Kubernetes 部署的最佳 CD 策略

Best CD strategy for Kubernetes Deployments

我们当前的 CI 部署阶段是这样工作的:

  1. 构建容器。
  2. 将图像标记为 "latest"< commit hash >
  3. 将图像推送到存储库。
  4. 在适当的 RC 上调用滚动更新。

这对于基于 RC 的部署一直很有效,但是现在 Deployment 对象变得更加稳定并且是一个基础功能,我们希望在我们当前的部署方案和开发阶段利用这种抽象.

我遇到的问题是找到一种合理的方法来使用 CI 工作流程自动更新 Deployment。我一直在尝试的是拆分 git 回购并做类似的事情:

  1. [应用构建]构建容器。
  2. [App Build] 将图像标记为 "latest"< commit hash >
  3. [应用构建] 将图像推送到存储库。
  4. [应用程序构建] 调用应用程序 Deployment 存储库的构建,传递当前提交哈希。
  5. [部署构建] 插入清单文件标记(当前只是传递的提交哈希,例如 image: app-%%COMMIT_HASH%%
  6. [部署构建] 将更新的清单应用到适当的 Deployment 资源。

当然有更好的方法来处理这个问题。如果 Deployment 监控图像的 "latest" 标签的散列变化,那就太好了……也许它已经做到了?我还没有成功。任何关于如何更好地处理 Deployment 部署的想法或见解将不胜感激:)

Deployment 仅监视 pod 模板 (.spec.template) 的更改。如果图像名称没有改变,Deployment 将不会进行更新。您可以通过更改 pod 模板来触发滚动更新(使用 Deployments),例如,使用提交哈希对其进行标记。此外,您需要将 .spec.template.spec.containers.imagePullPolicy 设置为 Always (如果指定了 :latest 标签,则默认设置为 Always 并且无法更新),否则图像将重用。

我们一直在练习我们所说的 GitOps 一段时间。

我们有一个 reconciliation operator,它将集群连接到配置存储库,并确保它在该存储库中找到的任何 Kubernetes 资源(包括 CRD)都应用于集群。它允许临时部署,但对 git 中定义的内容的任何临时更改都将在下一个协调周期中撤消。 操作员还能够观察任何图像注册表以获取新标签、部署的更新 image 属性、DaemonSet 和 StatefulSet 类型的对象。它首先在 git 中进行更改,然后将其应用到集群。

那么在CI中你需要做的是:

  1. 构建容器。
  2. 将图像标记为 <commit_hash>
  3. 将图像推送到存储库。

只要您将代理连接到可以找到应用程序部署对象的正确配置存储库,代理就会为您处理剩下的事情。

有关高级概述,请参阅:


免责声明:我是 Kubernetes 贡献者和 Weaveworks 员工。我们构建开源和商业工具,帮助人们更快地使用 Kubernetes 投入生产。