八、Pod生命周期、容器钩子

8.1 Pod 生命周期

pod从开始创建到终止退出的时间范围称为Pod生命周期。

8.1.1 生命周期中的重要流程
  • 创建主容器(containers)是必须的操作
  • 初始化容器(initContainers)
  • 容器启动后钩子,启动探测、存活性探测,就绪性探测,容器停止前钩子。

image-20260112142643060

状态 触发条件 典型场景 处理建议
Pending Pod 已创建但未调度到节点,或正在拉取镜像 资源不足、镜像下载中、调度延迟 检查节点资源/污点、镜像仓库状态、调度器日志
Running Pod 已绑定节点,所有容器创建完成,至少一个容器在运行/重启中 服务正常运行、容器崩溃重启中 结合就绪探针判断业务可用性;检查 CrashLoopBackOff
Succeeded 所有容器成功终止(退出码 0),且不会重启 Job/CronJob 任务完成 无需干预,由 Job 控制器管理
Failed 所有容器已终止,且至少一个容器失败(非 0 退出码或被系统终止) 应用崩溃、资源超限、启动命令错误 检查容器日志:kubectl logs <pod> --previous
Unknown API Server 无法从节点获取状态(通信中断) 节点宕机、网络分区、kubelet 崩溃 检查节点状态:kubectl get node <node>;修复节点或等待自动重建
8.1.2 生命周期中的重要行为
  • Pause容器
  • Init容器
  • 生命周期钩子(容器级)
  • 容器探针
8.1.2.1 行为1:Pause容器

Pod创建时,首先启动,初始化共享命名空间(网络/IPC)等,为其他容器提供基础环境。

8.1.2.2 行为2:Init容器

一个Pod可以拥有任意数量的init容器,init容器是按照顺序以此执行的,并且当最后一个init容器执行完毕之后才会启动主容器

8.1.2.3 行为3:生命周期钩子(容器级)

pod允许定义两种类型的生命周期钩子,启动后钩子(postStart)和停止前钩子(preStop);钩子只作用于单个容器。

8.1.2.4 行为4:容器探针

对于pod健康状态诊断,分为3种:

  • **StartupProbe(启动探针):**探测容器是否正常运行,验证应用是否完成启动(验证通过后才激活 Liveness/Readiness 探测)
  • **LivenessProbe(存活探针):**判断容器是否处于running状态,根据重启策略决定是否重启容器
  • **Readiness(就绪探针):**检测服务就绪状态,失败时从Service流量中摘除
  • 探测方式:
    • EXe:执行命令(返回0即为成功)
    • TCP:检测端口连通性
    • HTTP:检测指定路径的HTTP状态码
# 核心逻辑:
- Pause奠基
→ Init容器顺序准备
→ 主容器启动(触发postStart)
→ 探针持续监控
→ 终止前执行preStop。
探针中Startup优先级最高,Readiness控制流量准入。
8.1.3 Pod资源的终止过程
  • 1)**触发删除:**用户通过kubectl delete命令发起删除请求;

  • 2)**标记状态:**Pod状态立即转换为Terminating,并启动宽限期(默认30s),Pod视为“dead”状态;

  • 3)服务解耦:Endpoints控制器同步将Pod从Service的Endpoints列表中移除,并停止流量转发;

  • 4)执行钩子:

    • 若设置preStop钩子,则立即同步执行;
    • 若宽限期结束时,钩子还未完成,则额外获得2s的延长
  • 5)**发送信号:**容器内主进程收到SIGTERM信号,开始优雅关闭。

  • 6)**强制终止:**宽限期结束后,残留进程强制接收SIGKILL

  • 7)**资源清理:**Kubelet将Pod宽限期置零,通知API Server完成最终删除。

# 核心逻辑:优雅终止优先
#(宽限期内处理流量摘除、钩子执行、进程退出),超时则强制清理。
# 宽限期是协调各步骤的核心机制。

8.2 容器钩子

初始化容器启动之后,开始启动主容器,在主容器启动之后有一个post start hook(容器启动后钩子)和pre stop hook(容器结束前钩子),无论启动后还是结束前所做的事我们可以把它放两个钩子,这个钩子就表示用户可以用它来钩住一些命令,非必须选项

  • **postStart:**容器创建之后立即执行,用于资源部署,环境准备等。
  • **preStop:**在容器被终止前执行,用于优雅关闭应用程序,通知其他系统等。
演示postStart和preStop用法
......
containers:
- image: sample:v2  
     name: war
     lifecycle:
      postStart:
       exec:
         command:
          - “cp”
          - “/sample.war”
          - “/app”
      prestop:
       httpGet:
        host: monitor.com
        path: /waring
        port: 8080
        scheme: HTTP
......
	以上示例中,定义了一个Pod,包含一个JAVA的web应用容器,其中设置了PostStart和PreStop回调函数。即在容器创建成功后,复制/sample.war到/app文件夹中。而在容器终止之前,发送HTTP请求到http://monitor.com:8080/waring,即向监控系统发送警告。
]# kubectl explain pods.spec.containers.lifecycle.postStart
]# kubectl explain pods.spec.containers.lifecycle.preStop

优雅的删除资源对象

当用户请求删除含有pod的资源对象时(如RC、deployment等),K8S为了让应用程序优雅关闭(即让应用程序完成正在处理的请求后,再关闭软件),K8S提供两种信息通知:

1)、默认:K8S通知node执行docker stop命令,docker会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认超时时间(30s),会继续发送SIGKILL的系统信号强行kill掉进程。

2)、使用pod生命周期(利用PreStop回调函数),它执行在发送终止信号之前。

默认情况下,所有的删除操作的优雅退出时间都在30秒以内。kubectl delete命令支持–grace-period=的选项,以运行用户来修改默认值。0表示删除立即执行,并且立即从API中删除pod。在节点上,被设置了立即结束的的pod,仍然会给一个很短的优雅退出时间段,才会开始被强制杀死。如下:

# 案例演示:
[root@k8s-master1 pod]# vim poststart-prestop-demo.yaml
apiversion: v1
kind: Pod
metadata:
  name: demo-hook
spec:
  containers:
    - name: nginx
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh","-c","echo 'lifecycle hook' > /usr/share/nginx/html/test.html"]
        preStop:
          exec:
            command: ["/bin/sh","-c","nginx -s stop"]

[root@k8s-master1 pod]# kubectl apply -f poststart-prestop-demo.yaml

[root@k8s-master1 pod]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
demo-hook   1/1     Running   0          5s

# 进入pod里面的指定容器nginx并查看是否postStart生效
[root@k8s-master1 pod]# kubectl exec -it demo-hook -c nginx -- /bin/bash
root@demo-hook:/# cat /usr/share/nginx/html/test.html
lifecycle hook			# 确实生效!
root@demo-hook:/# exit
[root@k8s-master1 pod]#

[root@k8s-master1 pod]# kubectl delete pods demo-hook
# 另外打开终端去观察
[root@k8s-master1 pod]# kubectl get pods -w
NAME        READY   STATUS    RESTARTS   AGE
demo-hook   1/1     Running   0          3m21s
demo-hook   1/1     Terminating   0          3m41s
demo-hook   0/1     Completed     0          3m42s
pod "demo-hook" deleted
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐