在 Kubernetes 中自动进行停机(非非停机)升级

Jes*_*ell 1 kubernetes

我们正在将旧版应用程序迁移到 Kubernetes。我们将运行它的许多实例(每个客户一个 Kubernetes 命名空间),因此我们希望自动化我们的应用程序升级过程。

Kubernetes 拥有完善的滚动升级模式,但我(还)无法使用它们。我的申请需要经过以下流程:

  1. 所有现有的 pod 都被删除
  2. 数据库升级作业(Kubernetes 作业)运行并成功完成
  3. 创建了新的 Pod

我们通过 Deployment 定义 Pod。只要我们一次运行多个数据库,数据库升级作业就是幂等的。

我认为我的工作流程对于遗留应用程序来说并不罕见,但我找不到任何已建立的模式或预先配置的工具。外面有什么东西吗?如果我确实必须编写自己的运算符(或使用类似 Kudo 的东西),那么它执行的最佳步骤是什么?

mda*_*iel 5

是的,有一个现有的流程:

  1. 使用以下kubectl scale命令将现有 Deployment 缩减至零副本:kubectl scale --replicas=0 deploy/my-legacy-deployment

  2. 等待稳定(这是您要求的停机时间;-)

    使用kubectl wait会有所帮助,尽管我个人没有引入停机时间的经验来了解wait此处建议的其余论点

    您还可以使用类似while true; do [[ 0 -eq $(kubectl get pods -o name -l legacy-deployment-selector | wc -l) ]] && break; done“停止”之类的方法,直到没有剩余的豆荚为止

  3. 运行您的数据库作业或您选择的迁移

  4. 像平常一样部署新版本;根据您使用的工具,这实际上可能会也可能不会影响当前的零规模部署

    例如,kubectl set image deploy/my-legacy-deployment "*=example.com/my/new/image"将部署保留零副本

    但是helm install --upgrade legacy whatever-else很可能将部署的副本设置为图表中找到的值

  5. 如果您的工具尚未扩展新的部署,您现在可以使用相反的命令将其设置回所需的值:kubectl scale --replicas=3 deploy/my-legacy-deployment