Pod生命周期整个过程 如下图:
1、在启动任何容器之前,前创建 pause 容器,它初始化Pod的环境并为后续加入的容器提供共享名称空间。
2、初始化容器(initContainers):一个Pod可以定义任意个初始化容器,如上图就定义了两个初始化容器,初始化会按照YAML清单中顺序执行,当最后一个初始化容器执行成功后,才会去启动主容器。
3、启动钩子(postStart):容器启动后执行的一些操作。
4、容器探测:
Running
状态,如果不是根据重启策略进行响应操作。5、停止钩子(preStop):容器关闭前执行的一些操作
初始化容器官方参考文档:
初始化容器指,在启动主容器前的一些操作,使用 pod.spec.initContainers
来定义初始化容器,可以定义多个初始化容器,会按照顺序一次执行,执行完成后依次关闭初始化容器。当所有初始化容器执行完成且正常关闭后,才会去启动主容器。
实例:定义Pod资源,创建两个初始化容器,初始化容器执行 sleep 2,也就是说我们要等定义的两个初始化容器都睡眠2秒后,才创建主容器
cat pod-init.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: init-pod
labels:
env: uat
spec:
initContainers:
- name: init-1
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "sleep 2"]
- name: init-2
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "sleep 2"]
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
执行YAML文件 && 实时观察Pod状态:
kubectl apply -f pod-init.yaml
kubectl get pods init-pod -w
查看帮助命令:
kubectl explain pod.spec.containers.lifecycle.preStop
参数:
该钩子创建容器后立即被执行,如果执行失败,则会根据重启测试判断是否重启,这个钩子不需要传递任何参数。
实例:定义Pod启动钩子,容器运行后记录容器运行时间
cat pod-1.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-1
namespace: default
labels:
env: uat
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
lifecycle:
postStart:
exec:
command: ['/bin/bash', '-c', 'echo "Start Time: $(date +%F)" > /root/time.txt']
执行YAML文件:
kubectl apply -f pod-1.yaml
进入容器,查看容器启动时间
kubectl exec -it nginx-1 -- /bin/bash
# cat /root/time.txt
Start Time: 2023-05-21
容器停止前执行操作,比如容器停止前发送信号告诉监控系统此Pod将要停止等。
实例:创建Pod定义停止钩子,在容器停止前,优雅的关闭容器内服务
cat pod-2.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-2
namespace: default
labels:
env: uat
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
lifecycle:
preStop:
exec:
command: ['/bin/bash', '-c', 'nginx -s stop']
执行YAML清单:
kubectl apply -f pod-2.yaml