/etc/resolv.conf za Kubernetes pods, možnost ndots:5, kako lahko to negativno vpliva na delovanje aplikacije

/etc/resolv.conf za Kubernetes pods, možnost ndots:5, kako lahko to negativno vpliva na delovanje aplikacije

Pred kratkim smo predstavili Kubernetes 1.9 na AWS z uporabo Kops. Včeraj sem med nemotenim uvajanjem novega prometa v največje naše gruče Kubernetes začel opažati nenavadne napake pri razreševanju imen DNS, ki jih beleži naša aplikacija.

Na GitHubu je kar nekaj o tem govoril, zato sem se odločil, da tudi to ugotovim. Na koncu sem ugotovil, da je v našem primeru to posledica povečane obremenitve kube-dns и dnsmasq. Najbolj zanimiv in nov zame je bil prav razlog za znatno povečanje prometa DNS zahtev. Moja objava govori o tem in o tem, kaj storiti glede tega.

Ločljivost DNS znotraj vsebnika - kot v katerem koli sistemu Linux - določa konfiguracijska datoteka /etc/resolv.conf. Privzeti Kubernetes dnsPolicy это ClusterFirst, kar pomeni, da bo vsaka zahteva DNS posredovana na dnsmasq, tek v stroku kube-dns znotraj gruče, ki bo nato zahtevo posredovala aplikaciji kube-dns, če se ime konča s pripono gruče, ali drugače na strežnik DNS višje ravni.

datoteka /etc/resolv.conf znotraj vsakega vsebnika bo privzeto videti takole:

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

Kot lahko vidite, obstajajo tri direktive:

  1. Imenski strežnik je IP storitve kube-dns
  2. Določene so 4 domene lokalnega iskanja search
  3. Obstaja možnost ndots:5

Zanimiv del te konfiguracije so domene in nastavitve lokalnega iskanja ndots:5 razumeti se skupaj. Da bi to razumeli, morate razumeti, kako deluje razreševanje DNS za nekvalificirana imena.

Kaj je polno ime?

Popolnoma kvalificirano ime je ime, za katerega ne bo izvedeno lokalno iskanje in bo ime med razreševanjem imena veljalo za absolutno. Po dogovoru programska oprema DNS meni, da je ime popolnoma kvalificirano, če se konča s piko (.), sicer pa ni popolnoma kvalificirano. To je google.com. popolnoma definiran in google.com - ne.

Kako se obravnava nekvalificirano ime?

Ko se aplikacija poveže z oddaljenim gostiteljem, navedenim v imenu, se razrešitev imena DNS običajno izvaja s sistemskim klicem, npr. getaddrinfo(). Če pa je ime nekvalificirano (se ne konča z .), me zanima, ali bo sistemski klic najprej poskušal razrešiti ime kot absolutno ime ali bo najprej šel skozi domene lokalnega iskanja? Odvisno od možnosti ndots.

Iz priročnika resolv.conf:

ndots:n

устанавливает порог для количества точек, которые должны появиться в имени, прежде чем будет сделан начальный абсолютный запрос. Значение по умолчанию для n равно 1, что означает, что если в имени есть какие-либо точки, имя будет сначала опробовано как абсолютное имя, прежде чем к нему будут добавлены какие-либо элементы списка поиска.

To pomeni, da če za ndots če je podana vrednost 5 in ime vsebuje manj kot 5 pik, ga bo sistemski klic poskušal razrešiti zaporedno, najprej prečkati vse domene lokalnega iskanja in ga, če ne bo uspešno, na koncu razrešiti kot absolutno ime.

Zakaj tako ndots:5 ali lahko negativno vpliva na delovanje aplikacije?

Kot si lahko predstavljate, če vaša aplikacija uporablja veliko zunanjega prometa, bo za vsako vzpostavljeno povezavo TCP (ali natančneje, za vsako razrešeno ime) izdala 5 poizvedb DNS, preden bo ime pravilno razrešeno, ker bo najprej šlo skozi 4 domeno lokalnega iskanja in na koncu izda absolutno zahtevo za razrešitev imena.

Naslednja tabela prikazuje skupni promet na naših 3 modulih kube-dns pred in po tem, ko smo nekaj imen gostiteljev, konfiguriranih v naši aplikaciji, preklopili na popolnoma kvalificirana.

/etc/resolv.conf za Kubernetes pods, možnost ndots:5, kako lahko to negativno vpliva na delovanje aplikacije

Naslednji diagram prikazuje zakasnitev aplikacije pred in po tem, ko smo več imen gostiteljev, konfiguriranih v naši aplikaciji, preklopili na polna imena (navpična modra črta je uvedba):

/etc/resolv.conf za Kubernetes pods, možnost ndots:5, kako lahko to negativno vpliva na delovanje aplikacije

Rešitev št. 1 - Uporabite popolnoma kvalificirana imena

Če imate malo statičnih zunanjih imen (tj. definiranih v konfiguraciji aplikacije), za katera ustvarite veliko število povezav, je morda najenostavnejša rešitev, da jih preklopite na popolnoma kvalificirana, tako da jih preprosto dodate. na koncu.

To ni dokončna rešitev, vendar pomaga hitro, čeprav ne čisto, izboljšati stanje. Ta popravek smo uporabili za rešitev naše težave, rezultati pa so bili prikazani na zgornjih posnetkih zaslona.

Rešitev št. 2 – prilagajanje ndots в dnsConfig

V Kubernetesu 1.9 se je funkcionalnost pojavila v načinu alfa (beta različica v1.10), ki vam omogoča boljši nadzor nad parametri DNS prek lastnosti pod v dnsConfig. Med drugim vam omogoča konfiguracijo vrednosti ndots za določen strok, tj.

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

viri

Preberite tudi druge članke na našem blogu:

Vir: www.habr.com

Dodaj komentar