DNS请求处理流程
在使用kubernetes dns请求的时候,会用到配置中的/etc/resolv.conf
文件内容。一般如下:
10.254.0.10
这个地址作为默认的dns server的地址,根据请求消息会依次添加search
后的域名后缀。注意到还有一个参数options ndots:5
,之前没有对这个参数做太多的关注,直到最近发现coredns内有大量的无效域名请求,定位发现与ndots
的配置相关。
ndots的使用
ndots的含义可以通过man resolv.conf
命令查看,如下:
ndots:4
首先配置ndots为4,通过nslookup kubernetes.default.svc.cluster.local
请求解析域名,查看coredns日志:
nslookup kubernetes.aa
,查看coredns日志:
因为请求的点小于配置的个数,所以会根据/etc/resolv.conf
中的search内容,自动添加相应的后缀default.svc.cluster.local
、svc.cluster.local
和cluster.local
。直到都没有解析成功,解析请求的kubernetes.aa
。
优化建议
可以发现ndots的值和请求息息相关,在使用中为了避免过多的请求,可以适当优化相应的值或者请求。
1、条件允许的情况下,尽量将请求体中的点都带上,并且要大于或者等于配置中的ndots的值;
2、由于自动追加域名是按照配置中的参数依次添加的,所以在同一个namespace下,可以直接解析服务名即可。如nslookup kubernetes
,会自动补全default.svc.cluster.local
后缀,且是第一个配置的,因此请求也只有一条。