【问题标题】:CoreDNS do not respect local DNSCoreDNS 不尊重本地 DNS
【发布时间】:2026-02-10 08:50:01
【问题描述】:

我正在本地网络中的某个树莓派 4 上运行 k3s 集群。我在主节点上有一个 DNS 服务器 (dnsmasq)。我希望我的集群的 pod 通过 coredns 使用该 DNS 服务器。但是,当我从 pod 中 ping 一个地址时,我总是通过 google DNS 服务器并超越我的本地 DNS 规则。

apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        hosts /etc/coredns/NodeHosts {
          reload 1s
          fallthrough
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

这是我的 coredns 配置。如您所见,有forward . /etc/resolv.conf

我的 /etc/resolv.conf

domain home
nameserver 127.0.0.1

有什么建议吗?

【问题讨论】:

  • 这个文件 /etc/resolv.conf 来自哪里? Pod 还是主机?
  • 此文件来自主机

标签: kubernetes dnsmasq coredns k3s


【解决方案1】:

谢谢大家,我把我的 coredns 改成

kind: ConfigMap
metadata:
  annotations:
  name: coredns
  namespace: kube-system
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        hosts /etc/coredns/NodeHosts {
          reload 1s
          fallthrough
        }
        prometheus :9153
        forward . <master node ip>
        cache 30
        loop
        reload
        loadbalance
    }
  NodeHosts: |
    <master node ip> master
    <slave node ip> slave

它成功了!

【讨论】:

    【解决方案2】:

    CoreDNS official doc 说:

    在最基本的形式中,简单转发器使用以下语法:

    forward FROM TO...

    FROM 是与要转发的请求匹配的基域。

    TO… 是要转发到的目标端点。 TO 语法允许您为纯 DNS 指定协议 tls://9.9.9.9 或 dns://(或无协议)。上游数量限制为 15 个。

    不知何故,您不是能够执行 DNS 解析的目标端点,而是转发到本地主机 /etc/resolv.conf(这是一种有效的方法),在那里您拥有loop IP。

    如果您确实需要不是由 CoreDNS Pod 而是由主机 Node 上的 DNSMasq 处理 DNS 请求,最简单的方法是将它们转发到 Node 的 IP。

    【讨论】:

    • 如果我转发主节点ip,是否仍然可以使用内部kubernetes dns?是否仍然可以从 pod ping service.namespace ?
    【解决方案3】:

    您可以尝试只转发到您的 DNS 服务器正在运行的主节点的真实 IP。这将是集群中其他节点可以使用的 IP。所以不是 /etc/resolv.conf,而是类似于:

    forward . &lt;master node ip&gt;

    【讨论】: