配置 NodeLocal DNSCache

概述

NodeLocal DNSCache 是一个集群插件,通过在集群节点上运行 DNS 缓存代理来提升集群 DNS 性能。该插件通过在每个节点本地缓存 DNS 响应,减少 DNS 查询延迟并提升集群稳定性,同时降低中心 DNS 服务的负载。

主要特性

  • 本地 DNS 缓存:在每个节点本地缓存 DNS 响应,以降低查询延迟
  • 性能提升:显著缩短应用的 DNS 查询时间

重要说明

WARNING

部署注意事项:

  1. Kube-OVN Underlay 模式:该插件不支持在 Kube-OVN Underlay 模式下部署。如果部署,可能会导致 DNS 查询失败。

  2. kubelet 重启:部署该插件会导致 kubelet 重启。

  3. 需要重启 Pod:插件成功部署后,不会影响正在运行的 Pods,但只会对新创建的 Pods 生效。当 CNI 为 Kube-OVN 时,需要手动将参数 "--node-local-dns-ip=(本地 DNS 缓存服务器的 IP 地址)" 添加到 kube-ovn-controller 中。

  4. NetworkPolicy 配置:如果集群中配置了 NetworkPolicy,则需要在 networkPolicy 中额外允许 node CIDR 和 nodeLocalDNSIP 的入站与出站方向流量,以确保正常通信。

  5. 通过重建升级集群:如果集群通过重建节点(re-provisioning)进行升级,kubelet 配置更改将会丢失。为了使 NodeLocal DNS 配置在升级后保持持久化,需要在集群模板中的以下三个位置为 kubeletExtraArgs 添加 --cluster-dns 参数:

    • KubeadmControlPlaneinitConfigurationnodeRegistrationkubeletExtraArgs
    • KubeadmControlPlanejoinConfigurationnodeRegistrationkubeletExtraArgs
    • KubeadmConfigTemplatetemplatespecjoinConfigurationnodeRegistrationkubeletExtraArgs

    在上述每个 kubeletExtraArgs 部分中添加以下参数:

    cluster-dns: "<NodeLocal_DNS_IP>"  # e.g., 169.254.20.10
WARNING

4.2.x 升级说明

当将该插件从 4.2.0 以下版本(不包括 4.2.0 本身)升级到 4.2.x 时,由于 ResourcePatch 兼容性问题,需要执行以下步骤:

升级前:

  • 记录 kube-ovn-controller ResourcePatch 配置中的 --node-local-dns-ip 参数值
  • 删除 deploy/kube-ovn-controller 资源的 ResourcePatch

升级后:

  • 将记录的 --node-local-dns-ip 参数手动添加回 kube-ovn-controller 配置

注意:该兼容性问题已在 4.3 及以上版本中修复,因此升级到 4.3+ 时无需手动干预。

安装

通过 Marketplace 安装

  1. 导航到 管理员 > Marketplace > 集群插件

  2. 在插件列表中搜索 "Alauda Build of NodeLocal DNSCache"。

  3. 点击 安装 打开安装配置页面。

  4. 配置所需参数:

    参数说明示例值
    IP节点本地 DNS 缓存服务器的 IP 地址。对于 IPv4,建议使用 169.254.0.0/16 范围内的地址,优先使用 169.254.20.10。对于 IPv6,建议使用 fd00::/8 范围内的地址,优先使用 fd00::10。169.254.20.10
  5. 检查部署说明,并确保你的环境满足要求。

  6. 点击 安装 完成安装。

  7. 等待插件状态变为 "Ready"。

工作原理

架构

Pod → NodeLocal DNSCache → [Cache Hit] → Pod

    [Cache Miss] → CoreDNS → Response → Cache & Pod

配置

NetworkPolicy 配置

重要:如果集群启用了 NetworkPolicy,必须配置正确的规则,以允许 DNS 流量到达 NodeLocal DNSCache。否则,Pods 可能无法解析 DNS 查询。

使用 NetworkPolicy 时,请确保允许以下 DNS 流量:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-cache
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - ipBlock:
            cidr: 169.254.20.10/32 # NodeLocal DNS IP address
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
  egress:
    - to:
        - ipBlock:
            cidr: 169.254.20.10/32 # NodeLocal DNS IP address
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53