16.3.1 Pod生命周期与状态管理

在Kubernetes中,Pod是最小调度单元,生命周期从创建到终止贯穿多种状态与事件。理解Pod生命周期与状态管理,有助于排障、优化发布与资源利用。本节将结合示例、命令、排错与练习说明。

生命周期阶段与核心对象#

原理草图(Pod创建流程)

文章图片

Pod创建示例

# 文件路径:/root/labs/pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-life-demo
  labels:
    app: life
spec:
  containers:
  - name: web
    image: nginx:1.25
    ports:
    - containerPort: 80
# 创建Pod
kubectl apply -f /root/labs/pod-demo.yaml

# 查看Pod状态与阶段
kubectl get pod pod-life-demo -o wide

# 查看Pod条件与事件
kubectl describe pod pod-life-demo

Pod状态阶段(Pod Phase)
- Pending:已接收但未完成调度/镜像拉取/初始化。
- Running:容器已启动,至少一个容器在运行或已启动。
- Succeeded:所有容器成功退出(常见于Job)。
- Failed:所有容器退出且至少一个非0退出码。
- Unknown:节点失联或状态无法获取。

命令解释
- kubectl get pod -o wide:查看调度到的节点、IP、状态。
- kubectl describe pod:查看事件与条件(Conditions)。

容器生命周期与重启策略#

容器状态
- Waiting / Running / Terminated,通过 reason/message 判断失败原因。

重启策略示例

# 文件路径:/root/labs/restart-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: restart-demo
spec:
  restartPolicy: OnFailure
  containers:
  - name: busybox
    image: busybox:1.36
    command: ["sh","-c","exit 1"]
kubectl apply -f /root/labs/restart-demo.yaml
kubectl get pod restart-demo -w
# 预期:状态反复重启,RESTARTS计数增加

排错命令

kubectl describe pod restart-demo | sed -n '/Events/,$p'
kubectl logs restart-demo --previous

初始化与就绪控制#

Init容器与探针示例

# 文件路径:/root/labs/init-probe-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: init-probe-demo
spec:
  containers:
  - name: app
    image: nginx:1.25
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 2
      periodSeconds: 3
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
  initContainers:
  - name: init-check
    image: busybox:1.36
    command: ["sh","-c","echo init ok; sleep 3"]
kubectl apply -f /root/labs/init-probe-demo.yaml
kubectl get pod init-probe-demo
kubectl describe pod init-probe-demo | sed -n '/Init Containers:/,/Containers:/p'

说明
- Init容器全部成功后才进入主容器启动。
- Readiness 为服务就绪门槛;Liveness 用于健康检测与自愈。
- 启动慢的应用可补充 Startup 探针防止误杀。

终止流程与优雅下线#

终止流程草图

sequenceDiagram
  participant K as Kubelet
  participant C as Container
  K->>C: SIGTERM
  Note right of C: PreStop Hook(可选)
  C-->>K: 退出或清理
  K->>C: SIGKILL(超时后)

优雅下线示例

# 文件路径:/root/labs/grace-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: grace-demo
spec:
  terminationGracePeriodSeconds: 10
  containers:
  - name: app
    image: nginx:1.25
    lifecycle:
      preStop:
        exec:
          command: ["sh","-c","echo preStop >> /usr/share/nginx/html/index.html; sleep 5"]
kubectl apply -f /root/labs/grace-demo.yaml
kubectl delete pod grace-demo
# 预期:Pod进入Terminating,10秒内完成优雅退出

常见状态问题与排查要点#

Pending
- 资源不足/亲和/污点不满足/镜像拉取失败。

kubectl describe pod <pod> | sed -n '/Events/,$p'
kubectl get node -o wide

CrashLoopBackOff

kubectl logs <pod>
kubectl logs <pod> -p

ImagePullBackOff

kubectl describe pod <pod> | grep -A3 -i image
# 检查镜像名称、仓库凭证与网络连通

ContainerCreating

# 常见CNI/CSI问题
kubectl get pods -n kube-system | egrep "cni|calico|flannel|coredns"
journalctl -u kubelet -n 200

Terminating 过久

kubectl get pod <pod> -o json | jq '.metadata.finalizers'
# 若finalizer阻塞,需定位控制器或存储插件

生命周期事件与可观测性#

事件与日志

kubectl describe pod <pod> | sed -n '/Events/,$p'
kubectl logs <pod> --tail=100

指标建议
- 关注 kube_pod_container_status_restarts_total、Ready时长、失败率。
- 建议在Prometheus中对重启次数与长时间Pending设告警。

安装与环境准备(kubectl)#

# 以Linux为例安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -m 0755 kubectl /usr/local/bin/kubectl

# 验证版本
kubectl version --client

练习#

  1. 练习一:创建一个OnFailure重启策略的Pod,使其失败后重启3次并查看事件。
  2. 练习二:为Nginx Pod添加Readiness探针,观察Service端点是否变化。
  3. 练习三:手动删除Pod并观察Terminating持续时间,修改terminationGracePeriodSeconds比较效果。

生产建议#

  • 为关键应用配置合理的 readinessProbelivenessProbe
  • 设定合适的 terminationGracePeriodSeconds,避免强杀导致数据不一致。
  • 使用 PodDisruptionBudget 保证滚动升级或节点维护时最小可用实例数。
  • 对关键Pod设置资源请求/限制,减少调度与运行时不确定性。