Ako modul v Kubernetes získa IP adresu

Poznámka. preklad.: Tento článok, ktorý napísal inžinier SRE z LinkedIn, sa podrobne venuje vnútornej mágii v Kubernetes – presnejšie interakcii CRI, CNI a kube-apiserver – ktorá nastáva, keď je potrebné priradiť IP adresu ďalšiemu modulu.

Jedna zo základných požiadaviek Sieťový model Kubernetes je, že každý modul musí mať svoju vlastnú IP adresu a ktorýkoľvek iný modul v klastri ho musí mať možnosť kontaktovať na tejto adrese. Existuje mnoho sieťových „poskytovateľov“ (Flannel, Calico, Canal atď.), ktorí pomáhajú implementovať tento sieťový model.

Keď som prvýkrát začal pracovať s Kubernetes, nebolo mi úplne jasné, ako presne pody získavajú svoje IP adresy. Aj keď sme pochopili, ako jednotlivé komponenty fungovali, bolo ťažké si predstaviť, že by spolupracovali. Vedel som napríklad, na čo slúžia pluginy CNI, no netušil som, ako sa presne volajú. Preto som sa rozhodol napísať tento článok, aby som sa podelil o poznatky o rôznych sieťových komponentoch a o tom, ako spolupracujú v klastri Kubernetes, ktorý umožňuje každému modulu získať svoju vlastnú jedinečnú IP adresu.

Existujú rôzne spôsoby, ako organizovať sieť v Kubernetes, rovnako ako existujú rôzne možnosti runtime pre kontajnery. Táto publikácia bude používať flanel organizovať sieť v klastri a ako spustiteľné prostredie - Kontajner. Tiež vychádzam z predpokladu, že viete, ako funguje sieťovanie medzi kontajnermi, takže sa toho len stručne dotknem, len pre kontext.

Niektoré základné pojmy

Kontajnery a sieť: Stručný prehľad

Na internete je množstvo výborných publikácií, ktoré vysvetľujú, ako kontajnery medzi sebou komunikujú cez sieť. Preto uvediem len všeobecný prehľad základných pojmov a obmedzím sa na jeden prístup, ktorý zahŕňa vytvorenie linuxového mosta a zapuzdrenie balíkov. Podrobnosti sú vynechané, keďže samotná téma kontajnerových sietí si zaslúži samostatný článok. Odkazy na niektoré mimoriadne poučné a vzdelávacie publikácie budú uvedené nižšie.

Kontajnery na jednom hostiteľovi

Jedným zo spôsobov, ako organizovať komunikáciu cez IP adresy medzi kontajnermi bežiacimi na rovnakom hostiteľovi, je vytvorenie Linuxového mosta. Na tento účel sa v Kubernetes (a Docker) vytvárajú virtuálne zariadenia veth (virtuálny ethernet). Jeden koniec zariadenia veth sa pripája k mennému priestoru siete kontajnera, druhý k Linuxový most na hostiteľskej sieti.

Všetky kontajnery na tom istom hostiteľovi majú jeden koniec veth pripojený k mostu, cez ktorý môžu navzájom komunikovať cez IP adresy. Linuxový most má tiež IP adresu a funguje ako brána pre výstupný prenos z modulov určených pre iné uzly.

Ako modul v Kubernetes získa IP adresu

Kontajnery na rôznych hostiteľoch

Zapuzdrenie paketov je jednou z metód, ktorá umožňuje kontajnerom na rôznych uzloch navzájom komunikovať pomocou adries IP. Vo Flaneli je za túto príležitosť zodpovedná technológia. vxlan, ktorý „zabalí“ pôvodný paket do paketu UDP a následne ho odošle na miesto určenia.

V klastri Kubernetes Flannel vytvorí zariadenie vxlan a podľa toho aktualizuje smerovaciu tabuľku na každom uzle. Každý paket určený pre kontajner na inom hostiteľovi prechádza cez zariadenie vxlan a je zapuzdrený do paketu UDP. V cieli sa vnorený paket extrahuje a prepošle do požadovaného modulu.

Ako modul v Kubernetes získa IP adresu
Poznámka: Toto je len jeden spôsob organizácie sieťovej komunikácie medzi kontajnermi.

čo je CRI?

CRI (Container Runtime Interface) je doplnok, ktorý umožňuje kubeletu používať rôzne prostredia spustenia kontajnerov. CRI API je zabudované do rôznych runtime, takže používatelia si môžu zvoliť runtime podľa vlastného výberu.

čo je CNI?

Projekt CNI je a špecifikácia organizovať univerzálne sieťové riešenie pre linuxové kontajnery. Okrem toho zahŕňa pluginy, zodpovedný za rôzne funkcie pri nastavovaní siete pod. Doplnok CNI je spustiteľný súbor, ktorý je v súlade so špecifikáciou (niektoré doplnky rozoberieme nižšie).

Pridelenie podsietí uzlom na prideľovanie IP adries podom

Keďže každý modul v klastri musí mať IP adresu, je dôležité zabezpečiť, aby bola táto adresa jedinečná. Dosiahne sa to priradením jedinečnej podsiete každému uzlu, z ktorej sa potom podu v tomto uzle pridelia IP adresy.

Ovládač uzla IPAM

Kedy nodeipam odovzdaný ako parameter príznaku --controllers kube-controller-manager, prideľuje samostatnú podsieť (podCIDR) každému uzlu z klastrového CIDR (t.j. rozsah IP adries pre klastrovú sieť). Keďže sa tieto podCIDR neprekrývajú, každému podu je možné prideliť jedinečnú IP adresu.

Uzol Kubernetes má pri prvotnej registrácii v klastri priradený podCIDR. Ak chcete zmeniť podCIDR uzlov, musíte ich zrušiť a potom ich znova zaregistrovať, pričom medzi tým vykonajte príslušné zmeny v konfigurácii riadiacej vrstvy Kubernetes. PodCIDR uzla môžete zobraziť pomocou nasledujúceho príkazu:

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

Kubelet, kontajnerový runtime a CNI pluginy: ako to všetko funguje

Naplánovanie modulu na uzol zahŕňa množstvo prípravných krokov. V tejto časti sa zameriam len na tie, ktoré priamo súvisia s nastavením siete podov.

Naplánovanie modulu na určitý uzol spustí nasledujúci reťazec udalostí:

Ako modul v Kubernetes získa IP adresu

FAQ: Architektúra doplnkov CRI Containerd.

Interakcia medzi modulom runtime kontajnera a doplnkami CNI

Každý poskytovateľ siete má svoj vlastný doplnok CNI. Runtime kontajnera ho spustí, aby konfigurovalo sieť pre modul pri spustení. V prípade kontajnerov sa doplnok CNI spúšťa pomocou doplnku Kontajnerové CRI.

Navyše, každý poskytovateľ má svojho zástupcu. Je nainštalovaný na všetkých uzloch Kubernetes a je zodpovedný za konfiguráciu siete modulov. Tento agent je buď súčasťou konfigurácie CNI, alebo ho nezávisle vytvorí na uzle. Konfigurácia pomáha doplnku CRI nastaviť, ktorý doplnok CNI má volať.

Umiestnenie konfigurácie CNI je možné prispôsobiť; štandardne je v /etc/cni/net.d/<config-file>. Správcovia klastra sú tiež zodpovední za inštaláciu doplnkov CNI na každý uzol klastra. Ich umiestnenie je tiež prispôsobiteľné; predvolený adresár - /opt/cni/bin.

Pri použití kontajnera je možné v sekcii nastaviť cesty pre konfiguráciu pluginu a binárne súbory [plugins.«io.containerd.grpc.v1.cri».cni] в kontajnerový konfiguračný súbor.

Keďže ako poskytovateľa siete používame Flannel, povedzme si niečo o jeho nastavení:

  • Flanneld (Démon Flannel) sa zvyčajne inštaluje do klastra ako sada démonov s install-cni ako iniciačný kontajner.
  • Install-cni vytvára konfiguračný súbor CNI (/etc/cni/net.d/10-flannel.conflist) na každom uzle.
  • Flanneld vytvorí zariadenie vxlan, získa sieťové metadáta zo servera API a monitoruje aktualizácie modulu. Keď sú vytvorené, distribuuje trasy do všetkých modulov v celom klastri.
  • Tieto trasy umožňujú modulom komunikovať medzi sebou prostredníctvom IP adries.

Pre podrobnejšie informácie o práci Flanela odporúčam použiť odkazy na konci článku.

Tu je schéma interakcie medzi doplnkom Containerd CRI a doplnkami CNI:

Ako modul v Kubernetes získa IP adresu

Ako vidíte vyššie, kubelet volá doplnok Containerd CRI na vytvorenie modulu, ktorý potom zavolá doplnok CNI na konfiguráciu siete modulu. Zásuvný modul CNI poskytovateľa siete pritom volá ďalšie zásuvné moduly CNI na konfiguráciu rôznych aspektov siete.

Interakcia medzi zásuvnými modulmi CNI

Existujú rôzne doplnky CNI, ktorých úlohou je pomôcť nastaviť sieťovú komunikáciu medzi kontajnermi na hostiteľovi. Tento článok bude diskutovať o troch z nich.

CNI plugin Flannel

Keď používate Flannel ako poskytovateľa siete, volá komponent Containerd CRI CNI plugin Flannelpomocou konfiguračného súboru 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
      }
    }
  ]
}

Doplnok Flannel CNI funguje v spojení s Flanneld. Počas spúšťania Flanneld načíta podCIDR a ďalšie podrobnosti týkajúce sa siete zo servera API a uloží ich do súboru /run/flannel/subnet.env.

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

Doplnok Flannel CNI využíva údaje z /run/flannel/subnet.env nakonfigurovať a zavolať doplnok CNI bridge.

CNI plugin Bridge

Tento plugin sa volá s nasledujúcou konfiguráciou:

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

Pri prvom volaní vytvorí linuxový most s «name»: «cni0», ktorý je uvedený v konfigurácii. Potom sa vytvorí veth pár pre každý pod. Jeden koniec je pripojený k mennému priestoru siete kontajnera, druhý je zahrnutý v moste Linux v hostiteľskej sieti. CNI plugin Bridge pripája všetky hostiteľské kontajnery k mostu Linux v hostiteľskej sieti.

Po dokončení nastavenia páru veth doplnok Bridge zavolá miestny doplnok IPAM CNI hostiteľa. Typ doplnku IPAM je možné nakonfigurovať v konfigurácii CNI, ktorú doplnok CRI používa na volanie doplnku Flannel CNI.

Hostiteľské miestne doplnky IPAM CNI

Premostite hovory CNI Hostiteľský doplnok IPAM CNI s nasledujúcou konfiguráciou:

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

Hostiteľský miestny doplnok IPAM (IP Address Mspráva – správa IP adries) vráti IP adresu kontajnera z podsiete a uloží pridelenú IP na hostiteľovi do adresára špecifikovaného v sekcii dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Tento súbor obsahuje ID kontajnera, ktorému je priradená táto IP adresa.

Pri volaní doplnku IPAM miestneho hostiteľa vráti nasledujúce údaje:

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

Zhrnutie

Kube-controller-manager priradí podCIDR každému uzlu. Pody každého uzla prijímajú IP adresy z adresného priestoru v pridelenom rozsahu podCIDR. Keďže podCIDR uzlov sa neprekrývajú, všetky moduly dostávajú jedinečné adresy IP.

Správca klastra Kubernetes nakonfiguruje a nainštaluje kubelet, modul runtime kontajnera, agenta poskytovateľa siete a skopíruje doplnky CNI do každého uzla. Počas spúšťania agent poskytovateľa siete vygeneruje konfiguráciu CNI. Keď je modul naplánovaný na uzol, kubelet zavolá doplnok CRI, aby ho vytvoril. Ďalej, ak sa použije kontajner, doplnok Containerd CRI zavolá doplnok CNI špecifikovaný v konfigurácii CNI na konfiguráciu siete podu. Výsledkom je, že modul dostane IP adresu.

Trvalo mi nejaký čas, kým som pochopil všetky jemnosti a nuansy všetkých týchto interakcií. Dúfam, že vám táto skúsenosť pomôže lepšie pochopiť, ako Kubernetes funguje. Ak sa v niečom mýlim, kontaktujte ma na Twitter alebo na adrese [chránené e-mailom]. Neváhajte nás kontaktovať, ak by ste chceli prediskutovať aspekty tohto článku alebo čokoľvek iné. Rád by som sa s vami porozprával!

referencie

Kontajnery a sieť

Ako funguje Flanel?

CRI a CNI

PS od prekladateľa

Prečítajte si aj na našom blogu:

Zdroj: hab.com

Pridať komentár