Kubernetes Pods 无法解析外部主机

Kubernetes Pods unable to resolve external host

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

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

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

我还查看了 Kubernetes 是否有一些内置标志让 Pod 在 Node 的 /etc/hosts 中查找条目但找不到它。

所以我的问题是-

  1. 为什么节点上的 pods 运行 无法解析 /etc/hosts 文件中的主机。
  2. 有没有办法设置本地 DNS 服务器并要求所有 Pods 查询此 DNS 服务器以获取特定主机解析?

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

容器中的环境应该与其他容器和机器(包括它的宿主机)隔离,/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
        ...
    }

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