Kuidas pod Kuberneteses saab IP-aadressi

MĂ€rk. tĂ”lge.: see artikkel, mille on kirjutanud SRE-insener LinkedInist, rÀÀgib detailselt „sisemisest maagist“ Kuberneteses — tĂ€psemalt CRI, CNI ja kube-apiserveri koostööst, — mis juhtub, kui jĂ€rgmine pod vajab IP-aadressi mÀÀramist.

Üks pĂ”hivajadustest Kubernetes'e vĂ”rgumudel on see, et igal pod'il peab olema oma IP-aadress ning iga teine pod klastris peab suutma temaga selle aadressi kaudu ĂŒhendust luua. On palju vĂ”rguteenuse pakkujaid (nt Flannel, Calico, Canal jne), mis aitavad seda vĂ”rgumudelit rakendada.

Kuna alustasin Kubernetes'ega töötamist, ei olnud mul pĂ€ris selge, kuidas pod'id oma IP-aadresse saavad. Isegi kui mĂ”istsin, kuidas ĂŒksikud komponendid töötavad, oli keeruline ette kujutada nende koostööd. NĂ€iteks teadsin, milleks on CNI-pluginad vajalikud, kuid ei osanud ette kujutada, kuidas need tĂ€pselt kutsutakse. SeetĂ”ttu otsustasin kirjutada selle artikli, et jagada teadmisi erinevatest vĂ”rgukomponentidest ja nende koostööst Kubernetes'e klastris, mis vĂ”imaldab igal pod'il saada oma ainulaadne IP-aadress.

Kubernetesis on erinevaid viise, kuidas korraldada vĂ”rguĂŒhendust, samal ajal kui konteinerite tööks on erinevaid kĂ€ituskeskkondi (runtime). Selles publikatsioonis kasutatakse Flannel vĂ”rgu korraldamiseks klastris ning kĂ€ituskeskkonnana kasutatakse Containerd. Eeldan ka, et teate, kuidas konteinerite vahel vĂ”rguĂŒhendused toimivad, seega puudutan seda ainult lĂŒhidalt, et anda konteksti.

MÔned pÔhikontseptsioonid

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

Internetis on palju suurepĂ€raseid avaldusi, mis selgitavad, kuidas konteinerid omavahel vĂ”rgu kaudu ĂŒhenduvad. SeetĂ”ttu annan vaid ĂŒldise ĂŒlevaate pĂ”hikontseptsioonidest ja piirdun ĂŒhe lĂ€henemisega, mis hĂ”lmab Linuxi silda ja paketide kapseldamist. Detailid on vĂ€lja jĂ€etud, kuna konteinerite vĂ”rguĂŒhenduse teema vÀÀrib eraldi artiklit. Allpool tuuakse mĂ”ned eriti sisukad ja Ă”petlikud avaldused.

Konteinerid samal hostil

Üks vĂ”imalus korraldada IP-aadresside kaudu suhtlemist konteinerite vahel, mis töötavad samal hostil, on Linuxi silla loomine. Selleks luuakse Kuberneteses (ja Dockeris) virtuaalsed seadmepaarid. veth (virtuaalne ethernet). Üks veth-seadmepaarist on ĂŒhendatud konteineri vĂ”rgu nimeruumi, teine aga Linuxi sillaga hosti vĂ”rgus.

KĂ”igil konteineritel ĂŒhel hostil on ĂŒks veth-paarist ĂŒhendatud sillaga, mille kaudu nad saavad ĂŒksteisega IP-aadresside kaudu suhelda. Linuxi sillal on samuti IP-aadress ja see toimib vĂ€ljuva (egress) liikluse vĂ€ravana pod'idest, mis on suunatud muudele sĂ”lmedele.

Kuidas pod Kuberneteses saab IP-aadressi

Konteinerid erinevates hostides

Pakettide kapseldamine on ĂŒks vĂ”imalus, mis vĂ”imaldab konteineritel erinevates sĂ”lmedes ĂŒksteisega IP-aadresside kaudu ĂŒhenduda. Flannelis vastutab selle vĂ”imaluse eest tehnoloogia vxlan, mis "kapseldab" lĂ€htepaketi UDP-paketti ja saadab selle sihtkohta.

Kubernetesi klastris loob Flannel vxlan seadme ja vastavalt tÀiendab marsruudi tabelit igas sÔlmes. Iga pakett, mis on suunatud konteinerile teisel hostil, lÀbib vxlan seadmest ja kapseldatakse UDP paketti. Sihtkohas eraldatakse sisemine pakett ja suunatakse Ôigele pod'ile.

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

Mis on CRI?

CRI (Container Runtime Interface) — on plugin, mis vĂ”imaldab kubelet’il kasutada erinevaid konteinerite kĂ€ituskeskkondi. CRI API on integreeritud erinevatesse kĂ€ituskeskkondadesse, seega saavad kasutajad valida oma soovile vastava runtime'i.

Mis on CNI?

CNI projekt esindab RTMP protokolli spetsifikatsiooni, mis sisaldas vigu ja ei olnud sisuliselt tÀielik. Sel ajal hakkasid arendajad meisterdama oma rakendusi selle protokolli jÀrgi, mille tulemusena ilmus server Wowza. 2011. aastal esitas Adobe Wowza vastu kohtuhagi RTMP-ga seotud patentide ebaseadusliku kasutamise tÔttu, kuid neli aastat hiljem lahendati konflikt rahumeelselt. pakub universaalset vÔrgu lahendust Linuxi konteineritele. Lisaks sisaldab see pluginate, mis vastutavad erinevate funktsioonide eest pod'i vÔrgu seadistamisel. CNI plugin on kÀivitatav fail, mis vastab spetsifikatsioonile (mÔned pluginaid kÀsitleme allpool).

SÔlmedele alamvÔrkude mÀÀramine pod'idele IP-aadresside mÀÀramiseks

Kuna iga pod klastris peab olema IP-aadress, on oluline tagada, et see aadress oleks ainulaadne. See saavutatakse, eraldades igale sÔlmele ainulaadse alamvÔrgu, millest antakse seejÀrel pod'idele selles sÔlmes IP-aadressid.

SÔlme IPAM kontroller

Kui nodeipam edastatakse lipu parameetrina --controllers kube-controller-manager'ile, eraldab ta igale sÔlmele eraldi alamvÔrgu (podCIDR) klastri CIDR-st (st. IP-aadresside vahemik klasstri vÔrgus). Kuna need podCIDR'id ei kattu, on vÔimalik igale pod'ile eraldada ainulaadne IP-aadress.

Kubernetes'i sÔlmele mÀÀratakse podCIDR selle algse registreerimise ajal klastris. Kui soovite muuta sÔlmede podCIDR'it, tuleb need deregistreerida ja seejÀrel uuesti registreerida, vahepeal tehes vastavad muudatused Kubernetes'i haldustaseme konfiguratsioonis. SÔlme podCIDR'i kuvamiseks vÔib kasutada jÀrgmist kÀsku:

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

Kubelet, konteinerite kÀituskeskkond ja CNI pistikprogrammid: kuidas see kÔik töötab

Pod’i planeerimine sĂ”lmele on seotud mitmete ettevalmistavate tegevustega. Selles osas keskendun ainult neile, mis on otseselt seotud pod’i vĂ”rgu seadistamisega.

Pod’i planeerimine mingile sĂ”lmele kĂ€ivitab jĂ€rgmise sĂŒndmuste ahela:

Kuidas pod Kuberneteses saab IP-aadressi

Abi: Containerdi CRI-pluginite arhitektuur.

Konteinerite kÀituskeskkonna ja CNI-pluginite koostöö

Igal vĂ”rgu pakkujal on oma CNI-plugin. Konteineri tööaeg kĂ€ivitab selle, et seadistada vĂ”rku pod’ile tema kĂ€ivitamise kĂ€igus. Containerdi puhul tegeleb CNI-pluginiga kĂ€ivitamine plugin Containerd CRI.

Igal pakkujal on oma agent. See installeeritakse kÔikidele Kubernetes'e sÔlmedele ja vastutab pod'ide vÔrgu seadistamise eest. See agent tuleb kas koos CNI konfiguraatoriga vÔi loob selle ise sÔlmel. Konfiguratsioon aitab CRI-pluginil mÀÀrata, millist CNI-pluginit kutsuda.

CNI konfiguratsiooni asukohta saab seadistada; vaikesÀtte kohaselt asub see /etc/cni/net.d/<config-file>. Klasteri administraatorid vastutavad ka CNI-pluginite installeerimise eest igale klasteri sÔlmele. Nende asukohta saab samuti seadistada; vaikekaust on /opt/cni/bin.

Containerd'i kasutamisel saab plugina seadistuse ja binaaride teed mÀÀrata rubriigis [plugins.«io.containerd.grpc.v1.cri».cni] ĂŒhes containerd'i konfiguratsioonifailis.

Kuna kasutame Flanneli vÔrgu pakkujana, rÀÀgime natuke selle seadistamisest:

  • Flanneld (Flanneli deemon) installitakse tavaliselt klastrisse kui DaemonSet install-cni kui alguskonteineris.
  • Install-cni loob CNI konfiguratsioonifaili (/etc/cni/net.d/10-flannel.conflist) iga sĂ”lme jaoks.
  • Flanneld loob vxlan seadmestiku, vĂ€ljavĂ”tab vĂ”rgu metaandmed API-serverist ja jĂ€lgib pod’ide uuendusi. Nende loomise ajal levitab ta marsruute kĂ”igis pod'ides kogu klastris.
  • Need marsruudid vĂ”imaldavad pod’idel ĂŒksteisega IP-aadresside kaudu suhelda.

Flanneli töö kohta tÀiendava teabe saamiseks soovitan uurida artikli lÔpu linke.

Siin on skeem Containerd CRI plugina ja CNI pluginatega suhtlemisest:

Kuidas pod Kuberneteses saab IP-aadressi

Nagu ĂŒlal nĂ€htud, kutsub kubelet Containerd CRI plugina, et luua pod, ja see omakorda kutsub CNI plugina pod'i vĂ”rgu seadistamiseks. Samuti kutsub vĂ”rgu pakkuja CNI-plugin teisi aluspinge CNI pluginaid, et seadistada erinevaid vĂ”rgu aspekte.

Suhtlemine CNI-pluginite vahel

Sa on erinevaid CNI mooduleid, mille ĂŒlesanne on aidata seadistada vĂ”rgusuhtlust konteinerite vahel hostis. KĂ€esolevas artiklis kĂ€sitleme kolme neist.

CNI moodul Flannel

Flannel'i kasutamisel vÔrgu pakkujana kutsub Containerd CRI komponent CNI moodul Flannel, kasutades CNI konfigureerimisfaili /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 moodul Flannel töötab koos Flanned'iga. Flanned'i kĂ€ivitamisel ekstraktsib see podCIDR-i ja teised vĂ”rguga seotud ĂŒksikasjad 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 moodul Flannel kasutab andmeid /run/flannel/subnet.env CNI silla (bridge) mooduli seadistamiseks ja kutsumiseks.

CNI moodul Bridge

Seda moodulit 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 ajal loob see Linuxi silla «name»: «cni0», mis on mÀÀratud konfiguratsioonis. SeejĂ€rel luuakse iga pod'i jaoks veth paar. Üks tema ots on ĂŒhendatud konteineri vĂ”rgunimede ruumi, teine siseneb Linuxi sillasse hosti vĂ”rgus. CNI moodul Bridge ĂŒhendab kĂ”ik hosti konteinerid Linuxi sillaga hosti vĂ”rgus.

PĂ€rast veth paari seadistamist kutsub Bridge plugin kohalikku (host-local) CNI-plugina IPAM. IPAM-plugina tĂŒĂŒbi saab integreerida CNI seadistusse, mida CRI plugin kasutab CNI-plugin Flanneli kutsumiseks.

Kohalikud hosti IPAM-plugid CNI

Sild CNI kutsub host-local IPAM-plugina CNI jÀrgneva 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 eraldatud IP hostis mÀÀratud katalooge juurde dataDir — /var/lib/cni/networks/<network-name=cni0>/<ip>. Failis sisalduvad konteineri ID, kellele antud IP-aadress on mÀÀratud.

Kohaliku IPAM-plugina kutsel tagastab see jÀrgmised andmed:

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

KokkuvÔte

Kube-controller-manager mÀÀrab igale sĂ”lmele podCIDR. Iga sĂ”lme pod'id saavad IP-aadresse mÀÀratud vahemikus podCIDR. Kuna sĂ”lmede podCIDR-id ei ĂŒhti, saavad kĂ”ik pod'id unikaalsed IP-aadressid.

Kubernetesi klastrihaldur seadistab ja installib kubeleti, konteinerite kÀituskeskkonna, vÔrguoperaatori agendi ning kopeerib CNI pluginad igasse sÔlme. KÀivitamise ajal genereerib vÔrguoperaatori agent CNI konfigureerimise. Kui pod planeeritakse sÔlme, kutsub kubelet esile CRI plugin, et see luua. Edasi, kui kasutatakse containerd'd, kutsub Containerd CRI plugin vÀlja CNI plugina, mis on mÀÀratud CNI konfigureerimises, et seadistada pod'i vÔrk. Tulemusena saab pod oma IP-aadressi.

Mul lĂ€ks natuke aega, et mĂ”ista kĂ”iki neid interaktsioone ja nende nĂŒansse. Loodan, et saadud kogemus aitab ka teil paremini mĂ”ista, kuidas Kubernetes töötab. Kui ma olen millegagi vale, palun vĂ”tke minuga ĂŒhendust Twitter vĂ”i aadressil hello@ronaknathani.com. Ärge kartke ĂŒhendust vĂ”tta, kui soovite arutada selle artikli aspekte vĂ”i midagi muud. Mul on hea meel teiega suhelda!

Lingid

Konteinerid ja vÔrk

Kuidas Flannel töötab

CRI ja CNI

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster