Si pod në Kubernetes merr adresën IP

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ë e modelit rrjetor të Kubernetes ë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 Flannel pĂ«r organizimin e rrjetit nĂ« klaster, dhe si ambient ekzekutues — Containerd. 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 veth (virtual ethernet). NjĂ«ra annĂ« e pajisjes veth Ă«shtĂ« e lidhur me hapĂ«sirĂ«n e emrave rrjetor tĂ« kontejnerit, tjetra — me uren Linux 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.

Si pod në Kubernetes merr adresën IP

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ë vxlan, 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.

Si pod në Kubernetes merr adresën IP
Shënim: Kjo është vetëm një nga mënyrat për të organizuar ndërveprimin rrjetor mes kontejnerëve.

ÇfarĂ« Ă«shtĂ« CRI?

CRI (Container Runtime Interface) ë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?

Projekti CNI është një specifikimin për organizimin e një zgjidhjeje universale rrjetore për kontejnerët Linux. Për më tepër, ai përfshin plugina, 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 kube-controller-manager-it, 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:

Si pod në Kubernetes merr adresën IP

Manuali i përdoruesit DRBD Arkitektura e pluginave CRI të Containerd.

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 Containerd CRI.

Ç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ë të skedarit të konfigurimit të containerd.

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-cni si kontejnerin init.
  • Install-cni krijon skedarin e konfigurimit CNI (/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 pod në Kubernetes merr adresën IP

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 Plugin CNI Flannel, 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. Plugin CNI Bridge 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 pluginin IPAM lokal të hostit CNI 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ë Twitter ose në adresën hello@ronaknathani.com. 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ë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster