全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用NodeLocal DNSCache组件

更新时间:Jul 02, 2025

在ACK集群中部署NodeLocal DNSCache组件可以提升服务发现的稳定性和性能,NodeLocal DNSCache通过在集群节点上作为DaemonSet运行DNS缓存代理来提高集群DNS性能。本文介绍如何安装NodeLocal DNSCache,并在应用中使用NodeLocal DNSCache。

前提条件

使用限制

  • v1.6.0之前的NodeLocal DNSCache不支持ACK Serverless集群、以及托管版、专有版集群中部署的ECI类型的Pod。

  • NodeLocal DNSCache不支持Windows节点

  • 如果集群网络类型为Terway,请更新Terway至v1.0.10.301及以上版本。如果是基于IPVLAN的Terway多IP模式,需要对Terway进行配置修改。更多信息,请参见修改Terway配置(Terway早期版本创建的集群)

  • 全局开启DNS Cache或为单个命名空间配置DNS Cache时,NodeLocal DNSCache组件默认忽略对ACK系统命名空间的注入。您可通过下方的操作查看系统命名空间的定义。

    查看ACK系统命名空间

    执行下方命令:

    kubectl get mutatingwebhookconfigurations ack-node-local-dns-admission-controller -o yaml | grep -A 30 namespaceSelector

    预期输出如下,namespaceSelector.matchExpressions.values中的命名空间的Pod不会自动注入DNS Cache。

    namespaceSelector:
        matchExpressions:
          ...
          values:
          - kube-system
          - kube-public
          - arms-prom
          - security-inspector
          - ack-csi-fuse
        matchLabels:
          node-local-dns-injection: enabled
      ...
  • NodeLocal DNSCache不提供Hosts、Rewrite等插件能力,仅作为CoreDNS的透明缓存代理。如有需要,可在CoreDNS配置中修改。

  • 使用NodeLocal DNSCache前,您需要对CoreDNS配置进行修改,否则可能导致集群外部域名解析异常。具体操作,请参见配置Forward插件与上游VPC DNS服务器的默认协议

NodeLocal DNSCache

ACK NodeLocal DNSCache是基于社区开源项目NodeLocal DNSCache的一套DNS本地缓存解决方案。该方案主要由DNS本地缓存DaemonSet和DNSConfig动态注入控制器Deployment组成。关于NodeLocal DNSCache的缓存策略,请参见DNS解析及缓存策略说明

  • DNSConfig动态注入控制器Deployment,基于Admission Webhook机制拦截Pod创建的请求,自动注入使用DNS缓存的Pod DNSConfig信息。

    说明

    如果不启用DNSConfig动态注入控制器Deployment,您需要手动注入DNS域名相关配置至Pod配置中。具体操作,请参见为单个Pod手动启用DNS Cache

  • DNS缓存DaemonSet可以在每个节点上创建一个虚拟网络接口(默认监听IP 169.254.20.10,如需修改请提交工单咨询),配合Pod的DNSConfig和节点上的网络配置,Pod内产生的DNS请求会被该DaemonSet服务所代理。

    重要

    DaemonSet服务内同样基于CoreDNS提供服务,但其仅具有代理和缓存的功能,请勿启用额外的插件能力(如Hosts、Rewrite等)。

下方的图片展示了NodeLocal DNSCache的工作原理

image

步骤

描述

已注入DNS本地缓存的Pod,默认会通过NodeLocal DNSCache监听于节点上的IP(169.254.20.10)解析域名。

NodeLocal DNSCache本地若无缓存应答解析请求,则会通过kube-dns服务请求CoreDNS进行解析。

CoreDNS对于非集群内域名,会通过VPC DNS服务器进行解析。

已注入DNS本地缓存的Pod,当无法连通NodeLocal DNSCache时,会继而直接通过kube-dns服务连接到CoreDNS进行解析,此链路为备用链路。

未注入DNS本地缓存的Pod,会通过标准的kube-dns服务链路连接到CoreDNS进行解析。

虚拟节点上的DNS Cache

在v.1.6.0及更高版本中,NodeLocal DNSCache组件融合了BlazingDNS的能力,支持虚拟节点上的ECI或ACS Pod使用DNS Cache, 实现原理如下:

image

安装NodeLocal DNSCache组件

创建集群时安装

在创建集群时,在组件配置页面勾选安装 NodeLocal DNSCache选项,集群创建完成后会自动安装组件。

创建集群后安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 网络页签中找到ACK NodeLocal DNSCache卡片,单击安装,在弹出的对话框中单击确定

开启DNS Cache

说明

NodeLocal DNSCache Pod默认不会部署至Master节点。如果您的业务需要部署至Master节点,且您的Master节点设置了污点,您需要修改命名空间kube-system下node-local-dns DaemonSet的污点容忍。

为了将应用原本请求CoreDNS的流量改为由NodeLocal DNSCache代理,需要将Pod内部的nameservers配置成169.254.20.10和kube-dns对应的IP地址,您有以下几种方式可以选择:

在集群全局启用DNS Cache

NodeLocal DNSCache组件提供了是否默认启用 DNSCache配置。启用此配置后,除部分ACK系统命名空间外(可使用下方命令查看系统命名空间范围),其他命名空间中的Pod在新建时都会被自动注入DNS Cache。您可参照下方的步骤启用此配置:

查看ACK系统命名空间

执行下方命令:

kubectl get mutatingwebhookconfigurations ack-node-local-dns-admission-controller -o yaml | grep -A 30 namespaceSelector

预期输出如下,namespaceSelector.matchExpressions.values中的命名空间的Pod不会自动注入DNS Cache。

namespaceSelector:
    matchExpressions:
      ...
      values:
      - kube-system
      - kube-public
      - arms-prom
      - security-inspector
      - ack-csi-fuse
    matchLabels:
      node-local-dns-injection: enabled
  ...
重要

此配置适用于ACK NodeLocal DNSCache v1.6.0及更高版本。如果您的组件低于这个版本,请进行升级

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 网络页签中找到ACK NodeLocal DNSCache卡片,单击配置,在弹出的对话框中勾选是否默认启用 DNSCache,然后单击确认

为单个命名空间启用DNS Cache

您也可以通过标签为单个命名空间启用DNS Cache。NodeLocal DNSCache组件会自动监听包含了node-local-dns-injection=enabled标签的命名空间,并为其中新建的Pod自动注入DNS Cache相关配置。您可以通过以下命令给命名空间打上标签。

重要

为ACK系统命名空间配置标签后,不会启用DNS Cache注入。您可在使用限制中查看系统命名空间的定义。

kubectl label namespace default node-local-dns-injection=enabled
说明
  • 上述命令使用default命名空间作为示例,您可以替换default为其他命名空间。

  • 在命名空间启用DNS Cache的情况下,拥有node-local-dns-injection=disabled标签的Pod不会进行自动注入。

  • NodeLocal DNSCache在v1.6.0及以上版本支持虚拟节点上的Pod使用DNS Cache(要求ACK Virtual Node版本为v2.4.0或更高),如果您有使用需求,请尽快升级组件到该版本及以上。虚拟节点上的DNS Cache基于eBPF DNS Cache实现。对于调度到虚拟节点上的Pod, 您可通过检查Pod Annotations中的k8s.aliyun.com/dns-cache-enable确认Pod是否成功开启DNS缓存加速。

开启自动注入后,您创建的Pod会被增加以下字段,为了最大程度上保证业务DNS请求高可用,nameservers中会额外加入kube-dns服务的ClusterIP地址作为备份的DNS服务器(不适用于调度到虚拟节点上的Pod)。

dnsConfig:
  nameservers:
  - 169.254.20.10
  - 172.21.0.10 # kube-dns服务的ClusterIP地址
  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

Pod在同时满足以下条件时,才会自动注入DNS缓存。如果您的Pod容器未注入DNS缓存服务器的IP地址,请检查Pod是否未满足以下条件。

  • 新建Pod不位于kube-system和kube-public命名空间。

  • 新建Pod所在命名空间的Labels标签包含node-local-dns-injection=enabled

  • 新建Pod所在命名空间的Labels不包含ECI Pod相关标签,例如virtual-node-affinity-injectionecialibabacloud.com/eci等。

  • 新建Pod没有被打上ecialibabacloud.com/eci等ECI相关标签,或打上禁用DNS注入node-local-dns-injection=disabled标签。

  • 新建Pod的网络为hostNetwork且DNSPolicy为ClusterFirstWithHostNet,或Pod为非hostNetwork且DNSPolicy为ClusterFirst

为单个Pod手动启用DNS Cache

您也可以在Pod的spec.dnsConfig中手动启用DNS Cache。

重要

Pod调度到虚拟节点上时,dnsConfig会被强制覆盖,无法使用169.254.20.10作为DNS Server。因此,此方法不适用于虚拟节点上的Pod。

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: None
  dnsConfig:
    nameservers: ["169.254.20.10","172.21.0.10"]
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
    options:
    - name: ndots
      value: "3"
    - name: attempts
      value: "2"
    - name: timeout 
      value: "1"
  • dnsPolicy:必须为None

  • nameservers:配置成169.254.20.10和kube-dns服务的ClusterIP地址。

  • searches:设置搜索域,保证集群内部域名能够被正常解析。

  • ndots:默认为5,可以适当降低ndots以提升解析效率。更多信息,请参见resolv.conf

DNS Cache使用示例

通过在default命名空间下部署Deployment类型示例应用,演示如何配置应用使用NodeLocal DNSCache。

  1. 执行以下命令,给接入NodeLocal DNSCache的应用所在的命名空间(default)设置标签。

    kubectl label namespace default node-local-dns-injection=enabled
  2. 在集群的default命名空间下部署示例应用。

    1. 复制并保存下方YAML示例到nginx-deployment.yaml

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
              command: ["sh", "-c"]
              args: ["sleep 100000"]
    2. 执行以下命令,使示例应用在集群中生效。

      kubectl apply -f nginx-deployment.yaml

      预期输出:

      deployment.apps/nginx created
    3. 执行以下命令,查看应用信息。

      kubectl get deployment nginx

      预期输出:

      NAME     READY   UP-TO-DATE   AVAILABLE   AGE
      nginx    2/2     2            2           7s
  3. 查看是否成功注入dnsConfig

    1. 执行以下命令,查看Pod信息。

      kubectl get pods

      预期输出:

      NAME                     READY   STATUS    RESTARTS   AGE
      nginx-766448f68c-m****   1/1     Running   0          4m39s
      nginx-766448f68c-w****   1/1     Running   0          4m39s
    2. 执行以下命令,查看Pod的dnsConfig是否已经接入NodeLocal DNSCache。

      kubectl get pod nginx-766448f68c-m**** -o=jsonpath='{.spec.dnsConfig}'

      预期输出:

      map[nameservers:[169.254.20.10 172.21.0.10] options:[map[name:ndots value:5]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]

      当输出以上内容时,说明成功为应用接入NodeLocal DNSCache。

      开启自动注入后,您创建的Pod会被增加以下字段,为了最大程度上保证业务DNS请求高可用,nameservers中会额外加入kube-dns服务的ClusterIP地址(172.21.0.10)作为备份的DNS服务器。

        dnsConfig:
          nameservers:
          - 169.254.20.10
          - 172.21.0.10
          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

升级NodeLocal DNSCache

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 组件管理页面单击ACK NodeLocal DNSCache卡片下的升级,在弹出的对话框中单击确认

    重要
    • 若您对ConfigMap node-local-dns进行过修改操作,升级时您的修改配置将会被覆盖。建议您在升级前对node-local-dns进行备份,当组件升级完成后,重新配置组件。

    • 若您对node-local-dns DaemonSet进行过污点容忍等修改操作,升级时污点容忍等操作将会被覆盖,升级后需要再次设置。

    • 如果升级NodeLocal DNSCache失败,您需要根据操作异常码查找对应的问题,查看问题原因和解决方案。详细描述,请参见组件异常问题排查

卸载NodeLocal DNSCache

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 组件管理页面单击ACK NodeLocal DNSCache卡片下的卸载,在弹出的对话框中单击确认

    重要

    卸载后所有解析流量会请求至CoreDNS,建议您参照DNS最佳实践进行配置以保证DNS的高可用性。

修改Terway配置(Terway早期版本创建的集群)

在Terway早期版本创建的集群中,默认Terway配置可能无法使用NodeLocal DNSCache。您可参照下方的步骤,对Terway配置进行检查与修改。

  1. 执行以下命令,查看Terway配置文件。

    kubectl -n kube-system edit cm eni-config -o yaml
  2. 检查Terway配置文件。

    • 检查配置文件中eniip_virtual_type字段是否开启IPVLAN模式。如果配置文件中此项不存在或不是IPVLAN,则您不需要按后续步骤进行配置,可以直接安装NodeLocal DNSCache。具体操作,请参见安装NodeLocal DNSCache组件

    • 检查配置文件中是否已配置host_stack_cidrs字段。如果配置文件中已配置host_stack_cidrs 字段,则您不需要按后续步骤进行配置,可以直接安装NodeLocal DNSCache。具体操作,请参见安装NodeLocal DNSCache组件

  3. 在Terway配置文件中添加host_stack_cidrs字段,并输入网段169.254.20.10/32,保存并退出。

     10-terway.conf: |
      {
        "cniVersion": "0.3.0",
        "name": "terway",
        "eniip_virtual_type": "IPVlan",
        "host_stack_cidrs": ["169.254.20.10/32"], 
        "type": "terway"
      }
  4. 执行以下命令,查看当前Terway的所有DaemonSet容器组。

    kubectl -n kube-system get pod | grep terway-eniip

    预期输出:

    terway-eniip-7****         2/2     Running   0          30m
    terway-eniip-s****         2/2     Running   0          30m
  5. 执行以下命令,触发Terway容器组重建。

     kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. 登录任意集群节点,执行以下命令,查看Terway配置文件。

    如果Terway配置文件包含添加的网段,则说明配置成功。

    cat /etc/cni/net.d/*

    预期输出:

     {
       "cniVersion": "0.3.0",
       "name": "terway-chainer",
       "plugins": [
         {
           "eniip_virtual_type": "IPVlan",
           "host_stack_cidrs": [ 
             "169.254.20.10/32",
           ],
           "type": "terway"
         },
         {
           "type": "cilium-cni"
         }
       ]
     }

    所有Terway Pod重建并正常后,您可以继续安装NodeLocal DNSCache了。