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 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 vĂ”rgu korraldamiseks klastris ning kĂ€ituskeskkonnana kasutatakse . 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. . Ăks veth-seadmepaarist on ĂŒhendatud konteineri vĂ”rgu nimeruumi, teine aga 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.

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 , 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.

MĂ€rkus: See on vaid ĂŒks viis konteinerite vahelise vĂ”rguĂŒhenduse korraldamiseks.
Mis on CRI?
â 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?
esindab pakub universaalset vÔrgu lahendust Linuxi konteineritele. Lisaks sisaldab see , 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 , 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:

Abi: .
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 .
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 .
Kuna kasutame Flanneli vÔrgu pakkujana, rÀÀgime natuke selle seadistamisest:
- Flanneld (Flanneli deemon) installitakse tavaliselt klastrisse kui DaemonSet
install-cnikui . Install-cniloob (/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:

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 , 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. ĂŒ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 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 vĂ”i aadressil . Ă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:
- «»;
- âIllustreeritud juhend Kuberneteses olevate vĂ”rkude seadistamiseksâ: , ;
- «».
Allikas: habr.com
