【问题标题】:Connection Refused between Kubernetes pods in the same cluster同一集群中 Kubernetes pod 之间的连接被拒绝
【发布时间】:2021-04-19 20:02:20
【问题描述】:

我是 Kubernetes 新手,我正在努力在新的 Kubernetes 集群中部署应用程序。

目前,运行的服务有多个需要相互通信的 pod。我正在寻找一种通用的方法来调试问题,而不是进入服务的指定,因为问题会变得过于具体。

集群内的 Pod 抛出错误: err="Get \"http://testpod.mynamespace.svc.cluster.local:8080/": dial tcp 10.10.80.100:8080: connect: connection refused" 两个 pod 都在同一个集群中。

调试此问题的最佳步骤是什么?

我尝试过运行: kubectl exec -it testpod --namespace mynamespace -- cat /etc/resolv.conf 这会返回: search mynamespace.svc.cluster.local svc.cluster.local cluster.local us-east-2.compute.internal 我在这里找到的:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

【问题讨论】:

  • 我猜这是因为您的 pod 绑定到 127.0.0.1 而不是 0.0.0.0(这是最近的一个常见主题);此外,这些 URL 通常用于 Service 名称,而不是 Pod 名称,因此请注意您请求的对象是您认为自己是的对象

标签: kubernetes kubernetes-pod


【解决方案1】:

首先,如下模式:

my-svc.my-namespace.svc.cluster-domain.example

仅适用于FQDNs of Services,不适用于具有以下形式的Pods

pod-ip-address.my-namespace.pod.cluster-domain.example

例如:

172-17-0-3.default.pod.cluster.local

所以实际上您查询的是关于名为 testpodService 的 FQDN 的集群 dns,而不是关于 Pod 的 FQDN。从它被成功解决的事实来看,这样的Service 已经存在于您的集群中,但很可能配置错误。您收到错误消息 connection refused 的事实可能意味着:

  1. 您的Service FQDN testpod.mynamespace.svc.cluster.local 已成功解决 (否则你会收到curl: (6) Could not resolve host: testpod.default.svc.cluster.local之类的东西)
  2. 您已成功到达您的testpod Service (否则,即如果它存在但未在 8080 端口上侦听,则您正在尝试连接,您将收到 timeout 例如curl: (7) Failed to connect to testpod.default.svc.cluster.local port 8080: Connection timed out
  3. 你已经到达Pod,由testpodService暴露(你已经被testpodService重定向到它)
  4. 但是一旦到达Pod,您就试图连接到错误的端口,这就是连接被服务器拒绝的原因

我最好的猜测是您的 Pod 实际上侦听不同的端口,例如 80 但您通过仅指定 --port 值例如通过 ClusterIP Service 暴露它作者:

kubectl expose pod testpod --port=8080

在这种情况下,--portService 的端口)和--targetPortPod 的端口)将具有相同的值。换句话说,您已经创建了一个Service,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: testpod
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

你可能应该以这种方式暴露它:

kubectl expose pod testpod --port=8080 --targetPort=80

或使用以下 yaml 清单:

apiVersion: v1
kind: Service
metadata:
  name: testpod
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

当然,您的targetPort 可能与80 不同,但connection refused 在这种情况下仅意味着一件事:目标http 服务器(在Pod 中运行)拒绝连接到8080 端口(大多数可能是因为它没有在听它)。您没有指定您使用的是什么图像,它是标准的nginx 网络服务器还是基于您的自定义图像的东西。但如果它是 nginx 并且没有进行不同的配置,它会侦听端口 80

如需进一步调试,您可以附加到您的Pod

kubectl exec -it testpod --namespace mynamespace -- /bin/sh

如果netstat 命令不存在(最可能的情况)运行:

apt update && apt install net-tools

然后使用netstat -ntlp 检查您的容器在哪个端口上侦听。

我希望这可以帮助您解决问题。如有任何疑问,请不要犹豫。

【讨论】:

  • @fuzzi 这是answer your question吗?
  • 谢谢 - 是的,它给了我足够的信息来彻底解决问题。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2020-07-23
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多