故障排查 #

一、故障排查概述 #

Kubernetes故障排查是运维工作的重要部分,需要系统的方法和工具。

1.1 排查思路 #

text
故障排查思路
    │
    ├── 1. 确认问题范围
    │   ├── 集群级别
    │   ├── 命名空间级别
    │   └── Pod级别
    │
    ├── 2. 收集信息
    │   ├── 查看状态
    │   ├── 查看事件
    │   └── 查看日志
    │
    ├── 3. 分析原因
    │   ├── 配置问题
    │   ├── 资源问题
    │   └── 网络问题
    │
    └── 4. 解决问题
        ├── 修改配置
        ├── 调整资源
        └── 修复网络

1.2 常用命令 #

命令 用途
kubectl get 查看资源状态
kubectl describe 查看详细信息
kubectl logs 查看日志
kubectl exec 进入容器
kubectl events 查看事件

二、Pod故障排查 #

2.1 Pod状态 #

状态 说明 可能原因
Pending 等待调度 资源不足、节点选择器不匹配
Running 运行中 正常状态
Succeeded 成功完成 Job完成
Failed 运行失败 容器崩溃、健康检查失败
Unknown 状态未知 节点通信问题

2.2 Pending状态排查 #

bash
# 查看Pod详情
kubectl describe pod <pod-name>

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

# 常见原因
# 1. 资源不足
# 2. 节点选择器不匹配
# 3. 污点容忍不匹配
# 4. PVC未绑定

2.3 CrashLoopBackOff排查 #

bash
# 查看Pod状态
kubectl describe pod <pod-name>

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

# 查看退出码
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'

# 常见原因
# 1. 应用启动失败
# 2. 健康检查失败
# 3. 资源不足
# 4. 配置错误

2.4 ImagePullBackOff排查 #

bash
# 查看Pod详情
kubectl describe pod <pod-name>

# 常见原因
# 1. 镜像不存在
# 2. 镜像仓库认证失败
# 3. 网络问题
# 4. 镜像名称错误

# 解决方案
# 1. 检查镜像名称
# 2. 配置imagePullSecrets
# 3. 检查网络连接

三、Service故障排查 #

3.1 Service无法访问 #

bash
# 查看Service
kubectl get svc <service-name>

# 查看Endpoints
kubectl get endpoints <service-name>

# 检查Pod标签
kubectl get pods -l app=<app-name>

# 测试Service
kubectl run test --image=busybox --rm -it -- wget -qO- <service-name>:<port>

3.2 Endpoints为空 #

bash
# 检查Pod标签
kubectl get pods --show-labels

# 检查Service选择器
kubectl get svc <service-name> -o yaml

# 检查Pod就绪状态
kubectl get pods -l app=<app-name>

# 常见原因
# 1. 标签不匹配
# 2. Pod未就绪
# 3. 选择器配置错误

3.3 DNS解析问题 #

bash
# 测试DNS解析
kubectl run test --image=busybox --rm -it -- nslookup <service-name>

# 检查CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns

# 查看CoreDNS日志
kubectl logs -n kube-system -l k8s-app=kube-dns

# 检查Pod DNS配置
kubectl exec -it <pod> -- cat /etc/resolv.conf

四、网络故障排查 #

4.1 Pod间网络不通 #

bash
# 测试Pod间连通性
kubectl exec -it <source-pod> -- ping <target-pod-ip>

# 检查网络插件
kubectl get pods -n kube-system -l k8s-app=calico-node

# 检查网络策略
kubectl get networkpolicy -A

# 检查节点网络
kubectl exec -it <pod> -- ip route

4.2 外部访问问题 #

bash
# 检查Service类型
kubectl get svc <service-name>

# 检查NodePort
kubectl get svc <service-name> -o jsonpath='{.spec.ports[0].nodePort}'

# 检查Ingress
kubectl get ingress
kubectl describe ingress <ingress-name>

# 检查防火墙
iptables -L -n

五、存储故障排查 #

5.1 PVC Pending #

bash
# 查看PVC状态
kubectl describe pvc <pvc-name>

# 查看PV状态
kubectl get pv

# 检查StorageClass
kubectl get storageclass

# 常见原因
# 1. 无匹配的PV
# 2. StorageClass不存在
# 3. 动态供给失败

5.2 挂载失败 #

bash
# 查看Pod事件
kubectl describe pod <pod-name>

# 检查PV状态
kubectl describe pv <pv-name>

# 检查存储后端
# 根据存储类型检查

# 常见原因
# 1. PV不存在
# 2. 存储后端故障
# 3. 权限问题

六、节点故障排查 #

6.1 节点NotReady #

bash
# 查看节点状态
kubectl describe node <node-name>

# 检查kubelet
systemctl status kubelet

# 查看kubelet日志
journalctl -u kubelet -f

# 检查容器运行时
systemctl status containerd

# 常见原因
# 1. kubelet停止
# 2. 容器运行时故障
# 3. 网络问题

6.2 节点资源不足 #

bash
# 查看节点资源
kubectl describe node <node-name>

# 查看资源使用
kubectl top node <node-name>

# 查看Pod资源
kubectl top pods --all-namespaces --sort-by=memory

# 解决方案
# 1. 清理未使用资源
# 2. 迁移Pod到其他节点
# 3. 扩容节点

七、调试工具 #

7.1 kubectl debug #

bash
# 创建调试容器
kubectl debug <pod-name> -it --image=busybox

# 复制Pod调试
kubectl debug <pod-name> -it --copy-to=debug-pod --image=busybox

# 节点调试
kubectl debug node/<node-name> -it --image=busybox

7.2 临时Pod调试 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: debug-pod
spec:
  containers:
  - name: debug
    image: nicolaka/netshoot
    command: ["sleep", "3600"]
bash
# 创建调试Pod
kubectl apply -f debug-pod.yaml

# 进入调试
kubectl exec -it debug-pod -- /bin/bash

# 网络调试工具
curl, wget, ping, nslookup, dig, netstat, ss, tcpdump

7.3 日志分析 #

bash
# 查看Pod日志
kubectl logs <pod-name>

# 实时日志
kubectl logs -f <pod-name>

# 多容器日志
kubectl logs <pod-name> --all-containers

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

# 日志输出到文件
kubectl logs <pod-name> > app.log

八、常见问题解决 #

8.1 OOMKilled #

bash
# 查看Pod状态
kubectl describe pod <pod-name>

# 查看退出码
# OOMKilled退出码: 137

# 解决方案
# 1. 增加内存limits
# 2. 优化应用内存使用
# 3. 检查内存泄漏

8.2 健康检查失败 #

bash
# 查看Pod事件
kubectl describe pod <pod-name>

# 检查探针配置
kubectl get pod <pod-name> -o yaml

# 测试探针端点
kubectl exec -it <pod> -- curl localhost:<port>/<path>

# 解决方案
# 1. 调整探针参数
# 2. 修复应用健康检查端点
# 3. 增加初始延迟时间

8.3 证书过期 #

bash
# 检查证书有效期
kubeadm certs check-expiration

# 更新证书
kubeadm certs renew all

# 重启控制平面
kubectl restart kube-apiserver

九、排查流程图 #

text
Pod故障排查流程
    │
    ├── Pending
    │   ├── 检查资源是否充足
    │   ├── 检查节点选择器
    │   └── 检查PVC状态
    │
    ├── CrashLoopBackOff
    │   ├── 查看容器日志
    │   ├── 检查健康检查
    │   └── 检查资源配置
    │
    ├── ImagePullBackOff
    │   ├── 检查镜像名称
    │   ├── 检查镜像仓库认证
    │   └── 检查网络连接
    │
    └── Running但异常
        ├── 检查应用日志
        ├── 检查网络连通性
        └── 检查存储挂载

十、总结 #

10.1 核心要点 #

排查项 关键命令
Pod状态 kubectl describe pod
日志分析 kubectl logs
网络调试 kubectl exec, debug
存储问题 kubectl describe pvc/pv
节点问题 kubectl describe node

10.2 下一步 #

掌握了故障排查后,让我们学习 集群升级,了解Kubernetes版本升级方法。

最后更新:2026-03-28