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 开始,详细的 Cloudprovider 指标可用于 GCE、AWS、Vsphere 和 OpenStack 的存储操作。 这些指标可用于监控持久卷操作的运行状况。
例如,对于 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-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
元指标记录了在基数强制执行期间意外分类的计数,也就是说,每当遇到相对于允许列表约束不允许的标签值时,就会记录计数。
下一步是什么
- 阅读关于指标的 Prometheus 文本格式
- 查看 稳定的 Kubernetes 指标列表
- 阅读关于 Kubernetes 弃用策略