20、使用 Helm 与 Operator 框架:构建、部署与管理指南

使用 Helm 与 Operator 框架:构建、部署与管理指南

1. 安装 operator-sdk CLI

要下载此版本的 operator-sdk CLI,请运行以下命令:

$ curl -o operator-sdk -L https://github.com/operator-framework/operator-sdk/releases/download/v0.15.2/operator-sdk-v0.15.2-x86_64-linux-gnu

下载完成后,需要将 operator-sdk 二进制文件的权限更改为用户可执行。运行以下 chmod 命令进行此修改:

$ chmod u+x operator-sdk

接下来,将 operator-sdk 二进制文件移动到由 VM 的 PATH 变量管理的位置,例如 /usr/bin。由于此操作需要 root 权限,因此需要使用 sudo 运行 mv 命令,如下所示:

$ sudo mv operator-sdk /usr/bin

最后,通过运行 operator-sdk version 命令验证 operator-sdk 的安装:

$ operator-sdk version
operator-sdk version: 'v0.15.2', commit: 'ffaf278993c8fcb00c6f527c9f20091eb8dd3352', go version: 'go1.13.3 linux/amd64'

如果此命令执行时没有错误,则表明已成功安装 operator-sdk CLI。

作为额外步骤,还应该在 Minikube VM 中克隆 Packt 存储库,因为稍后将利用 guestbook Helm 图表来构建 Helm 运算符。在 VM 中运行以下命令来克隆存储库:

$ git clone https://github.com/PacktPublishing/-Learn-Helm.git Learn-Helm

2. 创建 Helm 运算符

2.1 搭建运算符文件结构

与 Helm 图表本身类似,由 operator-sdk CLI 构建的 Helm 运算符具有特定的文件结构,必须遵循该结构。文件结构如下表所示:

文件路径 说明
helm-charts/guestbook 包含 Guestbook 图表
build/Dockerfile 用于构建运算符镜像的 Dockerfile
watches.yaml 定义运算符的监视规则
deploy/service_account.yaml 定义服务账户
deploy/role.yaml 定义角色权限
deploy/role_binding.yaml 绑定角色和服务账户
deploy/operator.yaml 定义运算符部署资源
deploy/crds/charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml 示例 Guestbook CR 应用

可以使用 operator-sdk new 命令轻松创建运算符文件结构。在 Minikube VM 中执行以下命令来搭建 Guestbook 运算符:

$ operator-sdk new guestbook-operator --type helm --kind Guestbook --helm-chart Learn-Helm/helm-charts/charts/guestbook

2.2 构建运算符并推送到 Quay 注册表

operator-sdk CLI 提供了 operator-sdk build 命令,可轻松构建运算符镜像。此命令旨在针对运算符的顶级目录运行,并通过引用运算符的 build/ 文件夹下的 Dockerfile 来构建镜像。

在 Minikube VM 中,运行 operator-sdk build 命令,将 Quay 用户名替换为实际值,如下所示:

$ cd guestbook-operator
$ operator-sdk build quay.io/$QUAY_USERNAME/guestbook-operator

如果构建成功,将收到以下消息:

INFO[0092] Operator build complete.

由于 Minikube VM 已安装 Docker,operator-sdk CLI 在后台使用 Docker 来构建镜像。可以运行 docker images 命令来验证镜像是否已构建:

$ docker images

本地构建运算符镜像后,必须将其推送到镜像注册表,以便 Kubernetes 可以拉取它。要使用 Docker 将镜像推送到注册表,必须首先与目标注册表进行身份验证。使用以下 docker login 命令登录到 Quay:

$ docker login quay.io --username $QUAY_USERNAME --password $QUAY_PASSWORD

登录到 Quay 后,使用 docker push 命令将运算符镜像推送到 Quay 注册表:

$ docker push quay.io/$QUAY_USERNAME/guestbook-operator

2.3 部署 Guestbook 运算符

当搭建 Guestbook 运算符时,operator-sdk CLI 还创建了一个名为 deploy 的文件夹,并在其中生成了部署运算符所需的文件。deploy 文件夹的内容如下:

deploy/
  crds/
    charts.helm.k8s.io_guestbooks_crd.yaml
    charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml
  operator.yaml
  role_binding.yaml
  role.yaml
  service_account.yaml

按照以下步骤部署 Guestbook 运算符:
1. 由于 Minikube VM 不包含 Kubectl,因此如果仍通过命令行连接到 VM,必须首先退出到本地系统,运行以下命令:

$ exit
  1. 之前使用 operator-sdk 创建的资源也位于 Packt 存储库的 guestbook-operator/ 文件夹中。如果在前面的步骤中尚未克隆此存储库,请使用以下命令进行克隆:
$ git clone https://github.com/PacktPublishing/-Learn-Helm.git Learn-Helm
  1. Guestbook 运算符将依赖于一个新的 API 端点。通过应用 guestbook-operator/deploy/crds 文件夹下的 CRD 来创建此端点:
$ kubectl apply -f guestbook-operator/deploy/crds/charts.helm.k8s.io_guestbooks_crd.yaml
  1. 接下来,需要修改 guestbook-operator/deploy/operator.yaml 文件,以指定之前构建的运算符镜像。在该文件中会看到以下代码行:
# Replace this with the built image name
image: REPLACE_IMAGE

将 REPLACE_IMAGE 文本替换为运算符镜像的位置,该值应类似于 quay.io/$QUAY_USERNAME/guestbook-operator。
5. 应用 CRD 并更新 operator.yaml 文件后,可以通过运行以下命令应用 guestbook-operator/deploy/ 文件夹下的每个资源:

$ kubectl apply -f guestbook-operator/deploy -n chapter8
  1. 通过对 chapter8 命名空间中的 Pod 运行监视命令,等待运算符报告 1/1 就绪状态:
$ kubectl get pods -n chapter8 -w

3. 部署 Guestbook 应用程序

当通常将 Helm 作为独立的 CLI 工具使用时,会通过运行 helm install 命令来安装 Helm 图表。使用 Helm 运算符时,通过创建 CR 来安装 Helm 图表。通过创建 guestbook-operator/deploy/crds/ 文件夹下提供的 CR 来安装 Guestbook Helm 图表:

$ kubectl apply -f guestbook-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml -n chapter8

对 chapter8 命名空间中的 Pod 运行另一个监视命令,应该能够看到 Guestbook 和 Redis Pod 因 Helm 图表安装而启动:

$ kubectl get pods -n chapter8 -w

可以通过运行 helm list 命令确认创建的版本:

$ helm list -n chapter8

可以通过修改 example-guestbook CR 来升级版本。修改 guestbook-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml 文件,将副本数从 1 更改为 2:

replicaCount: 2

更新 replicaCount 值后,应用更改:

$ kubectl apply -f guestbook-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml -n chapter8

修改 Guestbook CR 将触发对 example-guestbook 版本的 helm upgrade 命令。

3.1 Helm 运算符的局限性与优势

  • 局限性 :截至目前,基于 Helm 的运算符的一个局限性是无法像使用 CLI 那样启动回滚到先前版本。如果尝试对 example-guestbook 版本运行 helm history 命令,会注意到版本历史记录中只有第二个版本:
$ helm history example-guestbook -n chapter8
  • 优势 :基于 Helm 的运算符在同步应用程序的期望状态和实时状态方面表现出色。这是因为运算符会不断监视 Kubernetes 环境的状态,并确保应用程序始终配置为与 CR 上指定的配置相匹配。

3.2 卸载 Guestbook 应用程序

使用基于 Helm 的运算符卸载 Guestbook 应用程序就像删除 CR 一样简单。删除 example-guestbook CR 以卸载版本:

$ kubectl delete -f guestbook-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_guestbook_cr.yaml -n chapter8

还可以删除 Guestbook 运算符及其资源:

$ kubectl delete -f guestbook-operator/deploy/ -n chapter8

一般来说,在删除运算符之前,应始终确保先删除 CR。运算符被编程为在删除 CR 时对版本执行 helm uninstall 命令。如果不小心先删除了运算符,则必须从命令行手动运行 helm uninstall。

4. 使用 Helm 管理运算符和 CR

在前面的部分中,通过首先创建 guestbook-operator/deploy/crds/ 文件夹下的 CRD,然后创建 guestbook-operator/deploy/ 文件夹下的运算符资源,最后创建 CR 来部署 Guestbook 应用程序。这些任务都是使用 Kubectl CLI 执行的,但也可以使用 Helm 图表来提供更灵活和可重复的解决方案,以安装和管理运算符。

Helm 允许在 Helm 图表中提供一个名为 crds/ 的特殊目录,用于在安装图表时创建 CRD。Helm 在创建 templates/ 文件夹下定义的任何其他资源之前创建 CRD,这使得安装依赖于 CRD 存在的应用程序(如运算符)变得更加简单。

以下是可用于安装 Guestbook 运算符的 Helm 图表的文件结构:

guestbook-operator/
  Chart.yaml
  crds/
    charts.helm.k8s.io_guestbooks_crd.yaml
  templates/
    operator.yaml
    role_binding.yaml
    role.yaml
    Service_account.yaml
  values.yaml

这个 Helm 图表在安装时将首先安装 Guestbook CRD。如果集群中已经存在 CRD,则会跳过 CRD 创建,仅创建模板资源。需要注意的是,虽然在 Helm 图表中包含 CRD 很方便,但也有一些限制:
- CRD 不能包含任何 Go 模板,因此 CRD 不能像典型资源那样从参数化中受益。
- CRD 永远不能升级、回滚或删除。因此,如果需要执行这些操作,用户必须手动修改或删除 CRD。
- 安装上述图表需要集群管理员权限,这是 Kubernetes 中允许的最高权限,因为图表至少包含一个 CRD 资源。

4.1 操作流程总结

下面是使用 Helm 和 Operator 框架的整体操作流程 mermaid 流程图:

graph LR
    A[安装 operator-sdk CLI] --> B[创建 Helm 运算符文件结构]
    B --> C[构建运算符镜像]
    C --> D[推送到 Quay 注册表]
    D --> E[部署 Guestbook 运算符]
    E --> F[部署 Guestbook 应用程序]
    F --> G[管理应用程序(升级、卸载等)]
    H[使用 Helm 管理运算符和 CR] --> E

通过上述步骤,我们可以完成从安装工具到部署应用程序,再到使用 Helm 管理整个过程的一系列操作,充分发挥 Helm 和 Operator 框架的优势。

5. 深入分析 Helm 与 Operator 框架的协同工作

5.1 资源管理的优化

在使用 Helm 与 Operator 框架时,资源管理是一个关键环节。Helm 提供了方便的模板化和版本管理功能,而 Operator 则专注于应用程序的自动化运维。通过结合两者,可以实现资源的高效管理。

例如,在部署 Guestbook 应用程序时,Helm 图表定义了应用程序所需的各种资源,如 Deployment、Service 等。而 Operator 则负责监控这些资源的状态,并在必要时进行调整。当应用程序的配置发生变化时,Operator 会自动触发 Helm 的升级操作,确保应用程序始终处于期望的状态。

5.2 权限管理的重要性

在部署和管理 Operator 时,权限管理至关重要。如前文所述,Operator 需要特定的权限来监视和操作 Kubernetes 资源。通过合理配置 Role、RoleBinding 和 ServiceAccount,可以确保 Operator 具有足够的权限来执行其任务,同时避免权限过大带来的安全风险。

以下是一个简单的权限管理列表:
| 文件 | 作用 |
| — | — |
| role.yaml | 定义 Operator 所需的具体权限,如对 Pod、Deployment 等资源的操作权限 |
| role_binding.yaml | 将角色绑定到 ServiceAccount,确保 Operator 可以使用这些权限 |
| service_account.yaml | 定义 Operator 使用的服务账户 |

5.3 与现有系统的集成

Helm 和 Operator 框架可以与现有的 CI/CD 系统集成,实现自动化的部署和管理。例如,可以在 CI/CD 流程中添加 Helm 命令,自动构建和部署 Operator 镜像。同时,Operator 可以与监控系统集成,实时监控应用程序的状态,并在出现问题时及时发出警报。

6. 实际应用案例分析

6.1 企业级应用部署

在企业级环境中,使用 Helm 和 Operator 框架可以实现大规模应用的高效部署和管理。例如,一家电商企业需要部署多个微服务应用,每个应用都有不同的配置和依赖。通过使用 Helm 图表和 Operator,可以将这些应用的部署和管理自动化,减少人工干预,提高部署效率。

6.2 云原生应用开发

在云原生应用开发中,Helm 和 Operator 框架可以帮助开发者更好地管理应用程序的生命周期。例如,开发者可以使用 Helm 图表来定义应用程序的初始配置,然后使用 Operator 来监控应用程序的运行状态,并在需要时进行自动扩展或升级。

7. 未来发展趋势

7.1 功能增强

随着 Kubernetes 和 Helm 的不断发展,Operator 框架也将不断增强其功能。例如,未来可能会支持更多的资源类型和操作,提供更强大的自动化能力。

7.2 生态系统完善

Helm 和 Operator 框架的生态系统将不断完善,会有更多的第三方工具和插件出现,进一步提高其易用性和功能性。例如,可能会出现更多的 Helm 图表仓库和 Operator 市场,方便用户查找和使用各种资源。

7.3 与其他技术的融合

Helm 和 Operator 框架可能会与其他技术进行更深入的融合,如机器学习、人工智能等。例如,通过结合机器学习算法,可以实现更智能的资源调度和故障预测。

8. 总结与建议

8.1 总结

本文详细介绍了使用 Helm 与 Operator 框架的一系列操作,包括安装 operator-sdk CLI、创建 Helm 运算符、部署应用程序以及使用 Helm 管理运算符和 CR 等。同时,还分析了 Helm 运算符的局限性和优势,以及在实际应用中的一些注意事项。

8.2 建议

  • 在使用 Helm 和 Operator 框架时,建议先进行充分的测试,确保应用程序的稳定性和可靠性。
  • 合理配置权限管理,避免因权限问题导致的安全风险。
  • 关注 Helm 和 Operator 框架的最新发展动态,及时采用新的功能和技术,提高应用程序的管理效率。

通过掌握 Helm 和 Operator 框架的使用方法,可以更好地应对复杂的 Kubernetes 环境,实现应用程序的高效部署和管理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值