You need to enable JavaScript to run this app.
导航
使用 NodeLocal DNSCache 缓存代理
最近更新时间:2024.08.06 14:29:15首次发布时间: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

使用限制

  • VCI 类型的 Pod 使用 NodeLocal DNSCache 相关功能,目前处于【邀测】中,如需使用,请提交申请。

    注意

    VCI Pod 中使用 NodeLocal DNSCache 时依赖 node-local-dns 组件的 v0.3.1 及以上版本。node-local-dns 组件的 v0.3.1 及以上版本目前也处于 邀测 阶段,请一并提交试用申请。

  • 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 的网络为 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。但不推荐此种配置方式,如有诉求,请提工单咨询。

相关文档