NodeLocal DNSCache 缓存方案为节点提供 DNS 缓存代理功能,提升整个集群的 DNS 服务发现性能和稳定性。本文介绍如何在集群中配置 NodeLocal DNSCache 功能。
在大规模场景下时,大量的 DNS 请求会对 CoreDNS 造成较大的压力,导致 DNS 的时延增加,从而影响业务性能。为了提高请求速度,用户需要经常提高 CoreDNS 资源规格或者扩容,增加运维复杂度,同时效果可能也不够理想。
为解决上述问题,Kubernetes 官方提供了 NodeLocal DNSCache 缓存方案,可以有效提高大规模集群 DNS 性能和稳定性。在 VKE 集群中,提供 node-local-dns 组件作为集群的 NodeLocal DNSCache 功能组件。该组件以 DaemonSet 的形态部署在集群中的每个节点上,为节点提供 DNS 缓存代理功能,提升集群的 DNS 服务发现性能和稳定性。
当您在集群中安装 node-local-dns 组件后,系统会在 Pod 中自动注入 DNS 缓存配置。此时,DNS 解析流程为:
说明
NodeLocal DNSCache 的更多信息,请参见 官方文档。
node-local-dns 主要包括以下组件。
组件名称 | 组件说明 | 资源类型 |
---|---|---|
node-local-dns-admission | 提供 Pod NodeLocal dnsConfig 自动注入功能。 | Deployment |
node-local-dns | 节点上的 DNS 缓存代理,用于响应节点上 Pod 的 DNS 请求,提高集群 DNS 性能。 | DeamonSet |
注意
VCI Pod 中使用 NodeLocal DNSCache 时依赖 node-local-dns 组件的 v0.3.1 及以上版本。node-local-dns 组件的 v0.3.1 及以上版本目前也处于 邀测 阶段,请一并提交试用申请。
...
> 安装。说明
如果组件安装异常,请参考 组件 FAQ。如果仍然无法解决,请提交工单处理。
node-local-dns 组件支持卸载。卸载完成后,存量使用 NodeLocal DNSCache 的 Pod 可以继续访问 DNS 请求,但是 DNS 请求时延会增加。DNS 的请求最终还是会访问到 CoreDNS 代理中。
卸载组件的步骤如下:
...
> 卸载。说明
如果组件卸载异常,请参考 组件 FAQ。如果仍然无法解决,请提交工单处理。
node-local-dns 组件安装完成后。当在集群中创建 Pod 时,系统会默认为 Pod 添加访问 NodeLocal DNSCache 的 dnsConfig 配置。
以下几种 Pod 除外:
dns-config-injection=disable
。ClusterFirstWithHostNet
,或 Pod 的网络不为 hostNetwork 且 DNSPolicy 为ClusterFirst
。以 default 命名空间下的 Pod 为例,创建 Pod 时,系统会添加如下 dnsConfig 配置。
... dnsConfig: nameservers: - 169.254.20.10 - 10.0.10.1 options: - name: ndots value: "3" - name: attempts value: "2" - name: timeout value: "1" searches: - default.svc.cluster.local - svc.cluster.local - cluster.local dnsPolicy: None ...
为了最大程度上保证业务 DNS 请求高可用,nameservers
中会额外加入 kube-dns 的 ClusterIP(10.0.10.1)地址作为备份的 DNS 服务器。
如果您不想使用 NodeLocal DNSCache 访问,可以通过如下几种方式,禁用自动注入。
kubectl label namespace <namespace name> dns-config-injection=disable
··· labels: dns-config-injection: disable ···
如果自动注入功能无法满足您的使用场景,也支持手动配置 NodeLocal DNSCache 功能。操作步骤如下:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:latest name: container-0 dnsPolicy: None dnsConfig: nameservers: ["169.254.20.10","172.21.0.10"] # DNS 服务器 IP 地址 searches: # 请求域名不完整时的拼接字段 - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots # 完整域名度量值。当域名中的点字符数超过该值时,直接解析。当域名中的点字符数少于该值时,会加上 searches 拼接字段再解析 value: "3" - name: attempts # 域名解析请求失败时的重试次数 value: "2" - name: timeout # 单个域名解析请求的超时时间,单位为秒 value: "1" imagePullSecrets: - name: default-secret ...
说明
支持使用 kubelet 通过--cluster-dns
和--cluster-domain
参数来全局控制 Pod dnsConfig。但不推荐此种配置方式,如有诉求,请提工单咨询。