/etc/resolv.conf vir Kubernetes-peule, opsie ndots:5, hoe dit toepassingprestasie negatief kan beïnvloed

/etc/resolv.conf vir Kubernetes-peule, opsie ndots:5, hoe dit toepassingprestasie negatief kan beïnvloed

Ons het onlangs Kubernetes 1.9 op AWS bekendgestel met die hulp van Kops. Gister, terwyl ek nuwe verkeer glad na ons grootste Kubernetes-kluster uitgerol het, het ek ongewone DNS-naamresolusie-foute begin opmerk wat deur ons toepassing aangeteken is.

GitHub het nogal 'n bietjie daaroor. gesê, so ek het ook besluit om daarna te kyk. As gevolg hiervan het ek besef dat dit in ons geval veroorsaak is deur 'n verhoogde las op kube-dns и dnsmasq. Die interessantste en nuutste vir my was die rede vir die aansienlike toename in DNS-navraagverkeer. Hieroor en wat om daarmee te doen, my plasing.

DNS-resolusie binne die houer - soos in enige Linux-stelsel - word bepaal deur die konfigurasielêer /etc/resolv.conf. Standaard Kubernetes dnsPolicy hierdie ClusterFirst, wat beteken dat enige DNS-versoek na herlei sal word dnsmasqhardloop in 'n peul kube-dns binne die cluster, wat op sy beurt die versoek na die aansoek sal deurstuur kube-dns, as die naam eindig met 'n cluster-agtervoegsel, of andersins, na 'n hoërvlak DNS-bediener.

lêer /etc/resolv.conf binne elke houer sal by verstek soos volg lyk:

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

Soos u kan sien, is daar drie riglyne:

  1. Die naambediener is die IP van die diens kube-dns
  2. 4 plaaslike soekdomeine gespesifiseer search
  3. Daar is 'n opsie ndots:5

Die interessante deel van hierdie konfigurasie is hoe die plaaslike soekdomeine en -instellings ndots:5 saam bestaan. Om dit te verstaan, moet jy verstaan ​​hoe DNS-resolusie werk vir ongekwalifiseerde name.

Wat is 'n volle naam?

'n Ten volle gekwalifiseerde naam is 'n naam wat nie plaaslik deursoek sal word nie en as 'n absolute naam tydens naambesluit hanteer sal word. Volgens konvensie beskou die DNS-sagteware 'n naam as ten volle gekwalifiseer as dit eindig met 'n punt (.), en andersins nie ten volle gekwalifiseer nie. Dit is google.com. volledig gedefinieer en google.com - geen.

Hoe word 'n ongekwalifiseerde naam hanteer?

Wanneer 'n toepassing koppel aan die afgeleë gasheer wat in die naam gespesifiseer word, word DNS-naamresolusie gewoonlik gedoen deur 'n stelseloproep te gebruik, byvoorbeeld, getaddrinfo(). Maar as die naam onvolledig is (nie eindig met . nie), wonder ek of die stelseloproep die naam as 'n absolute eerste sal probeer oplos, of sal dit eers deur die plaaslike soekdomeine gaan? Dit hang af van die opsie ndots.

Uit die handleiding vir resolv.conf:

ndots:n

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

Dit beteken dat as vir ndots op 5 gestel is en die naam minder as 5 kolletjies bevat, sal die stelseloproep probeer om dit opeenvolgend op te los, eers deur alle plaaslike soekdomeine gaan, en misluk, dit uiteindelik as 'n absolute naam oplos.

Hoekom so ndots:5 kan toepassingsprestasie negatief beïnvloed?

Soos jy jou kan voorstel, as jou toepassing baie eksterne verkeer gebruik, sal dit vir elke gevestigde TCP-verbinding (of meer presies, vir elke opgeloste naam), 5 DNS-navrae uitreik voordat die naam behoorlik opgelos word, want dit sal eers deurgaan 4 plaaslike soekdomein, en sal aan die einde 'n absolute naamresolusieversoek uitreik.

Die volgende grafiek toon die totale verkeer op ons 3 kube-dns-peule voor en nadat ons verskeie gasheername wat in ons toepassing opgestel is, na ten volle gekwalifiseerde oorgeskakel het.

/etc/resolv.conf vir Kubernetes-peule, opsie ndots:5, hoe dit toepassingprestasie negatief kan beïnvloed

Die volgende grafiek toon die latensie van die toepassing voor en nadat ons verskeie gasheername wat in ons toepassing opgestel is, na volle omgeskakel het (die vertikale blou lyn is ontplooiing):

/etc/resolv.conf vir Kubernetes-peule, opsie ndots:5, hoe dit toepassingprestasie negatief kan beïnvloed

Oplossing #1 - Gebruik ten volle gekwalifiseerde name

As jy min statiese eksterne name het (d.w.s. gedefinieer in die toepassingkonfigurasie) waaraan jy 'n groot aantal verbindings skep, is die maklikste oplossing miskien om dit na volledig gekwalifiseerde oor te skakel deur eenvoudig by te voeg. aan die einde.

Dit is nie 'n finale oplossing nie, maar dit help om die situasie vinnig, indien nie skoon nie, te verbeter. Ons het hierdie pleister toegepas om ons probleem op te los, waarvan die resultate in die skermkiekies hierbo gewys is.

Besluit #2 - aanpassing ndots в dnsConfig

Kubernetes 1.9 het 'n kenmerk in alfa-modus (beta-weergawe v1.10) bekendgestel wat jou toelaat om DNS-instellings beter te beheer deur 'n pod-eienskap in dnsConfig. Dit laat jou onder meer toe om die waarde aan te pas ndots vir 'n spesifieke peul, m.a.w.

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

bronne

Lees ook ander artikels op ons blog:

Bron: will.com

Voeg 'n opmerking