1. Pod 的完整生命周期

Pod 是 Kubernetes 最小的调度单元。它的一生可以用这张状态流转图概括:

Pending → Running → Succeeded / Failed
             │  ↑
             └── 多次重启后也可能进入 CrashLoopBackOff
排查工具 kubectl describe pod <name> 看 Events,kubectl logs <name> --previous 看上次崩溃的日志。90% 的 Pod 异常都靠这两条命令定位。

2. 两种探针的分工

很多刚接触 K8s 的同学分不清 liveness 和 readiness,这里用一句话记住:

liveness 决定「要不要重启」,readiness 决定「要不要接流量」。

3. 探针配置实战

一份生产级配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
  - name: app
    image: registry.example.com/demo:1.2.3
    ports:
    - containerPort: 8080
    startupProbe:
      httpGet:
        path: /health/startup
        port: 8080
      failureThreshold: 30
      periodSeconds: 5
    livenessProbe:
      httpGet:
        path: /health/live
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 3
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /health/ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      timeoutSeconds: 2
      failureThreshold: 3
三个常见坑 ① 三个探针共用一个健康端点,应用加载慢时会被 liveness 误杀 —— 用 startupProbe 兜底; ② timeoutSeconds 设太小(默认 1s),GC 触发时误报失败; ③ 不要给 liveness 探针依赖外部组件(如数据库),否则 DB 抖动会导致整批容器滚动重启。

4. 优雅退出:从停止到销毁

删除 Pod 时,K8s 并不会立刻杀死容器,而是走一遍优雅停机流程:

$ kubectl delete pod demo-app
# 1. 状态变为 Terminating,readiness 探针失效,从 Service 摘除流量
# 2. 发送 SIGTERM,等待 terminationGracePeriodSeconds(默认 30s)
# 3. 超时后发送 SIGKILL,强制杀掉
$ kubectl delete pod demo-app --grace-period=10 --force

5. 高频排障速查

把最常见的 Pod 症状和处置直接列成速查表:

症状 定位命令 常见原因
卡在 Pending describe 看 Events 资源不足 / 污点不匹配
CrashLoopBackOff logs --previous 应用启动即崩溃
频繁重启但无崩溃日志 describe Events liveness 误杀
有流量但无响应 exec 进容器检查 readiness 摘流量异常

探针设计的核心原则:readiness 保守(尽早摘流量),liveness 宽松(只杀真正死掉的)。 按这个原则配置,绝大多数抖动都不会演变成事故。

← 返回首页