自定义 DNS 服务

本页面介绍如何配置 DNS Pod(s) 并自定义集群中的 DNS 解析过程。

准备工作

你必须拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与你的集群通信。建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个集群,或者可以使用这些 Kubernetes 演练场之一。

你的集群必须运行 CoreDNS 插件。

你的 Kubernetes 服务器版本必须是 v1.12 或更高版本。

要检查版本,请输入 kubectl version

介绍

DNS 是一个内置的 Kubernetes 服务,它使用**插件管理器** 集群插件 自动启动。

如果将 CoreDNS 作为 Deployment 运行,它通常会作为具有静态 IP 地址的 Kubernetes Service 公开。kubelet 使用 `--cluster-dns=<dns-service-ip>` 标志将 DNS 解析器信息传递给每个容器。

DNS 名称还需要域。你使用标志 `--cluster-domain=<default-local-domain>` 在 kubelet 中配置本地域。

DNS 服务器支持正向查找(A 和 AAAA 记录)、端口查找(SRV 记录)、反向 IP 地址查找(PTR 记录)等等。有关详细信息,请参见 Service 和 Pod 的 DNS

如果 Pod 的 `dnsPolicy` 设置为 `default`,它将从 Pod 运行所在的节点继承名称解析配置。Pod 的 DNS 解析行为应该与节点相同。但请参阅 已知问题

如果你不希望这样,或者你希望为 Pod 使用不同的 DNS 配置,你可以使用 kubelet 的 `--resolv-conf` 标志。将此标志设置为空字符串以防止 Pod 继承 DNS。将其设置为有效文件路径以指定除 `/etc/resolv.conf` 之外的文件进行 DNS 继承。

CoreDNS

CoreDNS 是一个通用权威 DNS 服务器,可以作为集群 DNS,符合 DNS 规范

CoreDNS ConfigMap 选项

CoreDNS 是一个模块化且可插拔的 DNS 服务器,通过插件添加新功能。CoreDNS 服务器可以通过维护 Corefile 进行配置,Corefile 是 CoreDNS 配置文件。作为集群管理员,你可以修改 CoreDNS Corefile 的 ConfigMap,以更改该集群的 DNS 服务发现行为。

在 Kubernetes 中,CoreDNS 默认安装以下 Corefile 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }    

Corefile 配置包含以下 CoreDNS 插件

  • errors: 错误被记录到标准输出。
  • health: CoreDNS 的健康状态报告给 `https://:8080/health`。在这个扩展语法中,`lameduck` 将使进程不健康,然后等待 5 秒钟再关闭进程。
  • ready: 当所有能够发出就绪信号的插件都已发出信号时,端口 8181 上的 HTTP 端点将返回 200 OK。
  • kubernetes: CoreDNS 将根据 Service 和 Pod 的 IP 回复 DNS 查询。你可以在 CoreDNS 网站上找到关于此插件的更多详细信息
    • `ttl` 允许你为响应设置自定义 TTL。默认值为 5 秒。允许的最小 TTL 为 0 秒,最大值为 3600 秒。将 TTL 设置为 0 将阻止记录被缓存。
    • 提供 `pods insecure` 选项是为了向后兼容 `kube-dns`。
    • 你可以使用 `pods verified` 选项,它仅当在同一命名空间中存在具有匹配 IP 的 Pod 时才返回 A 记录。
    • 如果不用 Pod 记录,则可以使用 `pods disabled` 选项。
  • prometheus: CoreDNS 的指标可在 `https://:9153/metrics` 以 Prometheus 格式(也称为 OpenMetrics)获取。
  • forward: 任何不在 Kubernetes 集群域内的查询都将转发到预定义的解析器(/etc/resolv.conf)。
  • cache: 这启用了一个前端缓存。
  • loop: 检测简单的转发循环,如果发现循环,则中止 CoreDNS 进程。
  • reload: 允许自动重新加载更改的 Corefile。编辑 ConfigMap 配置后,请等待两分钟,更改才会生效。
  • loadbalance: 这是一个轮询 DNS 负载均衡器,它将答案中 A、AAAA 和 MX 记录的顺序随机化。

你可以通过修改 ConfigMap 来修改默认的 CoreDNS 行为。

使用 CoreDNS 配置 Stub-domain 和上游名称服务器

CoreDNS 能够使用 forward 插件 配置 stub 域和上游名称服务器。

示例

如果集群操作员有一个位于 "10.150.0.1" 的 Consul 域服务器,并且所有 Consul 名称都以 ".consul.local" 为后缀。为了在 CoreDNS 中配置它,集群管理员在 CoreDNS ConfigMap 中创建以下节。

consul.local:53 {
    errors
    cache 30
    forward . 10.150.0.1
}

为了明确强制所有非集群 DNS 查找都通过 172.16.0.1 上的特定名称服务器,将 `forward` 指向该名称服务器而不是 `/etc/resolv.conf`。

forward .  172.16.0.1

最终的 ConfigMap 以及默认的 `Corefile` 配置如下

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 172.16.0.1
        cache 30
        loop
        reload
        loadbalance
    }
    consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    }    

下一步

上次修改时间为 2025 年 1 月 8 日凌晨 2:06 PST:[en] 更新集群插件链接 (d3f1ddd0b8)