PiezÄ«me. tulk.: Å ajÄ rakstÄ, ko uzrakstÄ«jis LinkedIn SRE inženieris, ir detalizÄti aprakstÄ«ta Kubernetes iekÅ”ÄjÄ maÄ£ija - precÄ«zÄk, CRI, CNI un kube-apiserver mijiedarbÄ«ba -, kas notiek, kad nÄkamajam podam ir jÄpieŔķir IP adrese.
Viena no pamatprasÄ«bÄm Kubernetes tÄ«kla modelis ir tÄds, ka katram podam ir jÄbÅ«t savai IP adresei un jebkuram citam klastera podam ir jÄbÅ«t iespÄjai sazinÄties ar to Å”ajÄ adresÄ. Ir daudz tÄ«kla āpakalpojumu sniedzÄjuā (Flanel, Calico, Canal utt.), kas palÄ«dz ieviest Å”o tÄ«kla modeli.
Kad es pirmo reizi sÄku strÄdÄt ar Kubernetes, man nebija pilnÄ«gi skaidrs, kÄ tieÅ”i podi iegÅ«st savas IP adreses. Pat ar izpratni par to, kÄ darbojas atseviŔķi komponenti, bija grÅ«ti iedomÄties, ka tie darbotos kopÄ. PiemÄram, es zinÄju, kam paredzÄti CNI spraudÅi, bet man nebija ne jausmas, kÄ tieÅ”i tos sauc. TÄpÄc es nolÄmu uzrakstÄ«t Å”o rakstu, lai dalÄ«tos zinÄÅ”anÄs par dažÄdiem tÄ«kla komponentiem un to, kÄ tie darbojas kopÄ Kubernetes klasterÄ«, kas ļauj katram podam iegÅ«t savu unikÄlo IP adresi.
Kubernetes tÄ«klÄ var organizÄt dažÄdus veidus, tÄpat kÄ konteineriem ir dažÄdas izpildlaika iespÄjas. Å ajÄ publikÄcijÄ tiks izmantots Flaneļa organizÄt tÄ«klu klasterÄ« un kÄ izpildÄmu vidi - Konteiners. Es arÄ« pieÅemu, ka jÅ«s zinÄt, kÄ darbojas tÄ«klu veidoÅ”ana starp konteineriem, tÄpÄc es tikai Ä«si pieskarÅ”os tam tikai konteksta labad.
Daži pamatjÄdzieni
Konteineri un tÄ«kls: Ä«ss pÄrskats
InternetÄ ir daudz lielisku publikÄciju, kas izskaidro, kÄ konteineri sazinÄs savÄ starpÄ tÄ«klÄ. TÄpÄc es sniegÅ”u tikai vispÄrÄ«gu pÄrskatu par pamatjÄdzieniem un aprobežojos ar vienu pieeju, kas ietver Linux tilta izveidi un pakotÅu iekapsulÄÅ”anu. SÄ«kÄka informÄcija ir izlaista, jo pati konteineru tÄ«kla tÄma ir pelnÄ«jusi atseviŔķu rakstu. TÄlÄk tiks sniegtas saites uz dažÄm Ä«paÅ”i izsmeļoÅ”Äm un izglÄ«tojoÅ”Äm publikÄcijÄm.
Konteineri uz viena saimnieka
Viens veids, kÄ organizÄt saziÅu, izmantojot IP adreses, starp konteineriem, kas darbojas vienÄ un tajÄ paÅ”Ä resursdatorÄ, ir Linux tilta izveide. Å im nolÅ«kam Kubernetes (un Docker) tiek izveidotas virtuÄlÄs ierÄ«ces. veth (virtuÄlais Ethernet). Viens veth ierÄ«ces gals savienojas ar konteinera tÄ«kla nosaukumvietu, bet otrs ar Linux tilts resursdatora tÄ«klÄ.
Visiem viena un tÄ paÅ”a resursdatora konteineriem ir viens cauruma gals, kas savienots ar tiltu, caur kuru tie var sazinÄties viens ar otru, izmantojot IP adreses. Linux tiltam ir arÄ« IP adrese, un tas darbojas kÄ vÄrteja izejas trafikam no citiem mezgliem paredzÄtajiem blokiem.
Konteineri uz dažÄdiem saimniekiem
PakeÅ”u iekapsulÄÅ”ana ir viena no metodÄm, kas ļauj dažÄdu mezglu konteineriem sazinÄties vienam ar otru, izmantojot IP adreses. UzÅÄmumÄ Flanel tehnoloÄ£ija ir atbildÄ«ga par Å”o iespÄju. vxlan, kas āiepakoā sÄkotnÄjo paketi UDP paketÄ un pÄc tam nosÅ«ta to uz galamÄrÄ·i.
Kubernetes klasterÄ« Flannel izveido vxlan ierÄ«ci un attiecÄ«gi atjaunina marÅ”ruta tabulu katrÄ mezglÄ. Katra pakete, kas paredzÄta konteineram citÄ resursdatorÄ, iet caur vxlan ierÄ«ci un tiek iekapsulÄta UDP paketÄ. GalamÄrÄ·Ä« ligzdotÄ pakete tiek izvilkta un pÄrsÅ«tÄ«ta uz vÄlamo podziÅu.
PiezÄ«me. Å is ir tikai viens veids, kÄ organizÄt tÄ«kla saziÅu starp konteineriem.
Kas ir CRI?
CRI (konteinera izpildlaika saskarne) ir spraudnis, kas ļauj kubelet izmantot dažÄdas konteinera izpildlaika vides. CRI API ir iebÅ«vÄta dažÄdos izpildlaikos, tÄpÄc lietotÄji var izvÄlÄties izpildlaiku pÄc savas izvÄles.
Kas ir CNI?
Projekts CNI ir a specifikÄcija organizÄt universÄlu tÄ«kla risinÄjumu Linux konteineriem. TurklÄt tas ietver spraudÅi, kas atbild par dažÄdÄm funkcijÄm, iestatot pod tÄ«klu. CNI spraudnis ir izpildÄms fails, kas atbilst specifikÄcijai (mÄs tÄlÄk apspriedÄ«sim dažus spraudÅus).
ApakŔtīklu pieŔķirŔana mezgliem IP adreŔu pieŔķirŔanai podiem
TÄ kÄ katrai klastera podziÅai ir jÄbÅ«t IP adresei, ir svarÄ«gi nodroÅ”inÄt, lai Ŕī adrese bÅ«tu unikÄla. Tas tiek panÄkts, katram mezglam pieŔķirot unikÄlu apakÅ”tÄ«klu, no kura Å”ajÄ mezglÄ esoÅ”ajiem blokiem tiek pieŔķirtas IP adreses.
Mezgla IPAM kontrolieris
Kad nodeipam nodots kÄ karoga parametrs --controllerskube-kontrolieris-pÄrvaldnieks, tas pieŔķir atseviŔķu apakÅ”tÄ«klu (podCIDR) katram mezglam no klastera CIDR (t.i., klastera tÄ«kla IP adreÅ”u diapazonam). TÄ kÄ Å”ie podCIDR nepÄrklÄjas, katram podcim ir iespÄjams pieŔķirt unikÄlu IP adresi.
Kubernetes mezglam tiek pieŔķirts podCIDR, kad tas ir sÄkotnÄji reÄ£istrÄts klasterÄ«. Lai mainÄ«tu mezglu podCIDR, tie ir jÄatceļ un pÄc tam atkÄrtoti jÄreÄ£istrÄ, veicot attiecÄ«gas izmaiÅas Kubernetes vadÄ«bas slÄÅa konfigurÄcijÄ. Varat parÄdÄ«t mezgla podCIDR, izmantojot Å”Ädu komandu:
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet, konteinera izpildlaiks un CNI spraudÅi: kÄ tas viss darbojas
Poda plÄnoÅ”ana katram mezglam ietver daudzas sagatavoÅ”anÄs darbÄ«bas. Å ajÄ sadaÄ¼Ä es pievÄrsÄ«Å”os tikai tiem, kas ir tieÅ”i saistÄ«ti ar pod tÄ«kla izveidi.
Poda plÄnoÅ”ana noteiktam mezglam aktivizÄ Å”Ädu notikumu Ä·Ädi:
MijiedarbÄ«ba starp konteinera izpildlaiku un CNI spraudÅiem
Katram tÄ«kla pakalpojumu sniedzÄjam ir savs CNI spraudnis. Konteinera izpildlaiks to palaiž, lai konfigurÄtu tÄ«klu podam, kad tas tiek palaists. Konteinera gadÄ«jumÄ CNI spraudni palaiž spraudnis Konteineru CRI.
TurklÄt katram pakalpojumu sniedzÄjam ir savs aÄ£ents. Tas ir instalÄts visos Kubernetes mezglos un ir atbildÄ«gs par podziÅu tÄ«kla konfigurÄciju. Å is aÄ£ents ir iekļauts CNI konfigurÄcijÄ vai neatkarÄ«gi izveido to mezglÄ. KonfigurÄcija palÄ«dz CRI spraudnim iestatÄ«t, kuru CNI spraudni izsaukt.
CNI konfigurÄcijas atraÅ”anÄs vietu var pielÄgot; pÄc noklusÄjuma tas ir iekÅ”Ä /etc/cni/net.d/<config-file>. Klasteru administratori ir atbildÄ«gi arÄ« par CNI spraudÅu instalÄÅ”anu katrÄ klastera mezglÄ. To atraÅ”anÄs vieta ir arÄ« pielÄgojama; noklusÄjuma direktorijs - /opt/cni/bin.
Izmantojot konteineru, sadaÄ¼Ä var iestatÄ«t spraudÅa konfigurÄcijas un binÄro failu ceļus [plugins.Ā«io.containerd.grpc.v1.criĀ».cni] Š² konteinera konfigurÄcijas fails.
TÄ kÄ mÄs izmantojam Flanel kÄ mÅ«su tÄ«kla nodroÅ”inÄtÄju, parunÄsim nedaudz par tÄ iestatÄ«Å”anu:
Flaneld (Flaneļa dÄmons) parasti tiek instalÄts klasterÄ« kÄ DaemonSet ar install-cni kÄ init konteiners.
Flanelds izveido vxlan ierÄ«ci, izgÅ«st tÄ«kla metadatus no API servera un uzrauga pod atjauninÄjumus. Kad tie tiek izveidoti, tas izplata marÅ”rutus uz visÄm pÄkstÄ«m visÄ klasterÄ«.
Å ie marÅ”ruti ļauj podiem sazinÄties vienam ar otru, izmantojot IP adreses.
Lai iegÅ«tu sÄ«kÄku informÄciju par Flaneļa darbu, iesaku izmantot saites raksta beigÄs.
Å eit ir redzama Containerd CRI spraudÅa un CNI spraudÅu mijiedarbÄ«bas diagramma:
KÄ redzat iepriekÅ”, kubelet izsauc Containerd CRI spraudni, lai izveidotu podziÅu, kas pÄc tam izsauc CNI spraudni, lai konfigurÄtu pod tÄ«kla. To darot, tÄ«kla pakalpojumu sniedzÄja CNI spraudnis izsauc citus galvenos CNI spraudÅus, lai konfigurÄtu dažÄdus tÄ«kla aspektus.
MijiedarbÄ«ba starp CNI spraudÅiem
Ir dažÄdi CNI spraudÅi, kuru uzdevums ir palÄ«dzÄt iestatÄ«t tÄ«kla saziÅu starp resursdatora konteineriem. Å ajÄ rakstÄ tiks apskatÄ«ti trÄ«s no tiem.
Spraudnis Flanel CNI darbojas kopÄ ar Flaneld. StartÄÅ”anas laikÄ Flanelds izgÅ«st podCIDR un citu ar tÄ«klu saistÄ«tu informÄciju no API servera un saglabÄ tos failÄ. /run/flannel/subnet.env.
Kad tas tiek izsaukts pirmo reizi, tas izveido Linux tiltu ar Ā«nameĀ»: Ā«cni0Ā», kas ir norÄdÄ«ts konfigurÄcijÄ. PÄc tam katrai pÄkstei tiek izveidots veth pÄris. Viens tÄ gals ir savienots ar konteinera tÄ«kla nosaukumvietu, otrs ir iekļauts resursdatora tÄ«kla Linux tiltÄ. CNI spraudnis Bridge savieno visus resursdatora konteinerus ar Linux tiltu resursdatora tÄ«klÄ.
Pabeidzot veth pÄra iestatÄ«Å”anu, Bridge spraudnis izsauc resursdatora lokÄlo IPAM CNI spraudni. IPAM spraudÅa tipu var konfigurÄt CNI konfigurÄcijÄ, ko CRI spraudnis izmanto, lai izsauktu Flanel CNI spraudni.
Host-local IPAM spraudnis (IPAddress Management ā IP adreses pÄrvaldÄ«ba) atgriež konteinera IP adresi no apakÅ”tÄ«kla un saglabÄ pieŔķirto IP resursdatorÄ sadaÄ¼Ä norÄdÄ«tajÄ direktorijÄ dataDir SÄkot no /var/lib/cni/networks/<network-name=cni0>/<ip>. Å ajÄ failÄ ir tÄ konteinera ID, kuram ir pieŔķirta Ŕī IP adrese.
Izsaucot resursdatora lokÄlo IPAM spraudni, tas atgriež Å”Ädus datus:
Kube-controller-manager katram mezglam pieŔķir podCIDR. Katra mezgla podi saÅem IP adreses no adreÅ”u telpas pieŔķirtajÄ podCIDR diapazonÄ. TÄ kÄ mezglu podCIDR nepÄrklÄjas, visi podi saÅem unikÄlas IP adreses.
Kubernetes klastera administrators konfigurÄ un instalÄ kubelet, konteinera izpildlaiku, tÄ«kla nodroÅ”inÄtÄja aÄ£entu un kopÄ CNI spraudÅus katrÄ mezglÄ. StartÄÅ”anas laikÄ tÄ«kla nodroÅ”inÄtÄja aÄ£ents Ä£enerÄ CNI konfigurÄciju. Kad pods ir ieplÄnots mezglam, kubelet izsauc CRI spraudni, lai to izveidotu. PÄc tam, ja tiek izmantots konteiners, Containerd CRI spraudnis izsauc CNI spraudni, kas norÄdÄ«ts CNI konfigurÄcijÄ, lai konfigurÄtu pod tÄ«kla. RezultÄtÄ pods saÅem IP adresi.
Man vajadzÄja kÄdu laiku, lai saprastu visas Ŕīs mijiedarbÄ«bas smalkumus un nianses. Ceru, ka Ŕī pieredze palÄ«dzÄs jums labÄk izprast, kÄ darbojas Kubernetes. Ja kaut ko kļūdos, lÅ«dzu, sazinieties ar mani pa tÄlr Twitter vai adresÄ [e-pasts aizsargÄts]. Sazinieties ar mums, ja vÄlaties apspriest Ŕī raksta aspektus vai kaut ko citu. Es labprÄt ar tevi papļÄpÄtu!