自定义 DNS 服务

本页面介绍如何配置您的 DNS Pod 以及如何在您的集群中自定义 DNS 解析过程。

准备工作

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

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

您的 Kubernetes 服务器版本必须是 v1.12 或更高版本。要检查版本,请输入 kubectl version

简介

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

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

DNS 名称也需要域名。您可以使用 --cluster-domain=<default-local-domain> 标志在 kubelet 中配置本地域名。

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

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

使用 CoreDNS 配置存根域和上游域名服务器

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

示例

如果集群操作员有一个位于“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
    }    

下一步

上次修改时间:2023 年 1 月 11 日太平洋标准时间上午 11:12:更新 /tasks/administer-cluster 部分中的页面权重 (b1202c78ff)