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采集自定义指标数据