Oamc

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 日志和磁盘,不一定是网络问题。