Kako pod u Kubernetesu dobiva IP adresu

Bilješka. prev.: Ovaj članak, koji je napisao SRE inženjer iz LinkedIna, ide u detalje o unutarnjoj magiji u Kubernetesu - točnije, interakciji CRI, CNI i kube-apiservera - koja se događa kada se sljedećem modulu treba dodijeliti IP adresa.

Jedan od osnovnih zahtjeva Kubernetes mrežni model je da svaki pod mora imati vlastitu IP adresu i bilo koji drugi pod u klasteru mora biti u mogućnosti kontaktirati ga na toj adresi. Postoje mnogi mrežni "pružatelji" (Flannel, Calico, Canal, itd.) koji pomažu implementirati ovaj mrežni model.

Kad sam tek počeo raditi s Kubernetesom, nije mi bilo posve jasno kako točno podovi dobivaju svoje IP adrese. Čak i uz razumijevanje načina na koji pojedinačne komponente funkcioniraju, bilo je teško zamisliti da rade zajedno. Na primjer, znao sam čemu služe CNI dodaci, ali nisam imao pojma kako se točno zovu. Stoga sam odlučio napisati ovaj članak kako bih podijelio znanje o različitim mrežnim komponentama i načinu na koji one rade zajedno u Kubernetes klasteru, što svakom modulu omogućuje da dobije vlastitu jedinstvenu IP adresu.

Postoje različiti načini organiziranja umrežavanja u Kubernetesu, baš kao što postoje različite mogućnosti izvođenja za spremnike. Ova će publikacija koristiti Flanel organizirati mrežu u klasteru i kao izvršno okruženje - Kontejner. Također pretpostavljam da znate kako funkcionira umrežavanje između spremnika, pa ću se toga samo ukratko dotaknuti, samo radi konteksta.

Neki osnovni pojmovi

Kontejneri i mreža: Kratki pregled

Na internetu postoji mnogo izvrsnih publikacija koje objašnjavaju kako spremnici međusobno komuniciraju preko mreže. Stoga ću dati samo opći pregled osnovnih koncepata i ograničiti se na jedan pristup, koji uključuje stvaranje Linux mosta i enkapsulaciju paketa. Detalji su izostavljeni, budući da sama tema umrežavanja kontejnera zaslužuje poseban članak. Veze na neke posebno pronicljive i obrazovne publikacije bit će navedene u nastavku.

Kontejneri na jednom hostu

Jedan od načina organiziranja komunikacije putem IP adresa između spremnika koji rade na istom hostu uključuje stvaranje Linux mosta. U tu svrhu kreiraju se virtualni uređaji u Kubernetesu (i Dockeru) veth (virtualni ethernet). Jedan kraj veth uređaja povezuje se s mrežnim imenskim prostorom spremnika, a drugi s Linux most na glavnoj mreži.

Svi spremnici na istom hostu imaju jedan kraj veth-a spojen na most preko kojeg mogu međusobno komunicirati putem IP adresa. Linux most također ima IP adresu i djeluje kao pristupnik za izlazni promet iz modula namijenjen drugim čvorovima.

Kako pod u Kubernetesu dobiva IP adresu

Kontejneri na različitim hostovima

Enkapsulacija paketa jedna je od metoda koja omogućuje spremnicima na različitim čvorovima da međusobno komuniciraju pomoću IP adresa. U Flannelu je tehnologija zaslužna za ovu priliku. vxlan, koji "pakira" originalni paket u UDP paket i zatim ga šalje na odredište.

U Kubernetes klasteru, Flannel stvara vxlan uređaj i u skladu s tim ažurira tablicu rute na svakom čvoru. Svaki paket namijenjen spremniku na drugom hostu prolazi kroz vxlan uređaj i enkapsuliran je u UDP paket. Na odredištu se ugniježđeni paket izdvaja i prosljeđuje željenom modulu.

Kako pod u Kubernetesu dobiva IP adresu
Napomena: Ovo je samo jedan način organiziranja mrežne komunikacije između spremnika.

Što je CRI?

CRI (Container Runtime Interface) je dodatak koji kubeletu omogućuje korištenje različitih okruženja za izvođenje spremnika. CRI API je ugrađen u različita runtimea, tako da korisnici mogu odabrati runtime po svom izboru.

Što je CNI?

Projekt CNI je a specifikacija organizirati univerzalno mrežno rješenje za Linux spremnike. Osim toga, uključuje dodaci, odgovoran za razne funkcije pri postavljanju mreže pod. CNI dodatak je izvršna datoteka koja je u skladu sa specifikacijom (o nekim dodacima ćemo govoriti u nastavku).

Dodjela podmreža čvorovima za dodjelu IP adresa podovima

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

Čvor IPAM kontroler

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

Kubernetes čvoru se dodjeljuje podCIDR kada se inicijalno registrira u klasteru. Da biste promijenili podCIDR čvorova, morate ih deregistrirati i zatim ponovno registrirati, uvodeći odgovarajuće izmjene u konfiguraciju kontrolnog sloja Kubernetes između. Možete prikazati podCIDR čvora pomoću sljedeće naredbe:

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

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

Zakazivanje grupe po čvoru uključuje mnogo pripremnih koraka. U ovom odjeljku usredotočit ću se samo na one koji su izravno povezani s postavljanjem pod mreže.

Zakazivanje pod-a na određeni čvor pokreće sljedeći lanac događaja:

Kako pod u Kubernetesu dobiva IP adresu

Pomoć: Arhitektura Containerd CRI dodataka.

Interakcija između runtime spremnika i CNI dodataka

Svaki pružatelj mrežnih usluga ima svoj vlastiti CNI dodatak. Vrijeme izvođenja spremnika pokreće ga za konfiguriranje mreže za pod prilikom pokretanja. U slučaju kontejnera, CNI dodatak pokreće dodatak Kontejner CRI.

Štoviše, svaki pružatelj usluga ima svog agenta. Instaliran je na svim Kubernetes čvorovima i odgovoran je za mrežnu konfiguraciju podova. Ovaj je agent uključen u konfiguraciju CNI-ja ili ga samostalno stvara na čvoru. Konfiguracija pomaže CRI dodatku postaviti koji će CNI dodatak pozvati.

Lokacija CNI konfiguracije može se prilagoditi; prema zadanim postavkama je in /etc/cni/net.d/<config-file>. Administratori klastera također su odgovorni za instaliranje CNI dodataka na svakom čvoru klastera. Njihov položaj također je prilagodljiv; zadani imenik - /opt/cni/bin.

Kada koristite spremnik, staze za konfiguraciju dodatka i binarne datoteke mogu se postaviti u odjeljku [plugins.«io.containerd.grpc.v1.cri».cni] в konfiguracijska datoteka spremnika.

Budući da koristimo Flannel kao svog mrežnog davatelja usluga, razgovarajmo malo o njegovom postavljanju:

  • Flanneld (Flannelov demon) obično se instalira u klaster kao DaemonSet s install-cni kao init spremnik.
  • Install-cni stvara CNI konfiguracijska datoteka (/etc/cni/net.d/10-flannel.conflist) na svakom čvoru.
  • Flanneld stvara vxlan uređaj, dohvaća mrežne metapodatke s API poslužitelja i prati ažuriranja modula. Kako se stvaraju, distribuira rute svim podovima u cijelom klasteru.
  • Ove rute omogućuju podovima da međusobno komuniciraju putem IP adresa.

Za detaljnije informacije o radu Flannel preporučujem korištenje poveznica na kraju članka.

Ovdje je dijagram interakcije između dodatka Containerd CRI i dodataka CNI:

Kako pod u Kubernetesu dobiva IP adresu

Kao što možete vidjeti gore, kubelet poziva Containerd CRI plugin za stvaranje modula, koji zatim poziva CNI dodatak za konfiguraciju mreže modula. Pritom CNI dodatak mrežnog davatelja poziva druge osnovne CNI dodatke za konfiguriranje različitih aspekata mreže.

Interakcija između CNI dodataka

Postoje različiti CNI dodaci čiji je zadatak pomoći u postavljanju mrežne komunikacije između spremnika na hostu. U ovom ćemo članku raspravljati o tri od njih.

CNI dodatak Flannel

Kada koristite Flannel kao mrežnog pružatelja usluga, komponenta Container CRI poziva CNI dodatak Flannelpomoću CNI konfiguracijske datoteke /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
      }
    }
  ]
}

Dodatak Flannel CNI radi zajedno s Flanneldom. Tijekom pokretanja, Flanneld dohvaća podCIDR i druge detalje povezane s mrežom s API poslužitelja 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

Dodatak Flannel CNI koristi podatke iz /run/flannel/subnet.env za konfiguriranje i pozivanje dodatka za CNI most.

CNI dodatak Bridge

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

Kada se pozove prvi put, stvara Linux most s «name»: «cni0», što je naznačeno u konfiguraciji. Zatim se stvara veth par za svaku mahunu. Jedan njegov kraj povezan je s prostorom naziva mreže spremnika, a drugi je uključen u Linux most na glavnoj mreži. CNI dodatak Bridge povezuje sve host spremnike na Linux most na host mreži.

Po završetku postavljanja veth para, dodatak Bridge poziva IPAM CNI dodatak lokalnog računala. Vrsta IPAM dodatka može se konfigurirati u CNI konfiguraciji koju CRI dodatak koristi za pozivanje Flannel CNI dodatka.

Host-lokalni IPAM CNI dodaci

Premostite CNI pozive host-lokalni IPAM dodatak CNI sa sljedećom konfiguracijom:

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

Host-lokalni IPAM dodatak (IP Address Mupravljanje - upravljanje IP adresama) vraća IP adresu za spremnik iz podmreže i pohranjuje dodijeljeni IP na glavnom računalu u direktoriju navedenom u odjeljku dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ova datoteka sadrži ID spremnika kojem je dodijeljena ova 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 primaju IP adrese iz adresnog prostora u dodijeljenom podCIDR rasponu. Budući da se podCIDR-ovi čvorova ne preklapaju, svi moduli primaju jedinstvene IP adrese.

Administrator Kubernetes klastera konfigurira i instalira kubelet, runtime spremnika, agenta mrežnog davatelja usluga i kopira CNI dodatke u svaki čvor. Tijekom pokretanja, agent mrežnog pružatelja generira CNI konfiguraciju. Kada je pod zakazan za čvor, kubelet poziva CRI dodatak da ga stvori. Zatim, ako se koristi kontejner, Containerd CRI dodatak poziva CNI dodatak naveden u CNI konfiguraciji za konfiguraciju mreže modula. Kao rezultat toga, modul dobiva IP adresu.

Trebalo mi je neko vrijeme da shvatim sve suptilnosti i nijanse svih tih interakcija. Nadam se da će vam ovo iskustvo pomoći da bolje razumijete kako funkcionira Kubernetes. Ako u nečemu griješim, kontaktirajte me na X / Twitter ili na adresi [e-pošta zaštićena]. Slobodno se javite ako želite razgovarati o aspektima ovog članka ili bilo čemu drugom. Volio bih popričati s tobom!

reference

Kontejneri i mreža

Kako djeluje Flannel?

CRI i CNI

PS od prevoditelja

Pročitajte i na našem blogu:

Izvor: www.habr.com

Dodajte komentar