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

kmynzznz  于 2023-06-28  发布在  Kubernetes
关注(0)|答案(2)|浏览(121)

我们正在将一个遗留应用程序迁移到Kubernetes。我们将运行它的许多示例(每个客户一个Kubernetes命名空间),因此我们希望自动化我们的应用程序升级过程。
Kubernetes有完善的滚动升级模式,但我还不能使用它们。我的申请需要以下过程:
1.删除所有现有pod
1.数据库升级作业(Kubernetes作业)运行并成功完成
1.创建新的pod
我们通过Deployment定义Pod。数据库升级作业是幂等的,只要我们一次不运行多个。
我假设我的工作流对于遗留应用程序来说并不罕见,但是我找不到任何已建立的模式或预配置的工具。外面有什么东西吗如果我必须编写自己的操作符(或使用类似Kudo的操作符),那么最好的一组步骤是什么?

tnkciper

tnkciper1#

是的,有一个现有的流程:
1.使用kubectl scale命令将现有Deployment缩减为零复制副本:kubectl scale --replicas=0 deploy/my-legacy-deployment
1.等待它稳定下来(这是您请求的停机时间;- )
使用kubectl wait会很有帮助,尽管我个人没有引入停机时间的经验,因此我不知道在这里建议的关于wait的其余参数
您也可以使用类似while true; do [[ 0 -eq $(kubectl get pods -o name -l legacy-deployment-selector | wc -l) ]] && break; done的东西来停止,直到没有剩余的pod为止
1.运行您的数据库作业或您选择的迁移
1.像往常一样部署新版本;根据您使用的工具,这可能会也可能不会实际影响当前的零规模部署
例如,kubectl set image deploy/my-legacy-deployment "*=example.com/my/new/image"将使Deployment保持零复制副本
但是helm install --upgrade legacy whatever-else可以很好地将Deployment的副本设置为图表中的值
1.如果您的工具尚未扩展新的Deployment,您现在可以使用相反的命令将其设置回所需的值:kubectl scale --replicas=3 deploy/my-legacy-deployment

9rygscc1

9rygscc12#

我们最终使用了ArgoCD及其sync phases and waves feature
简短的版本是使用同步阶段分阶段应用图表更新(通过ArgoCD):
1.运行将部署的复制副本计数设置为0的作业
1.运行应用新版本的架构更改的作业
1.使用新的容器映像和所需的副本数更新部署
我写了一篇博客文章,为那些感兴趣的人提供更多细节:https://jessemcdowell.ca/2023/06/Automating-Non-Non-Downtime-Upgrades-in-Kubernetes-with-ArgoCD/

相关问题