kubernetes pod 无法解析本地主机名,但可以解析外部主机名,例如 google.com

kubernetes pod cannot resolve local hostnames but can resolve external ones like google.com

我正在尝试 kubernetes,但似乎遇到了一些障碍。问题是,在我的 pod 中,我无法卷曲本地主机名,例如 wrkr1wrkr2 (我网络上的机器主机名)但可以成功解析主机名,例如 google.com 或 whosebug.com.

我的集群是一个基本设置,包含一个主节点和 2 个工作节点。

pod 中的工作原理:

节点托管 pod 的工作原理:

Note: the pod cidr is completely different from the IP range used in LAN

该节点包含一个主机文件,其条目对应于 wrkr1 的 IP 地址(尽管我已经检查过节点也可以在没有它的情况下解析主机名,但我在某处读到一个 pod 继承了它的节点 DNS 解析,所以我保留了条目)

Kubernetes 版本:1.19.14

Ubuntu 版本:18.04 LTS

需要帮助了解这是否是正常行为,如果我希望 pod 也能够解析本地 LAN 上的主机名,可以做什么?

会发生什么

Need help as to whether this is normal behavior

这是正常行为,因为在您的网络中没有托管虚拟机的 DNS 服务器,而 kubernetes 在集群内有自己的 DNS 服务器,它根本不知道您的主机上发生了什么,尤其是在 /etc/hosts 因为 pods 根本无权访问此文件。

I read somewhere that a pod inherits its nodes DNS resolution so I've kept the entry

这是棘手的事情发生的地方。 There are four available DNS policies 应用于每个 pod。我们来看看其中两个常用的:

  • "Default":Pod继承pods 运行所在节点的名称解析配置。有关详细信息,请参阅相关讨论。
  • "ClusterFirst":任何与配置的集群域后缀不匹配的 DNS 查询,例如"www.kubernetes.io",将转发到继承自的上游名称服务器节点。集群管理员可能配置了额外的存根域和上游 DNS 服务器

有史以来最棘手的部分是(来自上面的 link):

Note: "Default" is not the default DNS policy. If dnsPolicy is not explicitly specified, then "ClusterFirst" is used.

这意味着所有未设置 DNS policy 的 pods 将是 运行 和 ClusterFirst,他们将无法看到 /etc/resolv.conf 在主机上。我尝试将其更改为 Default,实际上,它可以解析主机可以解析的所有内容,但是内部解析停止工作,所以它不是一个选项。

例如 coredns 部署是 运行 并且 Default dnsPolicy 允许 coredns 解析主机。

如何解决这个问题

1.将 local 域添加到 coreDNS

这将需要为每个主机添加 A 条记录。这是编辑过的 coredns configmap 的一部分:

这应该在 .:53 { 块内

file /etc/coredns/local.record local

这部分紧接在上面的块结束之后(SOA信息取自示例,这里没有任何区别):

local.record: |
  local.            IN      SOA     sns.dns.icann.org. noc.dns.icann.org. 2015082541 7200 3600 1209600 3600
  wrkr1.            IN      A      172.10.10.10
  wrkr2.            IN      A      172.11.11.11

然后 coreDNS 应该添加部署以包含此文件:

$ kubectl edit deploy coredns -n kube-system
      volumes:
      - configMap:
          defaultMode: 420
          items:
          - key: Corefile
            path: Corefile
          - key: local.record # 1st line to add
            path: local.record # 2nd line to add
          name: coredns

并重新启动 coreDNS 部署:

$ kubectl rollout restart deploy coredns -n kube-system

以防万一检查 coredns pods 是否为 running and ready:

$ kubectl get pods -A | grep coredns
kube-system   coredns-6ddbbfd76-mk2wv              1/1     Running            0                4h46m
kube-system   coredns-6ddbbfd76-ngrmq              1/1     Running            0                4h46m

如果一切正确,现在新创建的 pods 将能够通过名称解析主机。 Please find an example in coredns documentation

2。在网络中设置DNS服务器

虽然 avahi 看起来类似于 DNS 服务器,但它并不像 DNS 服务器。无法将 requests forwardingcoredns 设置为 avahi,但可以在网络中设置正确的 DNS 服务器,这样一切都会得到解决。

3。部署 avahi 到 kubernetes 集群

avahi here 有一个现成的图像。如果将其部署到 dnsPolicy 设置为 ClusterFirstWithHostNet 的集群中,最重要的是 hostNetwork: true 它将能够使用主机适配器发现网络中的所有可用主机。

有用links: