运维实战

Kubernetes 可观测性与故障排查:日志、指标、事件和性能调优

建立事件、日志、指标和追踪的证据链,用固定顺序排查 Pending、CrashLoopBackOff、网络和性能问题。

TY
Tycho
技术博主
• 2026-09-21 • 16 分钟阅读 • 3 次浏览
Kubernetes 可观测性与故障排查:日志、指标、事件和性能调优

实验基线: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> --previous

Kubernetes 不内置集群级日志后端;容器日志需要节点代理采集到集中系统。日志、指标和追踪必须带命名空间、Pod、容器、工作负载与请求关联字段。

按状态排障

现象优先检查
Pending调度事件、requests、PVC、污点和亲和性
ImagePullBackOff镜像名、凭据、DNS、出口网络
CrashLoopBackOffprevious 日志、退出码、配置、探针
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

  1. 查看 Pod UID、重启次数和 waiting reason。
  2. 用 logs --previous读取上一次崩溃日志。
  3. 查看退出码:137 常见于 SIGKILL/OOM,1 通常是应用错误。
  4. 核对 ConfigMap/Secret、命令参数、探针和挂载。
  5. 修复声明式配置并观察 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

故障场景:延迟升高

  1. 按版本、可用区、Pod 对比错误率和尾延迟。
  2. 检查 CPU throttling、GC、内存压力和连接池。
  3. 检查 Service 后端是否减少、DNS 与下游延迟。
  4. 对照发布、扩缩容、节点维护和配置变更时间。
  5. 回滚单一变量,确认指标恢复再定根因。

控制面观测

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 提交、开始与结束时间。命令输出至少保留对象状态、事件、关键日志和回滚结果。文中的占位符必须替换成自己的值,生产执行前应由第二人复核。

故障处理原则

  1. 先缩小影响面,不删除现场。
  2. 按对象状态—事件—日志—依赖顺序收集证据。
  3. 提出可证伪假设,一次只改变一个变量。
  4. 验证恢复后清理临时权限、调试 Pod、端口转发和测试数据。

完成检查

  • 命令退出码为 0,目标对象状态与预期一致。
  • 保存执行前后 YAML、事件与关键日志,确认没有把测试命名空间以外的对象改动。
  • 故障演练完成后执行清理或回滚,再进行下一章。

官方资料

TY

Tycho

热爱分享技术知识,帮助开发者成长。

评论 (0)

评论功能当前已关闭
暂无评论,快来抢沙发吧!