init容器是在普通容器之前运行的专用容器,可以包含普通容器映像中不存在的应用程序或安装脚本。 一个pod可以包含多个普通容器和多个init容器。在 Pod 中所有容器的名称必须唯一。
init容器在普通容器启动前顺序执行。如果init容器失败,则认为pod失败,K8S会根据pod的重启策略来重启这个容器,直到成功。
init容器需要在pod.spec中的initContainers数组中定义(与3pod.spec.containers数组相似)。init容器的状态在.status.initcontainerStatus字段中作为容器状态的数组返回(与status.containerStatus字段类似)。init容器支持普通容器的所有字段和功能,除了readinessprobe。
Init 容器只能修改image 字段,修改image 字段等于重启 Pod,Pod 重启所有Init 容器必须重新执行。
因为Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。在 Pod 上使用 activeDeadlineSeconds,在容器上使用 livenessProbe,相当于为 Init 容器活跃设置了一个期限,能够避免 Init 容器一直失败。以下为init container的例子:
1、新建一个包含两个init 容器一个普通容器的pod配置文件initcontainer.yaml
2、创建Pod后,由于域名无法解析,所以init容器无法执行成功,所以状态处于Init:0/2的状态
3、通过kubectl describe pod,可以看到第一个init container处于Running状态,ready为False
4、创建SVC,将myservice指向www.baidu.com,使init-myservice容器执行成功,init-db处于running状态,ready为False
5、同理,启动svc mydb后,init-db执行成功,myapp-pod进入RUNNING状态
网友评论