Kubernetes Pod

Pod 生命周期、Init Container、探针、重启策略以及 Pending 和 CrashLoopBackOff 排查。

Kubernetes Pod

Pod 是 Kubernetes 最小调度单元。一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间、存储卷和生命周期。

生命周期

常见阶段:

阶段说明
PendingPod 已创建,但还未完成调度或镜像拉取
RunningPod 已绑定节点,至少一个容器正在运行
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

强制删除会跳过优雅退出流程,生产环境谨慎使用。