docker - 无法从 k8s pod 内部解析 home dns
问题描述
所以我最近在我的家庭网络上设置了一个单节点 kubernetes 集群。我有一个运行在我的路由器(DD-WRT、dnsmaq)上的 dns 服务器,它解析了一堆本地域以便于使用。server1.lan
,例如解析为192.168.1.11
。
服务器 1 被设置为我的单节点 kubernetes 集群。对本地 DNS 的可能性感到兴奋,我使用名为 netshoot 的 docker 容器启动了我的第一个部署,该容器捆绑了一堆有用的网络调试工具。我执行到容器中,然后运行 ping 并得到以下结果......
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
该/etc/resolve.conf
文件从 pod 内部看起来很好
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
然后我开始跟踪 coredns 日志,我开始看到一些有趣的输出......
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
似乎 kubernetes 正在尝试192.168.1.1
从集群网络内部进行通信并且失败了。我猜 CoreDNS 使用resolv.conf
主机上的任何内容,所以这就是它的样子。
nameserver 192.168.1.1
除了这些 pod 之外,我可以从网络上的其他任何地方解析 server1.lan。我的路由器 IP 是 192.168.1.1,这就是对 DNS 查询的响应。
对此的任何帮助将不胜感激,这似乎是 kubernetes 网络和我真正的家庭网络之间的某种 IP 路由问题,或者这就是我的理论。提前致谢。
解决方案
所以问题是当我启动集群时,我指定了一个与我家庭网络上的 IP 冲突的 pod CIDR。我的 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。
希望这可以帮助某人。谢谢。
推荐阅读
- azure - 为什么我不能使用 Service Principle 和 Azure CLI 将 Add ReplyUrl 添加到 AAD 应用程序?
- php - 使用引导模式更新数据
- nativescript - NativeScript 上的 DateTimeRangePicker
- data-structures - 这是一个有效的二叉树吗?
- html - 为什么我在这个网站上的移动菜单可以在浏览器上运行,但不能在实际的移动设备上运行?
- c# - 使用 C# 的 Azure Blob 存储“找不到方法”
- python - 为什么 psycopg2 INSERT 需要这么长时间才能循环运行,我该如何加快速度?
- sql - 将“名称”列中具有相同值的所有行合并为一行
- c++ - 是否可以使用 C++/WinRT 创建 Windows 服务应用程序?
- php - 一次循环一个结果