文章目录
- 一、Pod生命周期流程
- 二、初始化容器-initContainers
- 三、主容器操作-containers
- 1、启动钩子-lifecycle.postStart
- 2、停止钩子-lifecycle.preStop
一、Pod生命周期流程
Pod生命周期整个过程 如下图:
1、在启动任何容器之前,前创建 pause 容器,它初始化Pod的环境并为后续加入的容器提供共享名称空间。
2、初始化容器(initContainers):一个Pod可以定义任意个初始化容器,如上图就定义了两个初始化容器,初始化会按照YAML清单中顺序执行,当最后一个初始化容器执行成功后,才会去启动主容器。
3、启动钩子(postStart):容器启动后执行的一些操作。
4、容器探测:
- 启动探测(Startupprobe):探测容器是否正常运行。
- 存活探测(Livenessprobe):探测容器是否处于
Running
状态,如果不是根据重启策略进行响应操作。 - 就绪探测(Readinessprobe):探测容器是否就绪对外提供服务。
5、停止钩子(preStop):容器关闭前执行的一些操作
二、初始化容器-initContainers
初始化容器官方参考文档:
初始化容器指,在启动主容器前的一些操作,使用 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
三、主容器操作-containers
查看帮助命令:
kubectl explain pod.spec.containers.lifecycle.preStop
参数:
- exec:执行命令
- httpGet:向容器IP地址的某指定端口的path发起HTTP GET请求
- tcpSocket:在容器启动前等待一个TCP端口打开
1、启动钩子-lifecycle.postStart
该钩子创建容器后立即被执行,如果执行失败,则会根据重启测试判断是否重启,这个钩子不需要传递任何参数。
实例:定义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
2、停止钩子-lifecycle.preStop
容器停止前执行操作,比如容器停止前发送信号告诉监控系统此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