init 容器
Pod 中除了常规的容器 pod.spec.containers
,还可以定义一种特殊的容器—— init 容器 pod.spec.initContainers
。顾名思义,该类容器通常用于初始化 Pod,例如:向容器的存储卷中写入数据,然后将这个存储卷挂载至容器中。
一个 Pod 可以拥有多个 init 容器。多个 init 容器之间 顺序 执行,仅当最后一个 init 容器执行完毕,才会启动常规容器。
换句话说,init 容器可以用来延迟常规容器的启动。例如,init 容器可以一直等待直至常规容器所依赖的服务启动完成并可以提供服务再结束,然后常规容器才启动。
案例
init 容器的 YAML 定义与常规容器的定义是一致的,只是在 spec.initContainers
中定义,下面直接展示一个案例。在该案例中,init 容器会以 1s 为间隔测试服务是否可以提供服务,当目标可以提供服务时,init 容器退出,此时常规容器开始启动:
apiVersion: v1
kind: Pod
metadata:
name: fortune-client
spec:
initContainers: # 定义常规容器
- name: init
image: busybox
command:
- sh
- -c
- 'while true; do echo "Waiting for fortune service to come up..."; wget http://fortune -q -T 1 -O /dev/null >/dev/null 2>/dev/null && break; sleep 1; done; echo "Service is up! Starting main container."'
containers:
- image: busybox
name: main
command:
- sh
- -c
- 'echo "Main container started. Reading fortune very 10 seconds."; while true; do echo "-------------"; wget -q -O - http://fortune; sleep 10; done'
Pod 状态变化
当 init 容器 未执行结束 时,该 Pod 的状态会卡在 Init,如下:
NAME READY STATUS RESTARTS AGE
fortune-client 0/1 Init:0/1 0 1s
Last updated
Was this helpful?