Kaip Kubernetes pod gauna IP adresą?

Pastaba. vert.: Šiame straipsnyje, kurį parašė SRE inžinierius iš „LinkedIn“, išsamiai aprašoma vidinė „Kubernetes“ magija – tiksliau, CRI, CNI ir „kube-apiserver“ sąveika – tai atsitinka, kai kitam blokui reikia priskirti IP adresą.

Vienas iš pagrindinių reikalavimų Kubernetes tinklo modelis Kiekviena grupė turi turėti savo IP adresą ir bet kuri kita grupė turi turėti galimybę susisiekti su ja tuo adresu. Yra daug tinklo „teikėjų“ (Flanel, Calico, Canal ir kt.), kurie padeda įgyvendinti šį tinklo modelį.

Kai pirmą kartą pradėjau dirbti su Kubernetes, man nebuvo visiškai aišku, kaip tiksliai pods gauna savo IP adresus. Net ir žinant, kaip veikia atskiri komponentai, buvo sunku įsivaizduoti, kad jie dirbtų kartu. Pavyzdžiui, žinojau, kam skirti CNI įskiepiai, bet neįsivaizdavau, kaip tiksliai jie vadinami. Todėl nusprendžiau parašyti šį straipsnį, kad pasidalyčiau žiniomis apie įvairius tinklo komponentus ir apie tai, kaip jie veikia kartu Kubernetes klasteryje, o tai leidžia kiekvienam blokui gauti savo unikalų IP adresą.

„Kubernetes“ tinkle galima organizuoti įvairiais būdais, taip pat yra skirtingų konteinerių vykdymo laiko parinkčių. Šiame leidinyje bus naudojamasi Flanelė organizuoti tinklą klasteryje ir kaip vykdomąją aplinką - Konteineris. Taip pat darau prielaidą, kad žinote, kaip veikia tinklų kūrimas tarp konteinerių, todėl trumpai pakalbėsiu apie kontekstą.

Kai kurios pagrindinės sąvokos

Konteineriai ir tinklas: trumpa apžvalga

Internete yra daugybė puikių publikacijų, kuriose paaiškinama, kaip konteineriai bendrauja tarpusavyje tinkle. Todėl pateiksiu tik bendrą pagrindinių sąvokų apžvalgą ir apsiribosiu vienu požiūriu, kuris apima Linux tilto kūrimą ir paketų inkapsuliavimą. Išsamios detalės praleistos, nes pati konteinerių tinklo tema nusipelno atskiro straipsnio. Žemiau bus pateiktos nuorodos į kai kuriuos ypač įžvalgius ir mokomuosius leidinius.

Konteineriai ant vieno pagrindinio kompiuterio

Vienas iš būdų organizuoti ryšį per IP adresus tarp konteinerių, veikiančių tame pačiame pagrindiniame kompiuteryje, yra sukurti Linux tiltą. Šiuo tikslu „Kubernetes“ (ir „Docker“) sukuriami virtualūs įrenginiai. veth (virtualus eternetas). Vienas veth įrenginio galas jungiasi prie konteinerio tinklo vardų erdvės, kitas – prie Linux tiltas pagrindiniame tinkle.

Visi konteineriai, esantys tame pačiame pagrindiniame kompiuteryje, turi vieną angos galą, prijungtą prie tilto, per kurį jie gali susisiekti vienas su kitu per IP adresus. „Linux“ tiltas taip pat turi IP adresą ir veikia kaip išėjimo srauto iš blokų, skirtų kitiems mazgams, vartai.

Kaip Kubernetes pod gauna IP adresą?

Konteineriai skirtinguose pagrindiniuose kompiuteriuose

Paketų inkapsuliavimas yra vienas iš būdų, leidžiantis skirtinguose mazguose esantiems konteineriams bendrauti tarpusavyje naudojant IP adresus. „Flanel“ už šią galimybę atsakingos technologijos. vxlan, kuris „supakuoja“ pradinį paketą į UDP paketą ir siunčia jį į paskirties vietą.

„Kubernetes“ klasteryje „Flanel“ sukuria „vxlan“ įrenginį ir atitinkamai atnaujina maršruto lentelę kiekviename mazge. Kiekvienas paketas, skirtas konteineriui skirtingame pagrindiniame kompiuteryje, praeina per vxlan įrenginį ir yra įdėtas į UDP paketą. Paskirties vietoje įdėtas paketas ištraukiamas ir persiunčiamas į norimą grupę.

Kaip Kubernetes pod gauna IP adresą?
Pastaba: tai tik vienas iš būdų organizuoti tinklo ryšį tarp konteinerių.

Kas yra CRI?

CRI (konteinerio vykdymo sąsaja) yra papildinys, leidžiantis kubelet naudoti skirtingas konteinerio vykdymo aplinkas. CRI API yra integruota į įvairius vykdymo laikus, todėl vartotojai gali pasirinkti savo pasirinktą vykdymo laiką.

Kas yra CNI?

Projektas CNI yra a specifikacija organizuoti universalų tinklo sprendimą Linux konteineriams. Be to, ji apima įskiepių, atsakingas už įvairias funkcijas nustatant pod tinklą. CNI įskiepis yra vykdomasis failas, atitinkantis specifikaciją (kai kuriuos papildinius aptarsime toliau).

Potinklių paskirstymas mazgams, kad būtų galima priskirti IP adresus

Kadangi kiekviena grupė turi turėti IP adresą, todėl svarbu užtikrinti, kad šis adresas būtų unikalus. Tai pasiekiama kiekvienam mazgui priskiriant unikalų potinklį, iš kurio to mazgo blokams priskiriami IP adresai.

Mazgo IPAM valdiklis

Kai nodeipam perduodamas kaip vėliavėlės parametras --controllers kube-valdiklis-vadybininkas, kiekvienam klasterio CIDR mazgui priskiriamas atskiras potinklis (podCIDR) (t. y. klasterio tinklo IP adresų diapazonas). Kadangi šie podCIDR nesutampa, kiekvienam podCIDR gali būti priskirtas unikalus IP adresas.

Kubernetes mazgui priskiriamas podCIDR, kai jis iš pradžių registruojamas klasteryje. Norėdami pakeisti mazgų podCIDR, turite juos išregistruoti ir iš naujo užregistruoti, atlikdami atitinkamus Kubernetes valdymo sluoksnio konfigūracijos pakeitimus. Galite rodyti mazgo podCIDR naudodami šią komandą:

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

Kubelet, konteinerio vykdymo laikas ir CNI papildiniai: kaip visa tai veikia

Suplanuojant podą kiekvienam mazgui, reikia atlikti daug parengiamųjų veiksmų. Šiame skyriuje daugiausia dėmesio skirsiu tik tiems, kurie yra tiesiogiai susiję su pod tinklo nustatymu.

Suplanavus grupę tam tikram mazgui, suaktyvinama tokia įvykių grandinė:

Kaip Kubernetes pod gauna IP adresą?

DUK: Containerd CRI įskiepių architektūra.

Sąveika tarp konteinerio vykdymo laiko ir CNI papildinių

Kiekvienas tinklo teikėjas turi savo CNI papildinį. Sudėtinio rodinio vykdymo laikas jį paleidžia, kad būtų sukonfigūruotas tinklas, skirtas podeliui, kai jis paleidžiamas. Konteinerio atveju CNI papildinį paleidžia papildinys Konteinerinis CRI.

Be to, kiekvienas tiekėjas turi savo agentą. Jis įdiegtas visuose „Kubernetes“ mazguose ir yra atsakingas už tinklo konfigūraciją. Šis agentas yra įtrauktas į CNI konfigūraciją arba savarankiškai sukuria jį mazge. Konfigūracija padeda CRI papildiniui nustatyti, kurį CNI papildinį iškviesti.

CNI konfigūracijos vietą galima pritaikyti; pagal numatytuosius nustatymus jis yra /etc/cni/net.d/<config-file>. Klasterio administratoriai taip pat yra atsakingi už CNI papildinių įdiegimą kiekviename klasterio mazge. Jų vieta taip pat pritaikoma; numatytasis katalogas - /opt/cni/bin.

Naudojant konteinerį, skyriuje galima nustatyti papildinio konfigūracijos ir dvejetainių failų kelius [plugins.«io.containerd.grpc.v1.cri».cni] в sudėtinis konfigūracijos failas.

Kadangi kaip tinklo teikėją naudojame „Flanel“, pakalbėkime apie jo nustatymą:

  • Flaneld (Flannelio demonas) paprastai yra įdiegiamas klasteryje kaip DaemonSet su install-cni kaip init konteineris.
  • Install-cni sukuria CNI konfigūracijos failas (/etc/cni/net.d/10-flannel.conflist) kiekviename mazge.
  • Flaneld sukuria vxlan įrenginį, nuskaito tinklo metaduomenis iš API serverio ir stebi pod naujinimus. Kai jie sukuriami, jis paskirsto maršrutus visoms grupėms.
  • Šie maršrutai leidžia ankštims susisiekti tarpusavyje per IP adresus.

Norėdami gauti išsamesnės informacijos apie „Flanel“ darbą, rekomenduoju naudoti nuorodas straipsnio pabaigoje.

Čia yra Containerd CRI papildinio ir CNI įskiepių sąveikos diagrama:

Kaip Kubernetes pod gauna IP adresą?

Kaip matote aukščiau, kubelet iškviečia Containerd CRI įskiepį, kad sukurtų podą, kuris tada iškviečia CNI įskiepį, kad sukonfigūruotų podėlio tinklą. Tai darydamas tinklo teikėjo CNI įskiepis iškviečia kitus pagrindinius CNI papildinius, kad sukonfigūruotų įvairius tinklo aspektus.

Sąveika tarp CNI įskiepių

Yra įvairių CNI papildinių, kurių užduotis yra padėti nustatyti tinklo ryšį tarp pagrindinio kompiuterio konteinerių. Šiame straipsnyje bus aptariami trys iš jų.

CNI papildinys Flanel

Naudojant „Flanel“ kaip tinklo teikėją, Containerd CRI komponentas iškviečia CNI papildinys Flanelnaudojant CNI konfigūracijos failą /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
      }
    }
  ]
}

„Flanel CNI“ papildinys veikia kartu su „Flaneld“. Paleidžiant Flaneldas nuskaito podCIDR ir kitą su tinklu susijusią informaciją iš API serverio ir išsaugo juos faile /run/flannel/subnet.env.

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

„Flanel CNI“ papildinys naudoja duomenis iš /run/flannel/subnet.env konfigūruoti ir iškviesti CNI tilto papildinį.

CNI papildinys Bridge

Šis papildinys iškviečiamas su tokia konfigūracija:

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

Kai iškviečiama pirmą kartą, jis sukuria „Linux“ tiltą su «name»: «cni0», kuris nurodytas konfigūracijose. Tada kiekvienai ankštims sukuriama veth pora. Vienas jo galas yra prijungtas prie konteinerio tinklo vardų erdvės, kitas yra įtrauktas į pagrindinio tinklo „Linux“ tiltą. CNI papildinys Bridge sujungia visus pagrindinio kompiuterio konteinerius su Linux tiltu pagrindiniame tinkle.

Baigęs nustatyti veth porą, Bridge papildinys iškviečia vietinį pagrindinio kompiuterio IPAM CNI papildinį. IPAM papildinio tipą galima sukonfigūruoti CNI konfigūracijoje, kurią CRI įskiepis naudoja Flanel CNI papildiniui iškviesti.

Prieglobos vietiniai IPAM CNI papildiniai

Tiltas CNI skambučiai prieglobos vietinis IPAM papildinys CNI su tokia konfigūracija:

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

Prieglobos vietinis IPAM papildinys (IP Aadresus, Management – ​​IP adresų valdymas) grąžina konteinerio IP adresą iš potinklio ir išsaugo paskirstytą IP pagrindiniame kompiuteryje skyriuje nurodytame kataloge dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Šiame faile yra konteinerio, kuriam priskirtas šis IP adresas, ID.

Skambinus prieglobos vietiniam IPAM papildiniui, jis pateikia šiuos duomenis:

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

Santrauka

„Kube-controller-manager“ kiekvienam mazgui priskiria podCIDR. Kiekvieno mazgo blokai gauna IP adresus iš adresų erdvės, esančios priskirtame podCIDR diapazone. Kadangi mazgų podCIDR nesutampa, visos grupės gauna unikalius IP adresus.

„Kubernetes“ klasterio administratorius sukonfigūruoja ir įdiegia „kubelet“, konteinerio vykdymo laiką, tinklo teikėjo agentą ir nukopijuoja CNI papildinius į kiekvieną mazgą. Paleidimo metu tinklo teikėjo agentas sugeneruoja CNI konfigūraciją. Kai blokas suplanuotas į mazgą, kubeletas iškviečia CRI papildinį, kad jį sukurtų. Tada, jei naudojamas konteineris, Containerd CRI įskiepis iškviečia CNI įskiepį, nurodytą CNI konfigūracijoje, kad sukonfigūruotų podėlio tinklą. Dėl to podas gauna IP adresą.

Man prireikė šiek tiek laiko, kad suprasčiau visas šių sąveikų subtilybes ir niuansus. Tikiuosi, kad ši patirtis padės geriau suprasti, kaip veikia Kubernetes. Jei dėl ko nors klystu, susisiekite su manimi tel Twitter arba adresu [apsaugotas el. paštu]. Nedvejodami susisiekite, jei norite aptarti šio straipsnio aspektus ar ką nors kita. Norėčiau su jumis pabendrauti!

Nuorodos

Konteineriai ir tinklas

Kaip veikia flanelė?

CRI ir CNI

PS iš vertėjo

Taip pat skaitykite mūsų tinklaraštyje:

Šaltinis: www.habr.com

Добавить комментарий