DNS 搜索域和 ndots 是什么?为什么 Kubernetes 中域名解析可能变慢?
简化版
搜索域是解析短域名时自动追加的一组后缀,ndots 决定一个名字里点号数量达到多少才优先当作绝对域名查询。
在 Kubernetes 中,Pod 的 /etc/resolv.conf 可能包含多个 search domain 和较高的 ndots:5。当应用访问外部域名时,解析器可能先尝试多个集群内部后缀,失败后才查真实域名,导致 DNS 查询次数变多、延迟升高。
解决方式包括使用完整域名加尾点、调整 ndots、优化 CoreDNS 缓存和避免频繁短连接解析。
详细版
典型配置:
search ns.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
应用查询:
api.example.com
因为点号数量小于 5,解析器可能先尝试:
api.example.com.ns.svc.cluster.local
api.example.com.svc.cluster.local
api.example.com.cluster.local
api.example.com
前面几次大概率 NXDOMAIN,造成额外 DNS 延迟。
这类问题在高并发 HTTP 客户端、短连接、缺少 DNS 缓存时会更明显。
完整版教学
1. 先解释搜索域是什么
搜索域用于把短名字补全。
例如配置:
search example.com corp.local
查询 api 时,系统可能尝试:
api.example.com
api.corp.local
api
这样用户在内网可以直接访问短名。
搜索域让短名字方便了,但也可能让本来完整的外部域名多走几次失败查询。
2. ndots 的作用
ndots 表示域名中点号数量达到多少,才优先按绝对域名查询。
例如:
options ndots:5
api.example.com 只有 2 个点,小于 5。
解析器可能先套 search 后缀。
如果是:
api.example.com.
末尾带点表示绝对域名,通常不会再追加搜索域。
3. Kubernetes 为什么容易出现
Kubernetes 为了方便服务发现,会给 Pod 配置集群搜索域。
例如:
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
这样应用访问服务名:
mysql
可以解析到同 namespace 或集群服务。
但访问外部域名时,也可能触发多次内部后缀尝试。
4. 查询次数示例
| 输入域名 | ndots:5 下可能行为 | 影响 |
|---|---|---|
mysql | 追加多个 search 后缀 | 方便服务发现 |
api.example.com | 先尝试内部后缀 | 外部解析变慢 |
api.example.com. | 直接按绝对域名 | 减少额外查询 |
a.b.c.d.e.f | 点数足够,优先绝对查询 | 较少受 search 影响 |
实际行为取决于 libc、运行时和 DNS 客户端实现。
5. 性能问题如何出现
单次多几个 DNS 查询看起来不严重。
但在高并发服务中,可能被放大。
例如:
- 每个请求都新建 HTTP 客户端。
- 没有连接池。
- DNS 缓存很弱。
- CoreDNS 压力大。
- 上游 DNS 延迟高。
最终表现为接口偶发慢、CoreDNS QPS 高、NXDOMAIN 数量多。
6. 优化方式
常见优化包括:
- 外部域名使用完整 FQDN,并在必要时加尾点。
- 调整 Pod 的
dnsConfig中ndots。 - 使用连接池减少重复解析。
- 开启或优化 NodeLocal DNSCache。
- CoreDNS 配置 cache。
- 避免在热路径频繁创建客户端。
示例配置:
dnsConfig:
options:
- name: ndots
value: "2"
调整前要评估对集群内部短名解析的影响。
7. 常见误区与追问
- 误区:DNS 慢一定是公网 DNS 慢。 搜索域和 ndots 可能导致本地先发出多次内部失败查询。
- 误区:api.example.com 一定会直接查外网。 在高 ndots 配置下,它可能先追加搜索域。
- 误区:把 ndots 改成 1 永远最好。 可能影响集群内部服务名解析习惯,要结合场景评估。
- 追问:末尾的点有什么用? 表示绝对域名,避免追加搜索域。
- 追问:Kubernetes 为什么默认较高 ndots? 为了优先支持集群服务发现和短名访问。
- 追问:如何观察这个问题? 抓 DNS 查询、看 CoreDNS 日志、统计 NXDOMAIN 和查询延迟。
8. 加强记忆
搜索域是自动补后缀,ndots 决定先补还是先查原名。
K8s 里外部域名变慢,先看看 /etc/resolv.conf。