Kā Kubernetes pod iegūst IP adresi?

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.

Kā Kubernetes pod iegūst IP adresi?

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.

Kā Kubernetes pod iegūst IP adresi?
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 --controllers kube-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:

Kā Kubernetes pod iegūst IP adresi?

Informācija: Containerd CRI spraudņu arhitektūra.

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.
  • Install-cni rada CNI konfigurācijas fails (/etc/cni/net.d/10-flannel.conflist) katrā mezglā.
  • 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ā Kubernetes pod iegūst IP adresi?

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.

CNI spraudnis Flanel

Izmantojot Flanel kā tīkla nodroŔinātāju, Containerd CRI komponents zvana CNI spraudnis Flanelizmantojot CNI konfigurācijas failu /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

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.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Spraudnis Flanel CNI izmanto datus no /run/flannel/subnet.env lai konfigurētu un izsauktu CNI tilta spraudni.

CNI spraudnis Bridge

Šis spraudnis tiek izsaukts ar Ŕādu konfigurāciju:

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

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 CNI spraudņi

Tiltu CNI zvani resursdatora vietējais IPAM spraudnis CNI ar Ŕādu konfigurāciju:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

Host-local IPAM spraudnis (IP Address 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:

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

Kopsavilkums

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!

atsauces

Konteineri un tīkls

Kā darbojas flanels?

CRI un CNI

PS no tulka

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru