无法从K8S Pod中解析家庭DNS

时间:2019-11-13 03:21:29

标签: docker networking kubernetes dns coredns

因此,我最近在家庭网络上设置了一个单节点kubernetes集群。我有一台运行在路由器(DD-WRT,dnsmaq)上的dns服务器,该服务器解析了许多本地域,以便于使用。 server1.lan,例如解析为192.168.1.11

服务器1被设置为我的单节点kubernetes集群。对本地DNS的可能性感到很兴奋,我使用一个名为netshoot的docker容器启动了我的第一次部署,该容器捆绑了许多有用的网络调试工具。我执行了该容器,然后执行ping操作并得到以下信息... < / p>

bash-5.0# ping server1.lan
ping: server1.lan: Try again

失败,然后我尝试ping谷歌的DNS(8.8.8.8),并且工作正常。

我尝试解析kubernetes默认域,效果很好

bash-5.0# nslookup kubernetes.default
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

{@ {1}}文件在窗格中看起来不错

/etc/resolve.conf

然后我要跟踪coredns日志,然后开始看到一些有趣的输出...

bash-5.0# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

似乎kubernetes正在尝试从群集网络内部与2019-11-13T03:01:23.014Z [ERROR] plugin/errors: 2 server1.lan. AAAA: read udp 192.168.156.140:37521->192.168.1.1:53: i/o timeout 2019-11-13T03:01:24.515Z [ERROR] plugin/errors: 2 server1.lan. A: read udp 192.168.156.140:41964->192.168.1.1:53: i/o timeout 2019-11-13T03:01:24.515Z [ERROR] plugin/errors: 2 server1.lan. AAAA: read udp 192.168.156.140:33455->192.168.1.1:53: i/o timeout 2019-11-13T03:01:25.015Z [ERROR] plugin/errors: 2 server1.lan. AAAA: read udp 192.168.156.140:48864->192.168.1.1:53: i/o timeout 2019-11-13T03:01:25.015Z [ERROR] plugin/errors: 2 server1.lan. A: read udp 192.168.156.140:35328->192.168.1.1:53: i/o timeout 通信,但失败了。我想CoreDNS会使用主机上192.168.1.1中的任何内容,所以这就是它的样子。

resolv.conf

我可以从网络上除这些Pod之外的任何其他位置解析server1.lan。我的路由器IP为192.168.1.1,这就是对DNS查询的响应。

对此的任何帮助将不胜感激,这似乎是kubernetes网络与我的真实家庭网络之间的某种IP路由问题,或者无论如何我都是这样。预先感谢。

1 个答案:

答案 0 :(得分:1)

因此,问题出在当我启动集群时,我指定了一个Pod CIDR,它与我的家庭网络上的IP冲突。我的kubeadm命令是这个

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-cert-extra-sans=server1.lan

由于我的家庭网络与该CIDR冲突,并且由于我的dns上游是192.168.1.1,因此它认为这是在Pod网络上,而不是在我的家庭网络上,因此无法正确路由DNS解析数据包。

解决方案是使用以下命令

重新创建集群
sudo kubeadm init --pod-network-cidr=10.200.0.0/16 --apiserver-cert-extra-sans=server1.lan

当我应用calico yaml文件时,我确保将默认的192.168.0.0/16 CIDR替换为新的10.200.0.0/16 CIDR。

希望这对某人有帮助。谢谢。

相关问题