使用 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
- 之前使用 operator-sdk 创建的资源也位于 Packt 存储库的 guestbook-operator/ 文件夹中。如果在前面的步骤中尚未克隆此存储库,请使用以下命令进行克隆:
$ git clone https://github.com/PacktPublishing/-Learn-Helm.git Learn-Helm
- Guestbook 运算符将依赖于一个新的 API 端点。通过应用 guestbook-operator/deploy/crds 文件夹下的 CRD 来创建此端点:
$ kubectl apply -f guestbook-operator/deploy/crds/charts.helm.k8s.io_guestbooks_crd.yaml
- 接下来,需要修改 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
- 通过对 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 环境,实现应用程序的高效部署和管理。
超级会员免费看
1071

被折叠的 条评论
为什么被折叠?



