按名称请求Kubernetes服务有时会失败。

3

我已经在Kubernetes上部署并公开了一个应用,但是请求的结果不一致 - 有时返回<200>,有时则是错误 - 可能是[Errno -2] Name or service not known或者[Errno -3] Temporary failure in name resolution

请求内容:

import requests

requests.get("http://someapp:1337")

错误信息:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='someapp', port=1337): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnecti
on object at 0x7eff4c274fa0>: Failed to establish a new connection: [Errno -2] Name or service not known'))

然而,当我使用IP发出请求时,它总是返回<200>

import requests
requests.get("http://10.90.34.73:1337")  # --> <200>

kubectl describe:

Name:              someapp
Namespace:         app
Labels:            <none>
Annotations:       <none>
Selector:          app=someapp
Type:              ClusterIP
IP Families:       <none>
IP:                10.103.244.53
IPs:               10.103.244.53
Port:              <unset>  1337/TCP
TargetPort:        1337/TCP
Endpoints:         10.90.34.73:1337
Session Affinity:  None
Events:            <none>

由于问题不稳定,我不确定接下来该怎么做。有什么想法吗?


你的服务的Pod是否出现了故障?除了你使用的这个IP地址之外,还有多少个Pod在该服务后面? - OneCricketeer
服务背后只有一个Pod,它已经启动,没有错误。暴露的Pod是一个worker,另一个应用程序(另一个Pod)每隔几秒钟检查一次。我还检查了使用服务名称进行请求需要很长时间-当它失败时,需要约20秒,当成功时,只有几个瞬间(> 1秒)连接。另一方面,现在我使用{SVCNAME}_SERVICE_HOST{SVCNAME}_SERVICE_PORT环境变量构建请求而不使用服务名称,并且使用IP进行连接每次都能立即成功(> 1秒)。 - jakubmatyszewski
1个回答

0

将服务定义中的协议更新为http而不是tcp。同时按其完全限定域名调用服务。

service-name.<namspace>.<cluster-domian>. 

尝试以这种方式调用服务,但我没有注意到任何变化。requests.get('http://someapp.app.svc.cluster.local:1337')不确定您在第一句话中的意思,因为您写了“更新http而不是http”。 - jakubmatyszewski
3
K8s的服务端口不能设为“http”,只能是/TCP/UDP - OneCricketeer
是的,我也发现K8s服务只支持TCP协议,而HTTP协议则是其底层协议。 - Manmohan Mittal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接