实验基线:Kubernetes v1.37.0、kubectl v1.37.0。先在测试环境执行,记录变更前状态与回滚点;生产集群不得直接照抄节点地址、网段、存储类或资源额度。
先保全证据,再执行修复
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.metadata.creationTimestamp
kubectl describe pod <pod> -n <ns>
kubectl logs <pod> -n <ns> -c <container> --since=15m --timestamps
kubectl logs <pod> -n <ns> -c <container> --previousKubernetes 不内置集群级日志后端;容器日志需要节点代理采集到集中系统。日志、指标和追踪必须带命名空间、Pod、容器、工作负载与请求关联字段。
按状态排障
| 现象 | 优先检查 |
|---|---|
| Pending | 调度事件、requests、PVC、污点和亲和性 |
| ImagePullBackOff | 镜像名、凭据、DNS、出口网络 |
| CrashLoopBackOff | previous 日志、退出码、配置、探针 |
| Service 不通 | Pod Ready、EndpointSlice、端口、DNS、策略 |
| 延迟升高 | 饱和度、限流、GC、下游和网络丢包 |
性能调优方法
先建立 SLO 与稳定负载,再比较 p50/p95/p99 延迟、错误率、吞吐和 CPU/内存/磁盘/网络饱和度。控制面重点观察 API 请求延迟、etcd 磁盘延迟、工作队列与限流;数据面重点观察容器 throttling、OOM、DNS 延迟和连接失败。一次只改一个参数,保留前后基线和回滚值。
kubectl top node
kubectl top pod -A --containers
kubectl get --raw '/metrics' | head
kubectl get --raw '/readyz?verbose'后两条通常需要管理员权限;不要把原始指标端点公开到互联网。
先定义四类黄金信号
| 信号 | 示例 | 用途 |
|---|---|---|
| 延迟 | 请求 p50/p95/p99 | 判断用户体验与尾延迟 |
| 流量 | QPS、消息速率 | 解释负载变化 |
| 错误 | 5xx、失败任务 | 判断正确性 |
| 饱和度 | CPU throttling、内存、队列 | 定位容量瓶颈 |
先定义 SLI/SLO,再告警;只对 CPU 高告警会产生大量无行动价值的噪音。
故障场景:CrashLoopBackOff
- 查看 Pod UID、重启次数和 waiting reason。
- 用
logs --previous读取上一次崩溃日志。 - 查看退出码:137 常见于 SIGKILL/OOM,1 通常是应用错误。
- 核对 ConfigMap/Secret、命令参数、探针和挂载。
- 修复声明式配置并观察 rollout,不直接在容器内改文件。
kubectl get pod <pod> -n lab -o jsonpath='{.status.containerStatuses[*].restartCount}{"\n"}{.status.containerStatuses[*].lastState.terminated.reason}{"\n"}{.status.containerStatuses[*].lastState.terminated.exitCode}{"\n"}'
kubectl logs <pod> -n lab --previous --timestamps
kubectl describe pod <pod> -n lab
故障场景:延迟升高
- 按版本、可用区、Pod 对比错误率和尾延迟。
- 检查 CPU throttling、GC、内存压力和连接池。
- 检查 Service 后端是否减少、DNS 与下游延迟。
- 对照发布、扩缩容、节点维护和配置变更时间。
- 回滚单一变量,确认指标恢复再定根因。
控制面观测
API Server 关注请求时延、错误码、inflight 与限流;etcd 关注 fsync/WAL 延迟、leader 变化、数据库容量;scheduler/controller 关注工作队列深度和重试。抓取控制面指标需要严格认证授权,不应公开匿名访问。
性能实验记录模板
- 构建与配置指纹、测试时间、流量模型。
- 变更前后 p50/p95/p99、错误率、吞吐。
- Pod/节点资源、重启、调度与事件。
- 唯一变量、预期、实测、结论和回滚结果。
若一次同时改 requests、JVM、HPA 和副本数,即使性能变好也无法判断原因。
最小观测栈的职责边界
- Metrics Server 提供资源指标给 kubectl top/HPA,不是长期监控库。
- Prometheus 类系统保存时序指标并计算告警。
- 节点日志代理采集 stdout/stderr 与系统日志到集中后端。
- OpenTelemetry Collector 接收、处理和导出指标/日志/追踪。
先定义数据保留、标签基数和脱敏规则。把用户 ID、请求 URL 全量值放进指标标签会造成基数爆炸。
可直接使用的告警思路
| 风险 | 信号 | 持续窗口 |
|---|---|---|
| 可用性下降 | 错误率超过 SLO | 快慢两档燃烧率 |
| 副本不可用 | available 小于 desired | 排除发布短窗 |
| 频繁重启 | restart 增量 | 结合退出原因 |
| 节点压力 | Memory/Disk/PIDPressure | 立即关联驱逐 |
| 证书风险 | 剩余有效期 | 提前多周 |
四个标准排障剧本
Pod Pending
看 FailedScheduling 事件,再查 requests、污点、亲和、拓扑、PVC 和配额。不要先扩节点;硬约束写错时扩容无效。
ImagePullBackOff
核对完整镜像名/摘要、imagePullSecrets、节点 DNS/代理和仓库限流;事件中的 HTTP 状态码是关键证据。
Service 超时
按进程监听—Pod IP—EndpointSlice—Service—策略—入口逐层验证,记录 timeout/refused/5xx 的区别。
节点 NotReady
查看 Node conditions、lease、kubelet、containerd、磁盘与网络。先 cordon 限制影响,再判断是否 drain;未知存储状态下不要强删 Pod。
调优停止条件
如果错误率上升、尾延迟恶化、OOM/重启增加、控制面限流或节点压力出现,应立即停止实验并回滚。性能优化必须同时保持正确性与可恢复性。
可复现记录模板
每次实验记录:集群版本、容器运行时、CNI/CSI 版本、命名空间、使用的 YAML Git 提交、开始与结束时间。命令输出至少保留对象状态、事件、关键日志和回滚结果。文中的占位符必须替换成自己的值,生产执行前应由第二人复核。
故障处理原则
- 先缩小影响面,不删除现场。
- 按对象状态—事件—日志—依赖顺序收集证据。
- 提出可证伪假设,一次只改变一个变量。
- 验证恢复后清理临时权限、调试 Pod、端口转发和测试数据。
完成检查
- 命令退出码为 0,目标对象状态与预期一致。
- 保存执行前后 YAML、事件与关键日志,确认没有把测试命名空间以外的对象改动。
- 故障演练完成后执行清理或回滚,再进行下一章。