Kuidas pod Kuberneteses saab IP-aadressi

MĂ€rkus tĂ”lke kohta.: see artikkel, mille on kirjutanud LinkedIn'i SRE-insener, selgitab pĂ”hjalikult Kubernetesi „sisemist maagiat“ — tĂ€psemalt CRI, CNI ja kube-apiserveri koostööd, — mis juhtub, kui uuele pod'ile on vajalik IP-aadress.

Üks pĂ”hivajadustest Kubernetesi vĂ”rgu mudel on, et igal pod'il peab olema oma IP-aadress ja iga teine pod klastri sees peab saama temaga selle adressi kaudu ĂŒhendust vĂ”tta. On palju vĂ”rgu „pakkujaid“ (nĂ€iteks Flannel, Calico, Canal jne), mis aitavad selle vĂ”rgu mudeli rakendamisel.

Kui ma alles alustasin Kubernetesi töötamist, siis ei olnud mul pÀris selge, kuidas pod'id oma IP-aadreseid saavad. Isegi kui ma mÔistsin, kuidas eraldi komponendid toimivad, oli nende koostöö visualiseerimine keeruline. NÀiteks teadsin ma, miks on CNI pistikud vajalikud, kuid ei suutnud ette kujutada, kuidas nad justkui kÀivitatakse. SeetÔttu otsustasin kirjutada selle artikli, et jagada teadmisi erinevate vÔrgu komponentide ja nende koostööst Kubernetesi klastri sees, mis vÔimaldavad igal pod'il saada oma unikaalse IP-aadressi.

Kubernetesis on erinevaid viise vĂ”rgusuhete korraldamiseks — sarnaselt erinevatele konteinerite kĂ€ituskeskkondade (runtime) variantidele. KĂ€esolevas publikatsioonis kasutatakse Flannel vĂ”rgu korraldamiseks klastris ja kĂ€ituskeskkonnana — Containerd. Samuti lĂ€htun ma eeldusest, et teate, kuidas konteinerite vahel vĂ”rguĂŒhendus töötab, seega vaid lĂŒhidalt kĂ€sitlen seda, ainult konteksti jaoks.

MÔned pÔhikontseptsioonid

Konteinerid ja vĂ”rk: lĂŒhike ĂŒlevaade

Internetis on piisavalt suurepĂ€raseid publikatsioone, mis selgitavad, kuidas konteinerid omavahel vĂ”rgu kaudu ĂŒhenduvad. SeetĂ”ttu teen vaid ĂŒldise ĂŒlevaate peamistest mĂ”isted ja piirdun ĂŒhe lĂ€henemisega, mis hĂ”lmab Linux'i silda loomist ja pakettide kapseldamist. Üksikasjad on vahele jĂ€etud, kuna konteinerite vĂ”rgusuhete teema vÀÀrib eraldi artiklit. Allpool lisatakse linke mĂ”ningatele eriti sisulistele ja harivatele publikatsioonidele.

Konteinerid ĂŒhel hostil

Üks meetod IP-aadresside kaudu ĂŒhenduse loomise korraldamiseks konteinerite vahel, mis töötavad samal hostil, hĂ”lmab Linux-silla loomist. Selleks luuakse Kuberneteses (ja Dockeris) virtuaalsed seadmed veth (virtuaalne ethernet). Üks ots veth-seadmest on ĂŒhendatud konteineri vĂ”rgu nimekirjaga, teine - Linux-silla hosti vĂ”rgus.

Kogu hosti konteineritel on ĂŒks veth-ots ĂŒhendatud sillaga, mille kaudu nad saavad omavahel IP-aadresside kaudu suhelda. Linux-sillal on ka IP-aadress ja see toimib sildina vĂ€ljamineva (egress) liikluse jaoks pod'idest, mis on suunatud teistele sĂ”lmedele.

Kuidas pod Kuberneteses saab IP-aadressi

Konteinerid erinevates hostides

Pakettide kapseldamine on ĂŒks meetodeid, mis vĂ”imaldab konteineritel erinevates sĂ”lmedes omavahel IP-aadresside kaudu suhelda. Flannelis vastutab selle vĂ”imaluse eest tehnoloogia vxlan, mis "pakendab" algse paketi UDP-paketisse ja saadab selle sihtkohta.

Kuberneteses luuakse Flanneli klastris vxlan-seade ja Vastavalt tÀiendatakse igas sÔlmes marsruutide tabelit. Iga pakett, mis on suunatud teise hosti konteinerile, lÀbib vxlan-seadmest ja kapseldatakse UDP-paketisse. Sihtkohas eemaldatakse sissepakendatud pakett ja suunatakse vajalikku pod'i.

Kuidas pod Kuberneteses saab IP-aadressi
MĂ€rkus: See on vaid ĂŒks viis konteinerite vahelise vĂ”rgu suhtluse korraldamiseks.

Mis on CRI?

CRI (Container Runtime Interface) on plugin, mis vÔimaldab kubelet'il kasutada erinevaid konteinerite tÀitmise keskkondi. CRI API on integreeritud erinevatesse tÀitmise keskkondadesse, nii et kasutajad saavad oma soovile vastava runtime'i valida.

Mis on CNI?

CNI projekt on spetsifikatsiooni universaalse vÔrgu lahenduse loomiseks Linuxi konteineritele. Lisaks sisaldab see pluginad, mis vastutavad erinevate funktsioonide eest pod'i vÔrgu seadistamisel. CNI plugin on kÀivitatav fail, mis vastab spetsifikatsioonidele (mÔned pluginaid arutame allpool).

Alaahelate mÀÀramine sÔlmedele pod'ide IP-aadresside mÀÀramiseks

Kuna igal klastris asuval pod'il peab olema IP-aadress, on oluline tagada, et see aadress oleks ainulaadne. See saavutatakse, mÀÀrates igale sÔlmele ainulaadne alajaotus, millest mÀÀratakse pod'idele IP-aadresse sellel sÔlmel.

SÔlme IPAM kontrollija

Kui nodeipam edastatakse lipuflagingu parameetrina --controllers kube-controller-manager'i, ta jagab igale sÔlmele eraldi alamvÔrgu (podCIDR) klastrite CIDR-st (st IP-aadresside vahemik klastrite jaoks). Kuna need podCIDR'id ei katke, on vÔimalik igale pod'ile mÀÀrata ainulaadne IP-aadress.

Kubernetes sÔlmale mÀÀratakse podCIDR selle algse registreerimise ajal klastrisse. SÔlmede podCIDR'i muutmiseks tuleb need deregistreerida ja siis uuesti registreerida, vahepeal muudatustega Kubernetes'i juhtkihi konfigureerimises. SÔlme podCIDR'i saab vÀlja tuua jÀrgmise kÀsuga:

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

Kubelet, konteineri kÀivituskeskkond ja CNI pluginad: kuidas see kÔik töötab

Pod'i planeerimine sÔlmele on seotud paljude ettevalmistavate toimingute tÀitmisega. Selles osas keskendun ainult nendele, mis on otseselt seotud pod'i vÔrgu seadistamisega.

Pod'i planeerimine mĂ”ne sĂ”lme kĂ€ivitab jĂ€rgmise sĂŒndmuste ahela:

Kuidas pod Kuberneteses saab IP-aadressi

Abi: Containerd CRI pluginite arhitektuur.

Konteinerite kÀivituskeskkonna ja CNI pluginite koostoime

Igal vÔrgu pakkujal on oma CNI plugin. Konteineri kÀivituskeskkond kÀivitab selle pod'i vÔrguelementide seadistamiseks kÀivitamise ajal. Containerd puhul vastutab CNI plugina kÀivitamise eest plugin Containerd CRI.

Igal pakkujal on ka oma agent. See installitakse kÔikidele Kubernetes'i sÔlmedele ja vastutab pod'ide vÔrgu seadistamise eest. See agent tuleb kas koos CNI konfiguraatoriga vÔi loob selle ise sÔlmes. Konfiguratsioon aitab CRI plugin'il mÀÀrata, millist CNI plugina kutsuda.

CNI konfiguratsiooni asukohta saab seadistada; vaikimisi asub see /etc/cni/net.d/<config-file>. Klastri administraatorid vastutavad ka CNI pluginite installimise eest igale klastrisÔlmele. Nende asukohta saab samuti kohandada; vaikimisi kaust on /opt/cni/bin.

Kuna kasutame containerd, saame CNI konfiguratsiooni ja binaaride teed mÀÀrata jaotises [plugins."io.containerd.grpc.v1.cri".cni] ja containerd konfiguratsioonifailis.

Kuna kasutame Flannel'i vĂ”rgu pakkujana, rÀÀgime nĂŒĂŒd veidi selle seadistamisest:

  • Flanneld (Flannel'i deemon) installitakse tavaliselt klastrisse DaemonSet'i kujul koos install-cni vaikimisi init-konteineriga.
  • Install-cni loo CNI konfiguratsioonifail (/etc/cni/net.d/10-flannel.conflist) igal sĂ”lmel.
  • Flanneld loob vxlan seadet, tĂ”mbab vĂ”rgu metaandmeid API serverist ning jĂ€lgib pod'de uuendusi. Nende loomise kĂ€igus jagab ta marsreid kogu klastri ulatuses.
  • Need marsreed vĂ”imaldavad pod'del omavahel IP-aadresside kaudu suhelda.

Flanneli toimimise kohta lÀhemat teavet leiate artikli lÔpus olevatest linkidest.

Siin on skeem Containerd CRI plugina ja CNI pluginade vahelisest interaktsioonist:

Kuidas pod Kuberneteses saab IP-aadressi

Nagu ĂŒlal nĂ€htud, kutsub kubelet Containerd CRI plugina, et luua pod, ja seejĂ€rel kutsub CNI plugina pod'i vĂ”rgu seadistamiseks. Samal ajal kutsub vĂ”rgu pakkuja CNI plugin teisi pĂ”hitaotlusi CNI erinevate vĂ”rguelementide seadistamiseks.

CNI pluginade interaktsioon

On olemas erinevaid CNI pluginaid, mis aitavad seadistada vÔrgu suhtlust konteinerite vahel hostis. Selles artiklis rÀÀgitakse kolmest neist.

CNI plugin Flannel

Flanneli kasutamisel vÔrgu pakkujana kutsub Containerd CRI komponent CNI plugin Flannel, kasutades CNI konfiguratsioonifaili /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
      }
    }
  ]
}

CNI plugin Flannel töötab koos Flanneldiga. Flanneld alustades tÔmbab ta podCIDR ja teised vÔrgu seotud detailid API serverist ning salvestab need faili /run/flannel/subnet.env.

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

CNI plugin Flannel kasutab andmeid /run/flannel/subnet.env CNI bridge plugina seadistamiseks ja kutsumiseks.

CNI plugin Bridge

Seda pluginat kutsutakse jÀrgmise konfiguratsiooniga:

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

Esimese kutsumise korral loob ta Linuxi silla "name": "cni0", nagu on mÀÀratud konfiguratsioonis. SeejĂ€rel luuakse iga pod'i jaoks veth paari. Üks ots on ĂŒhendatud konteineri vĂ”rgunimeala, teine ots jĂ”uab Linuxi silla hulka hosti vĂ”rgus. CNI plugin Bridge ĂŒhendab kĂ”ik hosti konteinerid Linuxi sillaga hosti vĂ”rgus.

PĂ€rast veth paari seadistamist kutsub Bridge plugin kohalikule hosti (host-local) CNI plugin IPAM-i. IPAM plugina tĂŒĂŒpi saab seadistada CNI konfiguratsioonis, mida CRI plugin kasutab Flanneli CNI plugina kutsumiseks.

Kohalikud hosti IPAM pluginad CNI

Bridge CNI kutsub kohaliku IPAM plugina CNI jÀrgmise konfiguratsiooniga:

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

Host-local IPAM-plugin (IP Aaadress Mhaldamine — IP-aadresside haldamine) tagastab konteinerile IP-aadressi alamvĂ”rgust ja salvestab mÀÀratud IP-aadressi hostis kaustas, mille asukoht on mÀÀratud jaotis dataDir — /var/lib/cni/networks/<network-name=cni0>/<ip>. Selles failis on konteineri ID, kellele on antud see IP-aadress.

Kutsudes host-local IPAM-pluginit, tagastab ta jÀrgmised andmed:

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

Elulookirjeldus

Kube-controller-manager mÀÀrab igale sĂ”lmele podCIDR. Iga sĂ”lme pod’id saavad IP-aadresse mÀÀratud podCIDR-i aadressiruumi. Kuna sĂ”lmede podCIDR-id ei kattu, siis saavad kĂ”ik pod’id unikaalsed IP-aadressid.

Kubernetes klastrihaldur seadistab ja installib kubeleti, konteinerite kĂ€ivituskeskkonna, vĂ”rgu-ettevĂ”tja agendi ja kopeerib CNI-pluginid igale sĂ”lmele. KĂ€ivitamise ajal genereerib vĂ”rgu-ettevĂ”tja agent CNI-konfiguratsiooni. Kui pod on planeeritud sĂ”lmele, kutsub kubelet selle loomiseks vĂ€lja CRI-plugin. Edasi, kui kasutatakse containerd-d, kutsub Containerd CRI-plugin esile CNI-plugin, mis on mÀÀratud CNI-konfiguratsioonis, et seadistada pod’i vĂ”rku. Tulemuseks on, et pod saab IP-aadressi.

Mul kulus aega, et mĂ”ista kĂ”iki neid interaktsioone ja nĂŒansse. Loodan, et saadud kogemus aitab ka teil paremini mĂ”ista, kuidas Kubernetes töötab. Kui leian, et olen millegi osas vale, palun vĂ”tke minuga ĂŒhendust Twitteris vĂ”i aadressil hello@ronaknathani.com. Ärge kartke ĂŒhendust vĂ”tta, kui soovite arutada selle artikli aspekte vĂ”i midagi muud. Ma oleksin rÔÔmus teiega suhelda!

Viidatud lingid

Konteinerid ja vÔrk

Kuidas Flannel töötab

CRI ja CNI

P.S. tÔlkijalt

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster