CoreDNS 添加自定义DNS解析记录
CoreDNS 的架构
解析流程
这里用到的是 CoreDNS 的 hosts plugin
插件。该插件仅支持 A, AAAA, 和 PTR 记录。
kubectl edit configmap coredns -n kube-system
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
hosts {
192.168.1.122 demo1.xx.com
192.168.1.123 demo2.xx.com
fallthrough
}
autopath @kubernetes
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
policy sequential
}
cache 30
loop
reload
loadbalance
}
kubernetes plugin
支持从 Kubernetes 集群读取 zone 数据。
运行 kubernetes 插件的 CoreDNS 可用作 kubernetes 集群中 kube-dns 的替代品。
forward plugin
用于设置 upstream Nameservers 上游 DNS 服务器。CoreDNS 就是通过它让容器能够解析外网的。
Multiple upstreams are randomized (see policy) on first use.
prefer_udp
, try first using UDP even when the request comes in over TCP.policy
specifies the policy to use for selecting upstream servers. The default israndom
.
支持三种策略
- random
- round_robin
- sequential
autopath plugin
在使用 autopath
插件之前,需要了解 pod 的四种 DNS 策略。
- Default: Pod 从运行所在的节点继承名称解析配置。
- ClusterFirst: 与配置的集群域后缀不匹配的任何 DNS 查询都将转发到从节点继承的上游名称服务器。
- ClusterFirstWithHostNet: 对于以 hostNetwork 方式运行的 Pod,应显式设置该策略。
- None: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段 所提供的 DNS 设置。
需要注意的是,pod 的默认 dnsPolicy 不是 Default
,而是 ClusterFirst
。
在 ClusterFirst 模式下,两次(一次 ipv4,一次 ipv6)集群外部域名查询产生 8 次(四次 ipv4,四次 ipv6)查询请求。
Autopath 会在第一次域名查询失败时切割域名后缀,尝试找到正确的域名,做到两次(一次 ipv4,一次 ipv6)域名查询获取到正确的解析结果。
pods 必须设置为 verified
使其正常运行。
其它插件
- errors: 查询处理期间遇到的任何错误都将打印到标准输出。
- health: 监控检查。
- ready: 就绪检查。
- loop: 检测简单的转发循环并停止服务器。
参考文档