在部署更新上运行初始化容器

时间:2019-11-04 12:45:54

标签: kubernetes

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

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

删除pod会触发init容器吗?

将副本设置为空然后将其设置为null会触发init容器吗?

是否可以手动触发初始化容器?

1 个答案:

答案 0 :(得分:2)

  

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

基本上,每次创建定义中具有此类容器的initContainers时,都会运行Pod,并且创建Pod的原因可能完全不同。如您在官方documentation中所读, 初始化容器 Pod 中的应用容器之前运行,它们总是运行到完成如果Pod的初始化容器失败,Kubernetes会反复重启Pod,直到初始化容器成功。因此,触发启动initContainer的原因之一是先前尝试启动它的失败尝试之一。

  

将针对以下内容编辑部署描述符(或使用Helm更新)   例如,更改图像标签,触发init容器?

是的,基本上对Deployment定义的每一次更改都会触发由它管理的Pods的创建/重新创建,也触发其initContainers的运行。手动管理还是手动管理都没关系。进行一些细微的更改(例如在您的Deployment中添加一组新标签)并不能使其重新创建其Pods,但可以肯定地更改容器image会导致控制器({ {1}},DeploymentReplicationController)来重新创建其ReplicaSet

  

删除pod会触发init容器吗?

否,删除Pods不会触发初始化容器。如果删除不受任何控制器管理的Pod,它将被删除,并且没有自动机制会关心重新创建它并运行其Pod。如果删除由控制器管理的initConainers,例如Pod,它将检测到replicaSet少于其yaml定义中声明的Pods,它将尝试创建一个缺少Pod以匹配所需/声明的状态。因此,我想再次强调一下,不是Pod的删除触发其initContainers的运行,而是Pod的创建,无论是手动还是由控制器管理例如replicaSet,当然可以通过手动删除由该控制器管理的Pod来触发。

  

将减少副本设置为null然后增加副本将触发   初始化容器?

是的,因为当您将副本的数量减少到0时,您使控制器删除了它所管理的所有Pods。重新创建它们时,将重复其所有启动过程,包括运行initContainers作为该Pods的一部分。

  

是否可以手动触发初始化容器?

正如@David Maze在其评论中所述运行init容器的唯一方法是创建一个新的pod,但是更新部署和删除由部署管理的pod都将触发该操作。我会说这取决于您所说的“手动”一词的含义。如果您询问是否可以在不重新启动/重新创建initContainer的情况下以某种方式触发Pod-不,那是不可能的。 initContainers的启动与Pod的创建紧密相关,换句话说,与启动过程紧密相关。

顺便说一句。您在问题中要问的所有内容都很容易测试。您在 kubernetes官方文档中有很多可用的示例,可用于测试不同的场景,也可以自己创建简单的initContainer,例如使用busybox图像,唯一的任务是到sleep所需的秒数。在这里,您有来自不同的与 initContainers 相关的k8s文档部分的有用链接:

Init Containers

Debug Init Containers

Configure Pod Initialization