我有以下项目,用于通过 KubeAdm 在本地机器(macOS)上创建自己的 Kubernetes 集群:https://github.com/sasadangelo/k8s-cluster 基本上我从这个开始项目并做了以下更新:
- 通过 YAML 文件配置 Vagrant 部署。
- 支持 K8s 1.6 API、K8s 1.18 和 Calico 3.8.8
- 自动 K8s 仪表板部署。
现在我对这个集群很满意,但我有一些 DNS 问题,我想了解如何解决。该工具使用 Vagrant 文件启动 3 个 Vagrant 框,然后我主要使用 3 个脚本:
- 配置框,我用来在每个盒子上安装所需的软件,如docker,kubeadm,kubelet,kubectl等。
- 配置主程序,仅用于配置主节点、安装网络插件并运行
kubeadm init
。 - 配置_worker.sh,用于配置加入集群的工作节点。
我的问题是resolv.conf
我的 Pod 看起来像这样:
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local <other domain coming from host machine>
options ndots:5
该文件有两个问题:
- 不允许我访问互联网。事实上,我必须手动添加它,在文件开头添加此行:
nameserver 8.8.8.8
当不再需要时将其删除(如果我保留它,内部 DNS 将不起作用)
- 在搜索子句中,有来自我的主机的域:
<other domain coming from host machine>
这会导致问题。
我阅读了很多文档,但仍然不知道如何更改代码以避免这两个问题。
答案1
- 不允许我访问互联网。
您的默认配置似乎没问题。正如您所发现的,您不想更改 pod resolv.conf,因为它需要使用集群内的 coredns 服务进行本地 dns 查找。 coredns 服务应该能够将 dns 请求转发到 k8s-master 中配置的解析器/etc/resolv.conf
。这似乎是 k8s-master 服务器互联网访问或 virtualbox 网络的问题。我克隆了您的 repo,并能够按预期解析集群上运行的 pod 的互联网 dns。
如果您查看 coredns 配置,您会发现它被设置为/etc/resolv.conf
用于任何未指定的域。从 k8s-master 中,您可以运行kubectl -n kube-system get configmap coredns -o yaml
以查看 coredns 配置。将有一行,forward . /etc/resolv.conf
。kubernetes 文档在这里解释 coredns corefile 配置。您还会发现resolve.conf
coredns pod 中的与主机上的相同。要验证这一点,您可以运行ps -aux | grep coredns
以获取其中一个 coredns 进程的 pid。然后运行nsenter -t <pid> -n cat /etc/resolv.conf
,您应该看到内容与主机系统相同。它应该有一个来自 virtualbox 网络的解析器。您可以从主机或 coredns 进程中测试此解析器,以验证它是否可以解析 dns。您还可以从 coredns 进程中针对 google 解析器进行测试,看看会得到什么。我会尝试 dns 查找以及 ping。这应该可以帮助您缩小导致问题的范围。再次,我在全新的 ubuntu 20.04 服务器上尝试了您的 vagrantfile,它运行良好。
- 在搜索子句中,有一些来自我的主机的域导致了问题。
这也是预期的配置。我通常不会认为这会导致问题,但我不知道您的确切配置或您想要实现的目标。如果解决方案要求您修改 pod 中的搜索域列表,则执行此操作的位置应在pod dns 策略。希望解决您的第一个问题可以让您避免对此进行自定义。