无法使用Kubernetes中的DNS从另一服务中调用一项服务

时间:2018-06-28 17:28:13

标签: kubernetes kubernetes-service

我为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 }

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

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和ta2carbon的服务描述。

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>

因此,根据我的观察,对于网址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时超时!

对此表示感谢。请让我知道其中缺少什么。

1 个答案:

答案 0 :(得分:1)

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

有两种可能的解决方案:

  1. 修改您的应用程序源以向http://ta1carbon:3000

  2. 发出API请求
  3. port服务上的ta1carbon设置为80

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