/etc/resolv.conf fyrir Kubernetes belg, ndots:5 valmöguleika, hvernig þetta getur haft neikvæð áhrif á afköst forrita

/etc/resolv.conf fyrir Kubernetes belg, ndots:5 valmöguleika, hvernig þetta getur haft neikvæð áhrif á afköst forrita

Við settum nýlega Kubernetes 1.9 á AWS með Kops. Í gær, á meðan ég var að koma nýrri umferð vel út í stærstu Kubernetes klasana okkar, byrjaði ég að taka eftir óvenjulegum DNS-nafnaupplausnarvillum skráðar af forritinu okkar.

Það er töluvert mikið um þetta á GitHub talaði, svo ég ákvað að finna út úr því líka. Á endanum áttaði ég mig á því að í okkar tilviki stafar þetta af auknu álagi á kube-dns и dnsmasq. Það áhugaverðasta og nýjasta fyrir mig var einmitt ástæðan fyrir verulegri aukningu á DNS beiðni umferð. Færsla mín fjallar um þetta og hvað á að gera við því.

DNS upplausn inni í ílátinu - eins og í hvaða Linux kerfi sem er - er ákvörðuð af stillingarskránni /etc/resolv.conf. Sjálfgefin Kubernetes dnsPolicy это ClusterFirst, sem þýðir að allar DNS beiðnir verða sendar til dnsmasq, hlaupandi í belg kube-dns inni í klasanum, sem aftur mun senda beiðnina áfram til umsóknarinnar kube-dns, ef nafnið endar á klasaviðskeyti, eða, annars, á hærra stigs DNS netþjón.

skrá /etc/resolv.conf inni í hverjum íláti mun sjálfgefið líta svona út:

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

Eins og þú sérð eru þrjár tilskipanir:

  1. Nafnaþjónninn er IP þjónustunnar kube-dns
  2. 4 staðbundin leitarlén tilgreind search
  3. Það er möguleiki ndots:5

Áhugaverði hluti þessarar uppsetningar er hvernig staðbundin leitarlén og stillingar ndots:5 ná saman. Til að skilja þetta þarftu að skilja hvernig DNS-upplausn fyrir óhæf nöfn virkar.

Hvað er fullt nafn?

Fullgilt nafn er nafn sem engin staðbundin uppfletting verður gerð fyrir og nafnið verður talið algjört við úrlausn nafns. Samkvæmt venju lítur DNS hugbúnaður á að nafn sé fullgilt ef það endar á punkti (.), og að öðru leyti ekki fullgilt. Það er google.com. fullkomlega skilgreind og google.com - nei.

Hvernig er farið með óhæft nafn?

Þegar forrit tengist ytri hýsilinn sem tilgreindur er í nafninu er DNS-nafnaupplausn venjulega gerð með því að nota kerfiskall, t.d. getaddrinfo(). En ef nafnið er óhæft (endar ekki á .), velti ég því fyrir mér hvort kerfiskallið reyni að leysa nafnið sem algjört nafn fyrst, eða fara fyrst í gegnum staðbundin leitarlén? Það fer eftir valmöguleikanum ndots.

Úr handbókinni resolv.conf:

ndots:n

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

Þetta þýðir að ef fyrir ndots gefið gildið 5 og nafnið inniheldur minna en 5 punkta, mun kerfiskallið reyna að leysa það í röð, fara fyrst yfir öll staðbundin leitarlén og, ef það tekst ekki, mun það að lokum leysa það sem algjört nafn.

Afhverju ndots:5 gæti það haft neikvæð áhrif á árangur forrita?

Eins og þú getur ímyndað þér, ef forritið þitt notar mikla utanaðkomandi umferð, fyrir hverja TCP tengingu sem komið er á (eða réttara sagt, fyrir hvert nafn sem er leyst), mun það gefa út 5 DNS fyrirspurnir áður en nafnið er rétt leyst, því það mun fyrst fara í gegnum 4 staðbundið leitarlén, og mun í lokin gefa út beiðni um algjöra nafnaupplausn.

Eftirfarandi töflu sýnir heildarumferð um 3 kube-dns einingar okkar fyrir og eftir að við skiptum fáum hýsingarnöfnum sem eru stillt í forritinu okkar yfir í fullhæf.

/etc/resolv.conf fyrir Kubernetes belg, ndots:5 valmöguleika, hvernig þetta getur haft neikvæð áhrif á afköst forrita

Eftirfarandi skýringarmynd sýnir biðtíma forritsins fyrir og eftir að við skiptum nokkrum hýsingarnöfnum sem eru stillt í forritinu okkar yfir í full nöfn (lóðrétta bláa línan er uppsetningin):

/etc/resolv.conf fyrir Kubernetes belg, ndots:5 valmöguleika, hvernig þetta getur haft neikvæð áhrif á afköst forrita

Lausn #1 - Notaðu fullgild nöfn

Ef þú ert með fá kyrrstæð ytri nöfn (þ.e. skilgreind í stillingar forritsins) sem þú býrð til fjölda tenginga við, er kannski einfaldasta lausnin að skipta þeim yfir í fullgild nöfn með því einfaldlega að bæta þeim við. undir lokin.

Þetta er ekki endanleg lausn, en það hjálpar til við að bæta ástandið fljótt, þó ekki hreint. Við notuðum þennan plástur til að leysa vandamál okkar, niðurstöður hans voru sýndar á skjámyndunum hér að ofan.

Lausn #2 - aðlögun ndots в dnsConfig

Í Kubernetes 1.9 birtist virkni í alfaham (beta útgáfa v1.10), sem gerir þér kleift að stjórna DNS breytum betur í gegnum pod eiginleikann í dnsConfig. Meðal annars gerir það þér kleift að stilla gildið ndots fyrir ákveðna belg, þ.e.

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

Heimildir

Lestu einnig aðrar greinar á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd