/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ì:

nameserver 100.64.0.10
search namespace.svc.cluster.local svc.cluster.local cluster.local 
eu-west-1.compute.internal
options ndots:5

Comu pudete vede, ci sò trè direttive:

  1. U servitore di nome hè l'IP di u serviziu kube-dns
  2. 4 duminii di ricerca lucali specificati search
  3. 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.

/etc/resolv.conf per Kubernetes pods, ndots: 5 opzione, cumu questu pò avè un impattu negativu in u rendiment di l'applicazione

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):

/etc/resolv.conf per Kubernetes pods, ndots: 5 opzione, cumu questu pò avè un impattu negativu in u rendiment di l'applicazione

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.

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: "1"

Fonti

Leghjite ancu altri articuli nantu à u nostru blog:

Source: www.habr.com

Add a comment