同一集群中 Kubernetes pods 之间的连接被拒绝

Connection Refused between Kubernetes pods in the same cluster

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

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

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

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

我试过了运行: kubectl exec -it testpod --namespace mynamespace -- cat /etc/resolv.conf 还有这个 returns: 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/

首先是以下模式:

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

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

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

例如:

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

因此,实际上您正在查询有关名为 testpodService 的 FQDN 而不是 Pod 的 FQDN 的群集 dns。从它被成功解决的事实来看,这样的 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,由 testpod Service 公开(您已被 testpod Service 成功重定向到它)
  4. 但是一旦到达 Pod,您正在尝试连接到不正确的端口,这就是连接被服务器拒绝的原因

我最好的猜测是你的 Pod 实际上在不同的端口上侦听,比如 80 但你通过 ClusterIP Service 通过仅指定 --port 值 例如通过:

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 服务器(运行ning 在一个Pod) 拒绝连接到 8080 端口(很可能是因为它没有监听)。您没有指定您使用的图像是标准的 nginx 网络服务器还是基于您的自定义图像的东西。但是,如果它是 nginx 并且没有进行不同的配置,它会在端口 80.

上侦听

为了进一步调试,您可以附加到您的 Pod:

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

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

apt update && apt install net-tools

然后检查 netstat -ntlp 你的容器监听的端口。

希望这能帮助您解决问题。如有任何疑问,请随时询问。