我正在尝试从集群中的节点解析集群内部 DNS。
示例:dig @10.96.0.10 kubernetes.local
(10.96.0.10 是 DNS 的服务 IP)
我希望获得服务的 IP(在本例中为 10.96.0.1),但是连接超时。
只有当我尝试通过 UDP 从集群中的主机连接到服务时,才会发生此问题,而服务的 Pod 未托管在我要连接的节点上。
如果我尝试从在同一节点上运行的 Pod 进行连接,它会按预期工作。
如果我尝试直接连接到 Pod 而不是服务,它会按预期工作。
如果我尝试通过 TCP 而不是 UDP 连接到服务,它会按预期工作。
如果当 Pod 在与我连接的同一节点上运行时尝试连接到服务,它会按预期工作。
我正在Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
使用 flannel pod 网络运行 Kubernetes v1.17 ( ),在 Debian Buster 上运行。
到目前为止,我已经查看了 iptables 规则,服务和 pod 规则似乎是正确的。
的相关部分iptables-save
:
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-SBQ7D3CPOXKXY6NJ
-A KUBE-SVC-TCOU7JCQXEZGVUNU -j KUBE-SEP-CDWMPIYNA34YYC2O
-A KUBE-SEP-CDWMPIYNA34YYC2O -s 10.244.1.218/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-CDWMPIYNA34YYC2O -p udp -m udp -j DNAT --to-destination 10.244.1.218:53
-A KUBE-SEP-SBQ7D3CPOXKXY6NJ -s 10.244.1.217/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-SBQ7D3CPOXKXY6NJ -p udp -m udp -j DNAT --to-destination 10.244.1.217:53
我还在sudo tcpdump -i flannel.1 udp
发送方和接收方上使用了命令,发现包裹被发送,但没有收到。
当我直接寻址 Pod 时,例如通过dig @10.244.1.218 kubernetes.local
,包裹会被正确发送和接收。