首页 > 解决方案 > Kubernetes - 部署初始化 - 如何确保它只发生一次?

问题描述

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

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

我正在考虑使用 Init Container,但至少据我了解,Init Container 将在任何时候创建额外的副本(pod)时执行,更糟糕的是 - 这可能会并行发生。在这种情况下,多个 Init 容器可能会并行工作,从而损坏我的数据库和其他所有内容。

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

标签: kubernetes

解决方案


在每次部署之前,我在运行 db 迁移时遇到了同样的问题。这是一个基于 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定义了一个配置了JobrestartPolicy: Never并且相当低的activeDeadlineSeconds. 使用kubectl wait确保任何错误或超时migration-job.yml都会导致脚本失败,从而阻止应用deployment.yml.


推荐阅读