Kubernetes 同一个 Node 节点内的 Pod 不能通过 Service 互访
在使用 Kubernetes 中,经常会遇到一个奇怪的现象,当 Pod 与 CoreDNS 在同一个 Node 节点时,此 Pod 无法解析 DNS 记录。
我清楚的知道 Service 是使用 iptables NAT DNAT + SNAT 规则实现的,因此我排查的方向是抓包查看数据包的流向。
经过抓包分析,发现同一个 Node 节点访问 Service 只是对访问的流量进行了 DNAT,没有做 SNAT。但当时并没有找到解决方法,今天又遇到了一样的问题,通过爬文找到了这篇文章,所描述的问题现象一模一样,也附带了解决方法,并有详细的排查过程,读者可以去拜读一下。
我的 Kubernetes 集群是使用 kubeadm 部署的,因此解决方法是修改 kube-proxy 的 ConfigMap
[root@k8s-master01 ~]# kubectl -n kube-system get cm
NAME DATA AGE
coredns 1 20d
extension-apiserver-authentication 6 20d
kube-flannel-cfg 2 20d
kube-proxy 2 20d
kubeadm-config 2 20d
kubelet-config-1.18 1 20d
metrics-server-config 1 19d
kubectl -n kube-system edit cm kube-proxy
# 修改 masqueradeAll: true
重启所有节点的 kube-proxy:
[root@k8s-master01 monitoring]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-66bff467f8-5v2j7 1/1 Running 1 20d
coredns-66bff467f8-gtrdb 1/1 Running 0 26m
etcd-k8s-master01 1/1 Running 1 20d
kube-apiserver-k8s-master01 1/1 Running 1 20d
kube-controller-manager-k8s-master01 1/1 Running 2 20d
kube-flannel-ds-94n7x 1/1 Running 1 20d
kube-flannel-ds-nf26k 1/1 Running 1 20d
kube-flannel-ds-nl2dl 1/1 Running 1 20d
kube-flannel-ds-thl9f 1/1 Running 2 20d
kube-proxy-gpxhb 1/1 Running 1 20d
kube-proxy-k2gjh 1/1 Running 1 20d
kube-proxy-lp5jw 1/1 Running 1 20d
kube-proxy-z67qm 1/1 Running 1 20d
kube-scheduler-k8s-master01 1/1 Running 3 20d
metrics-server-v0.3.6-5d9877d6b6-bqq8d 2/2 Running 2 19d
nfs-client-provisioner-5fbf5f4476-fpmdq 1/1 Running 2 10d
# 删掉Pod,让其重建
kubectl -n kube-system delete pod kube-proxy-gpxhb kube-proxy-k2gjh kube-proxy-lp5jw kube-proxy-z67qm
至此,问题解决。