Si e merr një pod Kubernetes një adresë IP?

Shënim. përkth.: Ky artikull, i shkruar nga një inxhinier SRE nga LinkedIn, hyn në detaje rreth magjisë së brendshme në Kubernetes - më saktë, ndërveprimin e CRI, CNI dhe kube-apiserver - që ndodh kur podit të ardhshëm duhet t'i caktohet një adresë IP.

Një nga kërkesat themelore Modeli i rrjetit Kubernetes është se çdo pod duhet të ketë adresën e vet IP dhe çdo pod tjetër në grup duhet të jetë në gjendje ta kontaktojë atë në atë adresë. Ka shumë "ofrues" rrjeti (Flannel, Calico, Canal, etj.) që ndihmojnë në zbatimin e këtij modeli rrjeti.

Kur fillova të punoja për herë të parë me Kubernetes, nuk ishte plotësisht e qartë për mua se si saktësisht pod-et i merrnin adresat e tyre IP. Edhe me të kuptuarit se si funksiononin komponentët individualë, ishte e vështirë të imagjinohej që ata të punonin së bashku. Për shembull, e dija se për çfarë shërbenin shtojcat CNI, por nuk e kisha idenë se si quheshin saktësisht. Prandaj, vendosa të shkruaj këtë artikull për të ndarë njohuritë rreth komponentëve të ndryshëm të rrjetit dhe se si ata punojnë së bashku në një grup Kubernetes, i cili lejon çdo pod të marrë adresën e vet unike IP.

Ka mënyra të ndryshme për të organizuar rrjetëzimin në Kubernetes, ashtu si ka opsione të ndryshme të kohës së funksionimit për kontejnerët. Ky publikim do të përdorë fanellë për të organizuar një rrjet në një grup, dhe si një mjedis të ekzekutueshëm - Kontejnerë. Unë po supozoj gjithashtu se ju e dini se si funksionon rrjetëzimi midis kontejnerëve, kështu që do ta prek shkurtimisht, vetëm për kontekst.

Disa koncepte bazë

Kontejnerët dhe rrjeti: Një përmbledhje e shkurtër

Ka shumë botime të shkëlqyera në internet që shpjegojnë se si kontejnerët komunikojnë me njëri-tjetrin përmes rrjetit. Prandaj, unë do të jap vetëm një pasqyrë të përgjithshme të koncepteve bazë dhe do të kufizohem në një qasje, e cila përfshin krijimin e një ure Linux dhe kapsulimin e paketave. Detajet janë lënë jashtë, pasi vetë tema e rrjetit të kontejnerëve meriton një artikull të veçantë. Lidhjet me disa botime veçanërisht të detajuara dhe edukative do të jepen më poshtë.

Kontejnerët në një host

Një mënyrë për të organizuar komunikimin nëpërmjet adresave IP midis kontejnerëve që funksionojnë në të njëjtin host përfshin krijimin e një ure Linux. Për këtë qëllim, pajisjet virtuale krijohen në Kubernetes (dhe Docker) veth (ethernet virtual). Njëri skaj i pajisjes veth lidhet me hapësirën e emrave të rrjetit të kontejnerit, tjetri me urë Linux në rrjetin pritës.

Të gjithë kontejnerët në të njëjtin host kanë një skaj të vethit të lidhur me një urë përmes së cilës ata mund të komunikojnë me njëri-tjetrin përmes adresave IP. Ura Linux gjithashtu ka një adresë IP dhe vepron si një portë për trafikun e daljes nga pods të destinuara për nyje të tjera.

Si e merr një pod Kubernetes një adresë IP?

Kontejnerët në pritës të ndryshëm

Enkapsulimi i paketave është një metodë që lejon kontejnerët në nyje të ndryshme të komunikojnë me njëri-tjetrin duke përdorur adresat IP. Tek Flannel, teknologjia është përgjegjëse për këtë mundësi. vxlan, e cila “paketon” paketën origjinale në një paketë UDP dhe më pas e dërgon atë në destinacionin e saj.

Në një grup Kubernetes, Flannel krijon një pajisje vxlan dhe përditëson tabelën e rrugës në secilën nyje në përputhje me rrethanat. Çdo paketë e destinuar për një kontejner në një host të ndryshëm kalon përmes pajisjes vxlan dhe kapsulohet në një paketë UDP. Në destinacion, paketa e mbivendosur nxirret dhe përcillet në podin e dëshiruar.

Si e merr një pod Kubernetes një adresë IP?
Shënim: Kjo është vetëm një mënyrë për të organizuar komunikimin në rrjet ndërmjet kontejnerëve.

Çfarë është CRI?

CRI (ndërfaqja e kohës së funksionimit të kontejnerit) është një shtojcë që lejon kubelet të përdorë mjedise të ndryshme të kohës së funksionimit të kontejnerëve. CRI API është ndërtuar në periudha të ndryshme funksionimi, kështu që përdoruesit mund të zgjedhin kohën e funksionimit sipas dëshirës së tyre.

Çfarë është CNI?

Projekti CNI përfaqësojnë veten Specifikim për të organizuar një zgjidhje universale të rrjetit për kontejnerët Linux. Përveç kësaj, ai përfshin shtojcat, përgjegjës për funksione të ndryshme kur konfiguroni një rrjet pod. Shtojca CNI është një skedar i ekzekutueshëm që përputhet me specifikimet (ne do të diskutojmë disa shtojca më poshtë).

Shpërndarja e nënrrjeteve në nyje për caktimin e adresave IP në pods

Meqenëse çdo pod në një grup duhet të ketë një adresë IP, është e rëndësishme të siguroheni që kjo adresë të jetë unike. Kjo arrihet duke i caktuar çdo nyje një nënrrjet unike, nga e cila pod-eve në atë nyje u caktohen më pas adresat IP.

Kontrolluesi IPAM i nyjes

Kur nodeipam kalohet si parametër flamuri --controllers kube-kontrollues-menaxher, cakton një nënrrjet të veçantë (podCIDR) për çdo nyje nga grupi CIDR (d.m.th., gamën e adresave IP për rrjetin e grupimit). Meqenëse këto podCIDR nuk mbivendosen, bëhet e mundur që çdo pod t'i ndahet një adresë IP unike.

Një nyje Kubernetes i caktohet një podCIDR kur regjistrohet fillimisht në grup. Për të ndryshuar podCIDR-in e nyjeve, duhet t'i çregjistroni dhe më pas t'i riregjistroni, duke bërë ndryshimet e duhura në konfigurimin e shtresës së kontrollit Kubernetes në mes. Ju mund të shfaqni podCIDR të një nyje duke përdorur komandën e mëposhtme:

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet, kohëzgjatja e kontejnerëve dhe shtojcat CNI: si funksionon gjithçka

Planifikimi i një pod për nyje përfshin shumë hapa përgatitor. Në këtë seksion, unë do të fokusohem vetëm në ato që lidhen drejtpërdrejt me vendosjen e një rrjeti pod.

Planifikimi i një pod në një nyje të caktuar shkakton zinxhirin e mëposhtëm të ngjarjeve:

Si e merr një pod Kubernetes një adresë IP?

Ndihmë: Arkitektura e shtojcave Containerd CRI.

Ndërveprimi midis kohës së funksionimit të kontejnerit dhe shtojcave CNI

Çdo ofrues i rrjetit ka shtojcën e vet CNI. Koha e funksionimit të kontejnerit e ekzekuton atë për të konfiguruar rrjetin për podin kur niset. Në rastin e kontejnerit, shtojca CNI lëshohet nga shtojca Kontejner CRI.

Për më tepër, çdo ofrues ka agjentin e vet. Ai është i instaluar në të gjitha nyjet Kubernetes dhe është përgjegjës për konfigurimin e rrjetit të pods. Ky agjent ose përfshihet me konfigurimin CNI ose e krijon në mënyrë të pavarur në nyje. Konfigurimi ndihmon shtojcën CRI të vendosë se cilën shtesë CNI të thërrasë.

Vendndodhja e konfigurimit CNI mund të personalizohet; si parazgjedhje është në /etc/cni/net.d/<config-file>. Administratorët e grupeve janë gjithashtu përgjegjës për instalimin e shtojcave CNI në secilën nyje të grupit. Vendndodhja e tyre është gjithashtu e personalizueshme; drejtoria e paracaktuar - /opt/cni/bin.

Kur përdorni kontejnerin, shtigjet për konfigurimin e shtojcave dhe binarët mund të vendosen në seksion [plugins.«io.containerd.grpc.v1.cri».cni] в skedari i konfigurimit të kontejnerit.

Meqenëse ne po përdorim Flannel si ofruesin tonë të rrjetit, le të flasim pak për konfigurimin e tij:

  • Flanneld (daemon i flanelit) zakonisht instalohet në një grup si një DaemonSet me install-cni si enë fillestare.
  • Install-cni krijon Skedari i konfigurimit CNI (/etc/cni/net.d/10-flannel.conflist) në secilën nyje.
  • Flanneld krijon një pajisje vxlan, merr meta të dhënat e rrjetit nga serveri API dhe monitoron përditësimet e pod. Ndërsa krijohen, ai shpërndan rrugë në të gjitha podet në të gjithë grupin.
  • Këto rrugë lejojnë pods të komunikojnë me njëri-tjetrin nëpërmjet adresave IP.

Për informacion më të detajuar në lidhje me punën e Flannel, unë rekomandoj përdorimin e lidhjeve në fund të artikullit.

Këtu është një diagram i ndërveprimit midis shtojcës Containerd CRI dhe shtojcave CNI:

Si e merr një pod Kubernetes një adresë IP?

Siç mund ta shihni më lart, kubelet thërret shtojcën Containerd CRI për të krijuar podin, i cili më pas thërret shtojcën CNI për të konfiguruar rrjetin e pod. Duke vepruar kështu, shtojca CNI e ofruesit të rrjetit thërret shtojcat e tjera kryesore CNI për të konfiguruar aspekte të ndryshme të rrjetit.

Ndërveprimi midis shtojcave CNI

Ka shtojca të ndryshme CNI, detyra e të cilave është të ndihmojnë në vendosjen e komunikimit të rrjetit midis kontejnerëve në host. Ky artikull do të diskutojë tre prej tyre.

Shtojca CNI Flannel

Kur përdorni Flannel si një ofrues rrjeti, komponenti Containerd CRI thërret Shtojca CNI Flannelduke përdorur skedarin e konfigurimit CNI /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
      }
    }
  ]
}

Shtojca Flannel CNI funksionon në lidhje me Flanneld. Gjatë nisjes, Flanneld merr podCIDR dhe detaje të tjera të lidhura me rrjetin nga serveri API dhe i ruan ato në një skedar /run/flannel/subnet.env.

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

Shtojca Flannel CNI përdor të dhëna nga /run/flannel/subnet.env për të konfiguruar dhe thirrur shtesën e urës CNI.

Plugin CNI Ura

Kjo shtojcë thirret me konfigurimin e mëposhtëm:

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

Kur thirret për herë të parë, krijon një urë Linux me «name»: «cni0», e cila tregohet në konfigurim. Më pas krijohet një palë veth për çdo pod. Një skaj i tij është i lidhur me hapësirën e emrave të rrjetit të kontejnerit, tjetri përfshihet në urën Linux në rrjetin pritës. Plugin CNI Ura lidh të gjithë kontejnerët pritës me një urë Linux në rrjetin pritës.

Pasi të ketë mbaruar konfigurimin e çiftit veth, shtojca Bridge thërret shtojcën IPAM CNI të host-lokal. Lloji i shtojcës IPAM mund të konfigurohet në konfigurimin CNI që përdor plugin CRI për të thirrur shtesën Flannel CNI.

Shtojcat IPAM CNI pritëse lokale

Thirrjet Bridge CNI shtojca IPAM host-lokal CNI me konfigurimin e mëposhtëm:

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

Shtojca IPAM pritëse-lokale (IP Address Mmenaxhimi - menaxhimi i adresës IP) kthen adresën IP për kontejnerin nga nënrrjeti dhe ruan IP-në e alokuar në host në drejtorinë e specifikuar në seksion dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ky skedar përmban ID-në e kontejnerit të cilit i është caktuar kjo adresë IP.

Kur telefononi shtojcën IPAM vendore të hostit, ai kthen të dhënat e mëposhtme:

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

Përmbledhje

Kube-controller-manager cakton një podCIDR për çdo nyje. Pod-et e secilës nyje marrin adresa IP nga hapësira e adresave në diapazonin e caktuar të podCIDR. Meqenëse podCIDR-të e nyjeve nuk mbivendosen, të gjitha pod-et marrin adresa IP unike.

Administratori i grupit Kubernetes konfiguron dhe instalon kubelet, kohëzgjatjen e kontejnerit, agjentin e ofruesit të rrjetit dhe kopjon shtojcat CNI në secilën nyje. Gjatë nisjes, agjenti i ofruesit të rrjetit gjeneron një konfigurim CNI. Kur një pod është planifikuar në një nyje, kubelet thërret shtojcën CRI për ta krijuar atë. Më pas, nëse përdoret kontejneri, shtojca Containerd CRI thërret shtesën CNI të specifikuar në konfigurimin CNI për të konfiguruar rrjetin e pod. Si rezultat, pod merr një adresë IP.

M'u desh pak kohë për të kuptuar të gjitha hollësitë dhe nuancat e të gjitha këtyre ndërveprimeve. Shpresoj se kjo përvojë do t'ju ndihmojë të kuptoni më mirë se si funksionon Kubernetes. Nëse e kam gabim për ndonjë gjë, ju lutem më kontaktoni në Twitter ose në adresën [email mbrojtur]. Mos ngurroni të kontaktoni nëse dëshironi të diskutoni aspekte të këtij artikulli ose ndonjë gjë tjetër. Do të doja të bisedoja me ju!

Referencat

Kontejnerët dhe rrjeti

Si funksionon Flannel?

CRI dhe CNI

PS nga përkthyesi

Lexoni edhe në blogun tonë:

Burimi: www.habr.com

Shto një koment