Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Use the NodeLocal DNSCache add-on

Última actualización: Sep 04, 2026

Instale una caché de DNS por nodo para reducir la latencia de las consultas y mejorar la confiabilidad de la resolución.

Funcionamiento

NodeLocal DNSCache consta de dos componentes:

  • DaemonSet (agente de caché de DNS): Se ejecuta en cada nodo, crea una interfaz de red virtual y escucha las consultas de DNS en 169.254.20.10 de forma predeterminada. Para cambiar la dirección IP de escucha, envíe un ticket.

  • Deployment (controlador de admisión): Intercepta las solicitudes de creación de pods mediante webhooks de admisión e inyecta automáticamente dnsConfig en las especificaciones del pod.

Basado en CoreDNS, el agente de caché proporciona únicamente funcionalidad de proxy y caché. No habilite plugins como hosts o rewrite en este componente; configúrelos directamente en CoreDNS.

Flujo de consultas de DNS tras el despliegue de NodeLocal DNSCache:

image

Flujo de consultas de DNS tras el despliegue de NodeLocal DNSCache:

image

N.º

Descripción

①

De forma predeterminada, un pod con la configuración dnsConfig local inyectada utiliza NodeLocal DNSCache, que escucha las consultas de DNS enviadas a 169.254.20.10 en el nodo.

②

Si NodeLocal DNSCache no encuentra una coincidencia en la caché, utiliza el Service kube-dns para reenviar la consulta a CoreDNS.

③

CoreDNS utiliza el servidor de DNS desplegado en la virtual private cloud (VPC) para resolver nombres de dominio que no son locales al clúster.

④

Si el pod con la configuración dnsConfig local inyectada no logra conectarse a NodeLocal DNSCache, utiliza el Service kube-dns para conectarse a CoreDNS y realizar la resolución de DNS.

⑤

Un pod sin la configuración dnsConfig local inyectada utiliza el Service kube-dns para conectarse a CoreDNS y realizar la resolución de DNS.

Consulte DNS resolution policies and caching policies.

Requisitos previos

Antes de empezar, asegúrese de cumplir con lo siguiente:

Limitaciones

  • Los nodos Windows no son compatibles. Para los pods en nodos virtuales (incluidos los pods de ECI y ACS), la caché de DNS solo es compatible cuando se instalan NodeLocal DNSCache v1.6.0 o posterior y ack-virtual-node v2.14.0 o posterior.

  • Si el clúster utiliza Terway, se requiere la versión 1.0.10.301 o posterior. Si Terway se ejecuta en modo ENI inclusivo con IPvlan, primero debe configurar Terway para el modo IPvlan.

  • NodeLocal DNSCache actúa únicamente como un proxy de caché transparente para CoreDNS y no expone extensibilidad mediante plugins. Configure plugins como hosts o rewrite directamente en CoreDNS.

  • Configure el protocolo predeterminado del plugin forward de CoreDNS antes de usar NodeLocal DNSCache; de lo contrario, CoreDNS podría fallar al resolver dominios externos. Consulte Best practices for DNS services.

  • No se instala en los nodos maestros de forma predeterminada. Si hay pods ejecutándose en nodos maestros con taints, agregue tolerancias coincidentes al DaemonSet node-local-dns en el namespace kube-system.

Instalación de NodeLocal DNSCache

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en consola de ACKClusters.

  2. Busque su clúster y elija More > Operations > Manage Components en la columna Actions.

  3. En la página Add-ons, haga clic en la pestaña Networking y busque ACK NodeLocal DNSCache.

  4. Haga clic en Install. En el cuadro de diálogo, haga clic en OK.

Configuración de NodeLocal DNSCache

Para enrutar las consultas de DNS de los pods a través de NodeLocal DNSCache, establezca nameservers en la configuración dnsConfig del pod con el valor 169.254.20.10 y la dirección IP del clúster de kube-dns. Utilice uno de los siguientes métodos:

Method

Recommendation

Description

Método 1: Inyección automática de dnsConfig

Recomendado

El controlador de admisión inyecta dnsConfig al crear el pod, sin necesidad de editar manualmente el YAML.

Método 2: dnsConfig manual

Neutro

Especifique dnsConfig directamente en el YAML del pod.

Método 3: Parámetros de inicio de kubelet

No recomendado

Modifica kubelet y requiere un reinicio, lo cual puede interrumpir las cargas de trabajo.

Método 1: Inyección automática de dnsConfig

El controlador de admisión inyecta dnsConfig en los pods de los namespaces etiquetados con node-local-dns-injection=enabled. Etiquete un namespace para habilitar la inyección:

kubectl label namespace default node-local-dns-injection=enabled
Esto habilita la inyección únicamente para el namespace default. Reemplace default con su namespace de destino según sea necesario.

Cuando está habilitada, se agrega la siguiente configuración dnsConfig a los nuevos pods. La IP del clúster de kube-dns se incluye como respaldo para garantizar la alta disponibilidad.

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

Condiciones de inyección

La inyección se aplica solo cuando se cumplen todas las condiciones siguientes:

  • El pod no se encuentra en el namespace kube-system ni en kube-public.

  • El namespace del pod tiene la etiqueta node-local-dns-injection=enabled.

  • El namespace del pod no tiene etiquetas relacionadas con ECI (virtual-node-affinity-injection, eci o alibabacloud.com/eci).

  • El pod no tiene las etiquetas eci, alibabacloud.com/eci o node-local-dns-injection=disabled.

  • El pod utiliza hostNetwork con la directiva de DNS ClusterFirstWithHostNet, o bien no utiliza hostNetwork y emplea la directiva de DNS ClusterFirst.

Si la inyección falla, compruebe que se cumplan todas las condiciones anteriores.

Exclusión de la inyección para pods específicos

Para excluir pods específicos de la inyección, agregue node-local-dns-injection=disabled a las etiquetas de la plantilla del pod:

metadata:
  labels:
    node-local-dns-injection: "disabled"
Importante

En versiones de NodeLocal DNSCache anteriores a la v1.6.0 o versiones de ack-virtual-node anteriores a la v2.14.0, los pods de ECI no pueden utilizar NodeLocal DNSCache, lo que provoca fallos de DNS. En ese caso, deshabilite la inyección para el Deployment agregando node-local-dns-injection=disabled a las etiquetas de la plantilla del pod.

Método 2: dnsConfig manual

Especifique dnsConfig directamente en la especificación del 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"

Campos clave:

Field

Value

Notes

dnsPolicy

None

Obligatorio al especificar una configuración dnsConfig personalizada.

nameservers

169.254.20.10, IP del clúster de kube-dns

La primera entrada enruta hacia NodeLocal DNSCache; la segunda es el respaldo de kube-dns.

searches

Dominios de búsqueda de DNS del clúster

Garantiza que los nombres de servicios internos se resuelvan correctamente.

ndots

3

Un valor más bajo reduce las búsquedas en los dominios de búsqueda antes de intentar resolver el nombre tal cual. El valor predeterminado es 5. Consulte resolv.conf.

Método 3: Parámetros de inicio de kubelet

En /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, agregue --cluster-dns con la IP de NodeLocal DNSCache y la IP de kube-dns:

--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns-ip> --cluster-domain=<search-domain>

Parameter

Description

--cluster-dns

Servidores de DNS escritos en la configuración dnsConfig del pod. Especifique primero 169.254.20.10 y luego la IP de kube-dns.

--cluster-domain

Dominio de búsqueda de DNS escrito en la configuración dnsConfig del pod. En la mayoría de los clústeres, este valor es cluster.local.

Después de editar el archivo, aplique los cambios:

sudo systemctl daemon-reload
sudo systemctl restart kubelet
Importante

Reiniciar kubelet puede interrumpir brevemente las cargas de trabajo en ejecución.

Ejemplo: Configurar NodeLocal DNSCache para un Deployment

Habilite NodeLocal DNSCache para un Deployment en el namespace default mediante el Método 1 (inyección automática).

  1. Etiquete el namespace para habilitar la inyección automática de dnsConfig.

    Importante

    El controlador de admisión omite los pods en los namespaces kube-system y kube-public. No habilite la inyección para esos namespaces.

    kubectl label namespace default node-local-dns-injection=enabled
  2. Despliegue una aplicación de ejemplo. Guarde este YAML como ubuntu-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ubuntu
      labels:
        app: ubuntu
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: ubuntu
      template:
        metadata:
          labels:
            app: ubuntu
        spec:
          containers:
          - name: ubuntu
            image: ubuntu
            command: ["sh", "-c"]
            args: ["sleep 100000"]

    Aplique el manifiesto:

    kubectl apply -f ubuntu-deployment.yaml

    Salida esperada:

    deployment.apps/ubuntu created
  3. Compruebe que el Deployment se esté ejecutando.

    kubectl get deployment ubuntu

    Salida esperada:

    NAME     READY   UP-TO-DATE   AVAILABLE   AGE
    ubuntu   2/2     2            2           7s
  4. Verifique la inyección de dnsConfig. Obtenga el nombre de un pod:

    kubectl get pods

    Salida esperada:

    NAME                      READY   STATUS    RESTARTS   AGE
    ubuntu-766448f68c-m****   1/1     Running   0          4m39s
    ubuntu-766448f68c-w****   1/1     Running   0          4m39s

    Revise la configuración dnsConfig de un pod:

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

    Salida esperada:

    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]]

    La presencia de 169.254.20.10 en nameservers confirma la inyección de dnsConfig.

Actualización de NodeLocal DNSCache

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. Haga clic en el nombre de su clúster. En el panel de navegación izquierdo, elija Operations > Add-ons.

  3. En la página Add-ons, busque NodeLocal DNSCache y haga clic en Upgrade. En el cuadro de diálogo, haga clic en OK.

Las tolerancias personalizadas en el DaemonSet node-local-dns se sobrescriben durante la actualización. Vuelva a configurarlas después del proceso. Si la actualización falla, consulte Component troubleshooting .

Desinstalación de NodeLocal DNSCache

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. Haga clic en el nombre de su clúster. En el panel de navegación izquierdo, elija Operations > Add-ons.

  3. En la página Add-ons, busque NodeLocal DNSCache y haga clic en Uninstall. En el cuadro de diálogo, haga clic en OK.

Importante

Después de la desinstalación, todas las consultas de DNS se envían directamente a CoreDNS. Escale horizontalmente CoreDNS antes de desinstalar para manejar la mayor carga de trabajo.

Configuración de Terway para el modo IPvlan

En clústeres con versiones antiguas de Terway, la configuración predeterminada podría no enrutar correctamente el tráfico de DNS hacia 169.254.20.10. Actualice la configuración antes de instalar NodeLocal DNSCache.

  1. Abra el ConfigMap de Terway para editarlo:

    kubectl -n kube-system edit cm eni-config -o yaml
  2. Revise el ConfigMap:

  3. Si eniip_virtual_type es IPVlan y host_stack_cidrs está ausente, agregue host_stack_cidrs y establézcalo en 169.254.20.10/32. Guarde los cambios y salga.

    10-terway.conf: |
     {
       "cniVersion": "0.3.0",
       "name": "terway",
       "eniip_virtual_type": "IPVlan",
       "host_stack_cidrs": ["169.254.20.10/32"],
       "type": "terway"
     }
  4. Liste los pods del DaemonSet de Terway:

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

    Salida esperada:

    terway-eniip-7****         2/2     Running   0          30m
    terway-eniip-s****         2/2     Running   0          30m
  5. Elimine los pods para aplicar la configuración actualizada:

    kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. Inicie sesión en un nodo del clúster y verifique la actualización:

    cat /etc/cni/net.d/*

    Salida esperada:

    {
      "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"
        }
      ]
    }

    Una vez que todos los pods de Terway estén en ejecución, continúe con Instalación de NodeLocal DNSCache.

Siguientes pasos