通过Serving Stale提高自建DNS的解析成功率
什么是Serving Stale
Serving Stale是RFC 8767描述的用于提高DNS解析可靠性的一个标准。当Local DNS上的域名缓存过期,由于权威DNS故障导致Local DNS无法刷新本地缓存时,可以通过Local DNS的Serving Stale的能力使用过期的缓存结果应答请求,避免客户端无法得到响应。
- 上游DNS服务器故障时,使用过期的缓存应答请求,可能导致域名在上游DNS更新后,自建DNS不能及时给客户端响应最新的结果。
- Serving Stale功能是使用在自建DNS缓存已经过期的缓存来应答客户端,未缓存过的域名不适用。
Serving Stale的使用场景
如下图中,容器/ECS使用了自建DNS做域名解析,当自建DNS的上游DNS由于故障而无法应答时:
- 如果自建DNS未开启Serving Stale能力,容器/ECS解析域名会失败。
- 如果自建DNS开启了Serving Stale能力,自建DNS使用过期的缓存来应答容器/ECS,解析不中断。
如何开启Serving Stale
- bind9开启Serving Stale:如果您的自建DNS用的是bind,可以在bind的options配置中增加相关配置项并重载/重启您的DNS服务来生效。
- coreDNS开启Serving Stale:如果您的自建DNS是coreDNS或者您需要优化k8s集群的域名解析时延,可以在cache配置项中开启Serving Stale。
bind9开启Serving Stale
bind9支持版本:9.16.3及以上
- 配置文件:named.conf
- 配置位置:options
- 配置项说明
配置项
默认值
建议值
功能说明
stale-cache-enable
no
yes
启用缓存保持功能。
stale-answer-enable
stale-answer-enable
yes
启用stale-cache来应答。
max-stale-ttl
1day
1day
stale-cache缓存保持多长时间。
stale-refresh-time
30s
30s
bind刷新stale-cache的时间间隔,即多长时间向权威DNS请求一次,并刷新缓存。
stale-answer-ttl
30s
30s
使用stale-cache回复response时,报文中的TTL值。
- 配置样例:
options { stale-cache-enable yes; stale-answer-enable yes; };
coreDNS开启Serving Stale
coreDNS插件中已支持Serving Stale能力,允许coreDNS无法连接上游DNS服务器时使用已过期的本地缓存来应答。
coreDNS支持版本:1.6.6
- 配置格式:serve_stale [DURATION] [REFRESH_MODE]
- 配置项说明:
- DURATION:过期缓存的使用时长,默认值为1h。
- REFRESH_MODE:支持配置为verify、immediate。
- verify:在将过期的缓存发送到客户端之前,先验证上游的DNS是否可用。该方式可能会增加客户端的解析时延。
- immediate:立即将过期的缓存作为响应发送给客户端。
- 配置样例:
cache { serve_stale 1h immediate }