从Kubernetes的码头工人处收集指标

时间:2018-01-16 14:59:29

标签: docker kubernetes

我与Docker和Kubernetes合作。 我想从每个Docker收集特定于应用程序的指标。 有各种应用程序,每个应用程序在一个或多个Dockers中运行。 我想收集JSON格式的指标,以便对每种指标进行进一步处理。

我正在努力了解什么是最佳做法,如果有的话,我可以用什么工具来实现我的目标。

目前我正在研究几个选项,没有一个看起来太好了:

  1. 连接到kubectl,获取pod列表,在每个pod上执行命令(exec)以使应用程序打印/发送带有度量标准的JSON。我不喜欢这个选项,因为这意味着我需要知道哪些pod存在并访问每个pod,而Kubernetes的重点是避免处理这个问题。

  2. 我正在寻找允许我提取特定文件的Kubernetes API HTTP GET请求。 我找到的最接近的是$xml.branches.branch,似乎不是我需要的。 再一次,它迫使我提到每个名字的流行音乐。

  3. 我考虑在Probe中使用ExecAction定期发送带有指标的JSON。这是一个hack(因为这不是Probe的目的),但它不需要处理每个特定的pod

  4. 我无法使用Prometheus,因为我无法控制,但我想知道Prometheus如何收集指标。也许我可以使用类似的方法?

  5. 任何可能的解决方案将不胜感激。

2 个答案:

答案 0 :(得分:1)

从架构的角度来看,这里有2个选项:

1)pull model:您的应用程序通过机制公开度量数据(例如在不同端口上使用HTTP协议),外部工具以定时间隔擦除您的pod(从k8s API获取pod地址) );这是普罗米修斯使用的模型。

2)push model:您的应用程序主动将度量标准推送到外部服务器,这是一个时间序列数据库,例如Influxdb,当它与它最相关时。

在我看来,选项2是最容易实现的,因为:

  • 您无需处理k8s API以发现pods地址;
  • 您无需创建本地存储层来存储指标(因为您会在它们出现时逐个推送它们);

但是有一个缺点:你需要小心如何实现它,它可能会导致你的API变慢,你可能需要处理对度量服务器的异步调用。

这显然是一个非常通用的答案,但我希望它可以指出你正确的方向。

答案 1 :(得分:1)

可惜你不能使用普罗米修斯,但它在这个范围内可以做的很好。 Prom的作用如下:

1:它假定您要抓取(收集)的指标暴露在Prometheus可以访问的某个http端点上。

2:它连接到kubernetes api以执行端点发现以从中获取指标(有一个配置,但通常它意味着它必须能够连接到API并列出服务/部署/ pod和分析他们的注释(因为他们有关于指标端点的信息)来组成一个地方列表以从中抓取数据

3:periodicaly(15s,60s等)它连接到端点并收集公开的指标。

那就是它。休息是存储/后处理。尽管如此,与kube相关的部分可能需要做大量的工作,因此最好选择已经存在的东西。

旁注:虽然这通常是一个基于拉动的模型,但有些情况下拉不可能(视短篇短文如php),这就是Prometheus pushgateway发挥作用,允许将指标推向普罗米修斯将拉动的地方从