Kubernetes Pod
Pod 生命周期、Init Container、探针、重启策略以及 Pending 和 CrashLoopBackOff 排查。
Kubernetes Pod
Pod 是 Kubernetes 最小调度单元。一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间、存储卷和生命周期。
生命周期
常见阶段:
| 阶段 | 说明 |
|---|---|
Pending | Pod 已创建,但还未完成调度或镜像拉取 |
Running | Pod 已绑定节点,至少一个容器正在运行 |
Succeeded | 所有容器正常退出,常见于 Job |
Failed | 至少一个容器异常退出且不会再重启 |
Unknown | 控制面无法获取 Pod 状态,常见于节点异常 |
查看状态:
kubectl get pod -n default -o wide
kubectl describe pod <pod-name> -n default
kubectl get events -n default --sort-by='.lastTimestamp'
Init Container
Init Container 在业务容器启动前按顺序执行,适合做依赖检查、配置初始化和数据准备。
# API 版本。Pod 是核心资源,使用 v1。
apiVersion: v1
# 资源类型。这里表示创建一个 Pod。
kind: Pod
metadata:
# Pod 名称,同一命名空间内唯一。
name: app-with-init
spec:
# Init Container 会在业务容器前按顺序执行。
initContainers:
# Init Container 名称。
- name: wait-db
# 用于执行等待逻辑的镜像。
image: busybox:1.36
# 启动命令,这里循环等待 mysql:3306 可连接。
command: ["sh", "-c", "until nc -z mysql 3306; do sleep 2; done"]
# 业务容器列表。
containers:
# 业务容器名称。
- name: app
# 业务容器镜像。
image: nginx:1.27
如果 Init Container 失败,业务容器不会启动。
探针
探针用于判断容器是否启动完成、是否就绪、是否健康。
| 探针 | 作用 |
|---|---|
startupProbe | 判断应用是否启动完成,适合慢启动应用 |
readinessProbe | 判断是否可以接收流量 |
livenessProbe | 判断是否需要重启容器 |
示例:
# 就绪探针,失败时 Pod 会从 Service 后端摘除。
readinessProbe:
# 使用 HTTP GET 方式探测。
httpGet:
# 健康检查路径。
path: /healthz
# 探针访问的容器端口。
port: 8080
# 容器启动后等待 5 秒再开始探测。
initialDelaySeconds: 5
# 每 10 秒探测一次。
periodSeconds: 10
# 存活探针,失败时 kubelet 会重启容器。
livenessProbe:
httpGet:
# 存活检查路径。
path: /livez
# 探针访问的容器端口。
port: 8080
# 容器启动后等待 30 秒再开始探测。
initialDelaySeconds: 30
# 每 10 秒探测一次。
periodSeconds: 10
建议:
- 慢启动应用先配置
startupProbe,避免被livenessProbe过早杀掉。 readinessProbe失败会摘除 Service 后端,不会重启容器。livenessProbe失败会重启容器,阈值不要过于激进。
资源限制
# 容器资源配置。
resources:
# requests 用于调度时预留资源。
requests:
# 申请 0.2 核 CPU。
cpu: 200m
# 申请 256Mi 内存。
memory: 256Mi
# limits 用于限制容器运行时最大资源。
limits:
# 最多使用 1 核 CPU。
cpu: "1"
# 最多使用 512Mi 内存,超过可能 OOMKilled。
memory: 512Mi
requests 影响调度,limits 影响运行时限制。内存超过 limit 通常会触发 OOMKill。
重启策略
# Pod 内容器退出后的重启策略。
restartPolicy: Always
| 策略 | 说明 |
|---|---|
Always | 总是重启,Deployment 默认使用 |
OnFailure | 非 0 退出时重启,常用于 Job |
Never | 不重启 |
常见异常
Pending
kubectl describe pod <pod-name> -n default
kubectl get events -n default --sort-by='.lastTimestamp'
常见原因:
- 节点资源不足。
- nodeSelector、亲和性、污点容忍不匹配。
- PVC 未绑定。
- 镜像拉取凭据或网络异常。
ImagePullBackOff
kubectl describe pod <pod-name> -n default
kubectl get secret -n default
排查方向:
- 镜像地址、tag 是否正确。
- 节点是否能访问镜像仓库。
- 私有仓库
imagePullSecrets是否配置。 - containerd 代理或镜像加速是否正常。
CrashLoopBackOff
kubectl logs <pod-name> -n default --previous
kubectl describe pod <pod-name> -n default
常见原因:
- 应用启动命令错误。
- 环境变量或配置文件错误。
- 依赖服务不可用。
- 探针配置过于激进。
- 容器内进程主动退出。
OOMKilled
kubectl describe pod <pod-name> -n default
kubectl top pod <pod-name> -n default --containers
处理方向:
- 检查应用内存泄漏或突增流量。
- 调整 JVM、Node.js、Go 等运行时内存参数。
- 合理提高 memory limit。
- 拆分大任务或降低并发。
删除 Pod
普通删除:
kubectl delete pod <pod-name> -n default
强制删除:
kubectl delete pod <pod-name> -n default --grace-period=0 --force
强制删除会跳过优雅退出流程,生产环境谨慎使用。