Kubernetes 系统组件指标

系统组件的指标可以更好地洞察其内部发生的情况。指标对于构建仪表盘和警报特别有用。

Kubernetes 组件以 Prometheus 格式发出指标。这种格式是结构化的纯文本,旨在方便人和机器阅读。

Kubernetes 中的指标

在大多数情况下,指标可通过 HTTP 服务器的 /metrics 端点获取。对于默认不暴露端点的组件,可以使用 --bind-address 标志启用它。

这些组件的示例

在生产环境中,你可能希望配置 Prometheus Server 或其他指标抓取器来定期收集这些指标,并将它们存储在某种时间序列数据库中。

请注意,kubelet 也通过 /metrics/cadvisor/metrics/resource/metrics/probes 端点暴露指标。这些指标的生命周期不同。

如果你的集群使用 RBAC,读取指标需要通过允许访问 /metrics 的 ClusterRole 的用户、组或 ServiceAccount 进行授权。例如:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
  - nonResourceURLs:
      - "/metrics"
    verbs:
      - get

指标生命周期

Alpha 指标 → 稳定指标 → 已弃用指标 → 隐藏指标 → 已删除指标

Alpha 指标不提供稳定性保证。这些指标可能随时被修改或删除。

稳定指标保证不改变。这意味着

  • 没有已弃用签名的稳定指标不会被删除或重命名
  • 稳定指标的类型不会被修改

已弃用指标计划删除,但仍可使用。这些指标包含关于其弃用版本的标注。

例如

  • 弃用之前

    # HELP some_counter this counts things
    # TYPE some_counter counter
    some_counter 0
    
  • 弃用之后

    # HELP some_counter (Deprecated since 1.15.0) this counts things
    # TYPE some_counter counter
    some_counter 0
    

隐藏指标不再发布供抓取,但仍可使用。要使用隐藏指标,请参阅显示隐藏指标部分。

已删除指标不再发布且无法使用。

显示隐藏指标

如上所述,管理员可以通过特定二进制文件的命令行标志启用隐藏指标。如果管理员错过了上一个版本中已弃用指标的迁移,此功能可用作应急方案。

标志 show-hidden-metrics-for-version 指定一个版本,你希望显示在该版本中已弃用的指标。版本表示为 x.y,其中 x 是主版本号,y 是次版本号。即使指标可能在补丁发布版本中被弃用,也无需补丁版本号,因为指标弃用策略是针对次版本号执行的。

该标志只能将其值设置为上一个次版本号。如果管理员将上一个版本设置为 show-hidden-metrics-for-version,则之前所有隐藏的指标都将发出。不允许使用过旧的版本,因为这违反了指标弃用策略。

以指标 A 为例,假设 A 在 1.n 版本中被弃用。根据指标弃用策略,我们可以得出以下结论

  • 1.n 版本中,该指标被弃用,并且默认会发出。
  • 1.n+1 版本中,该指标默认被隐藏,但可以通过命令行 show-hidden-metrics-for-version=1.n 发出。
  • 1.n+2 版本中,该指标应从代码库中移除。不再提供应急方案。

如果你从 1.12 版本升级到 1.13,但仍然依赖于在 1.12 中已弃用的指标 A,则应通过命令行设置隐藏指标:--show-hidden-metrics=1.12,并在升级到 1.14 之前记住删除此指标依赖。

组件指标

kube-controller-manager 指标

控制器管理器指标提供了对其性能和健康状况的重要洞察。这些指标包括常见的 Go 语言运行时指标(例如 go_routine 计数)和控制器特定指标(例如 etcd 请求延迟或 Cloudprovider(AWS、GCE、OpenStack)API 延迟),这些指标可用于衡量集群的健康状况。

从 Kubernetes 1.7 开始,提供了针对 GCE、AWS、Vsphere 和 OpenStack 的详细 Cloudprovider 存储操作指标。这些指标可用于监控持久卷操作的健康状况。

例如,对于 GCE,这些指标称为

cloudprovider_gce_api_request_duration_seconds { request = "instance_list"}
cloudprovider_gce_api_request_duration_seconds { request = "disk_insert"}
cloudprovider_gce_api_request_duration_seconds { request = "disk_delete"}
cloudprovider_gce_api_request_duration_seconds { request = "attach_disk"}
cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"}
cloudprovider_gce_api_request_duration_seconds { request = "list_disk"}

kube-scheduler 指标

功能状态: Kubernetes v1.21 [beta]

调度器暴露了可选指标,这些指标报告了所有运行中的 Pod 请求的资源和期望的限制。这些指标可用于构建容量规划仪表盘,评估当前或历史调度限制,快速识别因资源不足而无法调度的负载,并将实际使用情况与 Pod 的请求进行比较。

kube-scheduler 识别为每个 Pod 配置的资源请求和限制;当请求或限制不为零时,kube-scheduler 报告指标时间序列。时间序列用以下标签标记:

  • 命名空间 (namespace)
  • Pod 名称 (pod name)
  • Pod 调度的节点(如果尚未调度,则为空字符串)
  • 优先级 (priority)
  • 分配给该 Pod 的调度器
  • 资源名称(例如,cpu
  • 如果已知资源的单位(例如,cores

一旦 Pod 完成(restartPolicyNeverOnFailure,并且处于 SucceededFailed Pod 阶段;或者已被删除且所有容器处于终止状态),该时间序列将不再报告,因为调度器现在可以自由调度其他 Pod 运行。这两个指标称为 kube_pod_resource_requestkube_pod_resource_limit

这些指标暴露在 HTTP 端点 /metrics/resources。它们需要对 /metrics/resources 端点进行授权,通常由具有针对 /metrics/resources 非资源 URL 的 get 动词的 ClusterRole 授予。

在 Kubernetes 1.21 中,你必须使用 --show-hidden-metrics-for-version=1.20 标志来暴露这些 Alpha 稳定性指标。

kubelet 压力停滞信息 (PSI) 指标

功能状态: Kubernetes v1.33 [alpha]

作为 Alpha 功能,Kubernetes 允许你配置 kubelet 收集 Linux 内核针对 CPU、内存和 IO 使用情况的压力停滞信息 (PSI)。这些信息在节点、Pod 和容器级别收集。指标通过 /metrics/cadvisor 端点暴露,名称如下:

container_pressure_cpu_stalled_seconds_total
container_pressure_cpu_waiting_seconds_total
container_pressure_memory_stalled_seconds_total
container_pressure_memory_waiting_seconds_total
container_pressure_io_stalled_seconds_total
container_pressure_io_waiting_seconds_total

你必须启用 KubeletPSI 功能门控才能使用此功能。这些信息也通过汇总 API 暴露。

要求

压力停滞信息需要

禁用指标

你可以通过命令行标志 --disabled-metrics 明确关闭指标。如果某个指标导致性能问题,你可能希望这样做。输入是一个被禁用指标的列表(即 --disabled-metrics=metric1,metric2)。

指标基数强制

具有无界维度(unbounded dimensions)的指标可能会导致其所检测组件的内存问题。为了限制资源使用,你可以使用 --allow-metric-labels 命令行选项动态配置指标标签值的允许列表。

在 Alpha 阶段,该标志只能接受一系列映射作为指标标签允许列表。每个映射的格式为 <metric_name>,<label_name>=<allowed_labels>,其中 <allowed_labels> 是可接受标签名称的逗号分隔列表。

总体格式如下:

--allow-metric-labels <metric_name>,<label_name>='<allow_value1>, <allow_value2>...', <metric_name2>,<label_name>='<allow_value1>, <allow_value2>...', ...

这是一个示例

--allow-metric-labels number_count_metric,odd_number='1,3,5', number_count_metric,even_number='2,4,6', date_gauge_metric,weekend='Saturday,Sunday'

除了从 CLI 指定之外,还可以在配置文件中进行设置。你可以使用组件的 --allow-metric-labels-manifest 命令行参数指定配置文件的路径。以下是该配置文件的内容示例:

"metric1,label2": "v1,v2,v3"
"metric2,label1": "v1,v2,v3"

此外,元指标 cardinality_enforcement_unexpected_categorizations_total 记录了基数强制期间意外分类的计数,即每当遇到与允许列表约束不符的标签值时都会记录。

下一步

最后修改于 2025 年 4 月 8 日下午 3:42 PST:在 PSI 要求中添加 cgroup v2 (fd68ed8909)