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 事件并修正。

完成后,输出:事件、日志、修复步骤与复盘结论(写入排障手册)。