【发布时间】:2019-08-30 22:25:44
【问题描述】:
如果我想运行需要一次性初始化任务的某个容器的多个副本,是否有标准或推荐的做法?
可能性:
- 即使在初始化后不需要 StatefulSet,也要使用 StatefulSet,并让 init 容器检查它们是否位于集合中的第一个 pod 上,否则什么也不做。 (如果出于其他原因需要 StatefulSet,这几乎可以肯定是最简单的答案。)
- 使用使用领导选举或类似方法的初始化容器只选择其中一个进行初始化。
- 使用初始化容器,并确保多个副本可以安全地并行运行。可能是理想的,但安排起来并不总是那么简单。 (特别是在滚动更新期间 Pod 随机失败的情况下,并且替换的旧 Pod 在启动新 Pod 的同时运行其 init。)
- 对单个副本使用单独的作业(或单独的部署)。可能会使初始化变得容易,但会使管理它与 CI/CD 管道中的主容器之间的依赖关系变得更加困难(我们没有使用 Helm,但这与安装后/升级后的钩子大致相当) .
【问题讨论】:
-
如果您使用
helm进行部署,最好的方法是使用Helm Hooks 功能创建作业。您可以使用pre-install和pre-upgrade挂钩以及--wait标志;这样,Helm 可确保您的工作在部署 pod 之前完成(甚至在工作失败时中止/失败发布)。 -
我不确定这是否完全是骗局,但I've answered before 描述了@EduardoBaitello 的建议。
-
也和stackoverflow.com/questions/53427789/…有关。我不确定为什么我在之前的搜索中没有找到它。不过,在描述不同方法的权衡方面,两者的答案都相当有限。
-
CockroachDB 是使用初始化作业的 Helm 图表示例:github.com/helm/charts/tree/master/stable/cockroachdb 他们也有关于手动运行作业的纯 Kubernetes 设置的说明 - cockroachlabs.com/docs/stable/… 它正在将作业干净地集成到声明性 GitOps CI 中/CD 管道是该路线中不明显的部分。
标签: kubernetes