自定义 DNS 服务
本页解释如何配置您的 DNS Pod(s) 并自定义集群中的 DNS 解析过程。
开始之前
您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少包含两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 练习场之一
您的集群必须运行 CoreDNS 附加组件。
您的 Kubernetes 服务器的版本必须为 v1.12 或更高版本。要检查版本,请输入 kubectl version
。
简介
DNS 是 Kubernetes 的内置服务,使用 *附加组件管理器* 集群附加组件 自动启动。
注意
CoreDNS 服务在metadata.name
字段中名为 kube-dns
。目的是确保与依赖于旧版
kube-dns
服务名称解析集群内部地址的工作负载具有更好的互操作性。使用名为 kube-dns
的服务抽象掉了哪个 DNS 提供程序正在该通用名称后面运行的实现细节。如果您将 CoreDNS 作为 Deployment 运行,它通常会作为 Kubernetes 服务公开,具有静态 IP 地址。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 配置文件。作为集群管理员,您可以修改 ConfigMap 中的 CoreDNS Corefile,以更改该集群的 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 将根据服务和 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 的指标以 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
}
注意
CoreDNS 不支持桩域和名称服务器的 FQDN(例如: "ns.foo.com")。在转换期间,所有 FQDN 名称服务器将从 CoreDNS 配置中省略。下一步
- 阅读 调试 DNS 解析