初始化容器就是做初始化的工作,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有当所有的初始化容器执行完毕后,主容器才会启动。

常用场景:
等待其他模块Ready(例如Web服务启动之前,验证数据库服务是否正常启动可连接);
做初始化配置;

创建初始化容器采用initContainers命令:

apiVersion: v1 
kind: Pod
metadata:
name: init-demo
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://www.baidu.com
volumeMounts:
- name: workdir
mountPath: "/work-dir"
volumes:
- name: workdir
emptyDir: {}

这里使用到的spec.volumes指的是Pod中的卷,spec.containers.volumeMounts,是将指定的卷 mount 到容器指定的位置,相当于docker里面的-v 宿主机目录:容器目录,emptyDir{}就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。
初始化容器执行完,会下载一个 html 文件映射到emptyDir{},而主容器也是和 spec.volumes 里的emptyDir{} 进行映射,所以nginx容器的/usr/share/nginx/html目录下会映射 index.html 文件。

验证

kubectl get pod init-demo

进入容器查看

kubectl exec -it init-demo -- /bin/bash
cat /usr/share/nginx/html/index