【问题标题】:Failed to invoke one service from another service using DNS for services in kubernetes无法使用 DNS 为 kubernetes 中的服务从另一服务调用一项服务
【发布时间】:2018-06-29 01:49:16
【问题描述】:

我已经为 Kubernetes 建立了一个 AWS kops 集群,我有多个微服务,每个应用程序都需要相互交互。

场景:我的 ta2carbon 应用尝试通过服务(dns)名称调用 ta1carbon 应用中的函数。

结果:尝试访问端口 80(但配置了端口 -3000)失败并出现超时错误

我的 nodejs 应用程序控制台日志, apiUrl:http://ta1carbon/api/app1/app1Func2

{ Error: connect ETIMEDOUT 100.66.7.165:80
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
  code: 'ETIMEDOUT',
  errno: 'ETIMEDOUT',
  syscall: 'connect',
  address: '100.66.7.165',
  port: 80 }

当我尝试在 ta2carbon pod 中卷曲我的 ta1carbon 应用程序时,curl 的错误日志相同。

root@ta2carbon-5fdcfb97cc-8j4nl:/home/appHome# curl -i http://ta1carbon/api/app1/app1Func2
curl: (7) Failed to connect to ta1carbon port 80: Connection timed out

但我在 service.yaml 中定义的端口是 3000 而不是 80! 以下是两个微服务的服务的 yml 配置。

ta1carbon 服务 yaml

apiVersion: v1
kind: Service
metadata:
  name: ta1carbon
  labels:
    app: ta1carbon
spec:
  ports:
  - port: 3000
    targetPort: 3000
  type: ClusterIP
  selector:
    app: ta1carbon

ta2carbon 服务 yaml

apiVersion: v1
kind: Service
metadata:
  name: ta2carbon
  labels:
    app: ta2carbon
spec:
  ports:
  - port: 3001
    targetPort: 3001
  type: ClusterIP
  selector:
    app: ta2carbon

以下是 ta1carbon 和 ta2 carbon 的描述服务详情。

kubectl describe service ta1carbon
Name:              ta1carbon
Namespace:         default
Labels:            app=ta1carbon
Annotations:       <none>
Selector:          app=ta1carbon
Type:              ClusterIP
IP:                100.66.7.165
Port:              <unset>  3000/TCP
TargetPort:        3000/TCP
Endpoints:         100.96.1.13:3000
Session Affinity:  None
Events:            <none>

kubectl describe service ta2carbon
Name:              ta2carbon
Namespace:         default
Labels:            app=ta2carbon
Annotations:       <none>
Selector:          app=ta2carbon
Type:              ClusterIP
IP:                100.67.129.126
Port:              <unset>  3001/TCP
TargetPort:        3001/TCP
Endpoints:         100.96.1.12:3001
Session Affinity:  None
Events:            <none>

所以根据我的观察,对于 url http://ta1carbon/api/app1/app1Func2 服务 dns ta1carbon 正在解析为 100.67.24.69:80 导致超时。

但是,如果我从 ta2carbon 吊舱内卷曲到 100.67.24.69:3000,我会得到 成功响应

另外,如果我更改我的服务 yaml - 端口:80 并再次部署和测试,我会得到 成功响应

我发现 kubernetes 中的这种行为很奇怪,不确定天气是我犯了错误还是环境问题。

我的查询是 -

为什么将服务 ta1carbon 解析为 100.67.24.69:80 并超时,而端口应该是 3000!

对此的任何意见将不胜感激。请让我知道其中缺少什么。

【问题讨论】:

  • 是否可以同时向 AWS 团队(AWS 中的 Kubernetes 专家)提出问题?

标签: kubernetes kubernetes-service


【解决方案1】:

DNS 将域名解析为 IP 地址,而不是 IP 地址 + 端口。

有两种可能的解决方案:

  1. 修改您的应用程序源以向 http://ta1carbon:3000 发出 API 请求

  2. 将ta1carbon 服务上的port 设置为80。

我建议使用选项 2。在这种情况下,您将利用 Kubernetes 服务的强大功能。 Kubernetes 将在端口 80 上公开服务,但向支持端口 3000 上的服务的 pod 发送请求(因为targetPort: 3000)。

【讨论】:

  • 谢谢,我已经尝试过第二个选项了。现在也尝试了第一个选项,两者都有效。但是我想了解,如果我将端口和目标端口定义为 3000 作为默认服务,我的服务名称 ta1carbon 不应该正确解析吗?为什么会导致超时?
  • @ShruthiBhaskar 这是因为 Kubernetes 服务发现是由 DNS 支持的,DNS 不会告诉你的应用程序它应该使用哪个端口号。换句话说,当您的应用程序要求 DNS 解析“ta1carbon”时,DNS 会以应用程序可以用来与服务对话的 IP 地址进行响应。 DNS 不会告诉应用程序使用哪个端口。知道使用哪个端口是应用程序的责任。 Kubernetes 使用您可以在应用程序中使用的端口号公开环境变量。在你的情况下:TA1CARBON_SERVICE_PORT
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2015-11-10
相关资源
最近更新 更多