Si një pod në Kubernetes merr një adresë IP

ShĂ«n. pĂ«rkth.: ky kjo artikull, e shkruar nga njĂ« inxhinier SRE nga LinkedIn, pĂ«rshkruan me detaje atĂ« 'magjinĂ« e brendshme' nĂ« Kubernetes — mĂ« saktĂ«sisht, ndĂ«rveprimin midis CRI, CNI dhe kube-apiserver, — qĂ« ndodh kur njĂ« pod kĂ«rkon tĂ« caktohet njĂ« adresĂ« IP.

Një nga kërkesat themelore e modelit rrjetor Kubernetes është që çdo pod të ketë adresën e vet IP dhe çdo pod tjetër në klaster duhet të jetë në gjendje të bëjë lidhje me të përmes kësaj adrese. Ka shumë 'ofrues rrjeti' (Flannel, Calico, Canal, etj.) që ndihmojnë në implementimin e këtij modeli rrjeti.

Kur fillova të punoja me Kubernetes, nuk ishte krejtësisht e qartë se si podët merrnin adresat e tyre IP. Edhe me kuptimin se si funksionojnë komponentët e veçantë, ishte e vështirë të imagjinojë punën e tyre të përbashkët. Për shembull, dija se për çfarë shërbenin pluginet CNI, por nuk e kisha idenë se si thirreshin ato. Prandaj vendosa të shkruaj këtë artikull për të ndarë njohuritë mbi komponentët e ndryshëm rrjetorë dhe bashkëpunimin e tyre në klasterin Kubernetes, të cilat i lejojnë çdo pod të marrë një adresë IP unike.

EkzistojnĂ« mĂ«nyra tĂ« ndryshme pĂ«r tĂ« organizuar ndĂ«rveprimin rrjetor nĂ« Kubernetes — nĂ« mĂ«nyrĂ« tĂ« ngjashme me opsionet e ndryshme tĂ« mjediseve tĂ« ekzekutimit (runtime) pĂ«r kontejnerĂ«t. NĂ« kĂ«tĂ« publikim do tĂ« pĂ«rdoret Flannel pĂ«r tĂ« organizuar rrjetin nĂ« klaster, dhe si mjedis ekzekutimi — Containerd. Gjithashtu, po e marr si tĂ« dhĂ«nĂ« se e dini se si funksionon ndĂ«rveprimi rrjetor midis kontejnerĂ«ve, prandaj do tĂ« pĂ«rmend vetĂ«m shkurtimisht kĂ«tĂ« pĂ«r kontekst.

Disa koncepte themelore

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

Në internet ka shumë publikime të shkëlqyera, që shpjegojnë se si kontejnerët lidhen me njëri-tjetrin përmes rrjetit. Prandaj do të bëj vetëm një përmbledhje të përgjithshme të koncepteve themelore dhe do të kufizohem në një qasje që përfshin krijimin e një ure Linux dhe inkapsulimin e paketave. Detajet do të shpërfilen, pasi vetë tema e ndërveprimit të kontejnerëve meriton një artikull të veçantë. Do të jap lidhje për disa publikime të veçanta dhe të informuese më poshtë.

Kontejnerët në një host

NjĂ« nga mĂ«nyrat pĂ«r tĂ« organizuar lidhjet pĂ«rmes adreseve IP midis konteinerĂ«ve qĂ« punojnĂ« nĂ« tĂ« njĂ«jtin host, pĂ«rfshin krijimin e njĂ« ure Linux. PĂ«r kĂ«tĂ«, nĂ« Kubernetes (dhe Docker) krijohen pajisje virtuale veth (ethernet virtual). NjĂ«ra skaj e pajisjes veth i Ă«shtĂ« lidhur hapĂ«sirĂ«s neto tĂ« konteinerit, tjetra — ures Linux nĂ« rrjetin e hostit.

TĂ« gjithĂ« konteinerĂ«t nĂ« njĂ« host kanĂ« njĂ« skaj veth tĂ« lidhur me urĂ«n, 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 ajo shĂ«rben si njĂ« kalim pĂ«r trafikun e dalĂ«s (egress) nga pod’ët, qĂ« Ă«shtĂ« i destinuar pĂ«r nodet e tjera.

Si një pod në Kubernetes merr një adresë IP

Konteinerët në node të ndryshme

Inkasulimi i paketeve është një nga mënyrat që lejon konteinerët në node të ndryshme të komunikojnë me njëri-tjetrin përmes adresave IP. Në Flannel, kjo mundësi i atribuohet teknologjisë vxlan, e cila "paketon" paketën origjinale në një paketë UDP dhe pastaj e dërgon atë në destinacion.

NĂ« klasterin Kubernetes, Flannel krijon njĂ« pajisje vxlan dhe nĂ« pĂ«rputhje e ndihmon tabelĂ«n e rrugĂ«ve nĂ« secilĂ«n nga nodet. Çdo paketĂ« e destinuar pĂ«r njĂ« konteiner nĂ« njĂ« host tjetĂ«r kalon pĂ«rmes pajisjes vxlan dhe inkasulohet nĂ« njĂ« paketĂ« UDP. NĂ« destinacion, paketa e futur nxirret dhe dĂ«rgohet nĂ« pod-in e nevojshĂ«m.

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

ÇfarĂ« Ă«shtĂ« CRI?

CRI (Container Runtime Interface) — Ă«shtĂ« njĂ« plugin qĂ« lejon kubelet-in tĂ« pĂ«rdorĂ« ambiente tĂ« ndryshme ekzekutimi konteinerĂ«sh. API CRI Ă«shtĂ« integruar nĂ« ambiente tĂ« ndryshme ekzekutimi, kĂ«shtu qĂ« pĂ«rdoruesit mund tĂ« zgjedhin runtime sipas dĂ«shirĂ«s.

ÇfarĂ« Ă«shtĂ« CNI?

Projekti CNI pĂ«rfaqĂ«son specifikimi pĂ«r organizimin e njĂ« zgjidhjeje universale rrjetore pĂ«r konteinerĂ«t Linux. PĂ«r mĂ« tepĂ«r, ai pĂ«rfshin plugina, qĂ« janĂ« pĂ«rgjegjĂ«s pĂ«r funksione tĂ« ndryshme gjatĂ« konfigurimit tĂ« rrjetit tĂ« pod’it. Plugin CNI Ă«shtĂ« njĂ« skedar ekzekutues, nĂ« pĂ«rputhje me specifikimin (disa plugin ato do t'i diskutojmĂ« mĂ« poshtĂ«).

Caktimi i nĂ«nrrjeteve nĂ« nodet pĂ«r tĂ« caktuar adresat IP tĂ« pod’ave

PĂ«r shkak 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 i caktuar çdo nodi njĂ« nĂ«nrrjetĂ« unike, nga e cila pastaj adresat IP tĂ« caktuar nĂ« kĂ«tĂ« nod i atribuohen pod’ave.

Kontrolluesi IPAM i nodit

Kur nodeipam i kalon si njĂ« parametĂ«r tĂ« flagut --controllers tĂ« kube-controller-manager-it, ai jep njĂ« subnet tĂ« veçantĂ« (podCIDR) çdo nyjeje (t.e.a. gamĂ«s sĂ« IP-adresave pĂ«r rrjetin e klasĂ«s). Duke qenĂ« se kĂ«to podCIDR nuk ndĂ«rhyjnĂ«, çdo pod’i mund t'i jepet njĂ« adresĂ« IP unike.

Një nyje Kubernetes i jepet podCIDR në momentin e regjistrimit të saj fillestar në klasë. Për të ndryshuar podCIDR në nyje, është e nevojshme të hiqen nga regjistri dhe pastaj të regjistrohen përsëri, ndërsa ndryshimet përkatëse në konfigurimin e shtresës menaxhuese të Kubernetes duhet të bëhen. PodCIDR e një nyjeje mund të nxirret me komandën e mëposhtme:

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

Kubelet, ambienti i ekzekutimit të konteinerëve dhe plaginjtë CNI: si funksionon gjithçka kjo

Planifikimi i njĂ« pod’i nĂ« njĂ« nyje lidhet me realizimin e njĂ« sĂ«rĂ« veprimesh pĂ«rgatitore. NĂ« kĂ«tĂ« seksion do tĂ« fokusohem vetĂ«m nĂ« ato qĂ« lidhen direkt me konfigurimin e rrjetit tĂ« pod’it.

Planifikimi i njĂ« pod’i nĂ« njĂ« nyje nxit njĂ« zinxhir ngjarjesh:

Si një pod në Kubernetes merr një adresë IP

Konsultim: Arkitektura e plaginjtë CRI të Containerd.

Ndërveprimi i ambientit të ekzekutimit të konteinerëve dhe plaginjtë CNI

Çdo ofrues rrjeti ka plaginjin e tij CNI. Runtime i konteinerit e nis atĂ« pĂ«r tĂ« konfiguruar rrjetin pĂ«r pod’in gjatĂ« procesit tĂ« nisjes sĂ« tij. NĂ« rastin e containerd, nisja e plaginjtĂ« CNI bĂ«het nga plaginji Containerd CRI.

NĂ« kĂ«tĂ« rast, çdo ofrues ka agentin e vet. Ai instalohet nĂ« tĂ« gjitha nyjet e Kubernetes dhe Ă«shtĂ« pĂ«rgjegjĂ«s pĂ«r konfigurimin e rrjetit pĂ«r pod’ët. Ky agent vjen ose me konfigurimin e CNI ose krijon atĂ« vetĂ« nĂ« nyje. Konfigurimi ndihmon plaginjin CRI tĂ« vendosĂ« se cili plagin CNI duhet thirrur.

Vendndodhja e konfigurimit CNI mund të konfigurohet; në mënyrë të parazgjedhur ndodhet në /etc/cni/net.d/<config-file>. Administratoret e klasës gjithashtu janë përgjegjës për instalimin e plaginjtë CNI në çdo nyje të klasës. Vendndodhja e tyre gjithashtu konfigurohet; direktoria e parazgjedhur është /opt/cni/bin.

Duke përdorur containerd, rrugët për konfigurim dhe binarët e plaginjtë mund të caktohen në seksionin [plugins."io.containerd.grpc.v1.cri".cni] në në skedarin e konfigurimit të containerd.

Duke qenë se përdorim Flannel si ofruesin e rrjetit, le të flasim pak rreth konfigurimit të tij:

  • Flanneld (demon i Flannel) zakonisht instalohet nĂ« klasĂ« si DaemonSet me install-cni si kontejner inicial.
  • Install-cni krijon skedarin e konfigurimit CNI (/etc/cni/net.d/10-flannel.conflist) nĂ« secilĂ«n nyje.
  • Flanneld krijon njĂ« pajisje vxlan, nxjerr metadata rrjeti nga API-server dhe monitoron pĂ«rditĂ«simet e pod-ve. NdĂ«rsa ato krijohen, ai shpĂ«rndan rrugĂ«t pĂ«r tĂ« gjithĂ« pod-et nĂ« tĂ« gjithĂ« klasterin.
  • KĂ«to rrugĂ« u japin mundĂ«si pod-ve tĂ« lidhin njĂ«ri-tjetrin pĂ«rmes adresave IP.

Për më shumë informacion mbi funksionimin e Flannel, rekomandoj të shfrytëzoni lidhjet në fund të artikullit.

Këtu është skema e bashkëveprimit midis plugin-it Containerd CRI dhe plugin-eve CNI:

Si një pod në Kubernetes merr një adresë IP

Siç shihet më lart, kubelet thërret plugin-in Containerd CRI për të krijuar pod, ndërsa ai thërret plugin-in CNI për të konfiguruar rrjetin e pod-it. Në këtë proces, plugin-i CNI i ofruesit të rrjetit thërret plugin-e të tjera bazë CNI për të konfiguruar aspekte të ndryshme të rrjetit.

Bashkëveprimi midis plugin-eve CNI

Ekzistojnë plugin-e të ndryshme CNI, detyra e të cilave është të ndihmojnë në konfigurimin e bashkëveprimit rrjetësor midis konteinerëve në host. Ky artikull do të fokusohet në tre prej tyre.

Plugin-i CNI Flannel

Kur përdoret Flannel si ofrues rrjeti, komponenti Containerd CRI thërret Plugin-i CNI Flannel, duke përdorur skedarin përkatës të 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-i CNI Flannel punon në bashkëpunim me Flanneld. Gjatë nisjes, Flanneld nxjerr podCIDR dhe detaje të tjera të lidhura me rrjetin nga API-server 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

Plugin-i CNI Flannel përdor të dhënat nga /run/flannel/subnet.env për të konfiguruar dhe thirrur plugin-in CNI të urës (bridge).

Plugin-i CNI Bridge

Ky plugin 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"
  }
}

Në thirrjen e parë, ai krijon një urë Linux me "name": "cni0", e cila është e specifikuar në konfigurim. Pastaj, për çdo pod krijohet një çift veth. Njëra skaj lidhet me hapësirën e emrave të kontenierit, ndërsa tjetra futet në urën Linux në rrjetin e hostit. Plugin-i CNI Bridge lidhen të gjithë kontenierët e hostit me urën Linux në rrjetin e hostit.

Pasi të përfundoj me konfigurimin e çiftit veth, plugin-i Bridge thërret plugin-in IPAM lokal për hostin (host-local) CNI. Lloji i plugin-it IPAM mund të konfigurohet në konfigurimin CNI, të cilin plugin-i CRI përdor për të thirrur plugin-in CNI Flannel.

Plugin-et lokale për hostin IPAM CNI

Bridge CNI thërret plugin-in IPAM lokal për hostin CNI me konfigurimin e mëposhtëm:

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

Plugins IPAM host-local (IP Aadresa Mmenaxhim — menaxhimi i IP-adresave) kthen IP-adresĂ«n pĂ«r kontejnerin nga subneti dhe ruan IP-nĂ« e caktuar nĂ« host nĂ« drejtorinĂ« e caktuar nĂ« seksionin dataDir — /var/lib/cni/networks/<network-name=cni0>/<ip>. Ky skedar pĂ«rmban ID-nĂ« e kontejnerit tĂ« cilit i Ă«shtĂ« caktuar kjo 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": {}
}

CV

Kube-controller-manager-i i cakton çdo nodi podCIDR. Pod-et e çdo nodi marrin IP-adresa nga hapësira e adresave në intervalin e caktuar podCIDR. Duke qenë se podCIDR-të e nodeve nuk mbivendosen, të gjitha pod-et marrin IP-adresa unike.

Administratori i klasterit Kubernetes konfiguroni dhe instaloni kubelet, ambientin e ekzekutimit të kontejnerëve, agjentin e ofruesit të rrjetit dhe kopjon plugin-e CNI në çdo nod. Gjatë nisjes, agjenti i ofruesit të rrjetit gjeneron konfigurimin e CNI. Kur një pod planifikohet në një nod, kubelet thërret plugin-in CRI për ta krijuar atë. Pastaj, nëse përdoret containerd, plugin-i i Containerd CRI thërret plugin-in CNI, i caktuar në konfigurimin e CNI, për të konfiguruar rrjetin e pod-it. Si rezultat, pod-i merr IP-adresën.

Më mori pak kohë për të kuptuar të gjitha nuancat dhe detajet e këtyre ndërveprimeve. Shpresoj që përvoja e fituar t'ju ndihmojë edhe juve të kuptoni më mirë si funksionon Kubernetes. Nëse kam gabuar në ndonjë gjë, ju lutem kontaktoni me mua në Twitter ose në adresën hello@ronaknathani.com. Mos hezitoni të kontaktoni, nëse doni të diskutoni aspekte të këtij artikulli ose ndonjë gjë tjetër. Do të jem i lumtur të bisedoj me ju!

Linket

Kontejnerët dhe rrjeti

Si funksionon Flannel

CRI dhe CNI

P.S. nga përkthyesi

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

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