1 - Kubernetes 组件 SLI 指标

用于衡量 Kubernetes 组件可靠性和性能的高级指标。

This is a stable feature in Kubernetes, and has been since version 1.29. It was first available in the v1.26 release. You can no longer disable or opt of of this behavior.

默认情况下,Kubernetes 1.34 会为每个 Kubernetes 组件的二进制文件发布服务等级指标(SLI)。 此指标端点被暴露在每个组件提供 HTTPS 服务的端口上,路径为 /metrics/slis。 从 v1.27 版本开始,对每个 Kubernetes 组件而言, ComponentSLIs 特性门控都是默认启用的。

SLI 指标

启用 SLI 指标时,每个 Kubernetes 组件暴露两个指标,按照健康检查添加标签:

  • 计量值(表示健康检查的当前状态)
  • 计数值(记录观察到的每个健康检查状态的累计次数)

你可以使用此指标信息计算每个组件的可用性统计信息。例如,API 服务器检查 etcd 的健康。 你可以计算并报告 etcd 的可用或不可用情况,具体由其客户端(即 API 服务器)进行报告。

Prometheus 计量表数据看起来类似于:

# HELP kubernetes_healthcheck [ALPHA] This metric records the result of a single healthcheck.
# TYPE kubernetes_healthcheck gauge
kubernetes_healthcheck{name="autoregister-completion",type="healthz"} 1
kubernetes_healthcheck{name="autoregister-completion",type="readyz"} 1
kubernetes_healthcheck{name="etcd",type="healthz"} 1
kubernetes_healthcheck{name="etcd",type="readyz"} 1
kubernetes_healthcheck{name="etcd-readiness",type="readyz"} 1
kubernetes_healthcheck{name="informer-sync",type="readyz"} 1
kubernetes_healthcheck{name="log",type="healthz"} 1
kubernetes_healthcheck{name="log",type="readyz"} 1
kubernetes_healthcheck{name="ping",type="healthz"} 1
kubernetes_healthcheck{name="ping",type="readyz"} 1

而计数器数据看起来类似于:

# HELP kubernetes_healthchecks_total [ALPHA] This metric records the results of all healthcheck.
# TYPE kubernetes_healthchecks_total counter
kubernetes_healthchecks_total{name="autoregister-completion",status="error",type="readyz"} 1
kubernetes_healthchecks_total{name="autoregister-completion",status="success",type="healthz"} 15
kubernetes_healthchecks_total{name="autoregister-completion",status="success",type="readyz"} 14
kubernetes_healthchecks_total{name="etcd",status="success",type="healthz"} 15
kubernetes_healthchecks_total{name="etcd",status="success",type="readyz"} 15
kubernetes_healthchecks_total{name="etcd-readiness",status="success",type="readyz"} 15
kubernetes_healthchecks_total{name="informer-sync",status="error",type="readyz"} 1
kubernetes_healthchecks_total{name="informer-sync",status="success",type="readyz"} 14
kubernetes_healthchecks_total{name="log",status="success",type="healthz"} 15
kubernetes_healthchecks_total{name="log",status="success",type="readyz"} 15
kubernetes_healthchecks_total{name="ping",status="success",type="healthz"} 15
kubernetes_healthchecks_total{name="ping",status="success",type="readyz"} 15

使用此类数据

组件 SLI 指标端点旨在以高频率被抓取。 高频率抓取意味着你最终会获得更细粒度的计量信号,然后可以将其用于计算 SLO。 /metrics/slis 端点为各个 Kubernetes 组件提供了计算可用性 SLO 所需的原始数据。

2 - CRI Pod 和容器指标

通过 CRI 收集 Pod 和容器指标
特性状态: Kubernetes v1.23 [alpha]

kubelet 通过 cAdvisor 收集 Pod 和容器指标。作为一个 Alpha 特性, Kubernetes 允许你通过容器运行时接口(CRI) 配置收集 Pod 和容器指标。要使用基于 CRI 的收集机制,你必须启用 PodAndContainerStatsFromCRI 特性门控 并使用兼容的 CRI 实现(containerd >= 1.6.0, CRI-O >= 1.23.0)。

CRI Pod 和容器指标

当启用 PodAndContainerStatsFromCRI 时,kubelet 轮询底层容器运行时以获取 Pod 和容器统计信息,而不是直接使用 cAdvisor 检查主机系统。同直接使用 cAdvisor 收集信息相比,依靠容器运行时获取这些信息的好处包括:

  • 潜在的性能改善,如果容器运行时在正常操作中已经收集了这些信息。 在这种情况下,这些数据可以被重用,而不是由 kubelet 再次进行聚合。
  • 这种做法进一步解耦了 kubelet 和容器运行时。 对于使用 kubelet 来在主机上运行进程的容器运行时,其行为可用 cAdvisor 观测; 对于其他运行时(例如,使用虚拟化的容器运行时)而言, 这种做法提供了允许收集容器运行时指标的可能性。

3 - 节点指标数据

访问 kubelet 所观测到的节点、卷、Pod 和容器级别指标的机制。

kubelet 在节点、卷、Pod 和容器级别收集统计信息, 并在 Summary API 中输出这些信息。

你可以通过 Kubernetes API 服务器将代理的请求发送到 stats Summary API。

下面是一个名为 minikube 的节点的 Summary API 请求示例:

kubectl get --raw "/api/v1/nodes/minikube/proxy/stats/summary"

下面是使用 curl 所执行的相同 API 调用:

# 你需要先运行 "kubectl proxy"
# 更改 8080 为 "kubectl proxy" 指派的端口
curl http://localhost:8080/api/v1/nodes/minikube/proxy/stats/summary

概要指标 API 源

默认情况下,Kubernetes 使用 kubelet 内运行的嵌入式 cAdvisor 获取节点概要指标数据。如果你在自己的集群中启用 PodAndContainerStatsFromCRI 特性门控, 且你通过容器运行时接口(CRI)使用支持统计访问的容器运行时, 则 kubelet 将使用 CRI 来获取 Pod 和容器级别的指标数据, 而不是 cAdvisor 来获取。

压力停滞信息(PSI)

特性状态: Kubernetes v1.34 [beta]

作为 Beta 级别特性,Kubernetes 允许你配置 kubelet 来收集 Linux 内核的压力停滞信息(PSI) 的 CPU、内存和 I/O 使用情况。这些信息是在节点、Pod 和容器级别上收集的。 详细模式请参见 Summary API。 此特性默认启用,通过 KubeletPSI 特性门控管理。 这些信息也在 Prometheus 指标中暴露。

参见了解 PSI 指标, 学习如何解读 PSI 指标。

要求

压力停滞信息要求:

接下来

集群故障排查任务页面讨论了如何使用依赖这些数据的指标管道。

4 - Kubernetes z-pages

为 Kubernetes 组件提供运行时诊断,展示组件运行状态和配置标志的监测信息。
特性状态: Kubernetes v1.32 [alpha]

Kubernetes 的核心组件可以暴露一系列 z-endpoints,以便用户更轻松地调试他们的集群及其组件。 这些端点仅用于人工检查,以获取组件二进制文件的实时调试信息。请不要自动抓取这些端点返回的数据; 在 Kubernetes 1.34 中,这些是 Alpha 特性,响应格式可能会在未来版本中发生变化。

z-pages

Kubernetes v1.34 允许你启用 z-pages 来帮助排查其核心控制平面组件的问题。 这些特殊的调试端点提供与正在运行的组件有关的内部信息。对于 Kubernetes 1.34, 这些组件提供以下端点(当启用 z-pages 后):

statusz

使用 ComponentStatusz 特性门控启用后, /statusz 端点显示有关组件的高级信息,例如其 Kubernetes 版本、仿真版本、启动时间等。

来自 API 服务器的 /statusz 响应类似于:

kube-apiserver statusz
Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is for debugging purposes only.

Started: Wed Oct 16 21:03:43 UTC 2024
Up: 0 hr 00 min 16 sec
Go version: go1.23.2
Binary version: 1.32.0-alpha.0.1484+5eeac4f21a491b-dirty
Emulation version: 1.32.0-alpha.0.1484

flagz

使用 ComponentFlagz 特性门控启用后, /flagz 端点为你显示用于启动某组件的命令行参数。

API 服务器的 /flagz 数据看起来类似于:

kube-apiserver flags
Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is for debugging purposes only.

advertise-address=192.168.8.2
contention-profiling=false
enable-priority-and-fairness=true
profiling=true
authorization-mode=[Node,RBAC]
authorization-webhook-cache-authorized-ttl=5m0s
authorization-webhook-cache-unauthorized-ttl=30s
authorization-webhook-version=v1beta1
default-watch-cache-size=100