聊聊 resolv.conf 中 search 和 ndots 配置
背景
Kubernetes 集群中,域名解析离不开 DNS
服务,在 Kubernetes v1.10 以前集群使用 kube-dns
dns服务,后来在 Kubernetes v1.10+ 使用 Coredns
做为集群dns服务。
使用 Kubernetes 集群时,会发现 Pod /etc/resolv.conf
配置。具体如下:
nameserver 10.10.0.2
search production.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
小伙伴们会好奇,search
或者 ndots
这是干嘛呀!想知道是干嘛的,接着看下文。
名词解释
-
search
:搜索主机名查找列表。搜索列表目前仅限于6个域名,共计256个字符。 -
ndots
:通俗一点说,如果你的域名请求参数中,点的个数
比配置的ndots
小,则会按照配置的search
内容,依次添加相应的后缀直到获取到域名解析后的地址。如果通过添加了search之后还是找不到域名,则会按照一开始请求的域名进行解析。
抓包分析DNS请求
Kubernetes Pod 内抓包,请参考 K8S Pod 内抓包快速定位网络问题
解析集群内部域名
下面例子解析同一个 namespace
中 service 名称为 blog
域名。
# 进入 piwik 容器网络
$ e_net piwik-654dc7b97b-g44kn production
Entering pod netns for production/piwik-654dc7b97b-g44kn
Execute the command: nsenter -n -t 16519
# 使用 tcpdump 抓 dns 53 端口包
$ tcpdump -nt -i eth0 port 53
# 再打开另一个窗口,进入 piwik 容器
$ kubectl exec -it piwik-654dc7b97b-g44kn -n production sh
# 解析 blog 域名
$ nslookup blog
Server: 10.10.0.2
Address: 10.10.0.2#53
Name: blog.production.svc.cluster.local
Address: 10.10.72.218
下面是抓 blog
域名 DNS 包结果:
从上面看,解析 blog
域名时,点的个数比配置中 ndots
值小,会按照配置 search
参数填补域名后缀。在第一次填补后缀 production.svc.cluster.local
就解析出 A记录
,这时就会终止dns查询返回A记录结果。
解析集群外部域名
下面例子解析集群外部域名 www.jd.com
京东网站。
# 进入 piwik 容器
$ kubectl exec -it piwik-654dc7b97b-g44kn -n production sh
# dns 解析京东域名
$ nslookup www.jd.com
Server: 10.10.0.2
Address: 10.10.0.2#53
Non-authoritative answer:
www.jd.com canonical name = www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com canonical name = www.jdcdn.com.
www.jdcdn.com canonical name = img2x-v6-sched.jcloudedge.com.
Name: img2x-v6-sched.jcloudedge.com
Address: 222.186.184.3
下面是抓 www.jd.com
域名 DNS 包结果:
从上图抓包来看,京东域名点的个数比配置中 ndots
值小,会按照配置 search
参数填补域名后缀。依次填补 production.svc.cluster.local.
、svc.cluster.local.
、cluster.local.
都没有查询出结果,后面直接解析 www.jd.com
域名,查询出A记录并返回结果。
解析域名点数大于或者等于ndots配置
解析域名点数
大于或者等于ndots
配置,又会发生什么事情?
下面来看看结果:
# 点数等于 ndots 配置
$ nslookup a.b.c.e.yp14.cn
Server: 10.10.0.2
Address: 10.10.0.2#53
Non-authoritative answer:
Name: a.b.c.e.yp14.cn
Address: 39.106.191.105
点数等于 ndots 配置结果
# 点数大于 ndots 配置
$ nslookup a.b.c.e.f.yp14.cn
Server: 10.10.0.2
Address: 10.10.0.2#53
Non-authoritative answer:
Name: a.b.c.e.f.yp14.cn
Address: 39.106.191.105
点数等于 ndots 大于配置结果
从上面我们可以得出结论,不管是点数大于或者等于 ndots
配置,都不会填补 search
声明的配置。
优化建议
通过上面案例可以发现ndots
的值和请求息息相关,在使用中为了避免过多的DNS查询请求,可以适当优化相应的值或者请求域名。
- 条件允许的情况下,尽量将请求体中的点都带上,并且要大于或者等于配置中的ndots的值。
- 由于自动填补域名后缀是按照配置中的参数依次添加,所以在
同一个namespace
下,可以直接解析Service名
即可。如 nslookup blog,会自动补全production.svc.cluster.local
后缀,且是第一个配置的,因此查询也只有一条。提高DNS解析速度。
- P2885 [USACO07NOV]电话线Telephone Wire
- 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解
- 【下载】PyTorch实现的神经网络翻译框架——机器翻译工具包 nmtpytorch
- P2605 [ZJOI2010]基站选址
- MYSQL之索引原理与慢查询优化
- MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份
- P1452 Beauty Contes
- Python基础(一)
- P1452 Beauty Contes(旋转卡壳版)
- python常见模块之os模块
- BZOJ 2127: happiness(最小割解决集合划分)
- lightswitch 添加 TreeView 控件
- P3227 [HNOI2013]切糕
- python常见模块之random模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shadertoy绘图
- 单基因生信分析流程(6)单基因相似性分析
- 三阴性乳腺癌提取和分析
- 一日一技:更友好的格式化数据提取方案
- 『深度应用』YoloV5 RTX2080Ti TensorRT与PyTorch速度对比
- 0797-使用HDP或CDP的Atlas采集CDH6的元数据和血缘
- 现代通信理论与新技术 PPT笔记整理
- 找找规律——LeetCode题目6:Z字形变换
- 给你点信心——LeetCode题目7:整数反转
- Python -二叉树 创建与遍历算法(很详细,转自国外教程)
- APP流量来源追踪方式——Android篇
- 从浏览器输入网址回车到看到页面过程到底经历了什么?
- Flutter Bloc 官方文档(BlocBuilder翻译)
- OpenGL ES 3.0 | 统一变量和属性的概念与(在程序中的)获取流程、统一变量缓冲区对象详解、std140块规范、用 命名统一变量块 建立 统一变量缓冲区对象 的流程 和 相关API 和...
- 深入浅出SVM(PART III)