ProHoster > Blog > Amministrazione > /etc/resolv.conf per Kubernetes pods, ndots: 5 opzione, cumu questu pò avè un impattu negativu in u rendiment di l'applicazione
/etc/resolv.conf per Kubernetes pods, ndots: 5 opzione, cumu questu pò avè un impattu negativu in u rendiment di l'applicazione
Recentemente avemu lanciatu Kubernetes 1.9 nantu à AWS cù Kops. Ieri, mentre stendeva u trafficu novu in u più grande di i nostri cluster Kubernetes, aghju cuminciatu à nutà errori inusuali di risoluzione di nomi DNS registrati da a nostra applicazione.
Ci hè assai di questu nantu à GitHub parlava, cusì aghju decisu di capisce ancu. In fine, aghju capitu chì in u nostru casu, questu hè causatu da a carica aumentata kube-dns и dnsmasq. A cosa più interessante è nova per mè era u mutivu propiu di l'aumentu significativu di u trafficu di dumanda DNS. U mo post hè nantu à questu è ciò chì deve fà.
A risoluzione DNS in u cuntinuu - cum'è in qualsiasi sistema Linux - hè determinata da u schedariu di cunfigurazione /etc/resolv.conf. Kubernetes predefinitu dnsPolicy si ClusterFirst, chì significa chì ogni dumanda DNS serà trasmessa à dnsmasq, corre in un pod kube-dns in u cluster, chì à u turnu trasmetterà a dumanda à l'applicazione kube-dns, se u nome finisci cù un suffissu di cluster, o, altrimenti, à un servitore DNS di livellu più altu.
u schedariu /etc/resolv.conf Dentru ogni cuntainer, u predefinitu sarà cusì:
U servitore di nome hè l'IP di u serviziu kube-dns
4 duminii di ricerca lucali specificati search
Ci hè una opzione ndots:5
A parte interessante di sta cunfigurazione hè cumu i domini di ricerca lucali è paràmetri ndots:5 inseme. Per capiscenu questu, avete bisognu di capisce cumu funziona a risoluzione DNS per i nomi senza qualificazione.
Chì ghjè un nome cumpletu?
Un nome cumplettamente qualificatu hè un nome per quale ùn serà micca realizatu una ricerca locale è u nome serà cunsideratu assolutu durante a risoluzione di u nome. Per cunvenzione, u software DNS cunsidereghja chì un nome hè cumplettamente qualificatu s'ellu finisce cù un puntu (.), è micca cumplettamente qualificatu altrimenti. Hè google.com. cumplettamente definitu è google.com - Innò.
Cumu hè trattatu un nome senza qualificazione?
Quandu una applicazione si cunnetta à l'ospite remotu specificatu in u nome, a risoluzione di u nome DNS hè tipicamente fatta cù una chjama di sistema, per esempiu. getaddrinfo(). Ma se u nome ùn hè micca qualificatu (ùn finisci micca cù .), mi dumandu s'ellu a chjama di u sistema hà da pruvà à risolve u nome cum'è un nome assolutu prima, o passa per i domini di ricerca lucali prima? Dipende da l'opzione ndots.
Da u manuale resolv.conf:
ndots:n
устанавливает порог для количества точек, которые должны появиться в имени, прежде чем будет сделан начальный абсолютный запрос. Значение по умолчанию для n равно 1, что означает, что если в имени есть какие-либо точки, имя будет сначала опробовано как абсолютное имя, прежде чем к нему будут добавлены какие-либо элементы списка поиска.
Questu significa chì si per ndots datu un valore di 5 è u nome cuntene menu di 5 punti, a chjama di u sistema hà da pruvà à risolve in sequenza, prima traversendu tutti i domini di ricerca lucali, è, se ùn hè micca successu, eventualmente risolve cum'è un nome assolutu.
Perchè allora ndots:5 puderia avè un impattu negativu in u rendiment di l'applicazione?
Cum'è pudete imaginà, se a vostra applicazione usa assai trafficu esternu, per ogni cunnessione TCP stabilita (o più precisamente, per ogni nome risoltu), emette 5 dumande DNS prima chì u nome sia risoltu currettamente, perchè prima passà per mezu. 4 duminiu di ricerca lucale, è à a fine emetterà una dumanda di risoluzione di nome assolutu.
U graficu seguente mostra u trafficu tutale nantu à i nostri moduli 3 kube-dns prima è dopu avè cambiatu i pochi hostnames cunfigurati in a nostra applicazione à quelli cumpletamente qualificati.
U schema seguente mostra a latenza di l'applicazione prima è dopu avè cambiatu parechji hostnames cunfigurati in a nostra applicazione à i nomi completi (a linea blu verticale hè a implementazione):
Soluzione #1 - Aduprate nomi cumplettamente qualificati
Sì avete pochi nomi esterni statichi (vale à dì definiti in a cunfigurazione di l'applicazione) à quale create un gran numaru di cunnessione, forse a suluzione più simplice hè di cambià à quelli cumpletamente qualificati per solu appiccicà. à a fine.
Questa ùn hè micca una suluzione finale, ma aiuta à migliurà rapidamente, ancu s'ellu ùn hè micca pulitu, a situazione. Avemu applicatu stu patch per risolve u nostru prublema, i risultati di quale sò stati mostrati in i screenshots sopra.
Soluzione #2 - persunalizazione ndots в dnsConfig
In Kubernetes 1.9, a funziunalità apparsu in modu alfa (versione beta v1.10), chì vi permette di cuntrullà megliu i paràmetri DNS attraversu a pruprietà di pod in dnsConfig. Frà altre cose, permette di cunfigurà u valore ndots per un pod specificu, i.e.