代码之家  ›  专栏  ›  技术社区  ›  Shruthi Bhaskar

在kubernetes中使用dns从另一个服务调用一个服务失败

  •  1
  • Shruthi Bhaskar  · 技术社区  · 7 年前

    我已经为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
    

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

    TA1Carbon Service山药

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

    TA2碳素服务山药

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

    下面是TA1碳和TA2碳的详细说明。

    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 TA1碳 正在下决心 100.67.24.69分80秒 导致超时。

    但是如果我蜷缩在 100.67.24.69分3000秒 从Ta2碳仓里面我得到一个 成功反应

    如果我改变我的服务yaml -端口:80 重新部署和测试 成功反应

    我发现库伯内特斯的这种行为很奇怪,不确定我是在犯错误还是在环境方面。

    我的问题是-

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

    如有任何意见,将不胜感激。请告诉我这里面少了什么。

    1 回复  |  直到 7 年前
        1
  •  1
  •   AlexBrand    7 年前

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

    有两种可能的解决方案:

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

    2. 设置 port 关于你的 ta1carbon 服务于 80 是的。

    我建议选择2。在这个场景中,您将利用kubernetes服务的强大功能。Kubernetes将在端口80上公开服务,但将请求发送到端口3000上支持服务的播客(因为 targetPort: 3000 )中。

    推荐文章