DNS-sökning i Kubernetes

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 inte första Är. 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.

DNS-sökning i Kubernetes

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 (TjÀnst), 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 CoreDNS. 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.com eller mrkaran.dev inte Ă€r FQDN (fullstĂ€ndiga domĂ€nnamn). 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 Ă€r mrkaran.dev. ett fullstĂ€ndigt domĂ€nnamn (FQDN), medan mrkaran.dev inte Ă€r det;
  • FrĂ„n manualen för: Den mest intressanta parametern (denna artikel handlar just om den). FrĂ„n manualen för anger 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.

DNS-sökning i Kubernetes

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

Puh. 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). NXDOMAIN betyder att ingen post hittades för det angivna domĂ€nnamnet. Eftersom mrkaran.dev inte Ă€r ett FQDN-namn (enligt ndots=5), tittar resolvern pĂ„ sökvĂ€gen och bestĂ€mmer ordningen för begĂ€rningarna;
  • Posterna A och AAAAA skickas 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 alternativet single-request pĂ„ 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: NXDOMAIN

CoreDNS-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Ä K8s-meetup, 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:

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 en av mina tidigare publikationer. 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:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster