当前位置: 首页 > news >正文

k8s各种场景下排错思路以及命令 k8s常见问题故障处理思路

Kubernetes 集群故障通常集中在 Pod 异常、Service/网络不通、存储挂载失败、节点状态异常、配置错误 等场景。以下按错误环境分类,梳理排错思路、常见原因及对应命令,覆盖 90% 生产/测试环境问题。

一、Pod 异常环境(最常见)

现象:Pod 处于 PendingCrashLoopBackOffImagePullBackOffTerminating等状态,无法正常运行。

1. Pod 处于 Pending状态(调度失败)

可能原因:资源不足(CPU/内存/存储)、调度约束(亲和性/反亲和性)、PVC 未绑定、节点标签不匹配。

排查思路

  • 检查 Pod 事件(Events)中的调度失败原因;
  • 查看节点资源是否充足;
  • 检查调度约束(如 nodeSelectoraffinity)是否匹配节点标签。

关键命令

# 1. 查看 Pod 详细事件(核心!)
kubectl describe pod <pod-name> [-n <namespace>] | grep -A 20 "Events:"# 示例输出关键信息:
# Events:
#   Type     Reason            Age   From               Message
#   ----     ------            ----  ----               -------
#   Warning  FailedScheduling  2m    default-scheduler  0/3 nodes are available: 3 Insufficient cpu.# 2. 检查节点资源使用(需 metrics-server)
kubectl top nodes  # 查看节点 CPU/内存使用率
kubectl describe nodes | grep -A 10 "Allocatable"  # 查看节点可分配资源# 3. 检查调度约束(如 nodeSelector)
kubectl get pod <pod-name> -o jsonpath='{.spec.nodeSelector}'
kubectl get nodes --show-labels | grep <label-key>  # 检查节点是否匹配标签# 4. 检查 PVC 是否绑定(若 Pod 挂载 PVC)
kubectl get pvc [-n <namespace>]  # 查看 PVC 状态是否为 Bound

2. Pod 处于 CrashLoopBackOff状态(反复重启)

可能原因:应用启动失败(配置错误、依赖缺失)、健康检查(liveness/readiness probe)未通过、容器退出码非 0。

排查思路

  • 查看容器日志(定位应用层错误);
  • 检查健康检查配置是否合理;
  • 进入容器手动执行启动命令,验证环境。

关键命令

# 1. 查看容器日志(实时追踪 + 历史日志)
kubectl logs -f <pod-name> [-c <container-name>] [-n <namespace>]  # 实时日志
kubectl logs --previous <pod-name> [-c <container-name>] [-n <namespace>]  # 上一次启动日志(重启前)# 示例:查看 Nginx 容器日志是否有 404/502 错误
kubectl logs -f my-nginx -c nginx -n web# 2. 检查健康检查配置
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].livenessProbe}'
# 若配置不当(如端口错误、路径不存在),会导致容器被重启# 3. 进入容器手动调试(验证环境变量、依赖)
kubectl exec -it <pod-name> -- sh  # 进入容器 Shell
# 手动执行启动命令(如查看配置文件是否存在)
cat /etc/nginx/nginx.conf
curl http://localhost:80  # 测试应用是否能本地访问

3. Pod 处于 ImagePullBackOff状态(镜像拉取失败)

可能原因:镜像名称错误、镜像仓库认证失败(私有仓库)、网络无法访问镜像仓库。

排查思路

  • 检查镜像名称和 tag 是否正确;
  • 验证私有仓库认证(Secret 是否正确绑定);
  • 测试节点/集群能否访问镜像仓库(如 Docker Hub、Harbor)。

关键命令

# 1. 查看 Pod 事件(确认镜像拉取错误细节)
kubectl describe pod <pod-name> | grep -A 10 "Events:"
# 示例错误:"Failed to pull image \"my-private-repo/app:v1\": rpc error: code = Unknown desc = Error response from daemon: pull access denied"# 2. 检查镜像名称和 tag(YAML 中 image 字段)
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].image}'# 3. 测试镜像拉取(在节点上手动执行,需 Docker 环境)
docker pull <image-name>:<tag>  # 如 docker pull nginx:latest# 4. 检查私有仓库 Secret(若使用私有仓库)
kubectl get secret -n <namespace> | grep registry  # 查看是否存在 registry-secret
kubectl describe secret <registry-secret> -n <namespace>  # 检查认证信息是否正确

二、Service/网络不通环境

现象:Pod 间无法通信、外部无法访问 Service、DNS 解析失败。

1. Service 无法访问(外部/内部)

可能原因:Service 类型配置错误(如 LoadBalancer 未分配 IP、NodePort 端口未开放)、Endpoint 为空(selector 不匹配)、网络策略限制。

排查思路

  • 检查 Service 的 Endpoints是否存在(确认流量能路由到 Pod);
  • 验证 Service 端口映射(port/targetPort/nodePort);
  • 检查防火墙/安全组/网络策略是否放行流量。

关键命令

# 1. 查看 Service 详情(端口映射、selector)
kubectl describe svc <svc-name> [-n <namespace>]
# 关键字段:Ports(port/targetPort/nodePort)、Selector(是否匹配 Pod 标签)# 2. 查看 Endpoint(确认是否有 Pod IP)
kubectl get endpoints <svc-name> [-n <namespace>]
# 若 Endpoints 为空:① selector 标签不匹配;② Pod 未 Running;③ Pod 未通过 readinessProbe# 3. 测试 Service 访问(从集群内部)
kubectl exec -it <any-pod> -- curl http://<svc-cluster-ip>:<port>  # ClusterIP 访问
kubectl exec -it <any-pod> -- curl http://<node-ip>:<nodePort>  # NodePort 访问# 4. 检查网络策略(是否限制流量)
kubectl get networkpolicy [-n <namespace>]  # 列出所有网络策略
kubectl describe networkpolicy <np-name> [-n <namespace>]  # 查看允许的 IP/端口

2. 外部无法访问 LoadBalancer Service

可能原因:MetalLB/IP 分配失败、NodePort 未开放、防火墙拦截、BGP 路由未配置(若用 BGP 模式)。

排查思路

  • 检查 LoadBalancer 的 EXTERNAL-IP是否分配(非 <pending>);
  • 验证节点防火墙是否开放 NodePort 或 LoadBalancer 端口;
  • 检查 MetalLB 配置(IP 池、网络模式)。

关键命令

# 1. 查看 LoadBalancer Service 状态
kubectl get svc <svc-name> [-n <namespace>]
# 关键字段:EXTERNAL-IP(是否分配)、PORT(S)(外部端口)# 2. 测试节点端口访问(若为 NodePort/LoadBalancer)
curl http://<node-ip>:<nodePort>  # 替换为实际节点 IP 和端口# 3. 检查节点防火墙(以 firewalld 为例)
sudo firewall-cmd --list-ports | grep <nodePort>  # 查看端口是否开放
sudo firewall-cmd --add-port=<nodePort>/tcp --permanent && sudo firewall-cmd --reload  # 开放端口

3. Pod 间网络不通

可能原因:网络插件异常(Calico/Cilium/Flannel)、网络策略限制、节点路由问题。

排查思路

  • 检查网络插件 Pod 是否正常运行;
  • 测试 Pod 间连通性;
  • 查看网络策略是否放行。

关键命令

# 1. 检查网络插件状态(以 Calico 为例)
kubectl get pods -n kube-system -l k8s-app=calico-node  # 所有 Pod 需为 Running
kubectl logs -n kube-system <calico-pod-name> | grep -i "error"  # 查看插件日志# 2. 测试 Pod 间连通性(获取两个 Pod IP)
POD1_IP=$(kubectl get pod <pod1> -o jsonpath='{.status.podIP}')
POD2_IP=$(kubectl get pod <pod2> -o jsonpath='{.status.podIP}')
kubectl exec <pod1> -- curl -I http://$POD2_IP:80  # 从 Pod1 访问 Pod2# 3. 检查路由表(在节点上执行)
ip route show  # 查看是否有到其他节点 Pod 网段的路由(由网络插件配置)

4. DNS 解析失败

现象:Pod 内无法解析 Service 名称(如 nslookup my-svc.my-namespace.svc.cluster.local失败)。

可能原因:CoreDNS/Kube-DNS 异常、Pod /etc/resolv.conf配置错误。

关键命令

# 1. 检查 CoreDNS 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns  # 所有 Pod 需为 Running
kubectl logs -n kube-system <coredns-pod-name> | grep -i "error"  # 查看 DNS 日志# 2. 在 Pod 内测试 DNS 解析
kubectl exec <pod-name> -- nslookup <svc-name>.<namespace>.svc.cluster.local
# 示例:nslookup my-nginx.web.svc.cluster.local# 3. 检查 Pod 的 /etc/resolv.conf
kubectl exec <pod-name> -- cat /etc/resolv.conf
# 正常应包含 nameserver 10.96.0.10(Cluster DNS IP)和 search 域

三、存储异常环境

现象:Pod 无法挂载 PVC、数据无法持久化、PVC 处于 Pending状态。

1. PVC 处于 Pending状态(未绑定 PV)

可能原因:StorageClass 未配置、PV 不足、PVC 请求参数(如 accessMode、storage)与 PV 不匹配。

排查思路

  • 检查 PVC 事件(Events)中的绑定失败原因;
  • 验证 StorageClass 是否存在且配置正确;
  • 检查 PV 是否满足 PVC 的请求(容量、accessMode)。

关键命令

# 1. 查看 PVC 详情
kubectl describe pvc <pvc-name> [-n <namespace>]
# 关键字段:Status(Pending)、Events(错误信息,如 "no persistent volumes available for this claim")# 2. 检查 StorageClass
kubectl get storageclass  # 查看是否存在 PVC 指定的 StorageClass
kubectl describe storageclass <sc-name>  # 检查 provisioner(如 csi-hostpath)是否正常# 3. 检查 PV(动态供应的 PV 由 StorageClass 自动创建)
kubectl get pv  # 查看是否有 PV 状态为 Bound 且容量/模式匹配 PVC

2. Pod 无法挂载卷(MountVolume 失败)

可能原因:存储卷权限不足(如 MinIO 数据目录 UID 不匹配)、存储插件异常、卷类型不支持。

排查思路

  • 进入 Pod 查看挂载点是否正常;
  • 检查存储卷权限(如容器用户 UID 是否有读写权限);
  • 查看 kubelet 日志是否有卷挂载错误。

关键命令

# 1. 查看 Pod 挂载信息
kubectl get pod <pod-name> -o jsonpath='{.spec.volumes[*].persistentVolumeClaim.claimName}'
kubectl describe pod <pod-name> | grep -A 10 "Mounts:"  # 查看挂载点和卷名称# 2. 进入 Pod 检查挂载目录
kubectl exec -it <pod-name> -- df -h /<mount-path>  # 查看磁盘空间和使用
ls -ld /<mount-path>  # 检查目录权限(如 MinIO 需 UID 1000 可写)# 3. 查看 kubelet 日志(节点上执行)
journalctl -u kubelet | grep -i "mount"  # 过滤卷挂载错误(如 "MountVolume.SetUp failed")

四、节点异常环境

现象:节点状态 NotReady、Pod 无法调度到节点、kubelet 异常。

1. 节点处于 NotReady状态

可能原因:kubelet 服务崩溃、节点资源耗尽(DiskPressure/MemoryPressure)、网络与控制平面断开。

排查思路

  • 查看节点状态详情(Conditions);
  • 检查 kubelet 服务是否运行;
  • 验证节点与 API Server 通信是否正常。

关键命令

# 1. 查看节点状态
kubectl get nodes
kubectl describe node <node-name>  # 查看 Conditions(如 MemoryPressure、DiskPressure)# 2. 检查 kubelet 服务状态(节点上执行)
systemctl status kubelet  # 查看是否 Active: running
journalctl -u kubelet -f  # 实时查看 kubelet 日志(核心!)
journalctl -u kubelet | grep -i "error"  # 过滤错误# 3. 在节点上测试访问 API Server(确保节点与控制平面通信正常)
curl -k https://<api-server-ip>:6443/version  # 需证书或跳过 TLS

2. 节点资源不足(DiskPressure/MemoryPressure)

现象:节点状态显示 DiskPressureMemoryPressure,Pod 被驱逐。

排查思路

  • 清理节点磁盘空间(如删除无用镜像、日志);
  • 扩容节点资源或迁移 Pod 到其他节点。

关键命令

# 1. 查看节点资源压力详情
kubectl describe node <node-name> | grep -A 10 "Conditions:"# 2. 清理节点 Docker 镜像(节点上执行,若用 Docker)
docker system prune -af  # 清理无用镜像、容器、卷# 3. 驱逐 Pod(手动迁移,谨慎操作)
kubectl drain <node-name> --ignore-daemonsets  # 驱逐节点上所有 Pod(除 DaemonSet)

五、配置错误环境

现象:YAML 语法错误、资源定义冲突、环境变量/命令配置错误。

1. YAML 语法错误(kubectl apply失败)

可能原因:缩进错误、字段拼写错误、非法字符。

排查思路

  • 使用 dry-run校验 YAML;
  • 对比官方文档或已有正确 YAML。

关键命令

# 校验 YAML 语法(不提交到集群)
kubectl apply -f <yaml-file> --dry-run=client
# 示例错误:"error: error validating \"nginx.yaml\": error validating data: [ValidationError(Deployment.spec.template.spec.containers[0]): missing required field \"image\" in io.k8s.api.core.v1.Container]"

2. 环境变量/命令配置错误(Pod 启动失败)

可能原因:环境变量未注入、容器启动命令(command)错误、args 参数不匹配。

排查思路

  • 查看 Pod 描述中的环境变量和命令配置;
  • 进入容器手动执行命令验证。

关键命令

# 1. 查看 Pod 环境变量
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].env}'# 2. 查看容器启动命令(command/args)
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].command}'
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].args}'# 3. 进入容器手动执行命令
kubectl exec -it <pod-name> -- <command>  # 如 /app/start.sh

六、通用排错流程总结

  1. 确认问题现象:明确故障表现(Pod 异常/网络不通/存储失败等)。
  2. 定位受影响资源:通过 kubectl get列出相关资源(Pod/Service/Node 等)。
  3. 查看资源状态和事件kubectl describekubectl logs是核心,关注 Events 和日志中的 error/warning
  4. 检查关联资源:如 Service → Endpoint、Pod → PVC、Node → kubelet。
  5. 验证配置和环境:YAML 语法、网络连通性、存储权限、资源充足性。
  6. 逐步排除:从应用层(日志)→ 组件层(kubelet/CoreDNS)→ 基础设施层(节点/网络/存储)。

通过以上分类和命令,可快速定位 K8s 集群中 90% 以上的常见故障,关键是结合“事件+日志+配置”三要素进行排查。

http://www.dtcms.com/a/600700.html

相关文章:

  • win32k源代码分析之win32k!IsSAS函数中的全局变量win32k!gfsSASModifiers = 3是什么时候被赋值的
  • 序列和可迭代
  • 16.udp_socket(二)
  • 如何在不使用iTunes的情况下在电脑上访问iPhone文件
  • python+websockets,报错RuntimeError: no running event loop
  • 自己做网站流程龙口市最新公告
  • 自助建站系统介绍wordpress 百度推广
  • 基于Springboot的汽车推荐系统设计与实现7f7h74np(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • DBLoss: Decomposition-based Loss Function for Time Series Forecasting 论文阅读
  • STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
  • Git 中新建学习分支 + 暂存修改 + VSCode 可视化查看改动(超详细教程)
  • Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
  • Docker 相关使用收录
  • 【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
  • Docker-存储
  • wap手机网站模板上饶网站建设3ao cc专业a
  • 【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
  • 域名注册和网站设计服务如何做贴吧类网站多钱
  • python+uniapp基于微信小程序的垃圾分类信息系统
  • C语言编译器安卓版 | 强大功能助力编程学习与实践
  • STM32使用金属探测传感器自制金属探测仪
  • vmware嵌套安装esxi7.0.3扩容vmfs
  • 使用 BR 备份 TiDB 到 AWS S3 存储
  • 【OpenCV + VS】OpenCV 绘图:绘制矩形、圆形、椭圆形、线条等
  • 易语言反编译工具 - 高效破解易语言程序的利器
  • 11年始终专注营销型网站提供网站建设小程序制作
  • AOSP Android13 Launcher3——TransformParams 类
  • 网站推广问题推广公司网站有哪些方式
  • 成都网站建设公司电话美食网站建设多少钱
  • 【把Linux“聊”明白】进程的概念与状态