Kubernetes-部署初始化-如何确保它仅发生一次? [英] Kubernetes - deployment initialization - how to ensure it happens only once?

查看:83
本文介绍了Kubernetes-部署初始化-如何确保它仅发生一次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I using Kubernetes 1.12. I have a service (e.g. pod) which may have multiple instances (e.g. replicas > 1)

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

My goal is to perform a maintenance task (e.g. create\upgrade database, generate certificate, etc) before any of service instances are up.

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

I was considering to use Init Container, but at least as I understand, Init Container will be executed anytime additional replica (pod) is created and worse - that might happen in parallel. In that case, multiple Init Containers might work in parallel and thus corrupt my database and everything else.

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

I need a clear solution to perform a bootstrap maintenance task only once per deployment. How you would suggest to do that?

推荐答案

在运行数据库迁移之前,我遇到了相同的问题每个部署.这是一个基于Job资源的解决方案:

I encountered the same problem running db migrations before each deployment. Here's a solution based on a Job resource:

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定义了工作配置为restartPolicy: Never和相当低的activeDeadlineSeconds.使用kubectl wait可以确保migration-job.yml中的任何错误或超时都会导致脚本失败,从而阻止应用deployment.yml.

migration-job.yml defines a Job configured with restartPolicy: Never and a reasonably low activeDeadlineSeconds. Using kubectl wait ensures that any errors or timeout in migration-job.yml causes the script to fail and thus prevent applying deployment.yml.

这篇关于Kubernetes-部署初始化-如何确保它仅发生一次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆