KubeADM 集群:如何正确配置 DNS

KubeADM 集群:如何正确配置 DNS

我有以下项目,用于通过 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

该文件有两个问题:

  1. 不允许我访问互联网。事实上,我必须手动添加它,在文件开头添加此行:
nameserver 8.8.8.8

当不再需要时将其删除(如果我保留它,内部 DNS 将不起作用)

  1. 在搜索子句中,有来自我的主机的域:<other domain coming from host machine>这会导致问题。

我阅读了很多文档,但仍然不知道如何更改代码以避免这两个问题。

答案1

  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.confkubernetes 文档在这里解释 coredns corefile 配置。您还会发现resolve.confcoredns 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,它运行良好。

  1. 在搜索子句中,有一些来自我的主机的域导致了问题。

这也是预期的配置。我通常不会认为这会导致问题,但我不知道您的确切配置或您想要实现的目标。如果解决方案要求您修改 pod 中的搜索域列表,则执行此操作的位置应在pod dns 策略。希望解决您的第一个问题可以让您避免对此进行自定义。

相关内容