Note de traduction.: ProblĂšme DNS dans Kubernetes, plus prĂ©cisĂ©ment â la configuration du paramĂštre ndots, â Ă©tonnamment populaire, en fait dĂ©jĂ . Dans un nouvel article sur ce sujet, lâauteur â un ingĂ©nieur DevOps dâune grande sociĂ©tĂ© de courtage en Inde â explique de maniĂšre trĂšs simple et concise ce que les collĂšgues exploitant Kubernetes doivent savoir.

Un des principaux avantages du dĂ©ploiement d'applications dans Kubernetes est la dĂ©couverte fluide des applications. Lâinteraction intra-cluster est grandement simplifiĂ©e grĂące au concept de service (), qui reprĂ©sente une IP virtuelle, supportant un ensemble dâadresses IP des pod. Par exemple, si le service vanilla souhaite se connecter au service chocolate, il peut se rĂ©fĂ©rer directement Ă lâIP virtuelle pour chocolate. La question se pose : qui dans ce cas rĂ©soudra la requĂȘte DNS Ă chocolate et comment ?
La rĂ©solution des noms DNS est configurĂ©e dans le cluster Kubernetes Ă lâaide de . Kubelet enregistre le pod avec CoreDNS comme serveur de noms dans les fichiers /etc/resolv.conf de tous les pods. Si lâon regarde le contenu de /etc/resolv.conf nâimporte quel pod, il ressemblera Ă peu prĂšs Ă ce qui suit :
search hello.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.152.183.10
options ndots:5 Cette configuration est utilisĂ©e par les clients DNS pour rediriger les requĂȘtes vers le serveur DNS. Dans le fichier resolv.conf se trouve les informations suivantes :
- nameserver: le serveur vers lequel seront envoyĂ©es les requĂȘtes DNS. Dans notre cas, câest lâadresse du service CoreDNS ;
- search: définit le chemin de recherche pour un domaine donné. Il est intéressant de noter que
google.comoumrkaran.devne sont pas des FQDN (). Selon le standard suivi par la plupart des rĂ©solveurs DNS, les domaines complets (FQDN) sont ceux qui se terminent par un point « . », reprĂ©sentant la zone racine. Certains rĂ©solveurs peuvent ajouter le point automatiquement. Ainsi,mrkaran.dev.est un nom de domaine complet (FQDN), tandis quemrkaran.devne lâest pas ; - ndots: Le paramĂštre le plus intĂ©ressant (cette article porte prĂ©cisĂ©ment lĂ -dessus).
ndotsdĂ©finit le nombre seuil de points dans le nom de la requĂȘte, au-delĂ duquel il est considĂ©rĂ© comme un « nom de domaine » complet. Nous en parlerons plus en dĂ©tail plus tard, lorsque nous analyserons la sĂ©quence de recherche DNS.

Voyons ce qui se passe lorsque nous interrogeons mrkaran.dev dans le pod :
$ nslookup mrkaran.dev
Server: 10.152.183.10
Address: 10.152.183.10#53
Réponse non autorisée :
Nom : mrkaran.dev
Adresse : 157.230.35.153
Nom : mrkaran.dev
Adresse : 2400:6180:0:d1::519:6001 Pour cette expérience, j'ai défini le niveau de journalisation de CoreDNS sur tout (ce qui le rend assez verbeux). Regardons les journaux du pod coredns:
[INFO] 10.1.28.1:35998 - 11131 "A IN mrkaran.dev.hello.svc.cluster.local. udp 53 false 512" NXDOMAIN qr,aa,rd 146 0.000263728s
[INFO] 10.1.28.1:34040 - 36853 "A IN mrkaran.dev.svc.cluster.local. udp 47 false 512" NXDOMAIN qr,aa,rd 140 0.000214201s
[INFO] 10.1.28.1:33468 - 29482 "A IN mrkaran.dev.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.000156107s
[INFO] 10.1.28.1:58471 - 45814 "A IN mrkaran.dev. udp 29 false 512" NOERROR qr,rd,ra 56 0.110263459s
[INFO] 10.1.28.1:54800 - 2463 "AAAA IN mrkaran.dev. udp 29 false 512" NOERROR qr,rd,ra 68 0.145091744sOuf. Deux choses ici attirent l'attention :
- La requĂȘte passe par toutes les Ă©tapes de recherche jusqu'Ă ce que la rĂ©ponse contienne le code
NOERROR(les clients DNS le comprennent et l'enregistrent comme un rĂ©sultat).NXDOMAINindique qu'aucun enregistrement n'a Ă©tĂ© trouvĂ© pour ce nom de domaine. Puisquemrkaran.devn'est pas un nom FQDN (conformĂ©ment Ăndots=5), le rĂ©solveur examine le chemin de recherche et dĂ©termine l'ordre des requĂȘtes ; - Les enregistrements
UnetAAAAsont envoyĂ©s en parallĂšle. En fait, les requĂȘtes uniques dans/etc/resolv.confsont par dĂ©faut configurĂ©es pour effectuer une recherche parallĂšle sur les protocoles IPv4 et IPv6. Ce comportement peut ĂȘtre annulĂ© en ajoutant l'optionsingle-requestdansresolv.conf.
Remarque : glibc qui peut ĂȘtre configurĂ©e pour envoyer ces requĂȘtes de maniĂšre sĂ©quentielle, alors que musl â non, donc les utilisateurs d'Alpine devraient en tenir compte.
Expérimentons avec ndots
Faisons encore un peu d'expérimentation avec ndots et voyons comment ce paramÚtre se comporte. L'idée est simple : ndots détermine si le client DNS considérera le domaine comme absolu ou relatif. Par exemple, comment un simple client DNS Google sait-il si ce domaine est absolu ? En définissant ndots à 1, le client dira : « Oh, dans google il n'y a pas de point ; je vais probablement passer par toute la liste de recherche ». Cependant, si l'on demande google.com, la liste des suffixes sera complÚtement ignorée, car le nom demandé satisfait le seuil ndots (il y a au moins un point).
Assurons-nous de cela :
$ cat /etc/resolv.conf
options ndots:1
$ nslookup mrkaran
Serveur : 10.152.183.10
Adresse : 10.152.183.10#53
** le serveur ne peut pas trouver mrkaran : NXDOMAINJournaux de CoreDNS :
[INFO] 10.1.28.1:52495 - 2606 "A IN mrkaran.hello.svc.cluster.local. udp 49 false 512" NXDOMAIN qr,aa,rd 142 0.000524939s
[INFO] 10.1.28.1:59287 - 57522 "A IN mrkaran.svc.cluster.local. udp 43 false 512" NXDOMAIN qr,aa,rd 136 0.000368277s
[INFO] 10.1.28.1:53086 - 4863 "A IN mrkaran.cluster.local. udp 39 false 512" NXDOMAIN qr,aa,rd 132 0.000355344s
[INFO] 10.1.28.1:56863 - 41678 "A IN mrkaran. udp 25 false 512" NXDOMAIN qr,rd,ra 100 0.034629206s Ătant donnĂ© que dans mrkaran n'a pas de point, la recherche a Ă©tĂ© effectuĂ©e sur toute la liste des suffixes.
Note : dans la pratique, la valeur maximale ndots limité à 15 ; par défaut dans Kubernetes, il est fixé à 5.
Utilisation en production
Si l'application effectue de nombreux appels rĂ©seau externes, le DNS peut devenir un goulot d'Ă©tranglement en cas de trafic actif, car de nombreuses requĂȘtes inutiles sont effectuĂ©es lors de la rĂ©solution du nom (avant que le systĂšme n'accĂšde Ă la bonne). Les applications n'ajoutent gĂ©nĂ©ralement pas de zone racine aux noms de domaine, mais cela pourrait tout Ă fait ĂȘtre considĂ©rĂ© comme un hack. Autrement dit, au lieu de demander api.twitter.com, vous pouvez 'hardcoder' api.twitter.com. (avec un point) dans l'application, ce qui incitera les clients DNS Ă effectuer directement une recherche autoritaire dans le domaine absolu.
De plus, Ă partir de la version 1.14 de Kubernetes, les extensions dnsConfig et dnsPolicy ont atteint un Ă©tat stable. Ainsi, lors du dĂ©ploiement d'un pod, vous pouvez rĂ©duire la valeur ndots, disons, Ă 3 (voire Ă 1 !). De ce fait, chaque message Ă l'intĂ©rieur du nĆud devra inclure le domaine complet. C'est l'un des compromis classiques, lorsqu'il faut choisir entre performance et portabilitĂ©. Il me semble que cela ne mĂ©rite de s'inquiĂ©ter que si des latences extrĂȘmement faibles sont cruciales pour votre application, car les rĂ©sultats DNS sont Ă©galement mis en cache en interne.
Liens
J'ai entendu parler de cette fonctionnalité pour la premiÚre fois lors de , qui a eu lieu le 25 janvier. On y a parlé, entre autres, de ce problÚme.
Voici quelques liens pour approfondir :
- , pourquoi ndots=5 dans Kubernetes ;
- sur la façon dont le changement de ndots affecte les performances de l'application ;
- entre les résolveurs musl et glibc.
Remarque : J'ai prĂ©fĂ©rĂ© ne pas utiliser dig dans cet article. dig ajoute automatiquement un point (identifiant de la zone racine), rendant le domaine 'complet' (FQDN), ne le passant d'abord par la liste de recherche. J'en ai parlĂ© dans . NĂ©anmoins, il est assez surprenant que, globalement, un drapeau distinct doive ĂȘtre dĂ©fini pour un comportement standard.
Bonne DNS ! Ă bientĂŽt !
P.S. de l'auteur
Lisez aussi dans notre blog :
- «»;
- «»;
- « Guide illustré sur la mise en réseau dans Kubernetes » : , .
Source : habr.com
