如何使用只能运行一次的初始化容器复制容器?

时间:2019-08-29 17:07:15

标签: kubernetes

如果我要运行某个容器的多个副本,这些副本需要一次性初始化任务,那么有没有标准或推荐的做法?

可能性:

  • 即使在初始化后也没有必要使用StatefulSet,并具有init容器来检查它们是否在集合的第一个容器中,否则不执行任何操作。 (无论如何,如果出于其他原因需要使用StatefulSet,则几乎可以肯定这是最简单的答案。)
  • 使用使用领导者选举或类似方法的初始化容器仅选择其中一个进行初始化。
  • 使用初始化容器,并确保多个副本可以安全地并行运行。可能很理想,但安排起来并不总是那么简单。 (尤其是在滚动更新期间某个Pod随机失败,并且替换的旧Pod在启动新Pod的同时运行其初始化的情况下。)
  • 对单个副本使用单独的作业(或单独的部署)。可能会使初始化变得容易,但会使管理它与CI / CD管道中的主要容器之间的依赖关系变得更加困难(我们没有使用Helm,但这可以与安装后/升级后的钩子大致比较) 。

1 个答案:

答案 0 :(得分:1)

“某些容器的副本”依赖于“一次性初始化任务”这一事实意味着该应用程序体系结构与Kubernetes范式非常不匹配。这就是为什么必须考虑在Helm之类的k8之上加入第三方经理的原因(如Eduardo BaitelloMatt所建议)。

与纯Kubernetes方法保持一致,最好重新设计您的应用程序,以使其组件作为独立的或松散耦合的微服务(包括初始化任务)工作。 最近在这里讨论了similar question

对于问题中列出的可能性,在纯Kubernetes中使用InitContainersStatefulSets的第一个选项也许是可行的。