一、Pod生命周期简介
Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段。
Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。
二、init容器
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:
- 它们总是运行到完成。
- Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
2.1、init容器的作用
- Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
- Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
- 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
- Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
- 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init
容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
2.init初始化容器
pause镜像为pod提供了基础的初始化环境。
(1)在test1上搭建的Habbor私有仓库中上传busybox的镜像,新建编辑资源清单文件init.yaml,设置生成主容器myapp-container前需要1个init初始化容器
[root@server2 pod]# vim init.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp1
image: myapp:v1
imagePullPolicy: IfNotPresent
initContainers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done;"]
(2)读取资源清单创建pod,查看Pod信息可以在状态中看到初始化容器未成功运行,init初始化容器必须成功运行并退出后,主容器才能成功运行,因此pod一直未就绪