在部署更新时运行 init 容器

9il*_*0lo 2 kubernetes

什么触发初始化容器运行?

编辑部署描述符(或使用 helm 更新它),例如更改图像标签,是否会触发 init 容器?

删除 pod 会触发 init 容器吗?

将副本集减少为空然后增加它会触发 init 容器吗?

是否可以手动触发 init 容器?

mar*_*rio 6

什么触发初始化容器运行?

基本上initContainers每次 a 都会运行Pod,在其定义中包含这样的容器,并且创建 a 的原因Pod可能大不相同。正如您在官方文档中 所读到的,init 容器在 a 中的应用程序容器之前Pod运行,并且它们始终运行到完成如果 Pod 的 init 容器失败,Kubernetes 会反复重启 Pod,直到 init 容器成功。因此,触发启动 an 的其中一件事initContainer是之前启动它的失败尝试。

编辑部署描述符(或使用 helm 更新它),例如更改图像标签,是否会触发 init 容器?

是的,基本上每个Deployment触发创建/重新创建Pods由它管理的定义的更改也会触发它们的initContainers运行。无论您是通过掌舵还是手动管理它都没有关系。一些细微的更改,例如向您添加一组新标签,Deployment不会重新创建它,Pods但更改容器image肯定会导致控制器(DeploymentReplicationControllerReplicaSet)重新创建其Pods.

删除 pod 会触发 init 容器吗?

不,删除 aPod不会触发 init 容器。如果您删除Pod不受任何控制器管理的a ,它将消失,并且没有自动机制会关心重新创建它并运行它的initConainers. 如果您删除Pod由控制器管理的 a ,例如 a replicaSet,它将检测到Pods它的 yaml 定义中声明的少于声明的数量,并尝试创建此类缺失Pod以匹配所需/声明的状态。所以我想再次强调一下Pod,触发它initContainers运行的不是删除,而是Pod创建,无论是手动还是由控制器管理,例如replicaSet,当然可以通过手动删除Pod管理的这样的控制器。

将副本集减少为空然后增加它会触发 init 容器吗?

是的,因为当您将副本数量减少到 0 时,您会让控制器删除所有Pods属于其管理的内容。当它们被重新创建时,它们的所有启动过程都会重复,包括运行initContainers作为此类Pods.

是否可以手动触发 init 容器?

正如@David Maze 在他的评论中已经指出的那样,运行 init 容器的唯一方法是创建一个新的 pod,但是更新部署和删除部署管理的 pod 都应该触发它。我会说这取决于您所说的手动术语是什么意思。如果您问这是否可以在initContainer不重新启动/重新创建的情况下以某种方式触发Pod- 不,这是不可能的。启动initContainersPod创建或换句话说与其启动过程密切相关。

顺便提一句。您在问题中提出的所有问题都很容易测试。你在kubernetes 官方文档中有很多工作示例,你可以用来测试不同的场景,你也可以initContainer自己创建简单的例子,例如使用busybox图像,它的唯一任务是sleep在所需的秒数内完成。在这里,你必须从与不同的K8S文档章节一些有用的链接initContainers

初始化容器

调试初始化容器

配置 Pod 初始化