Recherche DNS dans Kubernetes

Note de traduction.: ProblĂšme DNS dans Kubernetes, plus prĂ©cisĂ©ment — la configuration du paramĂštre ndots, — Ă©tonnamment populaire, en fait dĂ©jĂ  pas le premier an. 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.

Recherche DNS dans Kubernetes

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 (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 CoreDNS. 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.com ou mrkaran.dev ne sont pas des FQDN (noms de domaine complets). 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 que mrkaran.dev ne l’est pas ;
  • ndots: Le paramĂštre le plus intĂ©ressant (cette article porte prĂ©cisĂ©ment lĂ -dessus). ndots dĂ©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.

Recherche DNS dans Kubernetes

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.145091744s

Ouf. 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). NXDOMAIN indique qu'aucun enregistrement n'a Ă©tĂ© trouvĂ© pour ce nom de domaine. Puisque mrkaran.dev n'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 Un et AAAA sont envoyĂ©s en parallĂšle. En fait, les requĂȘtes uniques dans /etc/resolv.conf sont 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'option single-request dans resolv.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 : NXDOMAIN

Journaux 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 K8s-meetup, qui a eu lieu le 25 janvier. On y a parlé, entre autres, de ce problÚme.

Voici quelques liens pour approfondir :

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 l'un de mes articles prĂ©cĂ©dents. 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 :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster