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
练习#
- 练习一:创建一个
OnFailure重启策略的Pod,使其失败后重启3次并查看事件。 - 练习二:为Nginx Pod添加Readiness探针,观察Service端点是否变化。
- 练习三:手动删除Pod并观察Terminating持续时间,修改
terminationGracePeriodSeconds比较效果。
生产建议#
- 为关键应用配置合理的
readinessProbe与livenessProbe。 - 设定合适的
terminationGracePeriodSeconds,避免强杀导致数据不一致。 - 使用
PodDisruptionBudget保证滚动升级或节点维护时最小可用实例数。 - 对关键Pod设置资源请求/限制,减少调度与运行时不确定性。