Cette rubrique décrit les politiques de résolution du Domain Name System (DNS) et les politiques de mise en cache pour les clusters Alibaba Cloud Container Compute Service (ACS).
Chaînes de résolution DNS
Les diagrammes suivants illustrent la chaîne de résolution DNS pour deux scénarios.
Applications non conteneurisées sur des instances Elastic Compute Service (ECS)
Par exemple, une application nommée App s'exécute sur une instance ECS, comme l'illustre la figure suivante.

Applications conteneurisées dans des pods avec la politique DNS ClusterFirst
Par exemple, une application nommée App s'exécute dans un pod au sein d'un cluster Kubernetes, comme l'illustre la figure suivante.

Politiques de résolution
Côté client
Les requêtes DNS provenant des pods transitent par les interfaces fournies par glibc. Le fichier /etc/resolv.conf détermine le mode de résolution DNS de glibc. Le tableau suivant répertorie les paramètres configurables et leurs valeurs par défaut selon les environnements.
| Paramètre | Description | Valeur par défaut (glibc) | ECS | Pod ClusterFirst | Pod Default | Réseau hôte + Pod Default |
|---|---|---|---|---|---|---|
nameserver |
Serveur DNS assurant la résolution des noms de domaine. | Aucune | Serveurs DNS du VPC ② | IP du cluster CoreDNS ③ | Serveurs DNS du VPC | Serveurs DNS du VPC |
search |
Suffixes ajoutés aux noms de domaine non FQDN avant la résolution. | Aucun | Aucun | <ns>.svc.cluster.local svc.cluster.local cluster.local |
Aucun | Aucun |
ndots:n |
Si un nom de domaine contient moins de points que cette valeur, les suffixes de recherche sont ajoutés avant la résolution. Dans le cas contraire, le nom est considéré comme un nom de domaine entièrement qualifié (FQDN) et résolu directement. | 1 | 1 | 5 | 1 | 1 |
timeout:n |
Délai d'expiration pour chaque tentative de résolution DNS, en secondes. | 5 | 2 | 5 | 5 | 2 |
attempts:n ① |
Nombre maximal de tentatives en cas d'échec de la résolution DNS. | 2 | 3 | 2 | 2 | 3 |
rotate |
Envoie les requêtes DNS aux serveurs de noms en alternance (round-robin). | Désactivé | Activé | Désactivé | Désactivé | Activé |
single-request-reopen |
Si deux requêtes DNS empruntent le même socket, ferme ce dernier après la première requête et en ouvre un nouveau pour la seconde. | Désactivé | Activé | Désactivé | Désactivé | Activé |
Le tableau suivant décrit le comportement de routage des requêtes pour chaque politique DNS.
| Politique DNS | Comportement |
|---|---|
ClusterFirst |
Les requêtes DNS sont envoyées à CoreDNS. Celles qui correspondent au suffixe de domaine du cluster sont résolues par CoreDNS. Toutes les autres requêtes sont transmises aux serveurs de noms upstream. Il s'agit de la politique par défaut lorsque dnsPolicy n'est pas spécifié. |
Default |
Le pod hérite des paramètres DNS de l'instance ECS sur laquelle il s'exécute. Les requêtes DNS sont envoyées directement aux serveurs DNS du VPC, sans passer par CoreDNS. |
« Default » n'est pas la politique DNS par défaut. Lorsque dnsPolicy n'est pas spécifié, Kubernetes utilise ClusterFirst.
① Le paramètre attempts s'applique uniquement lorsque le serveur retourne SERVFAIL, NOTIMP ou REFUSED, ou lorsqu'un code NOERROR est retourné sans résultat de résolution. Pour plus de détails, consultez Présentation du paramètre attempts.
② Les serveurs DNS du VPC constituent les serveurs de noms par défaut pour les instances ECS dans le Virtual Private Cloud (VPC). Leurs adresses IP sont 100.100.2.136 et 100.100.2.138. Ils résolvent les noms de domaine autoritaires ainsi que les domaines ajoutés à Alibaba Cloud DNS PrivateZone.
③ L'IP du cluster CoreDNS correspond à l'adresse IP du Service kube-dns dans le namespace kube-system. Ce service transfère les requêtes DNS à CoreDNS pour les noms de domaine internes, les domaines autoritaires et les domaines ajoutés à Alibaba Cloud DNS PrivateZone.
Pour plus d'informations sur la configuration de resolv.conf, consultez resolv.conf.
Environnements non standard
La configuration DNS côté client décrite ci-dessus s'applique aux environnements utilisant glibc. Les environnements suivants présentent un comportement différent.
Alpine Linux (musl libc)
Alpine Linux remplace glibc par musl libc, ce qui introduit plusieurs différences en matière de résolution DNS :
Les options
single-requestetsingle-request-reopenne sont pas prises en charge dans/etc/resolv.conf.Alpine 3.3 et les versions antérieures ne prennent pas en charge le paramètre
searchpour les domaines de recherche, ce qui entraîne l'échec de la découverte de services.musl libc envoie parallèlement des requêtes à tous les serveurs de noms définis dans
/etc/resolv.conf, empêchant ainsi NodeLocal DNSCache d'optimiser la résolution DNS.musl libc transmet simultanément les requêtes A et AAAA sur le même socket. Sur les anciennes versions du noyau, cela provoque une perte de paquets au niveau du port conntrack.
Pour plus d'informations, consultez Différences fonctionnelles entre musl libc et glibc.
Golang et Node.js
Les applications développées avec Golang ou Node.js peuvent utiliser un résolveur DNS intégré plutôt que glibc. Cela peut entraîner des différences significatives dans le comportement de résolution DNS. Vérifiez l'implémentation de la résolution DNS de votre application si vous observez un comportement inattendu.
Serveurs DNS internes du cluster
Par défaut, CoreDNS hérite du fichier /etc/resolv.conf de l'instance ECS qui l'héberge. CoreDNS utilise ensuite le plugin intégré forward pour transmettre les requêtes DNS en amont.
Le tableau suivant répertorie les paramètres du plugin forward ainsi que leurs valeurs par défaut. Pour la référence complète, consultez forward.
| Paramètre | Description | Valeur par défaut (CoreDNS) | Valeur par défaut (NodeLocal DNSCache) |
|---|---|---|---|
prefer_udp |
Utilise UDP pour communiquer avec le serveur upstream. | Activé | Désactivé |
force_tcp |
Utilise TCP pour communiquer avec le serveur upstream. | Désactivé | Activé |
max_fails |
Nombre de vérifications d'état consécutives échouées avant qu'un serveur upstream ne soit considéré comme défaillant. | 2 | 2 |
expire |
Durée de maintien de la connexion active avec le serveur upstream. | 10s | 10s |
policy |
Politique de sélection des serveurs upstream. | random | random |
health_check |
Intervalle entre les vérifications d'état des serveurs upstream. | 0.5s | 0.5s |
max_concurrent |
Nombre maximal de requêtes simultanées vers les serveurs upstream. | Aucune | Aucune |
dial timeout |
Délai de connexion aux serveurs upstream. Diminue dynamiquement en fonction de la durée réelle de connexion. | 30s | 30s |
read timeout |
Délai d'attente de réponse des serveurs upstream. | 2s | 2s |
Politiques de mise en cache
Côté client
La politique de mise en cache DNS côté client dépend de la configuration du conteneur et de l'application. Configurez la mise en cache côté client selon vos besoins.
Serveurs DNS internes du cluster
CoreDNS utilise le plugin cache pour mettre en cache les résultats de résolution DNS. Le tableau suivant répertorie les paramètres du plugin cache et leurs valeurs par défaut dans ACS.
| Paramètre | Description | Valeur par défaut (CoreDNS) | Valeur par défaut (CoreDNS dans ACS) |
|---|---|---|---|
| TTL max succès | Durée de vie (TTL) maximale pour les résolutions DNS réussies mises en cache. | 3600s | 30s |
| TTL min succès | TTL minimale pour les résolutions DNS réussies mises en cache. | 5s | 5s |
| Capacité succès | Nombre maximal de résultats de résolution DNS réussis à mettre en cache. | 9984 | 9984 |
| TTL max échec | TTL maximale pour les résolutions DNS échouées mises en cache. | 1800s | 30s |
| TTL min échec | TTL minimale pour les résolutions DNS échouées mises en cache. | 5s | 5s |
| Capacité échec | Nombre maximal de résultats de résolution DNS échoués à mettre en cache. | 9984 | 9984 |
| TTL ServerError | TTL maximale pour les résultats DNS retournés par des serveurs upstream défaillants. | 5s | 0s. Si la version de CoreDNS est antérieure à 1.8.4.2, la valeur par défaut est 5s. |
serve_stale |
Fournit des entrées de cache expirées lorsque le serveur upstream est inaccessible. | Désactivé | Désactivé |
La TTL effectivement appliquée à une entrée en cache est déterminée comme suit :
Si la TTL de l'enregistrement DNS dépasse la TTL maximale, c'est la TTL maximale qui s'applique.
Si la TTL de l'enregistrement DNS est inférieure à la TTL minimale, c'est la TTL minimale qui s'applique.
Si la TTL de l'enregistrement DNS se situe entre la TTL minimale et la TTL maximale, c'est la TTL de l'enregistrement DNS qui est utilisée.
Optimisation de la résolution DNS
Modifiez le fichier YAML du pod ou la ConfigMap CoreDNS pour ajuster le comportement de résolution DNS.
Utilisation directe des serveurs DNS du VPC
Définissez dnsPolicy: Default pour contourner CoreDNS et résoudre les noms de domaine directement via les serveurs DNS du VPC. Le pod hérite alors des paramètres DNS de l'instance ECS qui l'héberge.
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Set the dnsPolicy parameter to Default.
dnsPolicy: Default
# The /etc/resolv.conf file in the pod.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
Amélioration de la tolérance aux pannes pour les pods Default
Lorsque dnsPolicy: Default est défini, le fichier /etc/resolv.conf du pod omet les options rotate, single-request-reopen, timeout:2 et attempts:3 présentes par défaut sur les instances ECS. En l'absence de ces options, la résolution DNS risque davantage d'échouer lors d'instabilités réseau.
Ajoutez ces options via dnsConfig afin de reproduire le comportement des instances ECS :
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Set the dnsPolicy parameter to Default.
dnsPolicy: Default
# Add the following options.
dnsConfig:
options:
- name: timeout
value: "2"
- name: attempts
value: "3"
- name: rotate
- name: single-request-reopen
# After adding the options, redeploy the pod to apply the changes.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
options rotate single-request-reopen timeout:2 attempts:3