CentOS 下 Kubernetes 故障排查实战手册
一 快速定位流程
- 查看集群与节点健康:kubectl get nodes;kubectl get pods -A;kubectl get events --sort-by=.metadata.creationTimestamp。节点需为 Ready,异常优先看 NotReady 与频繁重启的 Pod。
- 聚焦异常对象:kubectl describe pod -n ;kubectl logs -n [-p](必要时查看上一次退出容器日志);必要时 kubectl exec -it -n – sh。
- 检查系统与服务:systemctl status kubelet;journalctl -u kubelet -f;如为自托管组件,查看 kube-apiserver/kube-controller-manager/kube-scheduler/kube-proxy 日志。
- 资源与系统:kubectl top nodes;kubectl top pods -A;free -m;df -h;dmesg | tail。
- 网络连通:在节点或临时调试 Pod 内验证跨 Pod/跨节点访问与 DNS 解析。
以上步骤覆盖“看状态—查事件—看日志—看资源—看网络”的闭环,适合大多数现场问题初筛。
二 Pod 异常高频场景与处置
- 持续 Pending
- 典型原因:节点 NotReady、资源不足(Insufficient cpu/memory/ephemeral-storage)、亲和/反亲和不匹配、污点未容忍、PVC 未绑定或存在节点亲和冲突、使用了 hostPort 导致端口占用。
- 处置要点:kubectl describe pod 查看 Events;核对节点状态与污点;检查 requests/limits 与节点可分配资源;确认 selector 与 label 一致;PVC 用 kubectl describe pvc/pv 查事件;hostPort 场景改为 Service 暴露。
- ImagePullBackOff / ErrImagePull
- 典型原因:镜像地址错误、私有仓库无 imagePullSecret、仓库证书不受信任、网络/DNS 不通、节点磁盘满。
- 处置要点:在节点上 crictl pull 或 curl -kv 验证连通;核对 imagePullSecrets;如为自签 CA,配置 containerd/docker 信任或临时使用 insecure-registry(仅测试);清理磁盘。
- CrashLoopBackOff / 启动即退出
- 典型原因:应用启动失败、配置错误、权限/挂载问题、就绪/存活探针失败。
- 处置要点:查看容器日志与上次退出日志;临时关闭探针验证应用本身可达;核对挂载卷与权限;必要时 kubectl exec 进入排查。
- OOMKilled
- 典型原因:内存泄漏或 limit 过低。
- 处置要点:查看日志与退出原因;优化应用内存或调高 resources.limits.memory;结合业务峰值设置合理 requests/limits。
- 就绪检查失败(Running 但不可用)
- 典型原因:/healthz 等路径或端口与应用不一致。
- 处置要点:核对 liveness/readiness 的 path/port/protocol;临时关闭探针验证;在容器内 curl 本地健康接口确认通过。
以上为生产最常见 Pod 异常路径与修复方向,覆盖调度、镜像、启动、资源、健康检查等关键维度。
三 Service 与网络排查
- 基础四连击:kubectl get svc -o wide;kubectl get endpoints ;kubectl get pods -l app=;在集群内临时 Pod 中 curl -Iv http://..svc.cluster.local 验证。
- 常见根因:
- Endpoints 为空:Service selector 与 Pod label 不匹配。
- 端口错误:spec.ports.port 与 targetPort 不一致。
- DNS 解析失败:CoreDNS 异常或域名拼写/命名空间错误,使用 FQDN:..svc.cluster.local。
- kube-proxy/网络插件异常:iptables/IPVS 规则缺失(ipvsadm -Ln)、CNI 未就绪(kubectl get pods -n kube-system | grep cni)。
- 节点/云安全组/防火墙:NodePort 默认 30000-32767 需放行;云上 LB/安全组策略需允许对应端口与来源。
- 不要通过 ping 判断 Service 可用性(ClusterIP 为虚拟 IP,不可 ping),应直接对端口发起应用层请求验证。
以上流程覆盖 Service 从配置、后端、DNS 到节点转发链路的关键检查点。
四 节点与控制面组件排查
- 节点层
- 状态与污点:kubectl describe node ;关注 NotReady、MemoryPressure/DiskPressure/PIDPressure/NetworkUnavailable 等状况与污点。
- 资源与系统:kubectl top nodes;free -m;df -h;检查容器运行时与镜像 GC;必要时重启 kubelet(systemctl restart kubelet)。
- 控制面与系统服务
- API Server 连通性:curl -k https://:6443/healthz;若异常,检查证书、负载与 apiserver 日志。
- 组件日志:journalctl -u kubelet -f;journalctl -u kube-proxy -f;如自托管,查看 kube-apiserver/kube-controller-manager/kube-scheduler 日志。
- 版本与兼容:kubectl version --short;确保所有组件与插件版本匹配。
该环节聚焦节点可调度性与控制面临界路径,常能快速定位“节点异常导致大面积 Pod 异常”或“控制面组件异常导致全集群不可用”的根因。
五 高频命令与一键巡检脚本
- 建议日常巡检命令清单
- 集群与事件:kubectl get nodes;kubectl get pods -A -o wide;kubectl get events --sort-by=.metadata.creationTimestamp
- 对象详情:kubectl describe node ;kubectl describe pod -n
- 日志与进入:kubectl logs -n [-p];kubectl exec -it -n – sh
- 资源与系统:kubectl top nodes;kubectl top pods -A;free -m;df -h;dmesg | tail
- 网络与连通:kubectl run -it --rm --image=busybox:1.36 --restart=Never testpod – wget -qO- http://kubernetes.default.svc
- 组件日志:journalctl -u kubelet -f;journalctl -u kube-proxy -f
- 一键巡检脚本示例(按需保存为 check-k8s.sh 并执行)
- #!/usr/bin/env bash
set -e
echo “=== Nodes ===”; kubectl get nodes -o wide
echo “=== Pods ===”; kubectl get pods -A -o wide | head -20
echo “=== Events ===”; kubectl get events --sort-by=.metadata.creationTimestamp | tail -20
echo “=== Top Nodes ===”; kubectl top nodes
echo “=== Top Pods ===”; kubectl top pods -A | head -20
echo “=== Disk/Inode ===”; df -h | head -10; df -i | head -10
echo “=== Kubelet ===”; systemctl is-active kubelet || journalctl -u kubelet -n 50 --no-pager
以上命令覆盖“状态—事件—日志—资源—网络—组件”的常用检查面,适合作为现场快速巡检与问题复盘的基线清单。