ShĂ«n. pĂ«rk.: kyta artikulli, i shkruar nga njĂ« inxhinier SRE nĂ« LinkedIn, pĂ«rshkruan nĂ« detaje atĂ« "magjinĂ« e brendshme" nĂ« Kubernetes â mĂ« saktĂ«sisht, interaksionin mes CRI, CNI dhe kube-apiserver, â se çfarĂ« ndodh kur njĂ« pod tjetĂ«r ka nevojĂ« pĂ«r t'u caktuar njĂ« adresĂ« IP.
Një nga kërkesat bazë është që çdo pod duhet të ketë adresën e tij IP dhe çdo pod tjetër në klaster duhet të ketë mundësinë për t'u lidhur me të përmes kësaj adrese. Ekzistojnë shumë "ofrues" rrjetorë (Flannel, Calico, Canal etj.) që ndihmojnë në realizimin e këtij modeli rrjetor.
Kur fillova të punoja me Kubernetes, nuk ishte krejtësisht e qartë për mua se si konkretisht pod-et merrnin adresat e tyre IP. Edhe me kuptimin e funksionimit të komponenteve të veçanta, ishte e vështirë të imagjinoja punën e tyre të përbashkët. Për shembull, dija për çfarë ishin plugin-ët CNI, por nuk kisha idenë se si saktësisht thirreshin ata. Prandaj vendosa të shkruaj këtë artikull, për të ndarë njohuritë mbi komponentët e ndryshëm rrjetorë dhe bashkëveprimin e tyre në klasterin Kubernetes, që lejojnë çdo pod të marrë adresën e tij unike IP.
EkzistojnĂ« mĂ«nyra tĂ« ndryshme pĂ«r tĂ« organizuar ndĂ«rveprimin rrjetor nĂ« Kubernetes â ashtu si dhe varianta tĂ« ndryshme pĂ«r ambientet ekzekutuese (runtime) pĂ«r kontejnerĂ«t. NĂ« kĂ«tĂ« publikim do tĂ« pĂ«rdoret pĂ«r organizimin e rrjetit nĂ« klaster, dhe si ambient ekzekutues â . Po ashtu, unĂ« e supozon qĂ« ju e dini si funksionon ndĂ«rveprimi rrjetor mes kontejnerĂ«ve, prandaj do ta pĂ«rmendi vetĂ«m shkurtimisht, vetĂ«m pĂ«r kontekst.
Disa koncepte bazike
Kontejnerët dhe rrjeti: një përmbledhje e shkurtër
Në internet ka mjaft publikime të shkëlqyera që shpjegojnë se si kontejnerët lidhen me njëri-tjetrin përmes rrjetit. Prandaj, do të bëj një përmbledhje të përgjithshme të koncepteve kryesore dhe do të mbetem me një qasje që përfshin krijimin e një ure Linux dhe kapsulimin e paketave. Detajet janë lënë jashtë, pasi tema e ndërveprimit rrjetor të kontejnerëve meriton një artikull të veçantë. Links për disa publikime sidomos informative dhe edukative do të ofrohen më poshtë.
Kontejnerët në të njëjtin host
NjĂ« nga mĂ«nyrat pĂ«r tĂ« organizuar lidhjen pĂ«rmes adresave IP mes kontejnerĂ«ve qĂ« punojnĂ« nĂ« tĂ« njĂ«jtin host, parashikon krijimin e njĂ« ure Linux. PĂ«r kĂ«tĂ«, nĂ« Kubernetes (dhe Docker) krijohen pajisje virtuale . NjĂ«ra annĂ« e pajisjes veth Ă«shtĂ« e lidhur me hapĂ«sirĂ«n e emrave rrjetor tĂ« kontejnerit, tjetra â me nĂ« rrjetin e hostit.
Të gjitha kontejnerët në të njëjtin host, një nga anët e veth-it është e lidhur me urën, përmes së cilës ata mund të lidhen me njëri-tjetrin përmes adresave IP. Ura Linux gjithashtu ka një adresë IP, dhe ajo shërben si një portë për trafikun e daljes (egress) nga pod-et, e destinuar për nodet tjera.

Kontejnerët në hoste të ndryshme
Kapsulimi i paketave është një nga mënyrat që lejon kontejnerët në nodet e ndryshme të lidhen me njëri-tjetrin përmes adresave IP. Në Flannel, kjo mundësi është përgjegjësi e teknologjisë , e cila "paketon" paketën e origjinës në një paketë UDP dhe më pas e dërgon në destinacion.
NĂ« klasterin Kubernetes, Flannel krijon njĂ« pajisje vxlan dhe plotĂ«son nĂ« pĂ«rputhje tabulatĂ«n e rutes nĂ« secilin nga nodet. Ădo paketĂ« e destinuar pĂ«r njĂ« kontejner nĂ« njĂ« host tjetĂ«r kalon pĂ«rmes pajisjes vxlan dhe kapsulohet nĂ« njĂ« paketĂ« UDP. NĂ« destinacion, paketa e ndjerĂ« nxirret dhe dĂ«rgohet nĂ« pod-in e duhur.

Shënim: Kjo është vetëm një nga mënyrat për të organizuar ndërveprimin rrjetor mes kontejnerëve.
ĂfarĂ« Ă«shtĂ« CRI?
është një plugin që lejon kubelet-in të përdorë ambiente të ndryshme ekzekutuese për kontejnerët. API CRI është integruar në ambiente të ndryshme ekzekutuese, kështu që përdoruesit mund të zgjedhin runtime sipas dëshirës.
ĂfarĂ« Ă«shtĂ« CNI?
është një për organizimin e një zgjidhjeje universale rrjetore për kontejnerët Linux. Për më tepër, ai përfshin , përgjegjës për funksione të ndryshme gjatë konfigurimit të rrjetit të pod-it. Plugin-i CNI është një skedar ekzekutiv që përputhet me specifikimin (disa plugin-e do t'i diskutojmë më poshtë).
Shpërndarja e nënrrjeteve për nodet për caktimin e adresave IP për pod-et
Duke qenë se çdo pod në klaster duhet të ketë një adresë IP, është e rëndësishme të sigurohet që kjo adresë të jetë unike. Kjo arrihet duke shpërndarë një nënrrjetë unike për secilin node, nga e cila pastaj caktohen adresat IP për pod-et në atë node.
Kontrolluesi IPAM i nodit
Kur nodeipam kalon si një parameter flage --controllers , i ndan çdo nyje i atribuon një nënrrjet të veçantë (podCIDR) nga CIDR i klasterit (dmth. diapazoni i adresave IP për rrjetin e klasterit). Duke qenë se këto podCIDR nuk mbivendosen, është e mundur të atribuohet çdo pod një adresë IP unike.
Një nyje Kubernetes merr podCIDR në momentin e regjistrimit të tij fillestar në klaster. Për të ndryshuar podCIDR në nyje, duhet t'i hiqni ato nga regjistrimi dhe më pas t'i regjistroni sërish, ndërkohë që bëni ndryshimet e nevojshme në konfigurimin e shtresës menaxhuese Kubernetes. PodCIDR-in e nyjës mund ta nxirrni me komandën vijuese:
$ kubectl get no -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet, mjedisi i ekzekutimit të kontejnerëve dhe pluginat CNI: si funksionon e gjithë kjo
Planifikimi i një pod-i në një nyje lidhet me realizimin e shumë veprimeve përgatitore. Në këtë seksion do të përqendrohem vetëm te ato që janë drejtpërdrejt të lidhura me konfigurimin e rrjetit të pod-it.
Planifikimi i një pod-i në një nyje nxit një zinxhir ngjarjesh:

Manuali i përdoruesit DRBD .
Ndërveprimi i mjedisit të ekzekutimit të kontejnerëve dhe pluginave CNI
Ădo ofrues rrjeti ka pluginin e vet CNI. Runtime i kontejnerit e aktivizon atĂ« pĂ«r tĂ« konfiguruar rrjetin pĂ«r pod-in gjatĂ« ekzekutimit tĂ« tij. NĂ« rastin e containerd, aktivizimi i pluginĂ«s CNI merret nga plugin .
Ădo ofrues ka agjentin e vet. Ai instalohet nĂ« tĂ« gjitha nyjat Kubernetes dhe Ă«shtĂ« pĂ«rgjegjĂ«s pĂ«r konfigurimin e rrjetit tĂ« pod-eve. Ky agjent vjen ose nĂ« paketim me konfigurimin CNI, ose krijon atĂ« vetĂ« nĂ« nyje. Konfigurimi ndihmon pluginin CRI tĂ« vendosĂ« se cilin plugin CNI tĂ« thĂ«rrasĂ«.
Lokacioni i konfigurimit CNI mund të konfigurohet; për default ai ndodhet në /etc/cni/net.d/<config-file>. Administratorët e klasterit gjithashtu janë përgjegjës për instalimin e pluginave CNI në çdo nyje të klasterit. Lokacioni i tyre gjithashtu konfigurohet; direktorja për default është /opt/cni/bin.
Kur përdorni containerd, rrugët për konfigurimin dhe binarët e pluginës mund të caktohen në seksionin [plugins."io.containerd.grpc.v1.cri".cni] në .
Duke qenë se ne përdorim Flannel si ofrues rrjeti, le të flasim pak për konfigurimin e tij:
- Flanneld (demon i Flannel-it) zakonisht instalohet në klaster si DaemonSet me
install-cnisi . Install-cnikrijon (/etc/cni/net.d/10-flannel.conflist) në çdo nyje.- Flanneld krijon një pajisje vxlan, nxjerr metadatën rrjetore nga API-serveri dhe ndjek përditësimet e pod-eve. Ndërsa ato krijohen, ai shpërndan rrugët për të gjithë pod-et në të gjithë klasterin.
- Këto rrugë lejojnë pod-et të komunikojnë mes tyre përmes adresave IP.
Për informacion më të detajuar mbi funksionimin e Flannel, rekomandoj të shfrytëzoni lidhjet në fund të artikullit.
Ja një skemë e ndërveprimit ndërmjet pluginave Containerd CRI dhe pluginave CNI:

Siç duket më sipër, kubelet thërret pluginin Containerd CRI për të krijuar pod-in, dhe ai pastaj thërret pluginin CNI për të konfiguruar rrjetin e pod-it. Në këtë rast, plugin CNI i ofruesit të rrjetit thërret pluginat e tjerë bazë CNI për të konfiguruar aspekte të ndryshme të rrjetit.
Ndërveprimi në mes pluginave CNI
Ka shumë plugina CNI, të cilët janë përgjegjës për ndihmën në konfigurimin e ndërveprimit rrjetor midis kontejnerëve në host. Në këtë artikull do të flasim për tre prej tyre.
Plugin CNI Flannel
Kur përdoret Flannel si ofrues rrjeti, komponenti Containerd CRI thërras , duke 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
}
}
]
}
Plugin CNI Flannel punon në bashkëpunim me Flanneld. Gjatë aktivizimit, Flanneld nxjerr podCIDR dhe detaje të tjera të lidhura me rrjetin nga API-serveri dhe i ruan ato në skedarin /run/flannel/subnet.env.
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
Plugin CNI Flannel përdor të dhënat nga /run/flannel/subnet.env për të konfiguruar dhe thirrur pluginin CNI të urës (bridge).
Plugin CNI Bridge
Ky plugin thirret me konfigurimin vijuese:
{
"name": "cni0",
"type": "bridge",
"mtu": 1450,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24"
}
}
Me thirrjen e parë, ai krijon një urë Linux me "name": "cni0", që specifikohet në konfigurim. Pastaj, për çdo pod krijohet një çift veth. Një skaj i tij lidhet me hapësirën e emrave të kontejnerit, skaji tjetër hyn në urën Linux në rrjetin e hostit. lidhet me të gjithë kontejnerët e hostit në urën Linux në rrjetin e hostit.
Pasi të përfundojë konfigurimin e çiftit veth, plugin Bridge thërret pluginin IPAM lokal për hostin (host-local). Lloji i plugin-it IPAM mund të konfigurohet në konfigurimin CNI, i cili plugin CRI e përdor për thirrjen e plugin CNI Flannel.
Pluginat lokalë për hostin IPAM CNI
Bridge CNI thërret me konfigurimin vijuese:
{
"name": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24",
"dataDir": "/var/lib/cni/networks"
}
}
Plugin IPAM lokal tĂ« hostit (IP Address Mmenaxhimi â menaxhimi i adresave IP) kthen IP adresin pĂ«r kontejnerin nga subnet dhe ruan IP-nĂ« e dedikuar nĂ« host nĂ« drejtorinĂ« e specifikuar nĂ« seksionin dataDir â /var/lib/cni/networks/<network-name=cni0>/<ip>. Ky skedar pĂ«rmban ID-nĂ« e kontejnerit tĂ« cilit i Ă«shtĂ« caktuar ky IP adres.
Kur thirret plugin-i IPAM host-local, ai kthen të dhënat e mëposhtme:
{
"ip4": {
"ip": "10.244.4.2",
"gateway": "10.244.4.3"
},
"dns": {}
}
Curriculum Vitae
Kube-controller-manager-i i cakton çdo nyjeje podCIDR. Pod-at e çdo nyjeje marrin adresat IP nga hapësira adresuese në intervalin e dedikuar podCIDR. Duke qenë se podCIDR-të e nyjeve nuk përputhen, të gjitha pod-at marrin adresat IP unike.
Administratori i klasterit Kubernetes konfiguroni dhe instalon kubelet, mjedisin e punës së kontejnerëve, agjentin e ofruesit të rrjetit dhe kopjon pluginat CNI në çdo nyje. Gjatë nisjes, agjenti i ofruesit të rrjetit gjeneron konfigurimin CNI. Kur një pod planifikohet në një nyje, kubelet thërret plugin-in CRI për ta krijuar atë. Më pas, nëse përdoret containerd, plugin-i Containerd CRI thërret plugin-in CNI të përcaktuar në konfigurimin CNI për të konfiguruar rrjetin e pod-it. Si rezultat, pod-i merr adresën IP.
Më mori pak kohë për të kuptuar të gjitha detajet dhe nuancat e këtij interaksioni. Shpresoj që përvoja e fituar t'ju ndihmojë edhe juve në kuptimin më të mirë të funksionimit të Kubernetes. Nëse kam bërë ndonjë gabim, ju lutem më kontaktoni në ose në adresën . Mos hezitoni të kontaktoni nëse dëshironi të diskutoni aspekte të këtij artikulli ose diçka tjetër. Do të më pëlqente të flisja me ju!
Linke
Kontejnerët dhe rrjeti
Si funksionon Flannel
CRI dhe CNI
P.S. nga përkthyesi
Lexoni gjithashtu në blogun tonë:
- «»;
- «Udhëzuesi ilustruar për ndërtimin e rrjetit në Kubernetes»: , ;
- «».
Burimi: habr.com
