Kubernetes Pod生命周期
约 1583 字大约 5 分钟
kubernetespod
2025-06-09
Pod 是 Kubernetes 中最小的可调度单元,理解其生命周期对排查问题和设计高可用应用至关重要。本文将深入剖析 Pod 从创建到终止的完整过程。
Pod Phase(阶段)
Pod 的 status.phase 字段描述了 Pod 在其生命周期中所处的阶段:
| Phase | 描述 |
|---|---|
| Pending | Pod 已被接受但尚未运行。包括调度、镜像拉取等过程 |
| Running | Pod 已绑定到节点,所有容器已创建,至少一个正在运行 |
| Succeeded | 所有容器正常终止且不会重启 |
| Failed | 所有容器已终止,至少一个以非零状态退出 |
| Unknown | 无法获取 Pod 状态,通常是节点通信故障 |
Container States(容器状态)
每个容器有独立的状态,通过 status.containerStatuses 查看:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80查看容器状态:
kubectl get pod lifecycle-demo -o jsonpath='{.status.containerStatuses[0].state}'容器的三种状态:
- Waiting:容器未运行,可能在拉取镜像或等待依赖。
reason字段说明原因(如ImagePullBackOff、CrashLoopBackOff) - Running:容器正在执行。
startedAt记录启动时间 - Terminated:容器已终止。
exitCode、reason、startedAt、finishedAt提供详细信息
Init Containers(初始化容器)
Init 容器在应用容器启动之前按顺序运行,每个必须成功完成才会启动下一个:
apiVersion: v1
kind: Pod
metadata:
name: app-with-init
spec:
initContainers:
- name: wait-for-db
image: busybox:1.36
command: ['sh', '-c', 'until nslookup mysql-service.default.svc.cluster.local; do echo waiting for mysql; sleep 2; done']
- name: init-schema
image: mysql:8.0
command: ['sh', '-c', 'mysql -h mysql-service -u root -p$MYSQL_ROOT_PASSWORD < /schema/init.sql']
envFrom:
- secretRef:
name: mysql-credentials
volumeMounts:
- name: schema
mountPath: /schema
containers:
- name: app
image: myapp:1.0
ports:
- containerPort: 8080
volumes:
- name: schema
configMap:
name: db-schemaInit 容器的典型用途:
- 等待依赖服务就绪
- 执行数据库迁移
- 从远端获取配置文件
- 设置文件权限或系统参数
Lifecycle Hooks(生命周期钩子)
Kubernetes 为容器提供了两个生命周期钩子:
postStart
容器创建后立即执行,与容器的 ENTRYPOINT 并行运行。注意它不保证在 ENTRYPOINT 之前执行完成:
preStop
容器终止前执行,是同步阻塞的。Kubelet 会等待 preStop 完成后才发送 SIGTERM。
apiVersion: v1
kind: Pod
metadata:
name: hook-demo
spec:
containers:
- name: nginx
image: nginx:1.25
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 'Pod started' >> /var/log/lifecycle.log"]
preStop:
httpGet:
path: /shutdown
port: 8080
# 或者使用 exec
# exec:
# command: ["/bin/sh", "-c", "nginx -s quit && sleep 5"]
ports:
- containerPort: 80
terminationGracePeriodSeconds: 60Health Probes(健康探针)
Kubernetes 提供三种探针来检测容器健康状态:
Startup Probe(启动探针)
用于检测应用是否已启动。在 startupProbe 成功之前,liveness 和 readiness 不会生效。适用于启动慢的遗留应用:
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30 # 最多允许 30 次失败
periodSeconds: 10 # 每 10 秒检查一次
# 总共允许 300 秒(5分钟)启动时间Liveness Probe(存活探针)
检测容器是否在运行。失败时 kubelet 会根据 restartPolicy 重启容器:
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: LivenessCheck
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
successThreshold: 1Readiness Probe(就绪探针)
检测容器是否准备好接收流量。失败时从 Service 的 Endpoints 中移除:
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3探针支持的检查方式:
- exec:在容器内执行命令,退出码 0 为成功
- httpGet:HTTP GET 请求,状态码 200-399 为成功
- tcpSocket:TCP 连接检查
- grpc:gRPC 健康检查协议
Pod 终止流程
当删除 Pod 时,Kubernetes 执行优雅终止流程:
关键配置:
apiVersion: v1
kind: Pod
metadata:
name: graceful-shutdown
spec:
terminationGracePeriodSeconds: 60 # 宽限期,默认30秒
containers:
- name: app
image: myapp:1.0
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 5"] # 等待流量排空最佳实践:在 preStop 中加入短暂 sleep(如 5 秒),确保 Endpoints 更新传播到所有 kube-proxy 和 Ingress Controller 后再开始停机,避免请求发送到已终止的 Pod。
Pod Disruption Budget(PDB)
PDB 限制自愿中断(如节点维护、集群升级)时可同时不可用的 Pod 数量,保障应用高可用:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
spec:
minAvailable: 2 # 至少保留2个可用Pod
# 或者使用 maxUnavailable
# maxUnavailable: 1 # 最多1个不可用
# maxUnavailable: "25%" # 最多25%不可用
selector:
matchLabels:
app: my-appPDB 仅对自愿中断生效:
- 受 PDB 保护:
kubectl drain、节点维护、Deployment 滚动更新 - 不受 PDB 保护:节点故障、OOMKill、手动
kubectl delete pod
Restart Policy(重启策略)
Pod 的 restartPolicy 决定容器退出后的行为:
spec:
restartPolicy: Always # Always | OnFailure | Never| 策略 | 描述 | 适用场景 |
|---|---|---|
| Always | 无论退出码,总是重启(默认值) | 长期运行服务 |
| OnFailure | 仅非零退出码时重启 | Job、批处理任务 |
| Never | 不重启 | 一次性任务 |
重启采用指数退避策略:10s、20s、40s...直到上限 5 分钟(CrashLoopBackOff)。
总结
理解 Pod 生命周期是掌握 Kubernetes 的基础。合理配置 Init 容器处理依赖,使用三种探针保障服务健康,正确处理优雅终止避免请求丢失,配合 PDB 保障高可用——这些都是生产环境中不可或缺的实践。
贡献者
更新日志
9f6c2-feat: organize wiki content and refresh site setup于