k8s 上的 Prometheus 自定义指标服务发现

Posted

技术标签:

【中文标题】k8s 上的 Prometheus 自定义指标服务发现【英文标题】:Prometheus custom metric service discovery on k8s 【发布时间】:2021-10-11 17:43:43 【问题描述】:

我正在尝试通过将 http“metrics”服务(与我的主要服务在同一个 pod 上运行)公开为 k8s 端点来向 Prometheus 报告自定义指标。但是从 prometheus 的 pod 到我的指标端点的连接尝试被拒绝(即使我可以使用 wget:8010 从 prometheus pod 访问我的主要服务)。似乎我已经暴露了主要服务端口,但是有什么东西阻止了同一个 pod 上我的指标端口的流量?帮助!

kubectl get svc mysvc
NAME       TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
mysvc      LoadBalancer   10.106.36.79   localhost     8767:31285/TCP,8010:30953/TCP   3m23s
kubectl describe ep mysvc
Name:         mysvc
Namespace:    default
Labels:       app.kubernetes.io/managed-by=Helm
Annotations:  endpoints.kubernetes.io/last-change-trigger-time: 2021-08-06T22:37:54Z
Subsets:
  Addresses:          10.1.18.170
  NotReadyAddresses:  <none>
  Ports:
    Name      Port  Protocol
    ----      ----  --------
    metrics   8767  TCP
    mysvcport 8010  TCP

Events:  <none>

Prometheus 尝试从“metrics”端点获取指标,但报告: “获取“http://10.1.18.170:8767/metrics”:拨打 tcp 10.1.18.170:8767:连接:连接被拒绝”

我可以确认无法从 prometheus pod 访问 mysvc:8767,但 mysvc:8010 可以!

在 mysvc 的 pod 上,我可以通过 localhost:8767 访问我的指标服务,但不能通过 mysvc:8767。

【问题讨论】:

你能给我们看看你的 pod 吗?我觉得你提到On mysvc's pod, I can reach my metrics service via localhost:8767 很有趣,我不认为localhost 会路由到另一个容器。您能否验证在您的指标容器中执行curl localhost:8767/metrics 时获得了有效结果? 【参考方案1】:

在这种情况下,8767 端口只暴露在 Pod 的 localhost 接口(127.0.0.1)上,而不暴露在 Pod 的公共网络接口上。

您可以通过在 Pod 中执行 exec 并运行类似以下内容来验证这一点:

netstat -tulpn

如果显示为127.0.0.1:8767,则该端口仅在 localhost 接口上公开,无法从 Pod 外部访问。

要更改这一点,您必须确保在指标容器的代码中将端口公开为 0.0.0.0:8767:8767 或在 Pod 的公共网络接口上公开端口的类似符号。

【讨论】:

感谢 weibeld,我太专注于 k8s/docker 配置了!

以上是关于k8s 上的 Prometheus 自定义指标服务发现的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 使用Prometheus采集自定义指标数据

SpringBoot 使用Prometheus采集自定义指标数据

Prometheus 添加自定义指标

十七,k8s集群指标API及自定义API

Hpa 没有获取现有的自定义指标?

prometheus自定义metrics