Kubernetes Pod 无法解析外部主机。

4

我正在运行一个使用Flannel作为CNI的3节点Kubernetes集群。我使用了kubeadm来设置这个集群,版本是1.23。

我的Pod需要使用DNS地址与外部主机通信,但是这些主机没有DNS服务器。为此,我在集群中的每个节点的/etc/hosts文件中添加了它们的条目。节点可以从DNS解析主机,但Pod无法解析它们。

我尝试在互联网上搜索这个问题,有建议使用HostAlias或更新容器内的/etc/hosts文件。但我的问题是主机列表很大,在yaml文件中维护这个列表不可行。

我还查看过Kubernetes是否有一些内置标志可以让Pod查找节点的/etc/hosts文件中的条目,但没有找到。

所以我的问题是 -

  1. 为什么运行在节点上的Pod无法解析/etc/hosts文件中存在的主机。
  2. 有没有一种设置本地DNS服务器并要求所有Pod查询该DNS服务器以进行特定主机解析的方法?

欢迎提出任何其他建议或解决方法。


请提供有关您当前设置的更多信息 - 您正在使用哪个Kubernetes版本,您使用了哪个解决方案来设置集群(kubeadm还是某个云提供商的解决方案等)。 - Bazhikov
我使用了kubeadm来设置集群,版本为1.23。问题中也进行了更新。 - Krishnom
1个回答

6

容器中的环境应该与其他容器和机器(包括宿主机)分离,同样适用于 /etc/hosts。

如果您正在使用 coreDNS(默认的内部 DNS),可以通过修改其 configMap 来轻松添加额外的主机信息。

打开 configMap kubectl edit configmap coredns -n kube-system 并编辑它,以便包括 hosts 部分:

apiVersion: v1
data:
  Corefile: |
    .:53 {
        ...
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }

        ### Add the following section ###
        hosts {
          {ip1} {hostname1}
          {ip2} {hostname2}
          ...
          fallthrough
        }

        prometheus :9153
        ...
    }

设置将在几分钟内加载,然后所有的Pod都可以解析configMap中描述的主机名。


我接受这个答案,因为它解决了我面临的问题,但是在coredns中是否有一个选项可以从/etc/hosts加载静态条目,而无需在hosts {}块中指定所有条目? 例如,我们在pod模板中有“hostNetwork:true”。 - Krishnom
2
我认为这是不可能的,因为hosts{}块不像forward部分一样接受文件。当然,可以通过编写一个自动将/etc/hosts信息添加到configMap的shell来实现。 - Daigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接