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