通过Prometheus查询计算Kubernetes集群中Pod 的CPU、内存使用率等指标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Prometheus查询计算Kubernetes集群中Pod 的CPU、内存使用率等指标相关的知识,希望对你有一定的参考价值。

参考技术A Kubernetes的kubelet组件内置了cadvisor,将Node上容器的指标以Prometheus支持的格式展示,可以通过这些指标计算得到更多有用的数据。

在Prometheus的配置文件中,配置了相关的Target之后,这些指标就可以从Prometheus中查询到。

直接访问Kubelet的apiserver接口,可以读取以Prometheus支持的格式呈现的指标:

从 man top 手册中找到了CPU使用率的定义:

即在过去的一段时间里进程占用的CPU时间与CPU总时间的比率,如果有多个CPU或者多核,需要将每个CPU的时间相加。
kubelet中的cadvisor采集的指标与含义,见: Monitoring cAdvisor with Prometheus 。

其中有几项是:

container_cpu_usage_seconds_total是container累计使用的CPU时间,用它除以CPU的总时间,就得到了容器的CPU使用率。
Pod 在1s内累计使用的CPU时间为:

container_spec_cpu_quota 是容器的CPU配额,它的值是:为容器指定的CPU个数*100000。
故,Pod在1s内CPU的总时间为:Pod的CPU核数 * 1s:

将上面两个公式的结果相除,就得到了容器的CPU使用率:

Pod 内存使用率的计算就简单多了,直接用内存实际使用量除以内存限制使用量即可:

查询通过 prometheus 节点导出器文本文件收集器公开的自定义指标失败

【中文标题】查询通过 prometheus 节点导出器文本文件收集器公开的自定义指标失败【英文标题】:Query on custom metrics exposed via prometheus node exporter textfile collector fails 【发布时间】:2018-11-19 02:13:57 【问题描述】:

我是 prometheus/alertmanager 的新手。

我创建了一个每分钟执行一次 shell 脚本的 cron 作业。这个 shell 脚本在分配给--textfile.collector.directory 参数(给节点导出器)的同一目录中生成“test.prom”文件(其中包含一个仪表度量)。我验证了(使用 curl http://localhost:9100/metrics)节点导出器正确地公开了该自定义指标。

当我尝试在 prometheus 仪表板中针对该自定义指标运行查询时,它没有显示任何结果(它说没有找到数据)。

我无法弄清楚为什么针对通过节点导出器文本文件收集器公开的指标的查询失败。 我错过了什么线索?另外请告诉我如何检查并确保普罗米修斯抓取了我的自定义指标“test_metric”?

我在普罗米修斯仪表板中的查询是test_metric != 0(在普罗米修斯仪表板中),但没有给出任何结果。但是我通过 node-exporter 文本文件暴露了test_metric

感谢任何帮助!

顺便说一句,node-exporter 在 Kubernetes 环境中作为 docker 容器运行。

【问题讨论】:

冷你添加更多细节:日志和yamls? 参数为--collector.textfile.directory="" 【参考方案1】:

我也遇到过类似情况,不过不是配置问题。

相反,我的数据包含时间戳:

# HELP network_connectivity_rtt Round Trip Time to each node
# TYPE network_connectivity_rtt gauge
network_connectivity_rtthost="home" 53.87 1541426242
network_connectivity_rtthost="hop_1" 58.8 1541426242
network_connectivity_rtthost="hop_2" 21.93 1541426242
network_connectivity_rtthost="hop_3" 71.69 1541426242

一旦我重新加载它,PNE 就会毫无问题地拿起它们。由于 prometheus 在 systemd 下运行,我不得不像这样检查日志:

journalctl --system -u prometheus.service --follow

我读到了这一行:

msg="Error on ingesting samples that are too old or are too far into the future"

删除时间戳后,值开始出现。这使我更详细地阅读了有关时间戳的信息,我发现它们必须以 毫秒 为单位。所以这个格式现在可以了:

# HELP network_connectivity_rtt Round Trip Time to each node
# TYPE network_connectivity_rtt gauge
network_connectivity_rtthost="home" 50.47 1541429581376
network_connectivity_rtthost="hop_1" 3.38 1541429581376
network_connectivity_rtthost="hop_2" 11.2 1541429581376
network_connectivity_rtthost="hop_3" 20.72 1541429581376

我希望它可以帮助别人。

【讨论】:

【参考方案2】:

这是我的错。我没有在 prometheus.yaml 文件中包含 node-exporter 的抓取指令。包含它们后它起作用了。

【讨论】:

【参考方案3】:

出现此问题是因为指标过时。 假设您已在 13.00 的文件中写入指标 默认情况下,普罗米修斯会在 5 分钟后认为您的指标过时,并且在您进行查询时它可能会从那里消失。

【讨论】:

以上是关于通过Prometheus查询计算Kubernetes集群中Pod 的CPU、内存使用率等指标的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 查询以计算唯一标签值

prometheus(或grafana)查询来评估grafana loki使用的存储?

Prometheus 查询语言

第七篇Prometheus PromQL 简单用法

如何使用 grafana singlestat 和 prometheus 计算正常运行时间百分比

Prometheus 查询计算 avg_over_time up-time,但想忽略 down-time 小于 1 分钟