文章目录
- 一、Pod生命周期流程
 - 二、初始化容器-initContainers
 - 三、主容器操作-containers
 - 1、启动钩子-lifecycle.postStart
 - 2、停止钩子-lifecycle.preStop
 
一、Pod生命周期流程
Pod生命周期整个过程 如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3nOh92k-1684662665661)(D:\MD归档文档\IMG\image-20230521153040610.png)]](https://img-blog.csdnimg.cn/e82cb81154834a71b11f96e190d73928.png)
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
 
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEuUYWIw-1684662665662)(D:\MD归档文档\IMG\image-20230521162813489.png)]](https://img-blog.csdnimg.cn/8f3a934751474713bddb74b81fd1f4f9.png)
三、主容器操作-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
                


















