【Kubernetes运维篇】Pod生命周期、启动停止钩子详解

一、Pod生命周期流程

Pod生命周期整个过程 如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3nOh92k-1684662665661)(D:\MD归档文档\IMG\image-20230521153040610.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)]

三、主容器操作-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

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/130794505