Obs. övers.: DNS-problemet i Kubernetes, mer specifikt - instÀllning av parameter FrÄn manualen för, - Àr förvÄnansvÀrt populÀrt, och det har redan . I en ny artikel om detta Àmne berÀttar författaren - en DevOps-ingenjör frÄn ett stort mÀklarföretag i Indien - pÄ ett mycket enkelt och koncist sÀtt vad kollegor som anvÀnder Kubernetes behöver kÀnna till.

En av de frÀmsta fördelarna med att distribuera applikationer i Kubernetes Àr det problemfria upptÀckandet av applikationer. Den interna kommunikation inom klustret förenklas avsevÀrt tack vare tjÀnstkonceptet (), vilket representerar en virtuell IP som stöder en uppsÀttning IP-adresser av poddar. Till exempel, om tjÀnsten vanilla vill kommunicera med tjÀnsten chocolate, kan den direkt hÀnvisa till den virtuella IP-adressen för chocolate. FrÄgan uppstÄr: vem kommer i detta fall att lösa DNS-förfrÄgan till chocolate och hur?
Namnupplösningen DNS konfigureras i Kubernetes-klustret med hjÀlp av . Kubelet registrerar podden med CoreDNS som namnserver i filerna /etc/resolv.conf av alla poddar. Om du tittar pÄ innehÄllet i /etc/resolv.conf vilken pod som helst, kommer det att se ut ungefÀr sÄ hÀr:
search hello.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.152.183.10
options ndots:5 Denna konfiguration anvÀnds av DNS-klienter för att omdirigera förfrÄgningar till DNS-servern. I filen resolv.conf finns följande information:
- nameserver: servern som DNS-förfrÄgningar kommer att riktas till. I vÄrt fall Àr detta adressen till CoreDNS-tjÀnsten;
- Det finns en option: definierar sökvÀgen för ett visst domÀnnamn. Det Àr intressant att
google.comellermrkaran.devinte Àr FQDN (). Enligt den standard som de flesta DNS-resolvrar följer anses fullstÀndiga (FDQN) domÀner endast vara de som slutar med en punkt «.», vilket representerar rotzonen. Vissa resolvrar kan lÀgga till punkten sjÀlva. SÄledes Àrmrkaran.dev.ett fullstÀndigt domÀnnamn (FQDN), medanmrkaran.devinte Àr det; - FrÄn manualen för: Den mest intressanta parametern (denna artikel handlar just om den).
FrÄn manualen föranger det tröskelnummer av punkter i namnfrÄgan, vid vilken den betraktas som ett «fullstÀndigt» domÀnnamn. Mer om detta kommer vi att diskutera senare nÀr vi analyserar sekvensen av DNS-sökningar.

LÄt oss titta pÄ vad som hÀnder nÀr vi begÀr mrkaran.dev i podden:
$ nslookup mrkaran.dev
Server: 10.152.183.10
Address: 10.152.183.10#53
Non-authoritative answer:
Name: mrkaran.dev
Address: 157.230.35.153
Name: mrkaran.dev
Address: 2400:6180:0:d1::519:6001 För detta experiment har jag stÀllt in loggnivÄn för CoreDNS pÄ all (vilket gör att det blir ganska omfattande). LÄt oss titta pÄ loggarna frÄn podden 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.145091744sPuh. TvÄ saker hÀr fÄngar uppmÀrksamheten:
- BegÀran genomgÄr alla söksteg tills svaret innehÄller koden
NOERROR(DNS-klienter förstÄr detta och lagrar det som ett resultat).NXDOMAINbetyder att ingen post hittades för det angivna domÀnnamnet. Eftersommrkaran.devinte Àr ett FQDN-namn (enligtndots=5), tittar resolvern pÄ sökvÀgen och bestÀmmer ordningen för begÀrningarna; - Posterna
AochAAAAAskickas parallellt. Faktum Àr att enstaka begÀrningar i/etc/resolv.confÀr som standard instÀllda sÄ att parallell sökning görs över bÄde IPv4 och IPv6-protokollen. Detta beteende kan avbrytas genom att lÀgga till alternativetsingle-requestpÄresolv.conf.
AnmÀrkning: glibc kan konfigureras för att skicka dessa begÀrningar sekventiellt, men musl kan inte, sÄ anvÀndare av Alpine bör ha detta i Ätanke.
Experimentera med ndots
LĂ„t oss experimentera lite mer med FrĂ„n manualen för och se hur denna parameter beter sig. IdĂ©n Ă€r enkel: FrĂ„n manualen för definierar om DNS-klienten ska betrakta domĂ€nen som absolut eller relativ. Till exempel, hur vet en enkel google DNS-klient om denna domĂ€n Ă€r absolut? Om man sĂ€tter FrĂ„n manualen för till 1, kommer klienten att sĂ€ga: "Ă
h, i google finns det inga punkter; jag fÄr kanske kolla hela söklistan". Men om man begÀr google.com, kommer listan med suffix helt att ignoreras, eftersom det begÀrda namnet uppfyller tröskeln FrÄn manualen för (det finns Ätminstone en punkt).
LÄt oss se till detta:
$ cat /etc/resolv.conf
options ndots:1
$ nslookup mrkaran
Server: 10.152.183.10
Address: 10.152.183.10#53
** server kan inte hitta mrkaran: NXDOMAINCoreDNS-loggar:
[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 Eftersom det i mrkaran det finns inga punkter, sökningen gjordes över hela suffixlistan.
AnmÀrkning: i praktiken Àr det maximala vÀrdet FrÄn manualen för begrÀnsat till 15; som standard Àr det 5 i Kubernetes.
AnvÀndning i produktion
Om en applikation gör mÄnga externa nÀtverksanrop kan DNS bli en flaskhals vid aktiv trafik, eftersom mÄnga onödiga förfrÄgningar görs vid namnupplösning (innan systemet nÄr det önskade). Applikationer lÀgger vanligtvis inte till rotzonen i domÀnnamnen, men detta kan definitivt rÀknas som ett hack. Med andra ord, istÀllet för att begÀra api.twitter.com, kan du 'hÄrdprogrammera' api.twitter.com. (med punkt) i applikationen, vilket fÄr DNS-klienter att omedelbart utföra en auktoritativ sökning i den absoluta domÀnen.
Dessutom, frÄn och med version 1.14 av Kubernetes, har tillÀggen dnsConfig och ClusterFirst fÄtt status som stabila. DÀrmed kan vÀrdet minskas vid distribution av en pod FrÄn manualen för, lÄt oss sÀga, till 3 (och till och med ner till 1!). Detta innebÀr att varje meddelande inom noden mÄste innehÄlla hela domÀnen. Det hÀr Àr en klassisk kompromiss nÀr man mÄste vÀlja mellan prestanda och portabilitet. Jag tycker att man bara ska oroa sig för detta om ultra-lÄga latenser Àr avgörande för din applikation, eftersom DNS-resultaten Àven cachas internt.
LĂ€nkar
Jag lÀrde mig först om denna funktion pÄ , som hölls den 25 januari. DÀr diskuterades bland annat detta problem.
HÀr Àr nÄgra lÀnkar för vidare lÀsning:
- , varför ndots=5 i Kubernetes;
- om hur Àndringen av ndots pÄverkar applikationens prestanda;
- mellan resolverna musl och glibc.
Notera: Jag valde att inte anvÀnda dig i denna artikel. dig lÀgger automatisk till en punkt (rotzonens identifierare), vilket gör domÀnen "full" (FQDN), inte efter att ha kört den genom söklistan. Jag skrev om detta i . Trots detta Àr det ganska förvÄnande att man mÄste ange en separat flagga för standardbeteendet.
Lycka till med DNS! Vi ses snart!
P.S. frÄn översÀttaren
LÀs Àven i vÄr blogg:
- «»;
- «»;
- »Illustrerad guide till nÀtverksuppbyggnaden i Kubernetes«: , .
KĂ€lla: habr.com
