Pod里面可以有一个或者多个容器,部署应用的容器可以称为主容器,在创建Pod时候,Pod中可以有一个或多个先于主容器启动的Init容器,这个init容器就可以成为初始化容器,初始化容器一旦执行完,它从启动开始到初始化代码执行完就退出了,它不会一直存在,所以在主容器启动之前执行初始化,初始化容器可以有多个,多个初始化容器是要串行执行的,先执行初始化容器1,在执行初始化容器2等,等初始化容器执行完初始化就退出了,然后再执行主容器,主容器一退出,pod就结束了,主容器退出的时间点就是pod的结束点,它俩时间轴是一致的。
Init容器就是做初始化工作的容器。可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的初始化容器执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到,Init Container可以在多种K8S资源里被使用到,如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。
Init容器与普通的容器区别是:
Init 容器不支持 Readiness,因为它们必须在Pod就绪之前运行完成。
每个Init容器必须运行成功,下一个才能够运行。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止,然而,如果Pod对应的restartPolicy值为 Never,它不会重新启动。
[root@master ~]# cat nginx_init.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: test-nginx
ports:
- containerPort: 80
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: webdata
mountPath: /usr/share/nginx/html
initContainers:
- name: init-html
image: busybox:1.28
imagePullPolicy: IfNotPresent
volumeMounts:
- name: webdata
mountPath: /opt
command: ["sh","-c","echo 'init' > /opt/index.html "]
volumes:
- name: webdata
emptyDir: {}
[root@master ~]# kubectl apply -f nginx_init.yaml
pod/nginx created
# 启动的时候先启动初始化容器
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 Init:0/1 0 7s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 2m7s
# 查看容器里面index.html文件的内容就是初始化容器写入的
[root@master ~]# kubectl exec -it nginx -c test-nginx -- cat /usr/share/nginx/html/index.html
init