系统组件的指标可以让我们更好的看清系统内部究竟发生了什么,尤其对于构建仪表盘和告警都非常有用。
Kubernetes 控制面板中的指标是以 prometheus 格式发出的,而且是易于阅读的。
在大多数情况下,指标在 HTTP 服务器的 /metrics
端点使用,对于默认情况下不暴露端点的组件,可以使用 --bind-address
参数启用。
举例下面这些组件:
在生产环境中,你可能需要配置 Prometheus Server 或其他指标收集器来定期收集这些指标,并使它们在某种时间序列数据库中可用。
请注意 kubelet一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。
同样在 /metrics/cadvisor
、/metrics/resource
和 /metrics/probes
等端点提供性能指标。这些指标的生命周期并不相同。
如果你的集群还使用了 RBAC管理授权决策,允许管理员通过 Kubernetes API 动态配置访问策略。
,那读取指标数据的时候,还需要通过具有 ClusterRole 的用户、组或者 ServiceAccount 来进行授权,才有权限访问 /metrics
。
举例:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- nonResourceURLs:
- "/metrics"
verbs:
- get
内测版指标 → 稳定版指标 → 弃用指标 → 隐藏指标 → 删除
内测版指标没有任何稳定性保证,因此可能随时被修改或删除。
稳定版指标可以保证不会改变,具体的说,稳定就意味着:
弃用指标表明这个指标最终将会被删除,要想查找是哪个版本,你需要检查其注释,注释中包括该指标从哪个 kubernetes 版本被弃用。
指标弃用前:
# 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
,但仍然需要依赖指标 A
,你可以通过命令行设置隐藏指标 --show-hidden-metrics=1.12
,但是在升级到 1.14
时就必须要删除这个指标的依赖,因为这个版本中这个指标已经被删除了。
控制器管理器指标提供了有关控制器管理器性能和运行状况的重要见解。这些指标包括常见的一些 Go 语言运行时的重要指标(比如 go_routine 的数量)和一些控制器的特定指标(比如 etcd 的请求时延),还有一些云供应商(比如 AWS、GCE、OpenStack)的 API 请求延迟,用来评估集群的整体运行状况。
从 Kubernetes 1.7 开始,详细的云供应商指标便可用于 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"}
此页是否对您有帮助?
感谢反馈。如果您有一个关于如何使用 Kubernetes 的特定的、需要答案的问题,可以访问 Stack Overflow. 在 GitHub 仓库上登记新的问题 报告问题 或者 提出改进建议.