Pod由一个或者多个容器组成,这里的容器通常指的是运行应用程序的业务容器。但是Pod中除了业务容器外,还有基础容器、初始化容器和临时容器。
初始化容器晚于基础容器运行,但先于业务容器运行。如果Pod的初始化容器运行失败,在默认情况下Kubernetes会不断尝试重启Pod,直到初始化容器运行成功。如果将Pod的配置参数“restartPolicy”设置为“Never”,这时候Kubernetes将不会执行重启的动作。
如果要将Pod中的容器指定为初始化容器,可以通过在“spec”中添加“initContainers”字段。一个Pod可以指定多个初始化容器,它们会按顺序逐个运行。每个初始化容器必须运行成功,下一个才能够运行。当所有的初始化容器运行完成后,Kubernetes才会开始执行业务容器从而运行应用程序。
视频讲解如下:
下面给出一个初始化容器的示例。
(1)创建initcontainer.yaml文件,并输入下面的内容。
代码语言:powershell复制apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app running! && sleep 5']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'echo The init-myservice running! && sleep 5']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'echo The init-mydb running! && sleep 5']
(2)执行下面的语句创建Pod。
代码语言:powershell复制kubectl apply -f initcontainer.yaml
(3)Pod创建成功后,使用describe查看具体的输出信息,如下图所示。
代码语言:powershell复制kubectl describe -f initcontainer.yaml
通过“Message”的输出信息可以看成,Kubernetes首先启动了两个初始化容器“init-myservice”和“init-mydb”,最后启动了业务容器“myapp-container”。
因为初始化容器与业务容器分离,因此它具有以下的优势:
- 在初始化容器中可以提前安装业务容器中使用到的工具或者运行一些初始化的脚本。
- 将与应用程序中依赖的工具和脚本分离到初始化容器中,可以避免这些工具导致应用镜像的安全性降低。
- 开发人员可以独立进行镜像的创建和部署,而不需要将所有的组件联合构建成一个单独的应用镜像。
- 初始化容器可以独立访问Kubernetes中的一些敏感信息,如:Secrets。
- 由于初始化容器必须在业务容器之前执行完成,因此可以利用初始化容器来阻塞或延迟业务容器的启动,直到满足了一组先决条件。