找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3785

积分

0

好友

531

主题
发表于 昨天 09:47 | 查看: 6| 回复: 0

本文是一份 Kubernetes 常见故障排查实战手册,适用于:

  • 日常生产环境运维排障
  • 运维 / SRE / 云原生岗位面试
  • 内部技术 Wiki

内容围绕 Pod、Service、Node、存储、镜像、集群性能、etcd 等核心组件,系统梳理排障思路与关键命令,强调 “先看状态 → 再看事件 → 最后定位根因” 的工程化方法。如果你对 运维/DevOps/SRE 的实战技能感兴趣,不妨在 云栈社区 与更多同行交流探讨。

Pod 一直处于 Pending 状态

典型现象

  • Pod 创建成功但长时间不运行
  • kubectl get pod 显示状态为 Pending
  • Pod 未被调度到任何节点

核心排查思路

Pending 本质上是 调度阶段失败,重点关注 调度器(scheduler) 的决策结果。

排查步骤

查看调度失败原因(最关键)

kubectl describe pod <pod-name>

重点查看 Events 区域,调度失败原因都会在这里体现。

常见事件信息

  • 0/3 nodes are available
  • Insufficient cpu / memory
  • node(s) had taint
  • pod has unbound immediate PersistentVolumeClaims

查看节点资源情况

kubectl top nodes
kubectl describe node <node-name>

重点关注:

  • CPU / 内存是否已被分配完
  • Allocated resources 是否接近上限

检查节点选择器与亲和性

kubectl get nodes --show-labels
kubectl get pod <pod-name> -o yaml | grep -E "nodeSelector|affinity"

查看集群调度事件

kubectl get events --field-selector reason=FailedScheduling

常见原因总结

  • 节点资源不足(最常见)
  • nodeSelector / nodeAffinity 配置错误
  • 节点存在污点(Taint),Pod 未设置容忍
  • PVC 未成功绑定

Pod 反复重启(CrashLoopBackOff)

典型现象

  • Pod 状态为 CrashLoopBackOff
  • 容器不断启动又退出
  • Ready 状态始终为 0/1

排查核心

CrashLoopBackOff ≠ Kubernetes 故障,90% 是应用自身启动失败

排查步骤

# 查看 Pod 当前状态
kubectl get pod <pod-name>

# 查看当前容器日志
kubectl logs <pod-name>

# 查看上一次崩溃的日志(非常关键)
kubectl logs <pod-name> --previous

# 查看 Pod 详细信息
kubectl describe pod <pod-name>

# 查看相关事件
kubectl get events --field-selector involvedObject.name=<pod-name>

高频原因与处理方式

场景 说明 解决思路
应用异常退出 程序启动即崩溃 修复代码 / 启动参数
配置错误 配置文件缺失或格式错误 检查 ConfigMap / Secret
资源不足 OOMKilled 调整 requests / limits
健康检查失败 探针过于严格 延长 initialDelaySeconds

Service 无法访问 Pod

典型现象

  • Service 状态正常
  • 访问 ClusterIP / NodePort 无响应

排查核心

Service 本身不转发流量,真正转发的是 Endpoints

排查步骤

检查 Service 与 Endpoints

kubectl get svc <service-name>
kubectl get endpoints <service-name>

如果 Endpoints 为空,说明 Service 没有选中任何 Pod

校验 Pod 标签与 Service Selector

kubectl get pods --show-labels
kubectl get svc <service-name> -o yaml

检查端口映射关系

kubectl get svc <service-name> -o yaml | grep -E "port|targetPort"

Pod 内部连通性测试

kubectl run test --image=busybox -it -- sh
wget -O- http://<service-name>:80

检查 NetworkPolicy

kubectl get networkpolicies

常见根因

  • selector 与 Pod labels 不匹配(最常见)
  • targetPort 与容器端口不一致
  • Pod 未监听对应端口
  • NetworkPolicy 拦截流量

Node 处于 NotReady 状态

典型现象

  • 节点状态显示 NotReady
  • 新 Pod 无法调度到该节点

排查主线

Node NotReady 通常是 kubelet 无法正常向 APIServer 汇报状态

排查步骤

查看节点状态信息

kubectl get nodes
kubectl describe node <node-name>

登录节点检查 kubelet

systemctl status kubelet
journalctl -u kubelet -f

常见基础检查

# 容器运行时
systemctl status docker
# 或
systemctl status containerd

# 网络插件
kubectl get pods -n kube-system

# 磁盘空间
df -h

检查证书有效期

openssl x509 -in /var/lib/kubelet/pki/kubelet-client.crt -noout -dates

常见原因

  • kubelet 服务异常
  • 容器运行时故障
  • 网络插件异常(Calico / Flannel)
  • 磁盘满或 inode 耗尽
  • 证书过期(生产环境高频问题)

PVC 无法绑定(Pending)

现象说明

  • PVC 长时间处于 Pending
  • Pod 因存储问题无法启动

排查步骤

kubectl get pvc
kubectl describe pvc <pvc-name>

kubectl get pv
kubectl describe pv <pv-name>

kubectl get storageclass
kubectl describe storageclass <sc-name>

高频问题总结

  • StorageClass 不存在或名称拼写错误
  • PV 容量不足
  • accessModes 不匹配(RWO / RWX)
  • PV nodeAffinity 与 Pod 节点不一致

集群性能问题排查

资源维度排查

kubectl top nodes
kubectl top pods --all-namespaces

kubectl describe nodes | grep -A 5 "Allocated resources"

etcd 健康与性能

etcdctl endpoint health

DNS 性能验证

kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default

建议手段

  • Prometheus + Grafana 进行长期监控
  • Metrics Server 进行即时分析

镜像拉取失败(ImagePullBackOff)

排查步骤

kubectl describe pod <pod-name>

kubectl get pod <pod-name> -o yaml | grep image:

私有仓库认证示例

kubectl create secret docker-registry regcred \
  --docker-server=<registry> \
  --docker-username=<username> \
  --docker-password=<password>
spec:
  imagePullSecrets:
  - name: regcred

常见原因

  • 镜像名或 tag 错误
  • 私有仓库未配置认证
  • 节点无法访问镜像仓库

etcd 数据损坏与恢复

场景说明

  • APIServer 无法启动
  • 集群状态异常、资源大量消失

基于快照的恢复流程

ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
  --name etcd-0 \
  --initial-cluster etcd-0=https://127.0.0.1:2380 \
  --initial-advertise-peer-urls https://127.0.0.1:2380

systemctl restart kubelet

运维建议

  • 定期自动备份 etcd 快照
  • 快照应存放在独立节点或对象存储

故障排查方法论总结

推荐排查顺序:

状态 → Events → 日志 → 资源 → 配置 → 网络 → 存储 → 证书

这套 云原生/IaaS 环境下的通用思路:

  • 覆盖 80% 以上的 Kubernetes 故障
  • 同样适用于 面试求职 中的系统性回答



上一篇:Palantir 核心竞争力解析:基于数据融合与本体建模的企业决策操作系统
下一篇:C++内存泄漏实战排查与修复指南:从场景分析到工具定位
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-25 09:10 , Processed in 1.897302 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表