Kubernetes-部署初始化-如何确保它仅发生一次?

时间:2018-11-22 09:34:14

标签: kubernetes

我使用Kubernetes 1.12。我有一个服务(例如Pod),其中可能有多个实例(例如,副本> 1)

我的目标是执行维护任务(例如,创建\升级数据库,生成证书等)任何服务实例启动之前。

我当时正在考虑使用Init容器,但至少据我了解,Init容器将在创建附加副本(pod)时执行,并且更糟糕-这可能会并行发生。在这种情况下,多个初始化容器可能会并行工作,从而损坏我的数据库以及其他所有内容。

我需要一个明确的解决方案来对每个部署仅一次执行一次引导维护任务。您会如何建议这样做?

2 个答案:

答案 0 :(得分:2)

在每次部署之前,我都遇到了same problem个正在运行的数据库迁移。这是一个基于Job资源的解决方案:

kubectl apply -f migration-job.yml 
kubectl wait --for=condition=complete --timeout=60s job/migration
kubectl delete job/migration
kubectl apply -f deployment.yml

migration-job.yml定义了一个Job,配置了restartPolicy: Never和相当低的activeDeadlineSeconds。使用kubectl wait可确保migration-job.yml中的任何错误或超时都会导致脚本失败,从而阻止应用deployment.yml

答案 1 :(得分:1)

可以用来保留启动顺序控件的一种方法是使用StatefulSet。通过顺序启动,直到上一个完成,下一个Pod才会启动,从而消除了并行初始化风险。

我个人希望此init具有自己的锁定机制并坚持常规Deploymant。

请记住,不仅需要在创建Deployment时首次启动,还要考虑滚动发行,扩展,中断等情况。