Skip to content

Kubernetes 可观测性:指标、日志与事件 ​

Kubernetes 可观测性 ​

可观测性分层 ​

层次重点信号常见来源
用户体验成功率、延迟、吞吐、业务正确性应用指标、网关、Tracing
工作负载Ready、副本、重启、OOM、资源和队列kube-state-metrics、kubelet、应用
数据面DNS、Service、丢包、连接、Ingress/GatewayCNI、CoreDNS、代理、LB
节点CPU、内存、磁盘、inode、网络、压力node exporter、kubelet、OS
控制面API 延迟/错误、etcd、调度、控制器队列组件 /metrics、日志
变更与安全谁在何时修改了什么API audit、部署事件、GitOps

先定义用户 SLI/SLO,再建立支撑层告警。只看 CPU 或 Pod Running 无法说明业务正常。

指标来源 ​

  • Metrics Server 提供 kubectl top 和 HPA Resource Metrics,通常不是长期监控库。
  • kube-state-metrics 把 API 对象状态转换为 Prometheus 指标,不采集容器实际 CPU。
  • kubelet/cAdvisor 提供节点、Pod 和容器资源指标;可用指标随版本/运行时变化。
  • 应用和网关 暴露请求、错误、延迟、队列和业务指标。
  • 控制面组件 暴露 /metrics;托管服务可能限制访问并提供云监控替代。
bash
kubectl top nodes
kubectl top pods -A --containers
kubectl get --raw='/apis/metrics.k8s.io/v1beta1/nodes' | jq '.items | length'

指标标签与基数 ​

不要把 user ID、request ID、完整 URL、Pod UID 等无界值放指标标签。高基数会消耗内存、存储和查询资源。建议:

  • 标签用稳定的 service、namespace、cluster、status class、route template。
  • 请求 ID 放日志/Trace,不放指标标签。
  • 记录原始状态码时也提供聚合后的 2xx/4xx/5xx。
  • 对短命 Job/Pod 调整保留和聚合规则,避免序列持续增长。

日志 ​

容器写 stdout/stderr,由节点日志代理集中采集。应用日志应:

  • 结构化输出,字段包含时间、级别、service、trace ID、稳定错误码。
  • 不记录密码、Token、卡号、个人敏感字段或完整请求体。
  • 多行堆栈有统一解析规则,避免每行变成独立事件。
  • 设置采样、速率限制和保留策略,错误风暴不会写满节点磁盘。
  • 时钟同步,统一 UTC 或明确时区。
bash
kubectl -n demo logs deployment/web --all-containers --since=15m --timestamps
kubectl -n demo logs pod/web-abc -c web --previous

kubectl logs 用于即时诊断;Pod 删除、日志轮转或节点故障后可能不可用。

Event ​

bash
kubectl -n demo get events --sort-by=.lastTimestamp
kubectl -n demo events --for pod/web-abc
kubectl get events -A --field-selector=type=Warning

Event 适合解释调度、拉镜像、挂载、探针和驱逐,但会聚合、限流和过期。关键 Event 应被采集或转成指标,仍不能代替审计日志。

分布式追踪 ​

使用 OpenTelemetry 等标准传递 trace context,采样策略覆盖错误、慢请求和少量正常流量。Trace 应跨网关、服务、队列消费者和数据库客户端;异步链路需明确 producer/consumer 关联。

追踪后端同样可能包含敏感参数,Span 属性遵守最小化原则。不要为了追踪在所有请求中记录完整 SQL、Header 或消息体。

API 审计 ​

API Audit 记录请求阶段、身份、verb、资源、响应码等。审计级别 Metadata、Request、RequestResponse 的成本和敏感度逐级增加;Secret、TokenReview 等资源通常不记录正文。

必须监控审计后端失败与磁盘使用,审计策略变更也纳入审批。托管集群在云审计产品中配置,核对默认是否开启及保留多久。

v1.36 组件诊断端点 ​

v1.36 中组件 /statusz 和 /flagz 能力进入 Beta,可显示启动时间、版本和有效启动参数,是否开放取决于 Feature Gate、组件和授权。启动参数可能泄露内部路径或拓扑,只给受控运维身份。

bash
kubectl get --raw='/version'
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/livez?verbose'

403 表示当前身份无相应非资源 URL 权限,不要为方便直接授予宽泛 / 或 *。

SLO 与告警 ​

推荐以症状为主、原因为辅:

  1. 页面告警:用户成功率/延迟违反多窗口 Burn Rate、核心服务完全不可用、数据安全风险。
  2. 工单告警:容量趋势、证书临近过期、版本 EOL、备份失败、资源长期浪费。
  3. 诊断信号:Pod 重启、单节点高 CPU 等,只有影响 SLO 或持续异常时升级。

每条告警包含:影响、集群/命名空间/工作负载、Dashboard、Runbook、最近变更和静默/升级规则。避免为每个 Pod 短暂重启呼叫值班。

关键告警建议 ​

  • Deployment 可用副本不足、StatefulSet 更新卡住、DaemonSet 未就绪。
  • CrashLoop/OOM/探针失败持续,Pending 超过调度 SLO。
  • API 错误率和延迟、etcd 无 Leader/空间/延迟、调度器队列异常。
  • 节点 NotReady、Memory/Disk/PID Pressure、磁盘/inode/证书接近阈值。
  • CoreDNS 错误/延迟、CNI 地址耗尽、Ingress 5xx、无 EndpointSlice。
  • PVC Pending、容量接近满、CSI 操作失败、快照/备份失败。
  • HPA 达上限仍过载、指标不可用、节点扩容失败。
  • RBAC/准入关键变更、异常 exec、审计流中断。

变更关联 ​

把部署版本、Git SHA、配置版本和变更单作为低基数元数据发送到监控系统。事故时间线同时展示:

  • Deployment rollout、ConfigMap/Secret 引用变化。
  • 节点池、CNI/CSI/Ingress 和控制面升级。
  • HPA/副本/流量变化。
  • 上游依赖与云平台事件。

可观测性的价值是缩短发现与定位时间;Dashboard 数量不是目标。每季度用演练验证“从告警到根因和恢复”链路。

Kubernetes EFK 日志组件职责 ​

K8s日志 ​

  • 日志记录代理(logging-agent):日志记录代理用于从容器中获取日志信息,使用Fluentd;官网
  • 日志记录后台(Logging-Backend):日志记录后台用于处理日志记录代理推送过来的日志,使用Elasticsearch;官网
  • 日志记录展示:日志记录展示用于向用户显示统一的日志信息,使用Kibana官网

继续阅读