Kako pod Kubernetes dobi naslov IP?

Opomba. prevod: Ta članek, ki ga je napisal inženir SRE iz LinkedIna, gre v podrobnosti o notranji čarovniji v Kubernetesu – natančneje, interakciji CRI, CNI in kube-apiserver – ki se zgodi, ko je treba naslednjemu podu dodeliti naslov IP.

Ena od osnovnih zahtev Omrežni model Kubernetes je, da mora vsak pod imeti svoj naslov IP in kateri koli drugi pod v gruči mora imeti možnost vzpostaviti stik z njim na tem naslovu. Obstaja veliko omrežnih »ponudnikov« (Flannel, Calico, Canal itd.), ki pomagajo implementirati ta omrežni model.

Ko sem prvič začel delati s Kubernetesom, mi ni bilo povsem jasno, kako točno pods dobijo svoje IP naslove. Čeprav smo razumeli, kako posamezne komponente delujejo, si je bilo težko predstavljati, da bi delovale skupaj. Na primer, vedel sem, čemu so vtičniki CNI, vendar nisem vedel, kako natančno se imenujejo. Zato sem se odločil napisati ta članek, da bi delil znanje o različnih omrežnih komponentah in o tem, kako delujejo skupaj v gruči Kubernetes, ki vsakemu podu omogoča, da dobi svoj edinstven naslov IP.

Obstajajo različni načini za organiziranje mreženja v Kubernetesu, tako kot obstajajo različne možnosti izvajanja za vsebnike. Ta publikacija bo uporabljala Flannel organizirati omrežje v gruči in kot izvršljivo okolje - Kontejner. Predvidevam tudi, da veste, kako deluje mreženje med vsebniki, zato se ga bom samo na kratko dotaknil, samo zaradi konteksta.

Nekaj ​​osnovnih konceptov

Vsebniki in omrežje: kratek pregled

Na internetu je veliko odličnih publikacij, ki pojasnjujejo, kako kontejnerji komunicirajo med seboj prek omrežja. Zato bom podal samo splošen pregled osnovnih konceptov in se omejil na en pristop, ki vključuje ustvarjanje mostu Linux in enkapsulacijo paketov. Podrobnosti so izpuščene, saj si sama tema vsebniškega mreženja zasluži ločen članek. Spodaj bodo navedene povezave do nekaterih posebej pronicljivih in poučnih publikacij.

Kontejnerji na enem hostu

Eden od načinov organiziranja komunikacije prek naslovov IP med vsebniki, ki se izvajajo na istem gostitelju, vključuje ustvarjanje mostu Linux. V ta namen se v Kubernetesu (in Dockerju) ustvarijo virtualne naprave. veth (navidezni ethernet). En konec naprave veth se poveže z omrežnim imenskim prostorom vsebnika, drugi pa z Linux most v gostiteljskem omrežju.

Vsi vsebniki na istem gostitelju imajo en konec vetha povezan z mostom, prek katerega lahko komunicirajo med seboj prek naslovov IP. Most Linux ima tudi naslov IP in deluje kot prehod za izstopni promet iz podov, namenjen drugim vozliščem.

Kako pod Kubernetes dobi naslov IP?

Vsebniki na različnih gostiteljih

Enkapsulacija paketov je ena od metod, ki omogoča vsebnikom na različnih vozliščih, da komunicirajo med seboj z uporabo naslovov IP. Pri Flannelu je za to priložnost odgovorna tehnologija. vxlan, ki izvirni paket »zapakira« v paket UDP in ga nato pošlje na cilj.

V gruči Kubernetes Flannel ustvari napravo vxlan in ustrezno posodobi tabelo poti na vsakem vozlišču. Vsak paket, namenjen vsebniku na drugem gostitelju, prehaja skozi napravo vxlan in je enkapsuliran v paket UDP. Na cilju se ugnezdeni paket ekstrahira in posreduje želenemu bloku.

Kako pod Kubernetes dobi naslov IP?
Opomba: To je samo en način za organiziranje omrežne komunikacije med vsebniki.

Kaj je CRI?

CRI (Container Runtime Interface) je vtičnik, ki kubeletu omogoča uporabo različnih izvajalnih okolij vsebnika. CRI API je vgrajen v različne izvajalne čase, tako da lahko uporabniki izberejo izvajalni čas po lastni izbiri.

Kaj je CNI?

Projekt CNI je a specifikacija organizirati univerzalno omrežno rešitev za vsebnike Linux. Poleg tega vključuje vtičniki, ki je odgovoren za različne funkcije pri postavljanju omrežja pod. Vtičnik CNI je izvršljiva datoteka, ki je skladna s specifikacijo (o nekaterih vtičnikih bomo razpravljali spodaj).

Dodelitev podomrežij vozliščem za dodeljevanje naslovov IP podom

Ker mora imeti vsak pod v gruči naslov IP, je pomembno zagotoviti, da je ta naslov edinstven. To dosežemo tako, da vsakemu vozlišču dodelimo edinstveno podomrežje, iz katerega se podom na tem vozlišču nato dodelijo naslovi IP.

Krmilnik vozlišča IPAM

Pri nodeipam posredovan kot parameter zastavice --controllers kube-controller-manager, dodeli ločeno podomrežje (podCIDR) vsakemu vozlišču iz CIDR gruče (tj. obseg naslovov IP za omrežje gruče). Ker se ti podCIDR-ji ne prekrivajo, je vsakemu podu mogoče dodeliti edinstven naslov IP.

Vozlišču Kubernetes je dodeljen podCIDR, ko je prvotno registrirano v gruči. Če želite spremeniti podCIDR vozlišč, jih morate odjaviti iz registra in nato znova registrirati ter vmes ustrezno spremeniti konfiguracijo nadzorne plasti Kubernetes. PodCIDR vozlišča lahko prikažete z naslednjim ukazom:

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

Kubelet, izvajalno okolje vsebnika in vtičniki CNI: kako vse deluje

Načrtovanje sklopa na vozlišče vključuje veliko pripravljalnih korakov. V tem razdelku se bom osredotočil samo na tiste, ki so neposredno povezani z vzpostavitvijo omrežja pod.

Načrtovanje sklopa v določeno vozlišče sproži naslednjo verigo dogodkov:

Kako pod Kubernetes dobi naslov IP?

Pomoč: Arhitektura vtičnikov Containerd CRI.

Interakcija med izvajalnim okoljem vsebnika in vtičniki CNI

Vsak ponudnik omrežja ima svoj vtičnik CNI. Izvajalno okolje vsebnika ga zažene, da konfigurira omrežje za pod, ko se zažene. V primeru vsebnika vtičnik CNI zažene vtičnik Kontejner CRI.

Poleg tega ima vsak ponudnik svojega agenta. Nameščen je na vseh vozliščih Kubernetes in je odgovoren za omrežno konfiguracijo podov. Ta agent je vključen v konfiguracijo CNI ali pa ga neodvisno ustvari v vozlišču. Konfiguracija pomaga vtičniku CRI nastaviti, kateri vtičnik CNI naj pokliče.

Mesto konfiguracije CNI je mogoče prilagoditi; privzeto je v /etc/cni/net.d/<config-file>. Skrbniki gruče so odgovorni tudi za namestitev vtičnikov CNI na vsako vozlišče gruče. Njihova lokacija je tudi prilagodljiva; privzeti imenik - /opt/cni/bin.

Pri uporabi vsebnika lahko v razdelku nastavite poti za konfiguracijo vtičnika in binarne datoteke [plugins.«io.containerd.grpc.v1.cri».cni] в konfiguracijska datoteka vsebnika.

Ker kot ponudnika omrežja uporabljamo Flannel, se pogovorimo o njegovi nastavitvi:

  • Flanneld (Flanelov demon) je običajno nameščen v gručo kot DaemonSet z install-cni kot init vsebnik.
  • Install-cni ustvarja Konfiguracijska datoteka CNI (/etc/cni/net.d/10-flannel.conflist) na vsakem vozlišču.
  • Flanneld ustvari napravo vxlan, pridobi omrežne metapodatke iz strežnika API in spremlja posodobitve podov. Ko so ustvarjene, razdeli poti do vseh podov v gruči.
  • Te poti omogočajo podom, da komunicirajo med seboj prek naslovov IP.

Za podrobnejše informacije o delu Flannel priporočam uporabo povezav na koncu članka.

Tukaj je diagram interakcije med vtičnikom Containerd CRI in vtičniki CNI:

Kako pod Kubernetes dobi naslov IP?

Kot lahko vidite zgoraj, kubelet pokliče vtičnik Containerd CRI za ustvarjanje poda, ki nato pokliče vtičnik CNI za konfiguracijo omrežja poda. Pri tem vtičnik CNI ponudnika omrežja pokliče druge osnovne vtičnike CNI, da konfigurirajo različne vidike omrežja.

Interakcija med vtičniki CNI

Obstajajo različni vtičniki CNI, katerih naloga je pomagati vzpostaviti omrežno komunikacijo med vsebniki na gostitelju. Ta članek bo obravnaval tri izmed njih.

CNI vtičnik Flannel

Ko uporabljate Flannel kot ponudnika omrežja, pokliče komponenta Container CRI CNI vtičnik Flannelz uporabo konfiguracijske datoteke CNI /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
      }
    }
  ]
}

Vtičnik Flannel CNI deluje v povezavi s Flanneldom. Med zagonom Flanneld pridobi podCIDR in druge z omrežjem povezane podrobnosti s strežnika API in jih shrani v datoteko /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Vtičnik Flannel CNI uporablja podatke iz /run/flannel/subnet.env za konfiguracijo in klic vtičnika CNI bridge.

CNI vtičnik Bridge

Ta vtičnik se kliče z naslednjo konfiguracijo:

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

Ob prvem klicu ustvari most Linux z «name»: «cni0», kar je navedeno v konfiguraciji. Nato se ustvari veth par za vsak pod. En konec je povezan z omrežnim imenskim prostorom vsebnika, drugi pa je vključen v most Linux v gostiteljskem omrežju. CNI vtičnik Bridge povezuje vse gostiteljske vsebnike z mostom Linux v gostiteljskem omrežju.

Ko konča nastavitev para veth, vtičnik Bridge pokliče vtičnik IPAM CNI lokalnega gostitelja. Vrsto vtičnika IPAM je mogoče konfigurirati v konfiguraciji CNI, ki jo vtičnik CRI uporablja za klic vtičnika Flannel CNI.

Lokalni gostiteljski vtičniki IPAM CNI

Premostite klice CNI gostiteljski lokalni vtičnik IPAM CNI z naslednjo konfiguracijo:

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

Lokalni IPAM vtičnik (IP Apoštnega naslova Mupravljanje - upravljanje naslovov IP) vrne naslov IP za vsebnik iz podomrežja in shrani dodeljeni IP na gostitelju v imenik, določen v razdelku dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ta datoteka vsebuje ID vsebnika, ki mu je dodeljen ta naslov IP.

Ko kliče vtičnik IPAM lokalnega gostitelja, vrne naslednje podatke:

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

Povzetek

Kube-controller-manager vsakemu vozlišču dodeli podCIDR. Stroki vsakega vozlišča prejmejo naslove IP iz naslovnega prostora v dodeljenem obsegu podCIDR. Ker se podCIDR-ji vozlišč ne prekrivajo, vsi sklopi prejmejo edinstvene naslove IP.

Skrbnik gruče Kubernetes konfigurira in namesti kubelet, izvajalno okolje vsebnika, agenta ponudnika omrežja in kopira vtičnike CNI v vsako vozlišče. Med zagonom agent ponudnika omrežja ustvari konfiguracijo CNI. Ko je pod načrtovan za vozlišče, kubelet pokliče vtičnik CRI, da ga ustvari. Nato, če je uporabljen kontejner, vtičnik Containerd CRI pokliče vtičnik CNI, naveden v konfiguraciji CNI, da konfigurira omrežje sklopa. Kot rezultat, pod prejme naslov IP.

Potreboval sem nekaj časa, da sem razumel vse podrobnosti in nianse vseh teh interakcij. Upam, da vam bo ta izkušnja pomagala bolje razumeti, kako deluje Kubernetes. Če se v čem motim, me kontaktirajte na Twitter ali na naslovu [e-pošta zaščitena]. Če želite razpravljati o vidikih tega članka ali o čem drugem, se obrnite na nas. Rad bi poklepetal s teboj!

reference

Zabojniki in mreža

Kako deluje flanel?

CRI in CNI

PS od prevajalca

Preberite tudi na našem blogu:

Vir: www.habr.com

Dodaj komentar