You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中Flask应用如何正确连接prometheus-operated服务?

问题

我在Kubernetes集群中部署了prometheus-operated服务,其服务信息如下:

NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)       AGE
prometheus-operated        ClusterIP   None             <none>        9090/TCP      13d

同时部署了一个Flask应用实例:

NAME                         READY   STATUS    RESTARTS   AGE
flask-app-7d59898b78-2j59f   1/1     Running   0          23m

我尝试在应用中通过以下代码发送GET请求连接prometheus-operated:

URL = "http://localhost:9090/api/v1/query_range"
PROMQL = ...
r1 = requests.get(url=URL, params=PROMQL)

但出现连接拒绝错误:

ConnectionError: HTTPConnectionPool(host='localhost', port=9090): Max retries exceeded with url: /api/v1/query_range?query= <<<my long query here>>>  (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fbbc01b6d60>: Failed to establish a new connection: [Errno 111] Connection refused'))

当Flask应用在Kubernetes集群外运行时连接正常,请问正确的连接URL是什么?

解答

问题原因

在Kubernetes集群内的Pod中,localhost指向Pod自身,而prometheus-operated服务并不运行在Flask应用所在的Pod里,因此会触发连接拒绝错误。

正确的连接URL

使用Kubernetes集群内部的服务域名访问即可,修改后的代码示例:

URL = "http://prometheus-operated:9090/api/v1/query_range"
PROMQL = ...
r1 = requests.get(url=URL, params=PROMQL)

说明

Kubernetes的CoreDNS组件会自动将集群内的服务名解析为对应的后端Pod地址,哪怕是ClusterIP为None的Headless服务,也可以直接通过服务名prometheus-operated访问,端口使用服务暴露的9090即可。这种方式比直接使用ClusterIP更稳定,服务IP变动时无需修改代码。

内容的提问来源于stack exchange,提问作者Nimander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:31:01