本文永久链接: https://www.xtplayer.cn/coredns/accelerate-external-domain-resolution/

问题背景

有时候业务可能对 DNS 解析有很高要求,通过以下脚本循环去访问一个域名,时而会出现解析到过 1s 的错误提示。

for i in `seq 1 500`;
do
curl -LSs -I api.mch.weixin.qq.com --connect-timeout 1 | grep HTTP/1.1
done

问题分析

在 coredns 配置中添加 log 参数可以打印详细的请求日志。

.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
template ANY AAAA . {
rcode NXDOMAIN
}
prometheus :9153
forward . "/etc/resolv.conf"
bufsize 4096
cache 30
loop
reload
loadbalance
}

api.mch.weixin.qq.com 为例,通过查看日志发现,在最后成功解析域名之前经过了多次搜索域的查询,从而增加了查询时间。

[INFO] 10.42.46.33:49935 - 64126 "AAAA IN api.mch.weixin.qq.com.prod-mail.svc.cluster.local. udp 67 false 512" NXDOMAIN qr,aa,rd 67 0.000146797s
[INFO] 10.42.46.33:49935 - 10869 "A IN api.mch.weixin.qq.com.prod-mail.svc.cluster.local. udp 67 false 512" NXDOMAIN qr,aa,rd 160 0.000168806s
[INFO] 10.42.46.33:41691 - 27825 "A IN api.mch.weixin.qq.com.svc.cluster.local. udp 57 false 512" NXDOMAIN qr,aa,rd 150 0.000093044s
[INFO] 10.42.46.33:41691 - 699 "AAAA IN api.mch.weixin.qq.com.svc.cluster.local. udp 57 false 512" NXDOMAIN qr,aa,rd 57 0.000090373s
[INFO] 10.42.46.33:58255 - 30725 "A IN api.mch.weixin.qq.com.cluster.local. udp 53 false 512" NXDOMAIN qr,aa,rd 146 0.000050077s
[INFO] 10.42.46.33:58255 - 41997 "AAAA IN api.mch.weixin.qq.com.cluster.local. udp 53 false 512" NXDOMAIN qr,aa,rd 53 0.000106777s
[INFO] 10.42.46.33:47452 - 34532 "AAAA IN api.mch.weixin.qq.com. udp 39 false 512" NXDOMAIN qr,aa,rd 39 0.000119399s
[INFO] 10.42.46.33:47452 - 26334 "A IN api.mch.weixin.qq.com. udp 39 false 512" NOERROR qr,aa,rd,ra 234 0.000161447s

解决方法

可以通过添加子域名的方式,跳过对其他搜索域的查询以提高解析速度。

在 system 项目下修改 coredns 的配置映射文件,参考以下配置,添加了一组 weixin.qq.com:53,这个是固定格式,根据需要修改搜索域即可。保存后默认一分钟配置会自动同步到 coredns pod,然后 coredns 会自动加载配置。

.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
template ANY AAAA . {
rcode NXDOMAIN
}
prometheus :9153
forward . "/etc/resolv.conf"
bufsize 4096
cache 30
loop
reload
loadbalance
}
weixin.qq.com:53 {
log
errors
ready
reload
cache 300
bufsize 4096
forward . 114.114.114.114
loadbalance
}
wx.gtimg.com:53 {
log
errors
ready
reload
cache 300
bufsize 4096
forward . 114.114.114.114
loadbalance
}

其他问题

以上通过配置 coredns 搜索域的方法虽然可以提高部分域名解析速度,但是目前存在一个已知的 dns 解析问题,因为内核 conntrack 模块的 bug 导致。具体原因请参考: https://tencentcloudcontainerteam.github.io/2018/10/26/DNS-5-seconds-delay/

问题的根本解决

经过测试,在工作负载的 YAML 文件中添加以下配置,可以加快 DNS 解析速度。

dnsConfig:
options:
- name: single-request-reopen
- name: ndots
value: "1"
dnsPolicy: ClusterFirst
imagePullSecrets: