This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-05-18 00:17:59 +08:00

5.9 KiB
Raw Permalink Blame History

tags, create time
tags create time
kubernetes
troubleshooting
diagnostics
ops-checklist
2026-05-18 00:30

K8s 运维排查 — Checklist 与诊断速查

概述

每次上线前过一遍清单,遇到问题时有系统化的排查思路。本章整理了实战中最常用的诊断命令、高频问题对照表和有价值的调试技巧。更多 SRE 理念(错误预算、MTTR)参见 ../04-SRE实践。

上线前 Checklist

# 检查项 说明
1 Probe 已配置 liveness/readiness/startup 都设定了阈值
2 Resources Limits 防止单个 Pod OOMKill 拖垮整台机器
3 日志输出到 stdout/stderr 可被采集器解析为 JSON
4 trace_id 透传 跨服务调用链 trace_id 不丢失
5 回滚预案 kubectl rollout undo deployment/order-service 能用
6 告警已配置 关键指标异常时有人收到通知
7 镜像 Tag 不用 latest,用语义化版本或 commit SHA

常用诊断命令

# 1. 查看 Pod 状态(为什么起不来?)
kubectl get pods -n production

# 2. 看单个 Pod 的详细事件
kubectl describe pod <pod-name> -n production
# ↑ 重点看 Events 区域的 LastState / State / Reason

# 3. 看容器日志(含重启前的上一次输出)
kubectl logs <pod-name> -n production --previous   # 上次崩溃容器的日志
kubectl logs <pod-name> -n production -c sidecar    # 多容器指定 sidecar 名

# 4. 进入运行中的容器调试
kubectl exec -it <pod-name> -n production -- /bin/sh

# 5. 查看滚动更新进度
kubectl rollout status deployment/order-service -n production

# 6. 回滚到上一个版本
kubectl rollout undo deployment/order-service -n production

# 7. 查看资源占用
kubectl top pods -n production          # Pod CPU/Memory
kubectl top nodes                       # 节点级别

高频问题对照表

症状 可能原因 排查步骤
ImagePullBackOff 镜像不存在、仓库认证失败、拼写错误 kubectl describe pod 看 Normal Events;确认 registry 凭证 Secret
ErrImagePull 镜像 tag 不存在 检查 CI 是否成功 push;docker pull 在本地复现
CrashLoopBackOff Liveness Probe 误杀、代码异常启动 kubectl logs --previous;检查 /healthz 健康端点逻辑
Pending (调度中) 资源不足、Affinity/Toleration 不满足 kubectl describe pod 看 Warning 事件;检查节点可用资源
OOMKilled memory limit 过小或内存泄漏 增大 limits;检查应用堆dump;JVM 需设 -Xmx
Service 不通 Selector 标签不匹配、端口配置错 kubectl get ep <svc> 看 Endpoint 列表;curl ClusterIP 验证
ConfigMap/Secret 未生效 重建了 Pod 但环境变量没更新 删除 Pod 让 Deployment 重建;ConfigMap volume 挂载会热更新
Ingress 无响应 Ingress Controller 未安装、Backend 配置错 kubectl get pods -n ingress-nginx;检查 annotation 语法
DNS 解析失败 CoreDNS Pod 异常或 NetworkPolicy 限制 DNS egress nslookup kubernetes.default;确保 DNS egress 端口 53 放行
Pod 被频繁驱逐 Node 资源不足触发 Eviction kubectl describe node <node> 看 MemoryPressure/DiskPressure

调试技巧:优雅地抓包与断点

# ========== Debugging Sidecar 模式 ==========
# 给故障 Pod 附加一个临时调试容器,共享网络命名空间
kubectl debug <pod-name> -it --image=nicolaka/netshoot --share-network

# 进来了之后可以直接:
# curl, nslookup, tcpdump, ping, tshark — 全套网络诊断工具

# ========== 动态调整日志级别(无需重建 Pod)==========
# 通过 port-forward 访问 kube-apiserver 的 debug endpoint
kubectl port-forward svc/kube-apiserver 6443:443 -n default

[!tip] 快速判断 K8s 问题的层级

Pod 起不来 → 查 Images / Resources / Probes
Pod 起来了但服务不通 → 查 Service Selector / Endpoints / Ingress
服务通但有报错 → 查 App Logs / Metrics / Traces
性能差 → 查 CPU Throttling / Disk IO / 连接池

按这个顺序一层层定位,避免在日志里大海捞针。

补充:kubectl 高阶用法

# 根据表达式筛选(比如只看处于 CrashLoop 的 Pod)
kubectl get pods --field-selector=status.phase==Failed -A

# 批量执行命令(在每个 Pod 中同时运行)
kubectl exec deploy/api-server -- sh -c 'uptime; free -m'

# 导出资源配置用于备份或审计
kubectl get deployment -n production -o yaml > deploy-backup.yaml

# 模拟变更效果(dry-run,不做实际修改)
kubectl apply -f new-deployment.yaml --dry-run=server -o yaml

# 查看哪个节点承载了某个 Pod
kubectl get pods -o wide -n production | grep my-app

# 持续监控 Pod 事件(实时流)
kubectl get events -n production --sort-by=.lastTimestamp -w

[!info] 理解 kubectl verbosity 级别

-v=6 显示 HTTP 请求 headers;-v=8 额外返回响应 body;-v=9 逐行展开。调试 API 交互时通常 -v=6 就足够了,-v=8 以上会产生大量输出。

补充:集群层面的健康检查

# 查看所有控制面组件状态
kubectl get componentstatuses       # K8s 1.19+ 已废弃,改用:
kubectl get endpoints etcd -n kube-system

# 检查 CoreDNS 健康(DNS 异常的起点)
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system <coredns-pod-name>

# 检查存储插件正常
kubectl get storageclass

# 查看当前活跃的资源配额使用情况
kubectl describe quota -n production

关联笔记