Kako pod u Kubernetesu dobija IP adresu

Bilješka. transl.: Ovaj članak, koji je napisao SRE inženjer na LinkedIn-u, opisuje „unutrašnju magiju“ u Kubernetesu – tačnije, interakciju CRI, CNI i kube-apiservera – šta se dešava kada sledećem pod-u treba da bude dodeljena IP adresa.

Jedan od osnovnih zahtjeva Kubernetes mrežni model je da svaki pod mora imati svoju IP adresu i bilo koji drugi pod u klasteru mora biti u mogućnosti da ga kontaktira na toj adresi. Postoje mnogi mrežni "provajderi" (Flannel, Calico, Canal, itd.) koji pomažu u implementaciji ovog mrežnog modela.

Kada sam prvi put počeo da radim sa Kubernetesom, nije mi bilo sasvim jasno kako tačno podovi dobijaju svoje IP adrese. Čak i uz razumijevanje kako pojedine komponente funkcionišu, bilo je teško zamisliti da rade zajedno. Na primjer, znao sam čemu služe CNI dodaci, ali nisam imao pojma kako se tačno zovu. Stoga sam odlučio da napišem ovaj članak kako bih podijelio znanje o različitim mrežnim komponentama i kako one rade zajedno u Kubernetes klasteru, koji omogućava svakom modulu da dobije svoju jedinstvenu IP adresu.

Postoje različiti načini za organizaciju umrežavanja u Kubernetesu – baš kao i različite opcije vremena izvođenja za kontejnere. Ovaj post će koristiti Flannel za umrežavanje u klasteru i kao izvršno okruženje - Containerd. Pretpostavljam i da znate kako funkcionira umrežavanje između kontejnera, pa ću se samo ukratko dotaknuti, čisto iz konteksta.

Neki osnovni koncepti

Kontejneri i umrežavanje na prvi pogled

Postoji dosta odličnih postova na webu koji objašnjavaju kako kontejneri komuniciraju jedni s drugima preko mreže. Stoga ću dati samo opći pregled osnovnih koncepata i ograničiti se na jedan pristup, koji uključuje kreiranje Linux mosta i inkapsuliranje paketa. Detalji su izostavljeni, jer sama tema o umrežavanju kontejnera zaslužuje poseban članak. Linkovi do nekih posebno informativnih i informativnih publikacija će biti navedeni u nastavku.

Kontejneri na istom hostu

Jedan od načina da se organizira komunikacija IP adresa između kontejnera koji rade na istom hostu uključuje kreiranje Linux mosta. Da bi to uradili, Kubernetes (i Docker) kreiraju virtuelne uređaje veth (virtuelni ethernet). Jedan kraj veth uređaja povezuje se sa mrežnim prostorom imena kontejnera, a drugi kraj se povezuje na Linux most na host mreži.

Svi kontejneri na istom hostu imaju jedan kraj veth-a povezan na most preko kojeg mogu međusobno komunicirati putem IP adresa. Linux most također ima IP adresu i djeluje kao gateway za odlazni (izlazni) promet iz podova namijenjenih drugim čvorovima.

Kako pod u Kubernetesu dobija IP adresu

Kontejneri na različitim hostovima

Enkapsulacija paketa je jedan od načina na koji kontejneri na različitim hostovima mogu međusobno komunicirati koristeći IP adrese. U kompaniji Flannel, tehnologija je ono što to čini mogućim. vxlan, koji "pakuje" izvorni paket u UDP paket i zatim ga šalje na odredište.

U Kubernetes klasteru, Flannel kreira vxlan uređaj i u skladu s tim ažurira tabelu ruta na svakom čvoru. Svaki paket namijenjen kontejneru na drugom hostu prolazi kroz vxlan uređaj i inkapsuliran je u UDP paket. Na odredištu, ugniježđeni paket se preuzima i preusmjerava na ispravan pod.

Kako pod u Kubernetesu dobija IP adresu
Napomena: Ovo je samo jedan od načina za organiziranje umrežavanja između kontejnera.

Šta je CRI?

CRI (sučelje za vrijeme rada kontejnera) je dodatak koji omogućava kubeletu da koristi različita vremena izvođenja kontejnera. CRI API je ugrađen u različita vremena izvođenja tako da korisnici mogu odabrati vrijeme izvođenja koje žele.

Šta je CNI?

CNI projekat je a specifikacija organizirati univerzalno mrežno rješenje za Linux kontejnere. Osim toga, uključuje dodaci, koji su odgovorni za različite funkcije prilikom postavljanja mreže pod. CNI dodatak je izvršna datoteka koja je u skladu sa specifikacijom (o nekim od dodataka ćemo raspravljati u nastavku).

Podmreže hostova za dodjelu IP adresa podovima

Budući da svaki pod u klasteru mora imati IP adresu, važno je osigurati da je ova adresa jedinstvena. Ovo se postiže dodjeljivanjem svakom čvoru jedinstvene podmreže, iz koje se podovima na tom čvoru zatim dodjeljuju IP adrese.

IPAM kontroler čvora

Kada nodeipam proslijeđen kao parametar zastavice --controllers kube-kontroler-menadžer, dodjeljuje svakom čvoru zasebnu podmrežu (podCIDR) iz CIDR klastera (tj. raspon IP adresa za mrežu klastera). Pošto se ovi podCIDR-ovi ne preklapaju, postaje moguće da se svakom pod-u dodeli jedinstvena IP adresa.

Kubernetes čvoru se dodjeljuje podCIDR kada se prvi put registruje u klasteru. Da biste promijenili podCIDR čvorova, morate ih odjaviti, a zatim ponovo registrirati, praveći odgovarajuće promjene u konfiguraciji Kubernetes kontrolnog sloja između. PodCIDR čvora možete prikazati sljedećom naredbom:

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

Kubelet, runtime kontejnera i CNI dodaci: kako sve to funkcionira

Planiranje pod do čvora uključuje puno pripremnog rada. U ovom odeljku, fokusiraću se samo na one koji su direktno povezani sa postavljanjem mreže pod.

Zakazivanje pod za čvor pokreće sljedeći lanac događaja:

Kako pod u Kubernetesu dobija IP adresu

Pomoć: Containerd CRI Plugin Architecture.

Interakcija između vremena izvođenja kontejnera i CNI dodataka

Svaki mrežni provajder ima svoj CNI dodatak. Vrijeme izvođenja kontejnera ga pokreće da konfigurira mrežu za pod kada se pokrene. U slučaju kontejnera, CNI dodatak pokreće dodatak Containerd C.R.I..

Štaviše, svaki provajder ima svog agenta. Instaliran je u sve Kubernetes čvorove i odgovoran je za mrežnu konfiguraciju podova. Ovaj agent ili dolazi u paketu sa CNI konfiguracijom ili ga kreira na samom čvoru. Konfiguracija pomaže CRI dodatku da odredi koji će CNI dodatak pozvati.

Lokacija CNI konfiguracije može se konfigurirati; podrazumevano je u /etc/cni/net.d/<config-file>. Administratori klastera su također odgovorni za instaliranje CNI dodataka na svaki čvor klastera. Njihova lokacija je također podesiva; zadani direktorij - /opt/cni/bin.

Kada koristite containerd, staze za binarne konfiguracije i dodatke mogu se postaviti u odjeljku [plugins.«io.containerd.grpc.v1.cri».cni] в konfiguracijski fajl kontejnera.

Pošto koristimo Flannel kao našeg mrežnog provajdera, hajde da pričamo malo o njegovom postavljanju:

  • Flanneld (Flannelov daemon) se obično instalira u klaster kao DaemonSet sa install-cni kao init kontejner.
  • Install-cni stvara CNI konfiguracijski fajl (/etc/cni/net.d/10-flannel.conflist) na svakom čvoru.
  • Flanneld kreira vxlan uređaj, preuzima mrežne metapodatke sa API servera i prati ažuriranja pod. Kako se kreiraju, propagira rute do svih podova u cijelom klasteru.
  • Ove rute omogućavaju podovima da međusobno komuniciraju putem IP adresa.

Za više informacija o radu Flannel-a preporučujem korištenje linkova na kraju članka.

Evo dijagrama interakcije između dodatka Containerd CRI i dodataka CNI:

Kako pod u Kubernetesu dobija IP adresu

Kao što se vidi gore, kubelet poziva Containerd CRI dodatak za kreiranje pod, koji već poziva CNI dodatak za postavljanje mreže pod. U ovom slučaju, CNI dodatak mrežnog provajdera poziva druge osnovne CNI dodatke za konfiguraciju različitih aspekata mreže.

Interakcija između CNI dodataka

Postoje različiti CNI dodaci, čiji je zadatak da pomognu u postavljanju mrežne komunikacije između kontejnera na hostu. Ovaj članak će raspravljati o tri od njih.

Flannel CNI dodatak

Kada koristite Flannel kao mrežnog provajdera, komponenta Containerd CRI poziva Flannel CNI dodatak, koristeći CNI konfiguracioni fajl /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 dodatak radi u sprezi sa Flanneldom. Tokom pokretanja, Flanneld preuzima podCIDR i druge detalje vezane za mrežu sa API servera i sprema ih u datoteku. /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 dodatak koristi podatke iz /run/flannel/subnet.env da konfigurišete i pozovete bridge CNI dodatak.

Bridge CNI dodatak

Ovaj dodatak se poziva sa sljedećom konfiguracijom:

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

Prvi put kada se pozove, kreira Linux most sa «name»: «cni0», što je navedeno u konfiguraciji. Zatim se kreira veth par za svaku mahunu. Jedan kraj se povezuje na mrežni imenski prostor kontejnera, drugi kraj se povezuje na Linux most na mreži hosta. Bridge CNI dodatak povezuje sve host kontejnere na Linux most na host mreži.

Kada je veth par konfigurisan, Bridge dodatak poziva lokalni IPAM CNI dodatak. Tip IPAM dodatka može se konfigurirati u CNI konfiguraciji koju CRI dodatak koristi za pozivanje Flannel CNI dodatka.

Host-Local IPAM CNI dodaci

Premosti CNI pozive Host-local IPAM CNI dodatak sa sljedećom konfiguracijom:

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

Lokalni IPAM dodatak (IP Address Mupravljanje - upravljanje IP adresama) vraća IP adresu za kontejner iz podmreže i pohranjuje dodijeljenu IP adresu na hostu u direktorij naveden u odjeljku dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ovaj fajl sadrži ID kontejnera kojem je dodeljena data IP adresa.

Prilikom pozivanja lokalnog IPAM dodatka, on vraća sljedeće podatke:

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

Rezime

Kube-controller-manager dodjeljuje podCIDR svakom čvoru. Podovi svakog čvora dobijaju IP adrese iz adresnog prostora u dodijeljenom podCIDR opsegu. Pošto se podCIDR-ovi čvorova ne preklapaju, svi podovi dobijaju jedinstvene IP adrese.

Administrator Kubernetes klastera konfiguriše i instalira kubelet, runtime kontejnera, agenta mrežnog provajdera i kopira CNI dodatke na svaki čvor. Tokom pokretanja, agent mrežnog provajdera generiše CNI konfiguraciju. Kada je pod zakazan za čvor, kubelet poziva CRI dodatak da ga kreira. Zatim, ako se koristi containerd, dodatak Containerd CRI poziva CNI dodatak naveden u CNI konfiguraciji za postavljanje mreže pod. Kao rezultat, pod dobija IP adresu.

Trebalo mi je neko vrijeme da shvatim sve suptilnosti i nijanse svih ovih interakcija. Nadam se da će vam stečeno iskustvo pomoći da bolje razumete kako Kubernetes funkcioniše. Ako griješim u bilo čemu, kontaktirajte me na cvrkut ili na adresi [email zaštićen]. Slobodno se obratite ako želite razgovarati o aspektima ovog članka ili bilo čemu drugom. Rado ću razgovarati s vama!

reference

Kontejneri i mreža

Kako radi flanel

CRI i CNI

PS od prevodioca

Pročitajte i na našem blogu:

izvor: www.habr.com

Dodajte komentar