16.8.4 事件排查与诊断工具
本节聚焦 Kubernetes 事件排查与诊断工具的使用,强调“现象→定位→修复→复盘”的闭环,提供可执行的命令、安装步骤、排错案例与练习。
原理草图:事件与诊断链路
1. 事件与告警入口(含示例与解释)#
示例:按时间获取全局事件并定位异常对象
# 按最新时间排序,快速发现异常事件
kubectl get events -A --sort-by=.lastTimestamp
# 解释:-A 跨命名空间;--sort-by 按字段排序
示例:定位某个 Pod 的失败原因
# 假设 Pod 名为 web-7bdc8d7f6b-2m5kz
kubectl describe pod web-7bdc8d7f6b-2m5kz -n app
# 预期:在 Events 中看到如 ImagePullBackOff / FailedScheduling
示例:与告警联动(Prometheus/Alertmanager 提示对象)
# 根据告警提示的 namespace/pod 定位
kubectl get pod -n app -o wide | grep web
2. 核心诊断命令(安装、排错、命令解释)#
2.1 kubectl 安装与版本校验#
# 下载并安装(Linux x86_64)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 验证版本
kubectl version --client --short
2.2 Pod 级排查命令#
# 查看 Pod 事件、镜像、探针、挂载等
kubectl describe pod web-7bdc8d7f6b-2m5kz -n app
# 查看上一次崩溃容器日志
kubectl logs web-7bdc8d7f6b-2m5kz -n app --previous
# 进入容器验证配置和连通性
kubectl exec -it web-7bdc8d7f6b-2m5kz -n app -- /bin/sh
# 解释:
# --previous 查看崩溃前日志
# exec 用于验证依赖服务与配置文件
2.3 节点级排查命令#
# 查看节点条件与驱逐信息
kubectl describe node node-1
# 资源视角观察瓶颈
kubectl top node
kubectl top pod -A --sort-by=cpu
2.4 控制面组件排查#
# 组件状态与系统命名空间 Pods
kubectl get pods -n kube-system -o wide
# 查看控制面组件日志
kubectl logs -n kube-system kube-apiserver-node-1
kubectl logs -n kube-system kube-controller-manager-node-1
3. 调度与资源异常(示例 + 排错)#
场景:Pod Pending,提示资源不足
kubectl describe pod web-7bdc8d7f6b-2m5kz -n app | sed -n '/Events/,$p'
# 预期:FailedScheduling Insufficient cpu/memory
排错步骤:
# 1) 查看节点剩余资源
kubectl describe node node-1 | sed -n '/Allocatable/,+5p'
# 2) 查看命名空间资源配额
kubectl get resourcequota -n app -o yaml
# 3) 查看 Pod 请求/限制
kubectl get pod web-7bdc8d7f6b-2m5kz -n app -o yaml | grep -A6 resources
修复示例:调整资源请求
# 文件: deploy-web.yaml(片段)
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
kubectl apply -f deploy-web.yaml
4. 网络与服务诊断(示例 + 验证)#
示例:服务无响应
# 1) 查看服务后端 endpoints 是否存在
kubectl get endpoints web-svc -n app -o wide
# 2) DNS 解析与连通性测试
kubectl exec -it web-7bdc8d7f6b-2m5kz -n app -- nslookup web-svc
kubectl exec -it web-7bdc8d7f6b-2m5kz -n app -- curl -sS http://web-svc:8080/healthz
# 3) 查看 Service 配置
kubectl get svc web-svc -n app -o yaml
排错说明:
- endpoints 为空:后端 Pod 未就绪或 selector 不匹配
- DNS 失败:CoreDNS 异常
- curl 失败:Pod 端口、探针、NetworkPolicy 或 CNI 异常
5. 存储与挂载问题(示例 + 排错)#
示例:Pod 挂载失败
kubectl describe pod db-0 -n app | sed -n '/Events/,$p'
# 预期:FailedMount / MountVolume.SetUp failed
排错步骤:
# 1) 查看 PVC/PV 绑定状态
kubectl get pvc -n app
kubectl describe pvc data-db-0 -n app
# 2) 查看 CSI 驱动日志(以 csi-hostpath 为例)
kubectl logs -n kube-system -l app=csi-hostpath -c csi-plugin --tail=200
6. 系统工具协同诊断(节点侧)#
# 网络连接与端口
ss -lntp
# 磁盘与 IO
df -h
iostat -x 1 3
# 内存与 OOM 排查
free -m
dmesg | tail -n 50
7. 排障流程模板(可复用)#
1) 确认现象(告警/用户反馈)
2) 定位资源对象(命名空间、Pod、节点)
3) 查看事件与日志(describe/logs/journalctl)
4) 检查资源与约束(quota、limit、调度条件)
5) 验证网络与存储
6) 修复与复盘(探针、资源、策略、自动化预案)
8. 典型排错案例(从现象到修复)#
案例:镜像拉取失败 ImagePullBackOff
kubectl describe pod web-7bdc8d7f6b-2m5kz -n app | sed -n '/Events/,$p'
# 预期:Failed to pull image "repo/web:v1"
定位与修复:
# 1) 验证镜像是否存在/私有仓库认证
kubectl get secret regcred -n app
# 2) 重新创建拉取凭证
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password='Passw0rd' \
--docker-email=ops@example.com -n app
# 3) 绑定到 ServiceAccount
kubectl patch serviceaccount default -n app -p '{"imagePullSecrets":[{"name":"regcred"}]}'
9. 练习(可操作)#
1) 模拟调度失败:创建一个 requests 超过节点容量的 Pod,观察 FailedScheduling 事件。
2) 模拟 DNS 故障:临时停止 CoreDNS(缩容到 0),验证 nslookup 失败并恢复。
3) 模拟挂载失败:创建一个 PV/PVC 访问模式不匹配的 Pod,查看 FailedMount 事件并修正。
完成后,输出:事件、日志、修复步骤与复盘结论(写入排障手册)。