2020年12月

在使用 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

至此,问题解决。