首先,以下模式:
my-svc.my-namespace.svc.cluster-domain.example
仅适用于服务的FQDNs,不适用于具有以下形式的Pods:
pod-ip-address.my-namespace.pod.cluster-domain.example
e.g.:
172-17-0-3.default.pod.cluster.local
事实上,您正在向集群DNS查询名为“testpod”的
Service
的FQDN,而不是
Pod
的FQDN。从成功解析的事实来看,这样的
Service
已经存在于您的集群中,但很可能配置不正确。您收到“连接被拒绝”的错误消息,可能意味着以下情况:
- 您的
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
)。
- 您已经访问了由
testpod
Service
公开的 Pod
(您已被 testpod
Service
成功重定向到它)。
- 但是一旦访问了
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
Web服务器还是基于你自定义的镜像。但如果是
nginx
且未进行不同配置,则会监听端口
80
。
如需进一步调试,可以连接到你的Pod
:
kubectl exec -it testpod --namespace mynamespace -- /bin/sh
如果没有netstat
命令(这是最有可能的情况),请运行:
apt update && apt install net-tools
然后使用 netstat -ntlp
命令检查您的容器监听的端口。
我希望这可以帮助您解决问题。如有疑问,请随时询问。