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
相关产品推荐
相关产品推荐

