定制 DNS 服务
本页面解释了如何配置你的 DNS Pod 并自定义集群中的 DNS 解析过程。
准备工作
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已被配置为与你的集群通信。建议在至少有两个非控制平面主机角色的节点的集群上运行本教程。如果你还没有集群,你可以使用 minikube 创建一个,或者你可以使用以下 Kubernetes 实践环境之一
你的集群必须运行 CoreDNS 插件。
你的 Kubernetes 服务器版本必须是 v1.12 或更高版本。
要检查版本,输入 kubectl version
。
介绍
DNS 是一个内置的 Kubernetes 服务,使用 addon manager 集群插件 自动启动。
说明
CoreDNS Service 在metadata.name
字段中被命名为 kube-dns
。这样做的目的是为了确保与依赖于传统
kube-dns
Service 名称来解析集群内部地址的工作负载具有更好的互操作性。使用名为 kube-dns
的 Service 抽象了在该通用名称背后运行的是哪个 DNS 提供者的实现细节。如果你将 CoreDNS 作为 Deployment 运行,它通常会通过具有静态 IP 地址的 Kubernetes Service 来暴露。kubelet 通过 --cluster-dns=<dns-service-ip>
标志将 DNS 解析器信息传递给每个容器。
DNS 名称也需要域名。你可以在 kubelet 中使用 --cluster-domain=<default-local-domain>
标志配置本地域名。
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 的健康状况将报告到
http://localhost: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 的度量指标可在
http://localhost:9153/metrics
获取,格式为 Prometheus 格式(也称为 OpenMetrics)。 - forward:所有不在 Kubernetes 集群域内的查询都将转发到预定义的解析器(/etc/resolv.conf)。
- cache:这会启用前端缓存。
- loop:检测简单的转发环路,如果发现环路则停止 CoreDNS 进程。
- reload:允许自动重新加载已更改的 Corefile。编辑 ConfigMap 配置后,请等待两分钟使更改生效。
- loadbalance:这是一个轮询 DNS 负载均衡器,它会随机排列响应中的 A、AAAA 和 MX 记录顺序。
你可以通过修改 ConfigMap 来更改 CoreDNS 的默认行为。
使用 CoreDNS 配置 Stub 域和上游名称服务器
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
}