Kubernetes容器编排环境中,故障排查是SRE稳定性工程的核心技能。与单机运维不同,K8s的故障点分散在Pod、Node、Control Plane等多个层级,问题定位需要系统化的诊断路径。本文整理了一套从Pod级别到集群级别的完整排查流程,覆盖Docker自动化部署场景下最常见的故障模式。
Pod状态异常的分级诊断方法
Pod是K8s最小调度单元,几乎所有业务故障的入口都从这里开始。不同状态对应不同的排查方向:
Pending状态:调度失败,资源不足或约束冲突。
kubectl describe pod <pod-name> -n <namespace>
# 查看Events部分,常见原因:
# - Insufficient cpu/memory
# - node(s) didn't match Pod's node affinity/selector
# - persistentvolumeclaim not found
CrashLoopBackOff状态:容器启动后反复崩溃。
kubectl logs <pod-name> -n <namespace> --previous
# 查看上一次崩溃的日志,常见原因:
# - 应用配置错误(连接数据库失败、环境变量缺失)
# - 健康检查配置不当(livenessProbe探针过于严格)
# - 资源限制过小(OOMKilled)
ImagePullBackOff状态:镜像拉取失败。
kubectl describe pod <pod-name> -n <namespace>
# 常见原因:
# - 镜像名或标签错误
# - 私有仓库认证失败(需配置imagePullSecrets)
# - 网络策略阻止外网访问
Service与Ingress流量不通的诊断路径
Service和Ingress故障占K8s运维问题的30%以上。排查路径遵循从内到外的原则:
第一步:验证Pod本身是否正常接收请求:
# 直接访问Pod IP
kubectl get pod -n <namespace> -o wide
curl http://<pod-ip>:<container-port>/healthz
第二步:验证Service ClusterIP是否可达:
# 从集群内任意Pod访问Service
kubectl run tmp-shell --rm -i --tty --image=busybox -- sh
wget -qO- http://<service-name>.<namespace>.svc.cluster.local:<port>/healthz
第三步:验证Endpoints是否正确关联:
kubectl get endpoints <service-name> -n <namespace>
# 如果Endpoints为空,检查selector标签是否匹配Pod标签
kubectl describe svc <service-name> -n <namespace>
第四步:Ingress配置检查:
kubectl describe ingress <ingress-name> -n <namespace>
# 检查Backends字段是否显示healthy
# 检查TLS证书是否正确配置
Node节点故障与资源压力排查
Node级别问题通常表现为Pod调度异常或性能劣化。核心诊断命令:
# 节点资源使用情况
kubectl top nodes
# 节点详细状态
kubectl describe node <node-name>
# 关注Conditions部分:
# - MemoryPressure: true → 节点内存压力
# - DiskPressure: true → 磁盘空间不足
# - PIDPressure: true → 进程数过多
# - Ready: Unknown → 节点与API Server失联
节点NotReady处理流程:
1. SSH登录节点检查kubelet状态:systemctl status kubelet
2. 检查kubelet日志:journalctl -u kubelet -n 100 --no-pager
3. 常见原因:磁盘满(清理/var/lib/docker和日志)、证书过期、网络插件异常
4. 恢复后节点重新Ready,原调度到该节点的Pod可能已被驱逐,需检查kubectl get pods -A -o wide | grep <node>
Control Plane组件异常诊断
Control Plane故障影响面最大,需优先排查:
# 检查组件状态
kubectl get componentstatuses
# etcd健康检查
ETCDCTL_API=3 etcdctl endpoint health \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# API Server日志
kubectl logs -n kube-system kube-apiserver-<master-node>
# Scheduler和Controller Manager日志
kubectl logs -n kube-system kube-scheduler-<master-node>
kubectl logs -n kube-system kube-controller-manager-<master-node>
etcd是最关键的组件,etcd不可用意味着整个集群不可用。定期检查etcd磁盘延迟(etcdctl endpoint status --write-out=table),超过100ms即需关注。etcd数据备份是最后的保障,建议每日自动执行:
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key
CI/CD流水线中的K8s部署故障定位
CI/CD流水线中的K8s部署失败通常与权限和配置版本有关。排查清单:
1. RBAC权限不足:ServiceAccount未绑定正确的ClusterRole,检查kubectl auth can-i验证权限。
2. Helm值覆盖错误:helm diff upgrade对比变更,确认values文件合并逻辑。
3. 滚动更新卡住:Readiness探针未通过,新版本Pod无法就绪。检查kubectl rollout status和kubectl get events。
4. 回滚操作:kubectl rollout undo deployment/<name>回退到上一个版本,kubectl rollout history查看历史。
日志分析与监控告警体系设计
集群级故障排查离不开日志聚合和监控体系。推荐工具组合:
日志:Fluent Bit → Elasticsearch → Kibana。Fluent Bit以DaemonSet部署在每个节点,采集/var/log/containers/下的容器日志。
监控:Prometheus + Grafana。关键告警规则包括:节点CPU/内存超过85%、Pod重启次数5分钟内超3次、etcd磁盘延迟超100ms、API Server请求延迟超500ms。
故障应急响应的黄金原则:先恢复再排查。通过kubectl rollout undo快速回滚,待服务恢复后再通过日志和事件定位根因。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-gu-zhang-pai-cha-shou-ce-cong/