# K8s 常见故障排查 ## 场景 Pod 起不来、一直重启、服务访问不到。K8s 的报错都藏在 `describe` 和 `events` 里。 ## 前置条件 - 有 kubectl 权限 - 知道出问题的 namespace 和 Pod 名 ## 配置 ```bash # 先看整体 kubectl get pods -A | grep -v Running kubectl get events -A --sort-by=.lastTimestamp | tail -20 # 定位到某个 Pod kubectl describe pod -n kubectl logs -n --tail=100 kubectl logs -n --previous # 上一次崩溃的日志 ``` 按状态对号入座: | 状态 | 常见原因 | | --- | --- | | `ImagePullBackOff` | 镜像名/tag 错、私有仓库没配 Secret | | `CrashLoopBackOff` | 应用启动就退出,看 `--previous` 日志 | | `Pending` | 资源不足、节点亲和性、PVC 没绑定 | | `OOMKilled` | 内存 limit 太小 | | `Evicted` | 节点磁盘或内存压力 | | `CreateContainerConfigError` | ConfigMap/Secret 缺失 | ```bash # 资源 kubectl top pod -n kubectl describe node | grep -A5 Allocated # 存储 kubectl get pvc -n ``` ## 验证 ```bash kubectl get pod -n -o wide kubectl exec -it -n -- sh kubectl port-forward 8080:8080 -n ``` ## 回滚 ```bash kubectl rollout undo deployment/ -n kubectl rollout status deployment/ -n ``` ## 坑 - **只看 `get pods` 不看 events**,会漏掉调度失败的原因。 - `CrashLoopBackOff` 的当前日志可能是空的,要看 `--previous`。 - 镜像 tag 用 `latest`,节点上缓存旧镜像,改了也不生效。 - PVC 一直 `Pending`,多半是 StorageClass 没配或容量不够。 - 探针(liveness)设得太激进,应用还没启动就被重启,越重启越起不来。 - 节点 `NotReady` 先看 kubelet 日志和磁盘,不一定是网络问题。