Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Installez un cache DNS par nœud pour réduire la latence des requêtes et améliorer la fiabilité de la résolution.

Fonctionnement

NodeLocal DNSCache se compose de deux composants :

  • DaemonSet (agent de mise en cache DNS) : s'exécute sur chaque nœud, crée une interface réseau virtuelle et écoute les requêtes DNS sur l'adresse 169.254.20.10 par défaut. Pour modifier l'adresse IP d'écoute, ouvrez un ticket.

  • Deployment (contrôleur d'admission) : intercepte les demandes de création de pods via des webhooks d'admission et injecte automatiquement la configuration dnsConfig dans les spécifications des pods.

L'agent de mise en cache repose sur CoreDNS et assure uniquement les fonctions de proxy et de cache. N'activez pas de plugins tels que hosts ou rewrite sur cet agent ; configurez-les directement dans CoreDNS.

Flux des requêtes DNS après le déploiement de NodeLocal DNSCache :

image

Flux des requêtes DNS après le déploiement de NodeLocal DNSCache :

image

Description

Par défaut, un pod dont la configuration dnsConfig locale est injectée utilise NodeLocal DNSCache, qui écoute les requêtes DNS envoyées à l'adresse 169.254.20.10 sur le nœud.

Si NodeLocal DNSCache ne trouve pas de correspondance dans le cache, il utilise le service kube-dns pour transférer la requête vers CoreDNS.

CoreDNS utilise le serveur DNS déployé dans le VPC (Virtual Private Cloud) pour résoudre les noms de domaine qui ne sont pas locaux au cluster.

Si le pod avec la configuration dnsConfig locale injectée ne parvient pas à se connecter à NodeLocal DNSCache, il utilise le service kube-dns pour se connecter à CoreDNS afin de résoudre les noms DNS.

Un pod sans injection de la configuration dnsConfig locale utilise le service kube-dns pour se connecter à CoreDNS afin de résoudre les noms DNS.

Consultez la rubrique Politiques de résolution DNS et politiques de mise en cache.

Prérequis

Avant de commencer, assurez-vous d'avoir :

Limites

  • Les nœuds Windows ne sont pas pris en charge. Pour les pods exécutés sur des nœuds virtuels (y compris les pods ECI et ACS), la mise en cache DNS est prise en charge uniquement si NodeLocal DNSCache version 1.6.0 ou ultérieure et ack-virtual-node version 2.14.0 ou ultérieure sont installés.

  • Si le cluster utilise Terway, la version 1.0.10.301 ou ultérieure est requise. Si Terway fonctionne en mode ENI inclusif avec IPvlan, configurez d'abord Terway pour le mode IPvlan.

  • NodeLocal DNSCache agit uniquement comme un proxy de mise en cache transparent pour CoreDNS et n'expose pas l'extensibilité des plugins. Configurez les plugins tels que hosts ou rewrite directement dans CoreDNS.

  • Configurez le protocole par défaut du plugin forward de CoreDNS avant d'utiliser NodeLocal DNSCache, sinon CoreDNS pourrait échouer à résoudre les domaines externes. Consultez la rubrique Bonnes pratiques pour les services DNS.

  • L'installation n'est pas effectuée par défaut sur les nœuds maîtres. Si des pods s'exécutent sur des nœuds maîtres avec des tolérances (taints), ajoutez les tolérances correspondantes au DaemonSet node-local-dns dans le namespace kube-system.

Installation de NodeLocal DNSCache

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur console ACKClusters.

  2. Recherchez votre cluster et choisissez More > Operations > Manage Components dans la colonne Actions.

  3. Sur la page Add-ons, cliquez sur l'onglet Networking et recherchez ACK NodeLocal DNSCache.

  4. Cliquez sur Install. Dans la boîte de dialogue, cliquez sur OK.

Configuration de NodeLocal DNSCache

Pour acheminer les requêtes DNS des pods via NodeLocal DNSCache, définissez les serveurs nameservers dans la configuration dnsConfig du pod sur 169.254.20.10 et sur l'adresse IP du cluster kube-dns. Utilisez l'une des méthodes suivantes :

Méthode

Recommandation

Description

Méthode 1 : Injection automatique de dnsConfig

Recommandée

Le contrôleur d'admission injecte la configuration dnsConfig lors de la création du pod, sans nécessiter de modifications manuelles du fichier YAML.

Méthode 2 : Configuration manuelle de dnsConfig

Neutre

Spécifiez directement la configuration dnsConfig dans le fichier YAML du pod.

Méthode 3 : Paramètres de démarrage de kubelet

Non recommandée

Modifie la configuration de kubelet et nécessite un redémarrage, ce qui peut interrompre les charges de travail.

Méthode 1 : Injection automatique de dnsConfig

Le contrôleur d'admission injecte la configuration dnsConfig dans les pods des namespaces portant le libellé node-local-dns-injection=enabled. Ajoutez un libellé au namespace pour activer l'injection :

kubectl label namespace default node-local-dns-injection=enabled
Cela active l'injection uniquement pour le namespace default . Remplacez default par le namespace cible de votre choix si nécessaire.

Lorsque cette option est activée, la configuration dnsConfig suivante est ajoutée aux nouveaux pods. L'IP du cluster kube-dns est incluse comme solution de secours pour assurer la haute disponibilité.

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

Conditions d'injection

L'injection s'applique uniquement lorsque toutes les conditions ci-dessous sont réunies :

  • Le pod ne se trouve pas dans les namespaces kube-system ou kube-public.

  • Le namespace du pod possède le libellé node-local-dns-injection=enabled.

  • Le namespace du pod ne possède pas de libellés liés à ECI (virtual-node-affinity-injection, eci ou alibabacloud.com/eci).

  • Le pod ne possède pas les libellés eci, alibabacloud.com/eci ou node-local-dns-injection=disabled.

  • Le pod utilise hostNetwork avec la politique DNS ClusterFirstWithHostNet, ou n'utilise pas hostNetwork et utilise la politique DNS ClusterFirst.

Si l'injection échoue, vérifiez toutes les conditions ci-dessus.

Exclusion de l'injection pour des pods spécifiques

Pour exclure des pods spécifiques de l'injection, ajoutez le libellé node-local-dns-injection=disabled aux libellés du modèle de pod :

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

Sur les versions de NodeLocal DNSCache antérieures à la v1.6.0 ou les versions d'ack-virtual-node antérieures à la v2.14.0, les pods ECI ne peuvent pas utiliser NodeLocal DNSCache, ce qui entraîne des échecs DNS. Dans ce cas, désactivez l'injection pour le Deployment en ajoutant le libellé node-local-dns-injection=disabled aux libellés du modèle de pod.

Méthode 2 : Configuration manuelle de dnsConfig

Spécifiez directement la configuration dnsConfig dans la spécification du 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"

Champs clés :

Champ

Valeur

Notes

dnsPolicy

None

Obligatoire lors de la spécification d'une configuration dnsConfig personnalisée.

nameservers

169.254.20.10, IP du cluster kube-dns

La première entrée dirige le trafic vers NodeLocal DNSCache ; la seconde sert de solution de secours via kube-dns.

searches

Domaines de recherche DNS du cluster

Garantit la résolution correcte des noms de service internes.

ndots

3

Une valeur plus faible réduit les recherches dans les domaines de recherche avant d'essayer le nom tel quel. La valeur par défaut est 5. Consultez la page resolv.conf.

Méthode 3 : Paramètres de démarrage de kubelet

Dans le fichier /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, ajoutez l'option --cluster-dns avec l'IP de NodeLocal DNSCache et l'IP de kube-dns :

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

Paramètre

Description

--cluster-dns

Serveurs DNS écrits dans la configuration dnsConfig du pod. Spécifiez d'abord 169.254.20.10, puis l'IP de kube-dns.

--cluster-domain

Domaine de recherche DNS écrit dans la configuration dnsConfig du pod. Dans la plupart des clusters, il s'agit de cluster.local.

Après avoir modifié le fichier, appliquez les changements :

sudo systemctl daemon-reload
sudo systemctl restart kubelet
Important

Le redémarrage de kubelet peut interrompre brièvement les charges de travail en cours d'exécution.

Exemple : Configuration de NodeLocal DNSCache pour un Deployment

Activez NodeLocal DNSCache pour un Deployment dans le namespace default en utilisant la méthode 1 (injection automatique).

  1. Ajoutez un libellé au namespace pour activer l'injection automatique de la configuration dnsConfig.

    Important

    Le contrôleur d'admission ignore les pods des namespaces kube-system et kube-public. N'activez pas l'injection pour ces namespaces.

    kubectl label namespace default node-local-dns-injection=enabled
  2. Déployez une application exemple. Enregistrez ce fichier YAML sous le nom 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"]

    Appliquez le manifeste :

    kubectl apply -f ubuntu-deployment.yaml

    Résultat attendu :

    deployment.apps/ubuntu created
  3. Vérifiez que le Deployment est en cours d'exécution.

    kubectl get deployment ubuntu

    Résultat attendu :

    NAME     READY   UP-TO-DATE   AVAILABLE   AGE
    ubuntu   2/2     2            2           7s
  4. Vérifiez l'injection de la configuration dnsConfig. Obtenez le nom d'un pod :

    kubectl get pods

    Résultat attendu :

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

    Vérifiez la configuration dnsConfig d'un pod :

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

    Résultat attendu :

    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 présence de 169.254.20.10 dans le champ nameservers confirme l'injection de la configuration dnsConfig.

Mise à jour de NodeLocal DNSCache

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

  2. Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Add-ons.

  3. Sur la page Add-ons, recherchez NodeLocal DNSCache et cliquez sur Upgrade. Dans la boîte de dialogue, cliquez sur OK.

Les tolérances personnalisées sur le DaemonSet node-local-dns sont écrasées lors de la mise à jour. Reconfigurez-les ensuite. Si la mise à jour échoue, consultez la rubrique Dépannage des composants .

Désinstallation de NodeLocal DNSCache

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

  2. Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Add-ons.

  3. Sur la page Add-ons, recherchez NodeLocal DNSCache et cliquez sur Uninstall. Dans la boîte de dialogue, cliquez sur OK.

Important

Après la désinstallation, toutes les requêtes DNS sont dirigées directement vers CoreDNS. Mettez à l'échelle CoreDNS avant la désinstallation pour gérer la charge accrue.

Configuration de Terway pour le mode IPvlan

Dans les clusters avec des versions anciennes de Terway, la configuration par défaut peut ne pas router correctement le trafic DNS vers 169.254.20.10. Mettez à jour la configuration avant d'installer NodeLocal DNSCache.

  1. Ouvrez le ConfigMap de Terway pour modification :

    kubectl -n kube-system edit cm eni-config -o yaml
  2. Vérifiez le ConfigMap :

  3. Si eniip_virtual_type est défini sur IPVlan et que host_stack_cidrs est absent, ajoutez host_stack_cidrs et définissez-le sur 169.254.20.10/32. Enregistrez et quittez.

    10-terway.conf: |
     {
       "cniVersion": "0.3.0",
       "name": "terway",
       "eniip_virtual_type": "IPVlan",
       "host_stack_cidrs": ["169.254.20.10/32"],
       "type": "terway"
     }
  4. Listez les pods du DaemonSet Terway :

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

    Résultat attendu :

    terway-eniip-7****         2/2     Running   0          30m
    terway-eniip-s****         2/2     Running   0          30m
  5. Supprimez les pods pour appliquer la configuration mise à jour :

    kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. Connectez-vous à un nœud du cluster et vérifiez la mise à jour :

    cat /etc/cni/net.d/*

    Résultat attendu :

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

    Une fois que tous les pods Terway sont en cours d'exécution, passez à la section Installation de NodeLocal DNSCache.

Étapes suivantes