0aa8fe6
这次没有正文改动。
这是 cloud/K8s 常见故障排查.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
e4d2cd0
@@ -0,0 +1,72 @@ +--- +tags: [Kubernetes, 排障, Pod] +order: 30 +--- + +# 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 <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 缺失 | + +```bash +# 资源 +kubectl top pod -n <ns> +kubectl describe node <node> | grep -A5 Allocated + +# 存储 +kubectl get pvc -n <ns> +``` + +## 验证 + +```bash +kubectl get pod <pod> -n <ns> -o wide +kubectl exec -it <pod> -n <ns> -- sh +kubectl port-forward <pod> 8080:8080 -n <ns> +``` + +## 回滚 + +```bash +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 日志和磁盘,不一定是网络问题。