背景
Kubernetes 集群中,域名解析离不开 DNS
服务,在 Kubernetes v1.10 以前集群使用 kube-dns
dns服务,后来在 Kubernetes v1.10+ 使用 Coredns
做为集群dns服务。
使用 Kubernetes 集群时,会发现 Pod /etc/resolv.conf
配置。具体如下:
1 | nameserver 10.10.0.2 |
小伙伴们会好奇,search
或者 ndots
这是干嘛呀!想知道是干嘛的,接着看下文。
名词解释
search
:搜索主机名查找列表。搜索列表目前仅限于6个域名,共计256个字符。ndots
:通俗一点说,如果你的域名请求参数中,点的个数
比配置的ndots
小,则会按照配置的search
内容,依次添加相应的后缀直到获取到域名解析后的地址。如果通过添加了search之后还是找不到域名,则会按照一开始请求的域名进行解析。
抓包分析DNS请求
Kubernetes Pod 内抓包,请参考 K8S Pod 内抓包快速定位网络问题
解析集群内部域名
下面例子解析同一个 namespace
中 service 名称为 blog
域名。
1 | # 进入 piwik 容器网络 |
下面是抓 blog
域名 DNS 包结果:
从上面看,解析 blog
域名时,点的个数比配置中 ndots
值小,会按照配置 search
参数填补域名后缀。在第一次填补后缀 production.svc.cluster.local
就解析出 A记录
,这时就会终止dns查询返回A记录结果。
解析集群外部域名
下面例子解析集群外部域名 www.jd.com
京东网站。
1 | # 进入 piwik 容器 |
下面是抓 www.jd.com
域名 DNS 包结果:
从上图抓包来看,京东域名点的个数比配置中 ndots
值小,会按照配置 search
参数填补域名后缀。依次填补 production.svc.cluster.local.
、svc.cluster.local.
、cluster.local.
都没有查询出结果,后面直接解析 www.jd.com
域名,查询出A记录并返回结果。
解析域名点数大于或者等于ndots配置
解析域名点数
大于或者等于ndots
配置,又会发生什么事情了?
下面来看看结果:
1 | # 点数等于 ndots 配置 |
点数等于 ndots 配置结果
1 | # 点数大于 ndots 配置 |
点数等于 ndots 大于配置结果
从上面我们可以得出结论,不管是点数大于或者等于 ndots
配置,都不会填补 search
声明的配置。
优化建议
通过上面案例可以发现ndots
的值和请求息息相关,在使用中为了避免过多的DNS查询请求,可以适当优化相应的值或者请求域名。
- 条件允许的情况下,尽量将请求体中的点都带上,并且要大于或者等于配置中的ndots的值。
- 由于自动填补域名后缀是按照配置中的参数依次添加,所以在
同一个namespace
下,可以直接解析Service名
即可。如 nslookup blog,会自动补全production.svc.cluster.local
后缀,且是第一个配置的,因此查询也只有一条。提高DNS解析速度。
---本文结束感谢您的阅读。微信扫描二维码,关注我的公众号---
本文链接: https://www.yp14.cn/2020/07/24/聊聊-resolv-conf-中-search-和-ndots-配置/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!