/etc/resolv.conf para sa mga Kubernetes pod, ndots:5 na opsyon, kung paano ito negatibong makakaapekto sa performance ng application

/etc/resolv.conf para sa mga Kubernetes pod, ndots:5 na opsyon, kung paano ito negatibong makakaapekto sa performance ng application

Inilunsad namin kamakailan ang Kubernetes 1.9 sa AWS gamit ang Kops. Kahapon, habang maayos na inilulunsad ang bagong trapiko sa pinakamalaki sa aming mga Kubernetes cluster, sinimulan kong mapansin ang mga hindi pangkaraniwang error sa paglutas ng pangalan ng DNS na naka-log sa aming application.

Marami ang tungkol dito sa GitHub nagsalita, kaya nagpasya akong alamin din ito. Sa huli, napagtanto ko na sa aming kaso ito ay sanhi ng pagtaas ng pagkarga kube-dns ΠΈ dnsmasq. Ang pinakakawili-wili at bagong bagay para sa akin ay ang mismong dahilan para sa makabuluhang pagtaas sa trapiko ng kahilingan sa DNS. Ang aking post ay tungkol dito at kung ano ang gagawin tungkol dito.

Ang resolution ng DNS sa loob ng container - tulad ng sa anumang Linux system - ay tinutukoy ng configuration file /etc/resolv.conf. Default na Kubernetes dnsPolicy это ClusterFirst, na nangangahulugan na ang anumang kahilingan sa DNS ay ipapasa sa dnsmasq, tumatakbo sa isang pod kube-dns sa loob ng cluster, na magpapasa naman ng kahilingan sa application kube-dns, kung ang pangalan ay nagtatapos sa isang cluster suffix, o, kung hindi, sa isang mas mataas na antas ng DNS server.

talaksan /etc/resolv.conf sa loob ng bawat lalagyan ang default ay magiging ganito:

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

Tulad ng nakikita mo, mayroong tatlong mga direktiba:

  1. Ang name server ay ang IP ng serbisyo kube-dns
  2. Tinukoy ang 4 na lokal na domain ng paghahanap search
  3. Mayroong isang pagpipilian ndots:5

Ang kawili-wiling bahagi ng pagsasaayos na ito ay kung paano ang mga lokal na paghahanap ng mga domain at setting ndots:5 magkakasama. Upang maunawaan ito, kailangan mong maunawaan kung paano gumagana ang resolusyon ng DNS para sa mga hindi kwalipikadong pangalan.

Ano ang buong pangalan?

Ang isang ganap na kwalipikadong pangalan ay isang pangalan kung saan walang lokal na paghahanap ang isasagawa at ang pangalan ay ituturing na ganap sa panahon ng paglutas ng pangalan. Sa pamamagitan ng convention, itinuturing ng DNS software na ganap na kwalipikado ang isang pangalan kung nagtatapos ito sa isang tuldok (.), at hindi ganap na kwalipikado kung hindi man. Yan ay google.com. ganap na tinukoy at google.com - hindi.

Paano pinangangasiwaan ang isang hindi kwalipikadong pangalan?

Kapag kumonekta ang isang application sa remote host na tinukoy sa pangalan, karaniwang ginagawa ang resolution ng pangalan ng DNS gamit ang isang system call, hal. getaddrinfo(). Ngunit kung hindi kwalipikado ang pangalan (hindi nagtatapos sa .), iniisip ko kung susubukan ng system call na lutasin muna ang pangalan bilang ganap na pangalan, o dadaan muna ang mga lokal na domain sa paghahanap? Depende sa option ndots.

Mula sa manwal resolv.conf:

ndots:n

устанавливаСт ΠΏΠΎΡ€ΠΎΠ³ для количСства Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π² ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ сдСлан Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ запрос. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для n Ρ€Π°Π²Π½ΠΎ 1, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π² ΠΈΠΌΠ΅Π½ΠΈ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ, имя Π±ΡƒΠ΄Π΅Ρ‚ сначала ΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ имя, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΊ Π½Π΅ΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ элСмСнты списка поиска.

Nangangahulugan ito na kung para sa ndots binigyan ng halagang 5 at ang pangalan ay naglalaman ng mas mababa sa 5 tuldok, susubukan ng system call na lutasin ito nang sunud-sunod, unang binabaybay ang lahat ng lokal na domain ng paghahanap, at, kung hindi matagumpay, sa huli ay lutasin ito bilang isang ganap na pangalan.

Bakit ganon ndots:5 maaari ba itong negatibong makaapekto sa pagganap ng application?

Tulad ng maiisip mo, kung ang iyong application ay gumagamit ng maraming panlabas na trapiko, para sa bawat koneksyon sa TCP na itinatag (o mas tumpak, para sa bawat pangalan na naresolba), maglalabas ito ng 5 mga query sa DNS bago ang pangalan ay malutas nang tama, dahil ito ay dadaan muna. 4 na lokal na domain ng paghahanap, at sa dulo ay maglalabas ng ganap na kahilingan sa paglutas ng pangalan.

Ipinapakita ng sumusunod na chart ang kabuuang trapiko sa aming 3 kube-dns module bago at pagkatapos naming ilipat ang ilang hostname na na-configure sa aming application sa mga ganap na kwalipikado.

/etc/resolv.conf para sa mga Kubernetes pod, ndots:5 na opsyon, kung paano ito negatibong makakaapekto sa performance ng application

Ipinapakita ng sumusunod na diagram ang latency ng application bago at pagkatapos naming ilipat ang ilang hostname na na-configure sa aming application sa mga buong pangalan (ang patayong asul na linya ay ang deployment):

/etc/resolv.conf para sa mga Kubernetes pod, ndots:5 na opsyon, kung paano ito negatibong makakaapekto sa performance ng application

Solusyon #1 - Gumamit ng ganap na kwalipikadong mga pangalan

Kung mayroon kang kaunting mga static na panlabas na pangalan (i.e. tinukoy sa configuration ng application) kung saan lumikha ka ng malaking bilang ng mga koneksyon, marahil ang pinakasimpleng solusyon ay ilipat ang mga ito sa mga ganap na kwalipikado sa pamamagitan lamang ng pagdaragdag sa kanila. sa dulo.

Hindi ito isang pangwakas na solusyon, ngunit nakakatulong ito upang mabilis, kahit na hindi malinis, mapabuti ang sitwasyon. Inilapat namin ang patch na ito upang malutas ang aming problema, ang mga resulta nito ay ipinakita sa mga screenshot sa itaas.

Solusyon #2 - pagpapasadya ndots Π² dnsConfig

Sa Kubernetes 1.9, lumabas ang functionality sa alpha mode (beta version v1.10), na nagbibigay-daan sa iyong mas mahusay na kontrolin ang mga parameter ng DNS sa pamamagitan ng pod property sa dnsConfig. Sa iba pang mga bagay, pinapayagan ka nitong i-configure ang halaga ndots para sa isang partikular na pod, i.e.

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

pinagmumulan

Basahin din ang iba pang mga artikulo sa aming blog:

Pinagmulan: www.habr.com

Magdagdag ng komento