Kubernetes(K8s)在生产环境中最常见的问题并不是“不会部署”,而是 服务上线后突然访问异常、Pod 无法启动、负载不均、流量打不进去 等问题。本文总结一套企业中真正会用到的 K8s 排障方法,按照从“哪里坏了”到“怎么修”的顺序,让你在生产环境遇到问题时能快速定位。

一、Pod 启动失败排查:从事件开始
在生产环境中,Pod 启动失败是最常见的告警之一。第一步永远是:
1. 查看 Pod 事件
kubectl describe pod <pod-name>
重点关注:
|
事件提示 |
缘由 |
解决方案 |
|
ImagePullBackOff / ErrImagePull |
镜像拉取失败 |
查看镜像仓库地址、tag、Secret |
|
CrashLoopBackOff |
程序启动后立即崩溃 |
查看容器日志 |
|
FailedScheduling |
无节点可调度 |
资源不足或节点污点 |
2. 查看容器日志
kubectl logs <pod-name> -f –tail=100
如果是多个容器:
kubectl logs <pod-name> -c <container-name>
二、服务无法访问:从 Service 到 Pod 一条链查到底
生产中最常见的问题之一是:
“为什么服务暴露了,但外部访问不到?”
排查顺序超级固定:
1. 确认 Service 是否绑定 Pod
kubectl get endpoints <service-name>
如果返回 0 endpoints,说明 Service 完全没有后端 Pod,常见缘由:
- Pod 标签写错(最常见)
- Deployment 使用了旧 label,未滚动更新
- Pod 不 Ready,未加入 Service
2. 检查 Pod 的探针
错误示例:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 1
timeoutSeconds: 1
如果你的应用启动需要 10 秒,那么 K8s 会把你不断判定为不健康并重启。
解决:延长 initialDelaySeconds:
initialDelaySeconds: 10
periodSeconds: 5
3. 如果是 NodePort / LoadBalancer,检查节点防火墙
Windows/Linux 服务器常常开着防火墙,导致 Service 虽然打开了端口,但访问被阻止。
Linux 服务器检查:
sudo iptables -L -n
或 firewalld:
sudo firewall-cmd –list-ports
三、Deployment 发布卡住:排查滚动更新问题
如果发布新版本一直 pending 或没有生效:
1. 观察 Deployment 状态
kubectl rollout status deployment <name>
2. 可能缘由及解决
|
现象 |
缘由 |
解决方案 |
|
一直在等待旧 Pod 删除 |
Pod 被 PDB 限制 |
修改 PodDisruptionBudget |
|
新 Pod 无法创建 |
节点资源不足 |
加节点 / 调整 limits |
|
发布后访问异常 |
readinessProbe 配置过严 |
放宽探针条件 |
四、生产中最容易忽略:资源限制配置不合理
许多公司出现的性能问题根本不是代码问题,而是:
资源限制(requests/limits)配置得离谱。
错误示例(常见):
resources:
requests:
cpu: “100m”
memory: “256Mi”
limits:
cpu: “200m”
memory: “512Mi”
这样会导致:
- CPU 很容易被 Throttle 导致服务卡顿
- 内存一旦溢出立即 OOMKill
生产推荐(实际可用):
CPU/内存要根据实际压力测试调整,通用提议:
- requests 不要太保守
- limits 不要限制太死
- 内存至少预留 30% buffer
五、排查网络问题:从 CNI 到 Pod 网络
生产中 CNI 网络问题常常表现为:
- Pod 之间 ping 不通
- Service 能 ping,Pod 不通
- 某节点上的 Pod 都异常
1. 测试 Pod 内部网络
kubectl exec -it <pod> — ping 10.244.x.x
(以 Flannel 网段为例)
2. 检查 CNI 插件状态
kubectl get pods -n kube-system | grep cni
如果 CNI pod 处于 CrashLoopBackOff,整个集群都会有网络异常。
3. 重建 CNI(生产可用)
例如重建 Flannel:
kubectl delete -f kube-flannel.yaml
kubectl apply -f kube-flannel.yaml
(针对无外网环境要使用本地镜像)
六、节点问题:从 kubelet 开始排查
Node NotReady 是运维中最常见的大问题。
常见缘由汇总
|
现象 |
缘由 |
|
DiskPressure |
节点磁盘空间不足 |
|
MemoryPressure |
内存耗尽 |
|
kubelet 停止 |
版本冲突、证书过期 |
|
runtime 失败 |
containerd / docker 异常 |
关键排查命令
- 查看节点状态:
kubectl describe node <node-name>
- 重新启动容器运行时:
sudo systemctl restart containerd
- 查看 kubelet 日志:
journalctl -u kubelet -f
七、生产中必须使用的 K8s 工具
1.
kubectl-debug(强烈推荐)
可以在出问题的 Pod 中直接进入调试容器。
2.
k9s
终端版可视化 K8s 管理工具,速度快、效率高。
3.
stern
实时查看多个 Pod 日志:
stern backend-
八、总结
Kubernetes 生产排障遵循 5 条铁律:
- 先 describe 再 logs
- 先看事件再看 Pod 本身
- Service 没流量就查 Endpoints
- 节点问题必定从 kubelet 查起
- 任何探针配错都会让你怀疑人生
只要按本文的顺序排查,90% 的故障都能迅速定位。



收藏了,感谢分享