DNS ndots的使用

6,880 阅读2分钟

DNS请求处理流程

在使用kubernetes dns请求的时候,会用到配置中的/etc/resolv.conf文件内容。一般如下:

表示没有指定dns server时,会以10.254.0.10这个地址作为默认的dns server的地址,根据请求消息会依次添加search后的域名后缀。注意到还有一个参数options ndots:5,之前没有对这个参数做太多的关注,直到最近发现coredns内有大量的无效域名请求,定位发现与ndots的配置相关。

ndots的使用

ndots的含义可以通过man resolv.conf命令查看,如下:

通俗一点说就是,如果你的域名请求参数中,点的个数比配置的ndots小,则会按照配置的search内容,依次添加相应的后缀直到获取到域名解析后的地址。如果通过添加了search之后还是找不到域名,则会按照一开始请求的域名进行解析。接下来依次验证。

ndots:4

首先配置ndots为4,通过nslookup kubernetes.default.svc.cluster.local请求解析域名,查看coredns日志:

只有一条请求,且返回了正确的结果;因为请求中点的个数为4,配置的也是4,所以只需要发送相应的请求即可。 修改请求,只保留一个点,nslookup kubernetes.aa,查看coredns日志:
因为请求的点小于配置的个数,所以会根据/etc/resolv.conf中的search内容,自动添加相应的后缀default.svc.cluster.localsvc.cluster.localcluster.local。直到都没有解析成功,解析请求的kubernetes.aa

优化建议

可以发现ndots的值和请求息息相关,在使用中为了避免过多的请求,可以适当优化相应的值或者请求。
1、条件允许的情况下,尽量将请求体中的点都带上,并且要大于或者等于配置中的ndots的值;
2、由于自动追加域名是按照配置中的参数依次添加的,所以在同一个namespace下,可以直接解析服务名即可。如nslookup kubernetes,会自动补全default.svc.cluster.local后缀,且是第一个配置的,因此请求也只有一条。