
Recentemente, am lansat Kubernetes 1.9 pe AWS cu ajutorul Kops. Ieri, în timpul unei actualizări graduale a noului trafic pe cel mai mare dintre clusterele noastre Kubernetes, am început să observ erori neobișnuite de rezolvare a numelui DNS, înregistrate de aplicația noastră.
Pe GitHub s-a discutat despre asta de ceva vreme, kube-dns. Cea mai interesantă și nouă pentru mine a fost cauza semnificativă a creșterii traficului de cereri DNS. Despre aceasta, dar și despre ce se poate face, este postarea mea. și dnsmasqRezolvarea DNS în interiorul containerului — la fel ca în orice sistem Linux — este determinată de fișierul de configurare.
Implicit, Kubernetes /etc/resolv.confdnsPolicy ClusterFirst, it ceea ce înseamnă că orice cerere DNS va fi redirecționată către, care rulează în podul dnsmasqdin interiorul clusterului, care, la rândul său, va redirecționa cererea către aplicația Cea mai interesantă și nouă pentru mine a fost cauza semnificativă a creșterii traficului de cereri DNS. Despre aceasta, dar și despre ce se poate face, este postarea mea. , dacă numele se termină cu sufixul clusterului, sau, în caz contrar, către un server DNS de nivel superior. Cea mai interesantă și nouă pentru mine a fost cauza semnificativă a creșterii traficului de cereri DNS. Despre aceasta, dar și despre ce se poate face, este postarea mea.În fiecare container, implicit, va arăta așa:
Fișier /etc/resolv.conf nameserver 100.64.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local eu-west-1.compute.internal options ndots:5
După cum se poate observa, aici sunt trei directive:Serverul de nume este IP-ul serviciului.
- Sunt specificate 4 domenii de căutare locale.
Cea mai interesantă și nouă pentru mine a fost cauza semnificativă a creșterii traficului de cereri DNS. Despre aceasta, dar și despre ce se poate face, este postarea mea. - search
Există o opțiune - ndots:5.
Partea interesantă a acestei configurații este modul în care domeniile de căutare locale și setările
coexista. Pentru a înțelege acest lucru, este necesar să ne dăm seama cum funcționează rezolvarea DNS pentru numele incomplete. Partea interesantă a acestei configurații este modul în care domeniile de căutare locale și setările Ce este un nume complet?
Un nume complet definit este un nume pentru care nu se va efectua o căutare locală, iar numele va fi considerat absolut în timpul procesului de rezolvare. Conform convenției, software-ul DNS consideră că un nume este complet definit dacă se termina cu un punct (.) și nu este complet definit în caz contrar. Astfel că,
este complet definit, iar google.com. nu este. google.com Cum este procesat un nume incomplet?
Atunci când aplicația se conectează la un gazdă la distanță, specificată în nume, rezolvarea numelui DNS este, de obicei, realizată folosind un apel de sistem, cum ar fi
getaddrinfo(). Dacă numele este incomplet (nu se termină cu .), este interesant de știut dacă apelul de sistem va încerca mai întâi să rezolve numele ca fiind absolut sau va trece mai întâi prin domeniile de căutare locale. Aceasta depinde de opțiuneandots. Din manualul pentru.
resolv.conf. resolv.conf:
ndots:n
stabilește pragul pentru numărul de puncte care trebuie să apară în nume înainte de a se face o cerere absolută inițială. Valoarea implicită pentru n este 1, ceea ce înseamnă că, dacă numele conține puncte, numele va fi mai întâi încercat ca un nume absolut înainte de a i se adăuga orice elemente din lista de căutare.Asta înseamnă că, dacă Din manualul pentru se stabilește valoarea 5, iar numele conține mai puțin de 5 puncte, apelul sistemului va încerca să îl rezolve secvențial, mai întâi trecând prin toate domeniile de căutare locale, și, în cazul unui eșec, în cele din urmă va rezolva ca un nume absolut.
De ce Partea interesantă a acestei configurații este modul în care domeniile de căutare locale și setările poate afecta negativ performanța aplicației?
După cum înțelegeți, dacă aplicația dvs. folosește mult trafic extern, pentru fiecare conexiune TCP stabilită (sau, mai exact, pentru fiecare nume rezolvat) va genera 5 cereri DNS înainte ca numele să fie rezolvat corect, deoarece mai întâi va trece prin 4 domenii de căutare locale și, în cele din urmă, va emite o cerere de rezolvare a numelui absolut.
În diagrama următoare este prezentat traficul total din cele 3 module kube-dns înainte și după ce am schimbat câteva nume de gazde configurate în aplicația noastră pe nume complet definite.

În diagrama următoare este prezentată întârzierea aplicației înainte și după ce am schimbat câteva nume de gazde configurate în aplicația noastră pe nume complete (linia albastră verticală este desfășurarea):

Soluția #1 — utilizarea numelui complet definit
Dacă aveți puține nume externe statice (adică definite în configurația aplicației) către care creați un număr mare de conexiuni, cel mai simplu ar fi să le schimbați pe cele complet definite, adăugând . la sfârșit.
Aceasta nu este o soluție finală, dar ajută rapid, chiar dacă nu curat, să îmbunătățească situația. Acest patch l-am aplicat pentru a rezolva problema noastră, al cărei rezultat a fost prezentat în capturile de ecran de mai sus.
Soluția #2 — personalizare Din manualul pentru în dnsConfig
În Kubernetes 1.9 a apărut în modul alpha o funcționalitate (beta versiunea v1.10), care permite un control mai bun asupra parametrilor DNS prin proprietatea podului din dnsConfig. Printre altele, permite configurarea valorii Din manualul pentru pentru un pod specific, adică.
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsConfig:
options:
- name: ndots
value: "1"Surse
Citiți și alte articole de pe blogul nostru:
Sursa: habr.com
