ProHoster > Blog > Pangangasiwa > /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:
Tulad ng nakikita mo, mayroong tatlong mga direktiba:
Ang name server ay ang IP ng serbisyo kube-dns
Tinukoy ang 4 na lokal na domain ng paghahanap search
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.
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.
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):
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.