首页 > 其他分享 >你不知道的resolv.conf 中 search 和 ndots 配置

你不知道的resolv.conf 中 search 和 ndots 配置

时间:2023-06-02 18:05:52浏览次数:31  
标签:search ndots resolv svc cluster 域名 asd cs local

作者ZHDYA,曾运营 “云原生个锤子” 达3000+人,专注免费分享一些DEVOPS/运维/自动化/K8S生态方面的实战技巧,我们一起前行学习! qrcode_for_gh_68d1bee1a9e8_258.jpg 最近更新主要围绕:Kubernetes、持久化存储、Helm、CICD、Ingress-nginx、监控告警、应用可观察性等相关文章。

一、背景

新招聘的一个小伙子,为了解决一个开发遇到的问题,手动改了coreDNS的/etc/resolv.conf文件,将nameserver配置成自建的域名解析,导致在pod内(dnsPolicy是ClusterFirst)无法正常解析内部域名。

问题根因:

业务pod(dnsPolicy是ClusterFirst)会将DNS请求发送给集群中的Coredns,由于是内部域名,Coredns会转发请求到/etc/resolv.conf(coredns pod内部的resolv.conf),而不是Coredns pod实例所在节点上的resolv.conf,导致客户无法解析内部域名。

深度剖析:

Kubernetes 集群中,域名解析离不开 DNS 服务,在 Kubernetes v1.10 以前集群使用 kube-dns dns服务,后来在 Kubernetes v1.10+ 使用 Coredns 做为集群dns服务。

FUhKiyonMZ8uL2a.png

使用 Kubernetes 集群时,会发现 Pod /etc/resolv.conf 配置。具体如下:

[root@k8s-10 ~]# docker exec -it 7a18fcfea7f9 bash
root@cs-apm-demo-d-5b7c79d8f6-5v88b:/opt#cat /etc/resolv.conf
nameserver 172.21.0.10
search dolphin.svc.cluster.local svc.cluster.local cluster.local 65.3.6
options ndots:5

[root@k8s-10 ~]# sudo kubectl get all --all-namespaces -owide| grep 172.21.0.10
kube-system                 service/kube-dns                                                 ClusterIP   172.21.0.10      <none>        53/UDP,53/TCP,9153/TCP                         70d     k8s-app=kube-dns

172.21.0.10为KubeDNS的集群IP,对于内部域名,KubeDNS会直接解析,对于外部域名,KubeDNS会丢给上一级DNS服务器解析,这个上一级DNS服务器就依赖于resolv.conf;

1.1、名词解释:

  • nameserver:定义DNS服务器的IP地址

  • search:它的多个参数指明域名查询顺序。搜索列表目前仅限于6个域名,共计256个字符。

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

options ndots:5 解释

如果查询的域名包含的点".",不到5个,那么进行DNS查找,将使用非完全限定名称(或者叫绝对域名),如果你查询的域名包含点数大于等于5,那么DNS查询,默认会使用绝对域名进行查询。

如果我们请求的域名是,a.b.c.d.e,这个域名中有4个点,那么容器中进行DNS请求时,会使用非绝对域名进行查找,使用非绝对域名,会按照 /etc/resolv.conf 中的 search 域,走一遍追加匹配:

a.b.c.d.e.cicd.svc.cluster.local. ->

a.b.c.d.e.svc.cluster.local. ->

a.b.c.d.e.cluster.local.

直到找到为止。如果走完了search域还找不到,则使用 a.b.c.d.e. ,作为绝对域名进行DNS查找。

说明

a)请求域名中点数少于5个时,先走search域,最后将其视为绝对域名进行查询;

b)请求域名中点数大于等于5个时,直接视为绝对域名进行查找,只有当查询不到的时候,才继续走 search 域。

二、解析集群内部域名

/ # nslookup cs-ezview-cu
Server:		172.21.0.10
Address:	172.21.0.10:53

Name:	cs-ezview-cu.dolphin.svc.cluster.local
Address: 172.21.20.207

*** Can't find cs-ezview-cu.svc.cluster.local: No answer
*** Can't find cs-ezview-cu.cluster.local: No answer
*** Can't find cs-ezview-cu.65.3.6: No answer
*** Can't find cs-ezview-cu.dolphin.svc.cluster.local: No answer
*** Can't find cs-ezview-cu.svc.cluster.local: No answer
*** Can't find cs-ezview-cu.cluster.local: No answer
*** Can't find cs-ezview-cu.65.3.6: No answer

从上面看,解析 cs-ezview-cu 域名时,点的个数比配置中 ndots 值小,会按照配置 search 参数填补域名后缀。在第一次填补后缀 cs-ezview-cu.dolphin.svc.cluster.local 就解析出 A记录,这时就会终止dns查询返回A记录结果。

三、解析集群外部域名

下面是抓 www.jd.com 域名 DNS 包结果:

tNGQVYIphgC5.png

从上图抓包来看,京东域名点的个数比配置中 ndots 值小,会按照配置 search 参数填补域名后缀。依次填补 production.svc.cluster.local.、svc.cluster.local.、cluster.local.都没有查询出结果,后面直接解析 www.jd.com 域名,查询出A记录并返回结果。

使用另外一个命令测试:

root@ga-transit-multidimension-back-7758f58d7d-pgs4g:/etc/sysconfig/network-scripts#host -v www.baidu.com
Trying "www.baidu.com.dolphin.svc.cluster.local"
Trying "www.baidu.com.svc.cluster.local"
Trying "www.baidu.com.cluster.local"
Trying "www.baidu.com.65.3.6"
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12482
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		30	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	30	IN	A	180.101.49.12
www.a.shifen.com.	30	IN	A	180.101.49.11

Received 138 bytes from 172.21.0.10#53 in 35 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49747
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;www.a.shifen.com.		IN	AAAA

;; AUTHORITY SECTION:
a.shifen.com.		30	IN	SOA	ns1.a.shifen.com. baidu_dns_master.baidu.com. 2007300002 5 5 2592000 3600

Received 124 bytes from 172.21.0.10#53 in 35 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31427
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;www.a.shifen.com.		IN	MX

;; AUTHORITY SECTION:
a.shifen.com.		30	IN	SOA	ns1.a.shifen.com. baidu_dns_master.baidu.com. 2007300002 5 5 2592000 3600

Received 124 bytes from 172.21.0.10#53 in 68 ms

如此一来,在默认配置情况下,在容器内部解析域名的成本还是很高的,大部分的域名都不会有5个.,也就意味着大部分外部域名DNS解析请求都需要5次才能解析成功。

四、解析域名点数大于或者等于ndots配置

解析域名点数大于或者等于ndots配置,又会发生什么事情了?

随便找个外网的泛域名:

点数等于 ndots

root@ga-transit-multidimension-back-7758f58d7d-pgs4g:/etc/sysconfig/network-scripts#host -v asd.asd.asd.asd.lty.com
Trying "asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52878
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;asd.asd.asd.asd.lty.com.	IN	A

;; ANSWER SECTION:
asd.asd.asd.asd.lty.com. 30	IN	A	65.254.248.194

Received 80 bytes from 172.21.0.10#53 in 417 ms
Trying "asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60759
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;asd.asd.asd.asd.lty.com.	IN	AAAA

;; AUTHORITY SECTION:
lty.com.		30	IN	SOA	ns1.fatcow.com. dnsadmin.fatcow.com. 2012041904 10800 3600 604800 86400

Received 117 bytes from 172.21.0.10#53 in 386 ms
Trying "asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41858
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;asd.asd.asd.asd.lty.com.	IN	MX

;; ANSWER SECTION:
asd.asd.asd.asd.lty.com. 30	IN	MX	30 mx.lty.com.

Received 90 bytes from 172.21.0.10#53 in 386 ms

点数大于 ndots:

root@ga-transit-multidimension-back-7758f58d7d-pgs4g:/etc/sysconfig/network-scripts#host -v a.asd.asd.asd.asd.lty.com
Trying "a.asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48797
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;a.asd.asd.asd.asd.lty.com.	IN	A

;; ANSWER SECTION:
a.asd.asd.asd.asd.lty.com. 30	IN	A	65.254.248.194

Received 84 bytes from 172.21.0.10#53 in 383 ms
Trying "a.asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34831
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;a.asd.asd.asd.asd.lty.com.	IN	AAAA

;; AUTHORITY SECTION:
lty.com.		30	IN	SOA	ns1.fatcow.com. dnsadmin.fatcow.com. 2012041904 10800 3600 604800 86400

Received 119 bytes from 172.21.0.10#53 in 399 ms
Trying "a.asd.asd.asd.asd.lty.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37761
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;a.asd.asd.asd.asd.lty.com.	IN	MX

;; ANSWER SECTION:
a.asd.asd.asd.asd.lty.com. 30	IN	MX	30 mx.lty.com.

Received 94 bytes from 172.21.0.10#53 in 397 ms

从上面我们可以得出结论,不管是点数大于或者等于 ndots 配置,都不会匹配 search的配置。

五、优化建议

通过上面案例可以发现ndots的值和请求息息相关,在使用中为了避免过多的DNS查询请求,可以适当优化相应的值或者请求域名。

  • 条件允许的情况下,尽量将请求体中的点都带上,并且要大于或者等于配置中的ndots的值。
  • 由于自动填补域名后缀是按照配置中的参数依次添加,所以在同一个namespace下,可以直接解析Service名即可。如 nslookup cs-ezview-cu,会自动补全 cs-ezview-cu.dolphin.svc.cluster.local 后缀,且是第一个配置的,因此查询也只有一条。提高DNS解析速度。

标签:search,ndots,resolv,svc,cluster,域名,asd,cs,local
From: https://blog.51cto.com/u_12593421/6404429

相关文章

  • Android中实现ContentResolver对系统中所有联系人的访问
    一、实现方法思路:朝着实验要求和目的去想,要想访问系统中的联系人,可以利用ContentResolver类来访问,使用ContentResolver类可以访问别的应用程序通过ContentProvider提供的数据,这里可以用Android系统提供的标准的ContentProvider来对手机联系人进行访问。还有要想实现长......
  • 当Elasticsearch遇见Kafka
    Elasticsearch作为当前主流的全文检索引擎,除了强大的全文检索能力和高扩展性之外,对多种数据源的兼容能力也是其成功的秘诀之一。而Elasticsearch强大的数据源兼容能力,主要来源于其核心组件之一的Logstash,Logstash通过插件的形式实现了对多种数据源的输入和输出。Kafka是一种高吞......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Delete by query API
    RESTAPIs——DocumentAPIs——DeletebyqueryAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-delete-by-query.htmlDeletesdocumentsthatmatchthespecifiedquery.删除与指定查询匹配的文档。curl-XPOS......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Delete API
    RESTAPIs——DocumentAPIs——DeleteAPIRemovesaJSONdocumentfromthespecifiedindex.从指定的索引中移除JSON文档。1、Request(请求)https://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-delete.......
  • Elasticsearch介绍及安装
    elasticsearch的作用elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容。倒排索引倒排索引的概念是基于MySQL这样的正向索引而言的。elasticsearch便是基于倒排索引实现快速查找的功能。倒排索引中有两个非常重要的概......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— GET API
     RESTAPIs——DocumentAPIs——GETAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-get.html#docs-getRetrievesthespecifiedJSONdocumentfromanindex.从索引中检索指定的JSON文档。......
  • docker安装elasticsearch
    一、环境CentOSelasticsearch5.6.12二、安装1.镜像拉取dockerpullelasticsearch:5.6.122.启动镜像dockerrun--nameelasticsearch-d-eES_JAVA_OPTS="-Xms256m-Xmx256m"-e"discovery.type=single-node"-p9200:9200-p9300:9300elasticsearch:5.6.12注......
  • elasticsearch常用命令总结
    目录#查看集群状态curlhttp://*:9200/_cluster/health?pretty#查看所有索引状态curl"http://*:9200/_cat/indices?pretty"#查看异常索引状态curl"http://*:9200/_cat/indices?v&health=red"#查看异常索引分片分配状态curl"http://*:9200/_cat/shards/your_inde......
  • Elasitcsearch 免费视频教程
    Elasitcsearch免费视频教程https://elasticsearch.cn/topichttps://elasticsearch.cn/topic/Elasitcsearch+%E5%85%8D%E8%B4%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B......
  • ElasticSearch Shard——本质上是做分布式扩展,副本对于集群的稳定性有很强的影响
    什么是一个Shard?Shard就是一个LuceneIndex,参照文章(深入理解Shard和LuceneIndex)。Index需要多少个Shard?回答这个问题,我们需要先谈谈节点,一个集群有多个节点,具体需要多少个节点合适,是另外一个问题,但是这个数字也会影响我们对Shard数的设置。Shard数=Node数?总体上说,当我们节点数......