首先,如下模式:
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
所以实际上您查询的是关于名为 testpod 的 Service 的 FQDN 的集群 dns,而不是关于 Pod 的 FQDN。从它被成功解决的事实来看,这样的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,由testpodService暴露(你已经被testpodService重定向到它)
- 但是一旦到达
Pod,您就试图连接到错误的端口,这就是连接被服务器拒绝的原因
我最好的猜测是您的 Pod 实际上侦听不同的端口,例如 80 但您通过仅指定 --port 值例如通过 ClusterIP Service 暴露它作者:
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 服务器(在Pod 中运行)拒绝连接到8080 端口(大多数可能是因为它没有在听它)。您没有指定您使用的是什么图像,它是标准的nginx 网络服务器还是基于您的自定义图像的东西。但如果它是 nginx 并且没有进行不同的配置,它会侦听端口 80。
如需进一步调试,您可以附加到您的Pod:
kubectl exec -it testpod --namespace mynamespace -- /bin/sh
如果netstat 命令不存在(最可能的情况)运行:
apt update && apt install net-tools
然后使用netstat -ntlp 检查您的容器在哪个端口上侦听。
我希望这可以帮助您解决问题。如有任何疑问,请不要犹豫。