同一集群中 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
因此,实际上您正在查询有关名为 testpod
的 Service
的 FQDN 而不是 Pod
的 FQDN 的群集 dns。从它被成功解决的事实来看,这样的 Service
已经存在于您的集群中但很可能是配置错误。您收到错误消息 connection refused
这一事实可能意味着以下内容:
- 您的
Service
FQDN testpod.mynamespace.svc.cluster.local
已成功解析
(否则你会收到类似 curl: (6) Could not resolve host: testpod.default.svc.cluster.local
的东西)
- 您已成功达到
testpod
Service
(否则,即如果它存在但没有在 8080
端口上侦听,您正在尝试连接,您将收到 timeout
例如 curl: (7) Failed to connect to testpod.default.svc.cluster.local port 8080: Connection timed out
)
- 您已到达
Pod
,由 testpod
Service
公开(您已被 testpod
Service
成功重定向到它)
- 但是一旦到达
Pod
,您正在尝试连接到不正确的端口,这就是连接被服务器拒绝的原因
我最好的猜测是你的 Pod
实际上在不同的端口上侦听,比如 80
但你通过 ClusterIP
Service
通过仅指定 --port
值 例如通过:
kubectl expose pod testpod --port=8080
在这种情况下,--port
(Service
的端口)和 --targetPort
(Pod
的端口)将具有相同的值。换句话说,您已经创建了一个如下所示的 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
你的容器监听的端口。
希望这能帮助您解决问题。如有任何疑问,请随时询问。
我是 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
因此,实际上您正在查询有关名为 testpod
的 Service
的 FQDN 而不是 Pod
的 FQDN 的群集 dns。从它被成功解决的事实来看,这样的 Service
已经存在于您的集群中但很可能是配置错误。您收到错误消息 connection refused
这一事实可能意味着以下内容:
- 您的
Service
FQDNtestpod.mynamespace.svc.cluster.local
已成功解析 (否则你会收到类似curl: (6) Could not resolve host: testpod.default.svc.cluster.local
的东西) - 您已成功达到
testpod
Service
(否则,即如果它存在但没有在8080
端口上侦听,您正在尝试连接,您将收到timeout
例如curl: (7) Failed to connect to testpod.default.svc.cluster.local port 8080: Connection timed out
) - 您已到达
Pod
,由testpod
Service
公开(您已被testpod
Service
成功重定向到它) - 但是一旦到达
Pod
,您正在尝试连接到不正确的端口,这就是连接被服务器拒绝的原因
我最好的猜测是你的 Pod
实际上在不同的端口上侦听,比如 80
但你通过 ClusterIP
Service
通过仅指定 --port
值 例如通过:
kubectl expose pod testpod --port=8080
在这种情况下,--port
(Service
的端口)和 --targetPort
(Pod
的端口)将具有相同的值。换句话说,您已经创建了一个如下所示的 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
你的容器监听的端口。
希望这能帮助您解决问题。如有任何疑问,请随时询问。