K8s 生产必备排障指南

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

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 异常

关键排查命令

  1. 查看节点状态:

kubectl describe node <node-name>

  1. 重新启动容器运行时:

sudo systemctl restart containerd

  1. 查看 kubelet 日志:

journalctl -u kubelet -f

七、生产中必须使用的 K8s 工具

1.

kubectl-debug(强烈推荐)

可以在出问题的 Pod 中直接进入调试容器。

2.

k9s

终端版可视化 K8s 管理工具,速度快、效率高。

3.

stern

实时查看多个 Pod 日志:

stern backend-

八、总结

Kubernetes 生产排障遵循 5 条铁律:

  1. 先 describe 再 logs
  2. 先看事件再看 Pod 本身
  3. Service 没流量就查 Endpoints
  4. 节点问题必定从 kubelet 查起
  5. 任何探针配错都会让你怀疑人生

只要按本文的顺序排查,90% 的故障都能迅速定位。

© 版权声明

相关文章

1 条评论

  • 头像
    建飞 读者

    收藏了,感谢分享

    无记录
    回复