Kubernetes Pod 无法解析外部主机

Kri*_*nom 4 dns kubernetes flannel kube-proxy

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

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

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

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

所以我的问题是 -

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

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

Dai*_*igo 6

容器中的环境应与其他容器和机器(包括其宿主机)分开,/etc/hosts 也是如此。

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

打开 configMapkubectl 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
        ...
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是不可能的,因为与“forward”部分不同,“hosts{}”块不接受文件。当然,可以通过编写一个自动将 /etc/hosts 信息添加到 configMap 的 shell 来完成... (2认同)