Kubernetes 系统组件指标
系统组件指标可以更好地了解它们内部发生的事情。指标对于构建仪表盘和警报特别有用。
Kubernetes 组件以 Prometheus 格式 发出指标。这种格式是结构化的纯文本,旨在供人和机器都能读取。
Kubernetes 中的指标
在大多数情况下,指标在 HTTP 服务器的 /metrics
端点上可用。对于默认情况下不公开端点的组件,可以使用 --bind-address
标志启用它。
这些组件的示例
在生产环境中,您可能希望配置 Prometheus Server 或其他指标抓取器来定期收集这些指标,并将它们提供给某种时间序列数据库。
请注意,kubelet 也在 /metrics/cadvisor
、/metrics/resource
和 /metrics/probes
端点中公开指标。这些指标的生命周期不同。
如果您的集群使用 RBAC,读取指标需要通过具有 ClusterRole 的用户、组或 ServiceAccount 进行授权,该角色允许访问 /metrics
。例如
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 会报告指标时间序列。时间序列由以下内容标记:
- 命名空间
- Pod 名称
- Pod 所调度到的节点或未调度时为空字符串
- 优先级
- 为该 Pod 分配的调度器
- 资源的名称(例如,
cpu
) - 资源的单位(如果已知)(例如,
cores
)
一旦 Pod 完成(具有 restartPolicy
为 Never
或 OnFailure
且处于 Succeeded
或 Failed
Pod 阶段,或已被删除且所有容器都处于终止状态),该序列将不再报告,因为调度器现在可以自由调度其他 Pod 运行。这两个指标称为 kube_pod_resource_request
和 kube_pod_resource_limit
。
这些指标在 HTTP 端点 /metrics/resources
上公开,需要与调度器上 /metrics
端点的相同授权。您必须使用 --show-hidden-metrics-for-version=1.20
标志来公开这些 alpha 稳定性指标。
禁用指标
您可以通过命令行标志 --disabled-metrics
明确关闭指标。例如,如果指标导致性能问题,您可能需要这样做。输入是一个禁用的指标列表(即 --disabled-metrics=metric1,metric2
)。
指标基数强制
具有无界维度的指标可能会导致对其进行检测的组件出现内存问题。为了限制资源使用,您可以使用 --allow-label-value
命令行选项来动态配置指标标签值的允许列表。
在 alpha 阶段,该标志只能接受一系列映射作为指标标签允许列表。每个映射的格式为 <metric_name>,<label_name>=<allowed_labels>
,其中 <allowed_labels>
是可接受的标签名称的逗号分隔列表。
整体格式如下所示
--allow-label-value <metric_name>,<label_name>='<allow_value1>, <allow_value2>...', <metric_name2>,<label_name>='<allow_value1>, <allow_value2>...', ...
以下是一个示例
--allow-label-value 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
命令行参数向组件指定该配置文件的路径。以下是该配置文件内容的示例
allow-list:
- "metric1,label2": "v1,v2,v3"
- "metric2,label1": "v1,v2,v3"
此外,cardinality_enforcement_unexpected_categorizations_total
元指标记录了在基数强制执行期间意外分类的计数,即,每当遇到相对于允许列表约束不允许的标签值时。
下一步
- 阅读有关 Prometheus 文本格式 的指标
- 查看 稳定的 Kubernetes 指标 列表
- 阅读有关 Kubernetes 弃用策略