Kuidas saab Kubernetes pod IP-aadressi?

Märge. tõlge: See artikkel, mille on kirjutanud LinkedIni SRE insener, käsitleb üksikasjalikult Kubernetese sisemist maagiat - täpsemalt CRI, CNI ja kube-apiserveri koostoimet -, mis juhtub siis, kui järgmisele podile on vaja määrata IP-aadress.

Üks põhinõuetest Kubernetese võrgumudel on see, et igal podil peab olema oma IP-aadress ja mis tahes muul klastris oleval podil peab olema võimalik sellega sellel aadressil ühendust võtta. Võrgu „pakkujaid” (Flannel, Calico, Canal jne) on palju, mis aitavad seda võrgumudelit rakendada.

Kui ma Kubernetesega esimest korda koostööd alustasin, ei olnud mulle täiesti selge, kuidas kaunad täpselt oma IP-aadressid saavad. Isegi üksikute komponentide toimimise mõistmisel oli raske ette kujutada, et need koos töötaksid. Näiteks teadsin, milleks CNI-pluginad on mõeldud, aga mul polnud õrna aimugi, kuidas neid täpselt nimetatakse. Seetõttu otsustasin kirjutada selle artikli, et jagada teadmisi erinevate võrgukomponentide ja nende koostöö kohta Kubernetese klastris, mis võimaldab igal podil saada oma ainulaadse IP-aadressi.

Võrgustiku korraldamiseks Kubernetesis on erinevaid viise, nagu ka konteinerite jaoks on erinevad käitusaja valikud. See väljaanne kasutab Flanell võrgu korraldamiseks klastris ja käivitatava keskkonnana - Konteiner. Samuti eeldan, et teate, kuidas konteineritevaheline võrgustik toimib, nii et ma puudutan seda lühidalt, konteksti huvides.

Mõned põhimõisted

Konteinerid ja võrk: lühike ülevaade

Internetis on palju suurepäraseid väljaandeid, mis selgitavad, kuidas konteinerid omavahel võrgu kaudu suhtlevad. Seetõttu annan ainult üldise ülevaate põhikontseptsioonidest ja piirdun ühe lähenemisega, milleks on Linuxi silla loomine ja pakettide kapseldamine. Üksikasjad on välja jäetud, kuna konteinerite võrgustamise teema väärib eraldi artiklit. Allpool on toodud lingid mõnele eriti põhjalikule ja harivale väljaandele.

Konteinerid ühel hostil

Üks viis IP-aadresside kaudu suhtluse korraldamiseks samas hostis töötavate konteinerite vahel on Linuxi silla loomine. Sel eesmärgil luuakse Kubernetesis (ja Dockeris) virtuaalsed seadmed veth (virtuaalne Ethernet). Veth-seadme üks ots ühendub konteineri võrgu nimeruumiga, teine ​​aga Linuxi sild hostvõrgus.

Kõigil sama hosti konteineritel on üks ots ühendatud sillaga, mille kaudu nad saavad omavahel IP-aadresside kaudu suhelda. Linuxi sillal on ka IP-aadress ja see toimib lüüsina teistele sõlmedele mõeldud kaunadest väljuvale liiklusele.

Kuidas saab Kubernetes pod IP-aadressi?

Konteinerid erinevatel hostidel

Pakettkapseldamine on üks meetod, mis võimaldab erinevatel sõlmedel asuvatel konteineritel omavahel IP-aadresse kasutades suhelda. Flannelis vastutab selle võimaluse eest tehnoloogia. vxlan, mis "pakib" algse paketi UDP-paketti ja saadab selle seejärel sihtkohta.

Kubernetese klastris loob Flannel vxlani seadme ja värskendab vastavalt iga sõlme marsruudi tabelit. Iga erineva hosti konteineri jaoks mõeldud pakett läbib vxlani seadet ja kapseldatakse UDP-paketti. Sihtkohas ekstraheeritakse pesastatud pakett ja edastatakse soovitud kausta.

Kuidas saab Kubernetes pod IP-aadressi?
Märkus. See on vaid üks võimalus konteineritevahelise võrgusuhtluse korraldamiseks.

Mis on CRI?

CRI (konteineri käitusaegne liides) on plugin, mis võimaldab kubeletil kasutada erinevaid konteineri käituskeskkondi. CRI API on sisseehitatud erinevatesse käitusaegadesse, nii et kasutajad saavad ise valida käitusaja.

Mis on CNI?

Projekt CNI on a spetsifikatsioon Linuxi konteinerite universaalse võrgulahenduse korraldamiseks. Lisaks sisaldab see pistikprogrammid, vastutab erinevate funktsioonide eest pod-võrgu seadistamisel. CNI pistikprogramm on spetsifikatsioonile vastav käivitatav fail (mõned pistikprogrammid käsitleme allpool).

Alamvõrkude eraldamine sõlmedele IP-aadresside määramiseks kaustadele

Kuna igal klastri kaustal peab olema IP-aadress, on oluline tagada, et see aadress oleks kordumatu. See saavutatakse, määrates igale sõlmele unikaalse alamvõrgu, millest seejärel määratakse selle sõlme kaustadele IP-aadressid.

Sõlme IPAM-kontroller

Millal nodeipam anti lipuparameetrina --controllers kube-kontroller-haldur, eraldab see klastri CIDR igale sõlmele eraldi alamvõrgu (podCIDR) (st klastri võrgu IP-aadresside vahemik). Kuna need podCIDR-id ei kattu, on võimalik, et igale podile määratakse kordumatu IP-aadress.

Kubernetese sõlmele määratakse podCIDR, kui see on algselt klastris registreeritud. Sõlmede podCIDR-i muutmiseks peate need tühistama ja seejärel uuesti registreerima, tehes vahepeal Kubernetese juhtkihi konfiguratsioonis asjakohaseid muudatusi. Saate kuvada sõlme podCIDR-i, kasutades järgmist käsku:

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

Kubelet, konteineri käitusaeg ja CNI pistikprogrammid: kuidas see kõik töötab

Podi ajastamine sõlme kohta hõlmab palju ettevalmistavaid samme. Selles jaotises keskendun ainult neile, mis on otseselt seotud pod-võrgu seadistamisega.

Podi ajastamine teatud sõlmele käivitab järgmise sündmuste ahela:

Kuidas saab Kubernetes pod IP-aadressi?

FAQ: Containerd CRI pistikprogrammide arhitektuur.

Koostoime konteineri käitusaja ja CNI pistikprogrammide vahel

Igal võrguteenuse pakkujal on oma CNI pistikprogramm. Konteineri käitusaeg käivitab selle, et konfigureerida võrku podi jaoks selle käivitumisel. Konteineri puhul käivitab CNI pistikprogrammi pistikprogramm Konteiner CRI.

Lisaks on igal pakkujal oma agent. See on installitud kõikidesse Kubernetese sõlmedesse ja vastutab kaunade võrgukonfiguratsiooni eest. See agent on kas kaasas CNI konfiguratsiooniga või loob selle iseseisvalt sõlmes. Konfiguratsioon aitab CRI pistikprogrammil määrata, millist CNI pistikprogrammi helistada.

CNI konfiguratsiooni asukohta saab kohandada; vaikimisi on see sees /etc/cni/net.d/<config-file>. Klastri administraatorid vastutavad ka CNI pistikprogrammide installimise eest igasse klastri sõlme. Nende asukoht on samuti kohandatav; vaikekataloog - /opt/cni/bin.

Konteineri kasutamisel saab jaotises määrata plugina konfiguratsiooni ja binaarfailide teed [plugins.«io.containerd.grpc.v1.cri».cni] в konteinerite konfiguratsioonifail.

Kuna kasutame oma võrguteenuse pakkujana Flannelit, räägime veidi selle seadistamisest:

  • Flaneld (Flanneli deemon) paigaldatakse tavaliselt klastrisse DaemonSetina koos install-cni kui init konteiner.
  • Install-cni loob CNI konfiguratsioonifail (/etc/cni/net.d/10-flannel.conflist) igal sõlmel.
  • Flaneld loob vxlani seadme, hangib API serverist võrgu metaandmed ja jälgib podi värskendusi. Nende loomisel jaotab see marsruudid kõikidele kaunadele kogu klastris.
  • Need marsruudid võimaldavad kaunadel üksteisega IP-aadresside kaudu suhelda.

Täpsema teabe saamiseks Flanelli töö kohta soovitan kasutada artikli lõpus olevaid linke.

Siin on diagramm Containerd CRI pistikprogrammi ja CNI pistikprogrammide vahelisest koostoimest:

Kuidas saab Kubernetes pod IP-aadressi?

Nagu ülalt näha, kutsub kubelet pod loomiseks Containerd CRI pistikprogrammi, mis seejärel CNI pistikprogrammi, et konfigureerida podi võrk. Seejuures kutsub võrgupakkuja CNI pistikprogramm teisi põhilisi CNI pistikprogramme, et konfigureerida võrgu erinevaid aspekte.

Interaktsioon CNI-pluginate vahel

On erinevaid CNI-pluginaid, mille ülesanne on aidata luua võrguühendust hosti konteinerite vahel. Selles artiklis käsitletakse neist kolme.

CNI pistikprogramm Flanell

Flanneli kasutamisel võrguteenuse pakkujana helistab Containerd CRI komponent CNI pistikprogramm Flanellkasutades 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
      }
    }
  ]
}

Flannel CNI pistikprogramm töötab koos Flaneldiga. Käivitamise ajal hangib Flaneld API serverist podCIDR-i ja muud võrguga seotud üksikasjad 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

Flannel CNI pistikprogramm kasutab andmeid alates /run/flannel/subnet.env CNI silla plugina konfigureerimiseks ja kutsumiseks.

CNI pistikprogramm 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"
  }
}

Esmakordsel kutsumisel loob see Linuxi silla «name»: «cni0», mis on näidatud konfiguratsioonis. Seejärel luuakse iga kauna jaoks vethipaar. Selle üks ots on ühendatud konteineri võrgu nimeruumiga, teine ​​​​on lisatud hostvõrgu Linuxi silda. CNI pistikprogramm Bridge ühendab kõik hostikonteinerid hostvõrgu Linuxi sillaga.

Pärast veth-paari seadistamist kutsub Bridge plugin hosti kohaliku IPAM CNI pistikprogrammi. IPAM-i pistikprogrammi tüüpi saab konfigureerida CNI-konfiguratsioonis, mida CRI-plugin kasutab Flannel CNI-plugina kutsumiseks.

Hosti-kohalikud IPAM-i CNI-pluginad

Sild CNI kõned hosti kohalik IPAM-i pistikprogramm CNI järgmise konfiguratsiooniga:

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

Hosti-kohalik IPAM-i pistikprogramm (IP Address Management – ​​IP-aadressi haldus) tagastab konteineri IP-aadressi alamvõrgust ja salvestab hostile eraldatud IP jaotises määratud kataloogi dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. See fail sisaldab konteineri ID-d, millele see IP-aadress on määratud.

Hosti kohaliku IPAM-i pistikprogrammi helistamisel 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-i. Iga sõlme kaustad saavad eraldatud podCIDR-i vahemikus olevast aadressiruumist IP-aadressid. Kuna sõlmede podCIDR-id ei kattu, saavad kõik kaustad kordumatud IP-aadressid.

Kubernetese klastri administraator konfigureerib ja installib kubeleti, konteineri käitusaja, võrgupakkuja agendi ning kopeerib CNI pistikprogrammid igasse sõlme. Käivitamise ajal loob võrgupakkuja agent CNI konfiguratsiooni. Kui pod on ajastatud sõlme, kutsub kubelet selle loomiseks CRI pistikprogrammi. Järgmiseks, kui konteinerit kasutatakse, kutsub Containerd CRI pistikprogramm CNI konfiguratsioonis määratud CNI pistikprogrammi, et konfigureerida podi võrk. Selle tulemusena saab pod IP-aadressi.

Mul kulus veidi aega, et mõista kõigi nende koostoimete peensusi ja nüansse. Loodan, et see kogemus aitab teil paremini mõista, kuidas Kubernetes töötab. Kui ma milleski eksin, võtke minuga ühendust aadressil puperdama või aadressil [meiliga kaitstud]. Võtke julgelt ühendust, kui soovite arutada selle artikli aspekte või midagi muud. Mulle meeldiks teiega vestelda!

Viited

Konteinerid ja võrk

Kuidas flanell toimib?

CRI ja CNI

PS tõlkijalt

Loe ka meie blogist:

Allikas: www.habr.com

Lisa kommentaar