Kubernetes 部署的最佳 CD 策略
Best CD strategy for Kubernetes Deployments
我们当前的 CI 部署阶段是这样工作的:
- 构建容器。
- 将图像标记为
"latest"
和 < commit hash >
。
- 将图像推送到存储库。
- 在适当的 RC 上调用滚动更新。
这对于基于 RC 的部署一直很有效,但是现在 Deployment
对象变得更加稳定并且是一个基础功能,我们希望在我们当前的部署方案和开发阶段利用这种抽象.
我遇到的问题是找到一种合理的方法来使用 CI 工作流程自动更新 Deployment
。我一直在尝试的是拆分 git 回购并做类似的事情:
- [应用构建]构建容器。
- [App Build] 将图像标记为
"latest"
和 < commit hash >
。
- [应用构建] 将图像推送到存储库。
- [应用程序构建] 调用应用程序
Deployment
存储库的构建,传递当前提交哈希。
- [部署构建] 插入清单文件标记(当前只是传递的提交哈希,例如
image: app-%%COMMIT_HASH%%
)
- [部署构建] 将更新的清单应用到适当的
Deployment
资源。
当然有更好的方法来处理这个问题。如果 Deployment
监控图像的 "latest" 标签的散列变化,那就太好了……也许它已经做到了?我还没有成功。任何关于如何更好地处理 Deployment
部署的想法或见解将不胜感激:)
Deployment
仅监视 pod 模板 (.spec.template
) 的更改。如果图像名称没有改变,Deployment
将不会进行更新。您可以通过更改 pod 模板来触发滚动更新(使用 Deployment
s),例如,使用提交哈希对其进行标记。此外,您需要将 .spec.template.spec.containers.imagePullPolicy
设置为 Always
(如果指定了 :latest
标签,则默认设置为 Always
并且无法更新),否则图像将重用。
我们一直在练习我们所说的 GitOps 一段时间。
我们有一个 reconciliation operator,它将集群连接到配置存储库,并确保它在该存储库中找到的任何 Kubernetes 资源(包括 CRD)都应用于集群。它允许临时部署,但对 git 中定义的内容的任何临时更改都将在下一个协调周期中撤消。
操作员还能够观察任何图像注册表以获取新标签、部署的更新 image
属性、DaemonSet 和 StatefulSet 类型的对象。它首先在 git 中进行更改,然后将其应用到集群。
那么在CI中你需要做的是:
- 构建容器。
- 将图像标记为
<commit_hash>
。
- 将图像推送到存储库。
只要您将代理连接到可以找到应用程序部署对象的正确配置存储库,代理就会为您处理剩下的事情。
有关高级概述,请参阅:
免责声明:我是 Kubernetes 贡献者和 Weaveworks 员工。我们构建开源和商业工具,帮助人们更快地使用 Kubernetes 投入生产。
我们当前的 CI 部署阶段是这样工作的:
- 构建容器。
- 将图像标记为
"latest"
和< commit hash >
。 - 将图像推送到存储库。
- 在适当的 RC 上调用滚动更新。
这对于基于 RC 的部署一直很有效,但是现在 Deployment
对象变得更加稳定并且是一个基础功能,我们希望在我们当前的部署方案和开发阶段利用这种抽象.
我遇到的问题是找到一种合理的方法来使用 CI 工作流程自动更新 Deployment
。我一直在尝试的是拆分 git 回购并做类似的事情:
- [应用构建]构建容器。
- [App Build] 将图像标记为
"latest"
和< commit hash >
。 - [应用构建] 将图像推送到存储库。
- [应用程序构建] 调用应用程序
Deployment
存储库的构建,传递当前提交哈希。 - [部署构建] 插入清单文件标记(当前只是传递的提交哈希,例如
image: app-%%COMMIT_HASH%%
) - [部署构建] 将更新的清单应用到适当的
Deployment
资源。
当然有更好的方法来处理这个问题。如果 Deployment
监控图像的 "latest" 标签的散列变化,那就太好了……也许它已经做到了?我还没有成功。任何关于如何更好地处理 Deployment
部署的想法或见解将不胜感激:)
Deployment
仅监视 pod 模板 (.spec.template
) 的更改。如果图像名称没有改变,Deployment
将不会进行更新。您可以通过更改 pod 模板来触发滚动更新(使用 Deployment
s),例如,使用提交哈希对其进行标记。此外,您需要将 .spec.template.spec.containers.imagePullPolicy
设置为 Always
(如果指定了 :latest
标签,则默认设置为 Always
并且无法更新),否则图像将重用。
我们一直在练习我们所说的 GitOps 一段时间。
我们有一个 reconciliation operator,它将集群连接到配置存储库,并确保它在该存储库中找到的任何 Kubernetes 资源(包括 CRD)都应用于集群。它允许临时部署,但对 git 中定义的内容的任何临时更改都将在下一个协调周期中撤消。
操作员还能够观察任何图像注册表以获取新标签、部署的更新 image
属性、DaemonSet 和 StatefulSet 类型的对象。它首先在 git 中进行更改,然后将其应用到集群。
那么在CI中你需要做的是:
- 构建容器。
- 将图像标记为
<commit_hash>
。 - 将图像推送到存储库。
只要您将代理连接到可以找到应用程序部署对象的正确配置存储库,代理就会为您处理剩下的事情。
有关高级概述,请参阅:
免责声明:我是 Kubernetes 贡献者和 Weaveworks 员工。我们构建开源和商业工具,帮助人们更快地使用 Kubernetes 投入生产。