You need to enable JavaScript to run this app.
导航

使用 NodeLocal DNSCache 缓存代理

最近更新时间2024.03.01 14:07:22

首次发布时间2023.10.24 10:20:13

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 解析流程为:

  1. NodeLocal DNSCache 解析:Pod 会首先访问本节点的 DNS 缓存配置(169.254.20.10),访问不通或缓存未命中时,再访问集群的 CoreDNS 配置。
  2. CoreDNS 解析:如果 NodeLocal DNSCache 本地若无缓存应答解析请求,则会通过 kube-dns 服务请求 CoreDNS(10.0.0.10) 进行解析。

alt

说明

NodeLocal DNSCache 的更多信息,请参见 官方文档

组件说明

node-local-dns 主要包括以下组件。

组件名称组件说明资源类型
node-local-dns-admission提供 Pod NodeLocal dnsConfig 自动注入功能。Deployment
node-local-dns节点上的 DNS 缓存代理,用于响应节点上 Pod 的 DNS 请求,提高集群 DNS 性能。DeamonSet

使用限制

  • NodeLocal DNSCache 不支持 VCI 类型的 Pod。
  • NodeLocal DNSCache 对 vpc-cni 组件版本有依赖,vpc-cni 组件的版本不低于 v1.3.0。详情请参见 组件发布记录

安装 NodeLocal DNSCache

  1. 登录 容器服务控制台
  2. 在顶部导航栏,选择您业务所在地域。
  3. 在左侧导航栏单击 集群,找到目标集群,单击集群名称。
  4. 在集群管理页面的左侧导航栏中,单击 组件管理。选择 DNS 页签,将鼠标移动到组件上,选择该组件右上角的 ... > 安装
    alt
  5. 等待组件状态显示 已安装,表示组件安装成功。
    alt

    说明

    如果组件安装异常,请参考 组件 FAQ。如果仍然无法解决,请提交工单处理。

卸载 NodeLocal DNSCache

node-local-dns 组件支持卸载。卸载完成后,存量使用 NodeLocal DNSCache 的 Pod 可以继续访问 DNS 请求,但是 DNS 请求时延会增加。DNS 的请求最终还是会访问到 CoreDNS 代理中。

卸载组件的步骤如下:

  1. 在集群管理页面的左侧导航栏中,单击 组件管理。选择 DNS 页签,将鼠标移动到组件上,选择该组件右上角的 ... > 卸载
    alt
  2. 二次确认后,卸载组件。
  3. 等待组件无状态显示,表示组件卸载成功。
    alt

    说明

    如果组件卸载异常,请参考 组件 FAQ。如果仍然无法解决,请提交工单处理。

在应用中使用 NodeLocal DNSCache

使用自动注入

node-local-dns 组件安装完成后。当在集群中创建 Pod 时,系统会默认为 Pod 添加访问 NodeLocal DNSCache 的 dnsConfig 配置。

以下几种 Pod 除外:

  • Pod 位于 kube-system 和 kube-public 命名空间。
  • Pod 所在命名空间或者 Pod 的标签包含dns-config-injection=disable
  • Pod 不属于 VCI 类型。
  • Pod 的网络为 hostNetwork 且 DNSPolicy 为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 访问,可以通过如下几种方式,禁用自动注入。

  1. 命名空间维度。执行如下命令,关闭整个命名空间下所有新建 Pod 的 dnsConfig 配置。
kubectl label namespace <namespace name> dns-config-injection=disable
  1. Pod 维度。在 Pod 上配置如下标签,关闭单个 Pod 的 dnsConfig 配置。
···
  labels:
    dns-config-injection: disable
···

手动配置

如果自动注入功能无法满足您的使用场景,也支持手动配置 NodeLocal DNSCache 功能。操作步骤如下:

  1. 请参考 禁用自动注入,关闭 Pod 自动注入功能。
  2. 手工为 Pod 配置 NodeLocal DNSCache 功能。以 default 命名空间下的 Pod 为例。
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。但不推荐此种配置方式,如有诉求,请提工单咨询。

相关文档