Dans un cluster Kubernetes, les pods utilisent des noms de domaine pour accéder aux services ou à des services externes. Ces noms de domaine doivent être résolus en adresses IP pour permettre l'accès. Le DNS gère cette opération en maintenant une correspondance entre les noms de domaine et les adresses IP. Cette rubrique décrit les bases du DNS, les modules complémentaires DNS dans ACK et la configuration DNS.
Fonctionnement de la résolution des noms de domaine
Bien que les appareils sur Internet communiquent à l'aide d'adresses IP, les noms de domaine sont plus faciles à retenir car ils sont plus sémantiques. Par conséquent, les clients utilisent presque toujours des noms de domaine pour initier des requêtes. La figure suivante illustre le processus lorsqu'un client envoie une requête à example.com.
Le serveur enregistre son adresse IP et son nom de domaine auprès d'un serveur DNS, qui stocke l'enregistrement correspondant.
Le client demande au serveur DNS l'adresse IP correspondant à example.com.
Le serveur DNS recherche l'enregistrement et renvoie l'adresse IP au client.
Le client utilise l'adresse IP pour accéder au serveur cible.
Types de noms de domaine dans un cluster
-
Nom de domaine interne : il s'agit du nom de domaine d'un Service, valide uniquement au sein du cluster. Nous vous recommandons d'utiliser le format de nom de domaine complet (FQDN),
<service-name>.<namespace>.svc.<cluster-domain>, pour accéder au Service. L'utilisation d'un nom de domaine court (<service-name>) génère un grand nombre de requêtes DNS invalides et augmente le temps de résolution.Le paramètre cluster-domain est une configuration personnalisée définie lors de la création du cluster ; sa valeur par défaut est
cluster.local. -
Nom de domaine externe : inclut les noms de domaine internes au VPC et les noms de domaine publics. Pour résoudre ces noms de domaine, CoreDNS doit obtenir le résultat auprès d'un serveur DNS en amont. Par défaut, le serveur DNS en amont est le service PrivateZone, avec les adresses IP 100.100.2.136 et 100.100.2.138.
ImportantLe service PrivateZone ne fournit aucun accord de niveau de service (SLA) pour la résolution récursive des noms de domaine publics. Pour connaître les limites de la résolution récursive, consultez la rubrique Gérer les requêtes récursives.
Modules complémentaires DNS dans un cluster
Dans un cluster managé ACK, deux modules complémentaires gèrent le DNS : CoreDNS et NodeLocal DNSCache.
CoreDNS
CoreDNS est disponible en deux modes : managé et non managé.
|
Critère de comparaison |
||
|
Clusters applicables |
|
|
|
Mode de déploiement |
Déployé sur le plan de contrôle et entièrement géré par ACK. Sur la page Component Management de la console, les cartes des composants hébergés affichent l'état Hosted. |
Déployé en tant que charge de travail (Deployment) dans le cluster. Par défaut, il est installé dans le namespace kube-system et consomme des ressources sur les nœuds de calcul. |
|
Responsabilité O&M |
Alibaba Cloud est responsable de l'O&M du composant. |
Suit un modèle de responsabilité partagée :
|
|
Fonctionnalités |
|
|
|
Journalisation |
La journalisation est activée par défaut. |
Prise en charge disponible, mais vous devez activer manuellement la journalisation CoreDNS. |
|
Surveillance et alertes |
Prend en charge la surveillance Prometheus. Vous devez configurer et paramétrer la surveillance du cluster. |
|
|
Performances |
Pour plus d'informations, consultez la rubrique Performances de CoreDNS managé. |
Dépend de la configuration du composant. |
CoreDNS non managé
CoreDNS est un module complémentaire dans un cluster Kubernetes qui gère la résolution DNS. Il peut résoudre à la fois les noms de domaine des services internes et les noms de domaine externes. Le projet CoreDNS est hébergé par la Cloud Native Computing Foundation (CNCF). Pour plus d'informations, consultez la page CoreDNS : DNS et découverte de services.
Conformément à la norme Kubernetes open source, les clusters ACK installent CoreDNS comme serveur DNS par défaut. CoreDNS est déployé en tant que Deployment dans le namespace kube-system. kube-dns est le Service de type ClusterIP pour CoreDNS. Pour savoir comment configurer CoreDNS, consultez la rubrique Configurer CoreDNS non managé.
Dans l'exemple suivant, un Pod du namespace default tente d'accéder à database-svc et suit le processus ci-dessous :
-
Le pod vérifie le fichier de configuration
/etc/resolv.confet détermine que l'adresse IP du serveur DNS est172.0.XX.XX. Il s'agit du ClusterIP de kube-dns. Voici un exemple du fichier de configuration.nameserver 172.0.XX.XX # Defines the IP address of the DNS server. search default.svc.cluster.local svc.cluster.local cluster.local # Sets the search suffix rules for domain names. The more search paths are configured, the more lookup attempts are made. options ndots:5 # Defines options for the domain name resolution configuration file. Multiple key-value pairs are supported. -
Un pod envoie une requête DNS à kube-dns, en utilisant les valeurs du champ
searchcomme suffixes pour résoudre séquentiellement les noms suivants :database-svc.default.svc.cluster.local(un Service dans le même namespace que le pod)database-svc.svc.cluster.local(un Service dans un autre namespace)database-svc.cluster.local(nom de domaine étendu au cluster)database-svc(nom de domaine externe)
Le pod CoreDNS renvoie le résultat, à savoir l'adresse IP 172.4.XX.XX.
Le pod utilise cette adresse IP pour accéder au service cible
database-svc.-
Si la requête concerne un nom de domaine externe, tel qu'un nom de domaine interne au VPC ou un nom de domaine public, le pod CoreDNS transfère la requête au serveur DNS en amont.
ImportantNe modifiez pas la configuration du serveur DNS sur le nœud, car CoreDNS hérite de l'adresse du serveur DNS en amont depuis le nœud sur lequel il s'exécute.
La configuration CoreDNS est stockée dans le ConfigMap
corednsdu namespace kube-system. Dans la configuration par défaut, le pluginforwardpointe vers/etc/resolv.conf. Cela signifie que pour les requêtes DNS en amont, CoreDNS utilise les adresses des serveurs DNS issues du fichier/etc/resolv.confde son conteneur. Le fichier/etc/resolv.confdu conteneur CoreDNS est, par défaut, identique au fichier/etc/resolv.confde son nœud hôte, qui utilise les adresses DNS par défaut 100.100.2.136 et 100.100.2.138. Si vous modifiez la configuration du serveur DNS sur le nœud, CoreDNS utilisera des adresses DNS en amont incorrectes, ce qui entraînera des échecs de résolution ou des résultats inattendus..:53 { ... forward . /etc/resolv.conf { prefer_udp } ... }
CoreDNS managé
CoreDNS managé fonctionne sur le même principe que CoreDNS non managé, mais il est entièrement géré par ACK. Il ne consomme pas de ressources du cluster et ne nécessite aucune intervention O&M de votre part. Il effectue également un scaling automatique en fonction de la charge. Pour plus d'informations, consultez la rubrique Performances de CoreDNS managé.
CoreDNS managé est pris en charge dans les clusters managés ACK avec le mode automatique activé. Pour utiliser un cluster managé ACK avec le mode automatique activé, consultez la rubrique Créer un cluster managé ACK avec le mode automatique activé.
NodeLocal DNSCache
NodeLocal DNSCache configure un cache DNS sur chaque nœud de calcul afin de réduire la charge sur CoreDNS et d'améliorer la stabilité et la disponibilité du DNS du cluster. Installez ce module complémentaire dans les scénarios où la charge DNS est élevée ou lorsque des exigences strictes s'appliquent à la vitesse et à la stabilité des réponses DNS. Pour installer et utiliser le composant, consultez la rubrique Utiliser le composant NodeLocal DNSCache.
Dans l'exemple suivant, après l'installation de NodeLocal DNSCache et l'ajout du libellé node-local-dns-injection: "enabled" au namespace default, un pod du namespace default tente d'accéder à database-svc et suit le processus ci-dessous :
Le pod vérifie d'abord le cache DNS de son nœud.
-
Le processus se déroule de l'une des deux manières suivantes, selon qu'il y ait ou non un hit dans le cache :
Un hit se produit si le cache DNS du nœud contient un enregistrement pour
database-svc. Le cache renvoie le résultat et le pod l'utilise pour accéder au service.En cas de miss dans le cache, c'est-à-dire si le cache DNS du nœud ne contient pas d'enregistrement pour
database-svc, le résultat est récupéré auprès de CoreDNS. Le résultat obtenu de CoreDNS est ensuite mis en cache dans le cache DNS du nœud pour une utilisation future.
Configuration DNS du cluster
Le DNS dans un cluster peut être configuré à trois niveaux différents, chacun ayant une portée distincte.
Configuration du cluster
ClusterDomain est une configuration kubelet sur chaque nœud. Cette configuration doit être cohérente sur tous les kubelets du cluster. Sinon, des erreurs réseau se produiront.
-
ClusterDomainClusterDomain représente le domaine de premier niveau local d'un cluster et le suffixe par défaut des noms de domaine complets de tous les Services au sein du cluster. La valeur par défaut est
cluster.local. La configuration ClusterDomain est généralement utilisée pour distinguer les réseaux intra-cluster des réseaux extra-cluster. Lors de la création d'un cluster, vous pouvez personnaliser ClusterDomain. Assurez-vous que le nom de domaine personnalisé n'entre pas en conflit avec les noms de domaine externes couramment utilisés.
Configuration du nœud
-
resolveConfresolveConfspécifie le chemin d'accès au fichier de configuration DNS sur le nœud. Lorsque la politiquednsPolicyd'un pod est définie surDefault, le kubelet copie le fichier spécifié parresolveConf(qui est par défaut/etc/resolv.conf) dans le fichier/etc/resolv.confdu pod.
Configuration du pod
Chaque pod dispose de deux configurations pour personnaliser sa politique DNS :
dnsPolicydéfinit la politique de résolution DNS, etdnsConfigpermet de spécifier des serveurs DNS et des domaines de recherche personnalisés. Pour plus d'informations sur l'utilisation conjointe dednsPolicyet dednsConfigdans différents scénarios, consultez la rubrique Configuration de la politique DNS et résolution des noms de domaine.