使用 cAdvisor 和 Prometheus 监控未命名容器

Posted

技术标签:

【中文标题】使用 cAdvisor 和 Prometheus 监控未命名容器【英文标题】:Monitoring unnamed containers with cAdvisor and Prometheus 【发布时间】:2021-09-10 16:16:12 【问题描述】:

我有一个运行 Docker 容器化应用程序的实验主机。 cAdvisor 和 Prometheus 容器也在运行。

应用生成容器以运行与一组命名空间(可能是数千个命名空间)中的一个相关的作业,并使用 uuid 命名容器。 cAdvisor 可以选择这些,我可以看到每个容器在 prometheus 中的指标使用情况。这些容器的运行时间从几秒钟到大约一个小时不等。

我需要能够将命名空间 ID(来自容器中的 API 调用)与 prometheus 中的指标相关联,因为容器名称对于运行来说是唯一的,我需要命名空间 ID。

This doc 说不要使用很多不同的标签,因为它会生成很多单独的时间序列,但添加 kv 似乎是最方便的方法。

This doc 表示将 pushgateway 用于服务级别的批处理作业,并且由于我的容器与命名空间相关而不是与整个服务相关,因此使用它似乎不正确。

我每天可能有 5-10 个容器在不同的容器名称下运行,这些容器名称对应于应用程序中的相同命名空间,我需要一个跨越所有 5-10 个的时间序列。

进行这种关联的最佳方法是什么? 如何从容器内部向 prometheus 发送一些任意数据?

【问题讨论】:

【参考方案1】:

如果您需要通过某些特征来区分一组相同的指标,那么除了使用标签之外没有其他合理的方法。当标签过多或标签值过多时,就会出现标签和存储问题。请允许我向您展示此示例中的问题:

http_requestscode="200",client="8.8.8.8",uri="/hello"

只有三个标签,但每个标签都可以产生大量不同的时间序列。每个响应代码、客户端地址和访问 URL 的唯一组合一个。我想,您的命名空间 ID 具有有限且少量的可能值,因此不会造成任何伤害。独特的容器名称(cAdvisor 将它们公开为标签)甚至可能比命名空间 ID 产生更大的影响。

还有一种使用relabel_config 重写、添加或删除标签的方法。但是,如果您决定重写,该解决方案有点难以掌握并且很容易在腿部射击。如果可能的命名空间数量很少,我建议继续添加新标签。

【讨论】:

谢谢。我发现将自定义指标发布到推送网关是最好的。

以上是关于使用 cAdvisor 和 Prometheus 监控未命名容器的主要内容,如果未能解决你的问题,请参考以下文章

cadvisor 与 Prometheus 集成

故障样本 prometheus 和 cadvisor

cAdvisor+Prometheus+Grafana监控docker

我们如何在 prometheus 中导出 cadvisor 指标

cAdvisor + Prometheus + grafana的安装

Prometheus 未从 GKE 中的 cadvisor 接收指标