如何使用仅运行一次的 init 容器复制 pod?

arm*_*rmb 7 kubernetes

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

可能性:

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

meb*_*s99 1

“某些容器的副本”依赖于“一次性初始化任务”这一事实意味着应用程序架构不太适合 Kubernetes 范式。这就是为什么必须考虑在 k8s 之上引入像 Helm 这样的第三方管理器(正如Eduardo BaitelloMatt所建议的那样)。

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

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

  • 这恰恰忽略了拥有数据库的意义。确实,Kubernetes 曾经被认为只适合无状态应用程序,但事情已经发生了变化。 (10认同)