了解k8s 组件 Coredns 的ndots配置

本文介绍了Kubernetes集群中DNS服务的重要性,从kube-dns过渡到CoreDNS的变化。讨论了Pod的/etc/resolv.conf配置,包括nameserver、search和ndots选项的作用。文章还提供了关于如何优化DNS查询以减少CoreDNS压力的建议,比如确保请求域名包含足够的点以匹配ndots配置,以及在相同namespace内直接使用Service名称来提高解析速度。
导读Kubernetes 集群中,域名​解析离不开 DNS​ 服务,在 Kubernetes v1.10 以前集群使用 kube-dns​ dns服务,后来在 Kubernetes v1.10+ 使用 Coredns 做为集群dns服务。


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 搜索主机名查找列表。搜索列表目前仅限于6个域名,共计256个字符。
通俗一点说,如果你的域名请求参数中,点的个数​比配置的ndots​小,则会按照配置的search​内容,依次添加相应的后缀直到获取到域名解析后的地址。如果通过添加了search之后还是找不到域名,则会按照一开始请求的域名进行解析。
例子:

 
# host -v kubernetes.default.svc
Trying "kubernetes.default.svc.default.svc.cluster.local"
Trying "kubernetes.default.svc.svc.cluster.local"
Trying "kubernetes.default.svc.cluster.local"
  

想解析的 kubernetes.default.svc​ 中的 .​ 只有2,小于5,这时会依次拼接上 search 中的地址之后再进行查询,如果都查询不到,则再查询本身。不管是点数大于或者等于 ndots​ 配置,都不会填补 search 声明的配置。

相关建议优化

在使用中为了避免过多的DNS查询请求,防止coredns压力过大,可以适当优化相应的值或者请求域名。
条件允许的情况下,尽量将请求体的点都带式,并且要大于等于配置ndots的值
由于自动填补域名后缀是按照配置中的参数依次添加,所以在同一个namespace下,可以直接解析service名称,即可。以此可以提高DNS解析速度。www.linuxprobe.com

Kubernetes 中的 DNS 解析优先级配置主要由 Pod 的 `dnsPolicy` 字段控制,该字段决定了 Pod 如何进行域名解析。默认情况下,Kubernetes 使用 CoreDNS 作为集群的 DNS 服务器,并且根据不同的策略影响 DNS 解析的行为。 ### 默认 DNS 策略 在 Kubernetes 中,默认的 DNS 策略是 `ClusterFirst`,这意味着 Pod 会优先使用 CoreDNS 来解析域名。CoreDNS 能够解析集群内部服务(如 Service 名称)以及外部域名。如果 CoreDNS 无法解析某个域名,则会回退到宿主机的 DNS 配置中指定的 DNS 服务器[^1]。 这种策略适用于大多数需要访问集群内服务的应用场景,因为它确保了对集群内部服务名称的正确解析,同时也支持对外部域名的解析。 ### 其他 DNS 策略 除了 `ClusterFirst` 外,还有几种其他的 DNS 策略可供选择: - **Default**:Pod 使用宿主机的 `/etc/resolv.conf` 文件中的 DNS 设置。这通常用于调试目的或者当不需要通过 CoreDNS 解析集群内部服务时。 - **ClusterFirstWithHostNet**:此策略类似于 `ClusterFirst`,但仅适用于使用主机网络模式的 Pod。在这种模式下,Pod 不使用自己的网络命名空间,而是共享节点的网络栈。因此,在某些情况下可能需要特别处理 DNS 解析逻辑[^1]。 - **None**:允许用户自定义 DNS 设置。此时必须提供一个 `dnsConfig` 字段来指定具体的 DNS 配置,包括 nameservers、searches 和 options 等参数[^3]。 ### DNS 解析顺序 当使用 `ClusterFirst` 或 `ClusterFirstWithHostNet` 策略时,Kubernetes 内部的 DNS 解析流程如下: 1. 首先尝试通过 CoreDNS 解析域名; 2. 如果 CoreDNS 无法解析,则按照 CoreDNS 配置文件中设定的上游 DNS 服务器列表进行查询; 3. 最终,若上述步骤均未能成功解析域名,则可能会依赖于宿主机上的 DNS 配置(具体行为取决于 CoreDNS配置和版本)。 此外,可以通过修改 Pod 的 `spec.hostAliases` 字段向容器添加额外的 hosts 条目,这些条目会在 DNS 解析之前被检查,从而实现对特定域名或 IP 地址映射的定制化需求。 ### 示例代码 下面是一个设置了 `dnsPolicy` 和 `dnsConfig` 的 Pod 示例: ```yaml apiVersion: v1 kind: Pod metadata: name: dns-example spec: containers: - name: test-container image: nginx dnsPolicy: "None" dnsConfig: nameservers: - 8.8.8.8 searches: - example.com options: - name: ndots value: "2" ``` 在这个例子中,Pod 使用了 `None` 类型的 `dnsPolicy` 并显式地指定了 DNS 配置,包括使用的 DNS 服务器地址、搜索域和一些选项设置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值