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.10par 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
dnsConfigdans 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 :
Flux des requêtes DNS après le déploiement de NodeLocal DNSCache :
|
N° |
Description |
|
① |
Par défaut, un pod dont la configuration |
|
② |
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 |
|
⑤ |
Un pod sans injection de la configuration |
Consultez la rubrique Politiques de résolution DNS et politiques de mise en cache.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Créé un cluster ACK.
Connecté kubectl au cluster.
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
hostsourewritedirectement 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-dnsdans le namespacekube-system.
Installation de NodeLocal DNSCache
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur console ACKClusters.
Recherchez votre cluster et choisissez More > Operations > Manage Components dans la colonne Actions.
Sur la page Add-ons, cliquez sur l'onglet Networking et recherchez ACK NodeLocal DNSCache.
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 |
|
Recommandée |
Le contrôleur d'admission injecte la configuration |
|
|
Neutre |
Spécifiez directement la configuration |
|
|
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 namespacedefault. Remplacezdefaultpar 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-systemoukube-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,ecioualibabacloud.com/eci).Le pod ne possède pas les libellés
eci,alibabacloud.com/eciounode-local-dns-injection=disabled.Le pod utilise
hostNetworkavec la politique DNSClusterFirstWithHostNet, ou n'utilise pashostNetworket utilise la politique DNSClusterFirst.
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"
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 |
|
|
|
Obligatoire lors de la spécification d'une configuration |
|
|
|
La première entrée dirige le trafic vers NodeLocal DNSCache ; la seconde sert de solution de secours via kube-dns. |
|
|
Domaines de recherche DNS du cluster |
Garantit la résolution correcte des noms de service internes. |
|
|
|
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 |
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 |
|
|
Serveurs DNS écrits dans la configuration |
|
|
Domaine de recherche DNS écrit dans la configuration |
Après avoir modifié le fichier, appliquez les changements :
sudo systemctl daemon-reload
sudo systemctl restart kubelet
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).
-
Ajoutez un libellé au namespace pour activer l'injection automatique de la configuration
dnsConfig.ImportantLe contrôleur d'admission ignore les pods des namespaces
kube-systemetkube-public. N'activez pas l'injection pour ces namespaces.kubectl label namespace default node-local-dns-injection=enabled -
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.yamlRésultat attendu :
deployment.apps/ubuntu created -
Vérifiez que le Deployment est en cours d'exécution.
kubectl get deployment ubuntuRésultat attendu :
NAME READY UP-TO-DATE AVAILABLE AGE ubuntu 2/2 2 2 7s -
Vérifiez l'injection de la configuration
dnsConfig. Obtenez le nom d'un pod :kubectl get podsRésultat attendu :
NAME READY STATUS RESTARTS AGE ubuntu-766448f68c-m**** 1/1 Running 0 4m39s ubuntu-766448f68c-w**** 1/1 Running 0 4m39sVérifiez la configuration
dnsConfigd'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.10dans le champnameserversconfirme l'injection de la configurationdnsConfig.
Mise à jour de NodeLocal DNSCache
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Add-ons.
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
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Operations > Add-ons.
Sur la page Add-ons, recherchez NodeLocal DNSCache et cliquez sur Uninstall. Dans la boîte de dialogue, cliquez sur OK.
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.
-
Ouvrez le ConfigMap de Terway pour modification :
kubectl -n kube-system edit cm eni-config -o yaml -
Vérifiez le ConfigMap :
Si
eniip_virtual_typen'est pas défini surIPVlan, aucune modification n'est nécessaire. Passez à la section Installation de NodeLocal DNSCache.Si
host_stack_cidrsest déjà présent, aucune modification n'est nécessaire. Passez à la section Installation de NodeLocal DNSCache.
-
Si
eniip_virtual_typeest défini surIPVlanet quehost_stack_cidrsest absent, ajoutezhost_stack_cidrset définissez-le sur169.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" } -
Listez les pods du DaemonSet Terway :
kubectl -n kube-system get pod | grep terway-eniipRésultat attendu :
terway-eniip-7**** 2/2 Running 0 30m terway-eniip-s**** 2/2 Running 0 30m -
Supprimez les pods pour appliquer la configuration mise à jour :
kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s**** -
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.