Načrtovanje Kubernetes grozdov: koliko jih mora biti?

Op. prev.: ta vsebina je iz izobraževalnega projekta learnk8s — odgovor na priljubljeno vprašanje o zasnovi infrastrukture na podlagi Kubernetes. Upamo, da bodo dovolj podrobni opisi prednosti in slabosti vsake od možnosti pomagali pri optimalni izbiri za vaš projekt.

Načrtovanje Kubernetes grozdov: koliko jih mora biti?

TL;DR: isti sklop delovnih obremenitev je mogoče zagnati na več velikih grozdu (vsak grozd bo imel veliko število delovnih obremenitev) ali na številnih manjših (z manjšim številom obremenitev v vsakem grozdu).

Spodaj je tabela, v kateri so ocenjene prednosti in slabosti vsakega pristopa:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?

Pri uporabi Kubernetes kot platforme za upravljanje aplikacij se pogosto pojavljajo nekatera temeljna vprašanja o nastavitev grozdov:

  • Koliko grozdov uporabiti?
  • Kako velike naj bodo?
  • Kaj naj vsebuje vsak grozd?

V tem članku bom poskušal odgovoriti na vsa ta vprašanja, analizirajoč prednosti in slabosti vsakega pristopa.

Postavljanje vprašanja

Kot razvijalec programske opreme verjetno hkrati razvijate in upravljate številne aplikacije.

Poleg tega se številni primerki teh aplikacij zagotovo izvajajo v različnih okoljih — na primer, to so lahko dev, test in prod.

Rezultat je celotna matrika aplikacij in okolij:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
Aplikacije in okolja

V zgornjem primeru je prikazanih 3 aplikacije in 3 okolja, kar na koncu daje 9 možnih kombinacij.

Vsak primer aplikacije predstavlja samostojno enoto za izvajanje, s katero lahko delate neodvisno od drugih.

je res polinom stopnje primer aplikacije lahko je sestavljen iz mnogih komponent, kot so frontend, backend, baza podatkov itd. V primeru mikroservisne aplikacije bo primer vključil vse mikroservise.

Zato se uporabnikom Kubernetes zastavlja več vprašanj:

  • Ali naj bodo vsi primerki aplikacij v enem grozdu?
  • Ali naj ima vsak primer aplikacije svoj grozd?
  • Ali pa bi morda morali uporabiti kombinacijo zgoraj navedenih pristopov?

Vse te možnosti so povsem izvedljive, saj je Kubernetes fleksibilen sistem, ki uporabnikom omogoča široko paleto možnosti.

Tukaj je nekaj možnih poti:

  • en velik skupen grozd;
  • veliko majhnih specializiranih grozdov;
  • en grozd za vsako aplikacijo;
  • en grozd za vsako okolje.

Kot je prikazano spodaj, sta prva dva pristopa na nasprotnih koncih spektra možnosti:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
Od nekaj velikih grozdov (levo) do mnogih majhnih (desno)

Na splošno velja, da je en grozd "večji" od drugega, če ima večjo skupno število vozlišč in podov. Na primer, grozd s 10 vozlišči in 100 podi je večji od grozda z 1 vozliščem in 10 podi.

No, začnimo!

1. En velik skupni grozd

Prva možnost je, da vse delovne obremenitve postavite v en grozd:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
En velik grozd

V okviru tega pristopa se grozd uporablja kot univerzalna infrastrukturna platforma — vse, kar potrebujete, preprosto namestite v obstoječem grozdu Kubernetes.

Imenskih prostorov Kubernetes omogoča logično ločevanje delov grozda drug od drugega, tako da lahko za vsako instanco aplikacije uporabite svoj imenski prostor.

Poglejmo prednosti in slabosti tega pristopa.

+ Učinkovita uporaba virov

V primeru enotnega grozda je potrebna le ena kopija vseh virov, potrebnih za zagon grozda Kubernetes in njegovo upravljanje.

Na primer, to velja za vodilna vozlišča. Običajno ima vsak grozd Kubernetes 3 vodilna vozlišča, zato bo število ostalo tako, tudi za en sam grozd (kot primer, 10 grozdov bo potrebovalo 30 vodilnih vozlišč).

Ta posebnost se nanaša tudi na druge storitve, ki delujejo na ravni celotnega grozda, kot so uravnoteževalniki obremenitve, kontrolerji Ingress, sistemi za avtentifikacijo, beleženje in nadzor.

V enotnem grozdu lahko te storitve uporabite takoj za vse delovne obremenitve (ni treba ustvarjati njihovih kopij, kot v primeru več grozdov).

+ Cenejša izbira

Zaradi zgornjega je manjše število grozdov običajno cenejše, saj ni stroškov za odvečne vire.

To še posebej velja za vodilna vozlišča, ki lahko stanejo precej, ne glede na način nastanitve (na lokaciji ali v oblaku).

Nekatere upravljane storitve Kubernetes, kot je Google Kubernetes Engine (GKE) ili Azure Kubernetes Service (AKS), zagotavljajo brezplačno upravljavsko plast. V tem primeru vprašanje stroškov ni tako izrazito.

Obstajajo tudi upravljane storitve, ki zaračunavajo fiksno ceno za delovanje vsakega Kubernetes klasterja (na primer, Amazon Elastic Kubernetes Service, EKS).

+ Učinkovito upravljanje

Upraviti en klaster je lažje kot več njih.

Upravljanje lahko vključuje naslednje naloge:

  • posodobitev različice Kubernetes;
  • nastavitev CI/CD pipelinov;
  • namestitev CNI vtičnika;
  • nastavitev sistema avtorizacije uporabnikov;
  • namestitev kontrolerja dostopa;

in mnoge druge…

V primeru enega klasterja je potrebno to početiti le enkrat.

Pri več klasterjih bo treba naloge ponavljati večkrat, kar bo verjetno zahtevalo avtomatizacijo procesov in orodij za zagotavljanje sistematičnosti in doslednosti.

Sedaj pa nekaj besed o slabostih.

− Enotna točka okvare

V primeru okvare edinega klasterja prenehajo delovati takoj vse delovne obremenitve!

Obstaja veliko scenarijev, kjer lahko kaj gre narobe:

  • posodobitev Kubernetes privede do nepredvidljivih stranskih učinkov;
  • komponenta v skupnem klasterju (na primer, CNI vtičnik) ne deluje, kot je pričakovano;
  • ena izmed komponent klasterja ni pravilno nastavljena;
  • okvara v spodnji infrastrukturi.

En tak incident lahko povzroči resno škodo vsem delovnim obremenitvam, nameščenim v skupnem klasterju.

− Pomanjkanje stroge izolacije

Delo v skupnem klasterju pomeni, da aplikacije skupno uporabljajo strojno opremo, omrežne zmogljivosti in operacijski sistem na vozliščih klasterja.

V določenem smislu sta dva kontejnerja z dvema različnima aplikacijama, ki delujeta na istem vozlišču, podobna dvema procesoma, ki delujeta na istem računalniku pod nadzorom istega OS jedra.

Linux kontejnerji zagotavljajo neko obliko izolacije, vendar ta ni tako močna kot tista, ki jo zagotavljajo na primer virtualni stroji. V bistvu je proces v kontejnerju enak procesu, ki teče v gostiteljskem operacijskem sistemu.

To lahko postane težava s stališča varnosti: taka organizacija teoretično omogoča nepovezanim aplikacijam, da komunicirajo med seboj (nameroma ali nenameroma).

Poleg tega vse delovne obremenitve v Kubernetes klastru skupno uporabljajo nekatere skupne storitve, kot so DNS — to omogoča aplikacijam, da najdejo storitve drugih aplikacij v klastru.

Vse zgoraj navedene točke imajo lahko različne pomene, odvisno od varnostnih zahtev aplikacij.

Kubernetes ponuja različna orodja za preprečevanje težav v informacijski varnosti, kot so PodSecurityPolicies in NetworkPolicies. Vendar pa je za pravilno nastavitev potrebna določena izkušnja, poleg tega pa ne morejo zapreti vseh varnostnih lukenj.

Pomembno je, da vedno pomnimo, da je Kubernetes prvotno zasnovan za skupno rabo, ne pa za izolacijo in varnost.

− Pomanjkanje stroge multi-tenancy

Ob upoštevanju obilice skupnih virov v Kubernetes klastru obstaja veliko načinov, kako si različne aplikacije lahko "stopijo na prste".

Na primer, aplikacija lahko monopolizira določen skupni vir (kot je procesor ali pomnilnik) in drugim aplikacijam, ki delujejo na istem vozlišču, onemogoči dostop do njega.

Kubernetes zagotavlja različne mehanizme za nadzor takšnega obnašanja, kot so zahteve po virih in omejitve (glejte tudi članek " Omejitve CPU in agresivno omejevanje v Kubernetesu “ — op. prev.), ResourceQuotas in LimitRanges. Vendar pa, kot v primeru varnosti, njihova nastavitev ni triviaalna in ne morejo preprečiti vseh nepredvidenih stranskih učinkov.

− Število uporabnikov

V primeru enega samega klastru je treba dostop do njega odpreti številnim ljudem. In bolj kot je njihovo število, večje je tveganje, da bodo kaj "pokvarili".

Znotraj klastru je mogoče nadzorovati, kdo in kaj lahko počne z uporabo upravljanja dostopa na podlagi vlog (RBAC) (glejte članek " Uporabniki in avtorizacija RBAC v Kubernetes “ — op. prev.). Vendar pa to ne preprečuje, da bi uporabniki "pokvarili" kaj v okviru svojih odgovornosti.

− Klasterji ne morejo rasti neskončno

Kluster, ki se uporablja za vse delovne obremenitve, bo verjetno precej velik (glede na število vozlišč in podov).

Toda tu se pojavi drug problem: klasterji v Kubernetesu ne morejo rasti neskončno.

Obstaja teoretična omejitev velikosti klustra. V Kubernetesu ta znaša približno 5000 vozlišč, 150 tisoč podov in 300 tisoč kontejnerjev.

Vendar v resničnem svetu se težave lahko začnejo mnogo prej — na primer, pri 500 vozliščih.

Težava je v tem, da veliki klasterji obremenjujejo upravljalsko plast Kubernetes. Z drugimi besedami, za vzdrževanje klasterja v funkcionalnem stanju in učinkovito uporabo virov je potrebno skrbno nastavljanje.

Ta problem je obravnavan v ustreznem članku v originalnem blogu z naslovom „Architecting Kubernetes clusters — choosing a worker node size».

Toda poglejmo nasproten pristop: več manjših klasterjev.

2. Številni majhni, specializirani klasterji

Pri tem pristopu uporabite ločen klaster za vsak razporejen element:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
Mnogokratni majhni klasterji

Za namen tega članka pod razporejenim elementom razumemo primer aplikacije — na primer, dev različico posamezne aplikacije.

V tej strategiji se Kubernetes uporablja kot specializirano izvajalno okolje za posamezne primere aplikacij.

Poglejmo prednosti in slabosti tega pristopa.

+ Omejen „radius eksplozije“

Ob „okvari“ klasterja so negativne posledice omejene le na tiste delovne obremenitve, ki so bile razporejene v tem klasterju. Vse druge obremenitve ostanejo nedotaknjene.

+ Izolacija

Delovne obremenitve, nameščene v individualnih klasterjih, nimajo skupnih virov, kot so procesor, pomnilnik, operacijski sistem, omrežje ali druge storitve.

Posledično dobimo strogo izolacijo med nepovezanimi aplikacijami, kar lahko pozitivno vpliva na njihovo varnost.

+ Majhno število uporabnikov

Glede na to, da v vsakem klasterju obstaja le omejen nabor delovnih obremenitev, se zmanjša število uporabnikov z dostopom do njega.

Manj ljudi, ki imajo dostop do klasterja, pomeni manjše tveganje, da se kaj „pokvari“.

Poglejmo pomanjkljivosti.

− Neučinkovita uporaba virov

Kot je bilo omenjeno prej, vsak klaster Kubernetes potrebuje določen nabor upravljalskih virov: master-vozlišča, komponente nadzorne plasti, rešitve za spremljanje in beleženje logov.

V primeru velikega števila majhnih klasterjev je treba dodeliti večji delež virov za upravljanje.

− Stroški

Neučinkovita uporaba virov samodejno vodi do visokih stroškov.

Na primer, vsebina 30 master vozlišč namesto treh pri enaki računski moči bo zagotovo vplivala na stroške.

− Težave z upravljanjem

Upravljanje z mnogimi Kubernetes klasterji je precej bolj zapleteno kot delo z enim samim.

Na primer, potrebno bo nastaviti avtentifikacijo in avtorizacijo za vsak klaster. Posodobitev različice Kubernetes bo prav tako treba izvesti večkrat.

Verjetno bo potrebno uporabiti avtomatizacijo, da bi povečali učinkovitost vseh teh nalog.

Zdaj pa poglejmo manj ekstremne scenarije.

3. En klaster za vsako aplikacijo

V okviru tega pristopa ustvarite ločen klaster za vse instance določenega programa:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
Klaster za aplikacijo

Takšna pot se lahko obravnava kot posplošitev načela „ločen klaster za ekipo“, saj običajno ekipa inženirjev razvija eno ali več aplikacij.

Poglejmo prednosti in slabosti tega pristopa.

+ Klaster je mogoče prilagoditi aplikaciji

Če ima aplikacija posebne potrebe, jih je mogoče uresničiti v klastru, ne da bi vplivali na druge klastre.

Takšne potrebe lahko vključujejo delavce z GPU, določene CNI vtičnike, mrežo storitev ali kakšno drugo storitev.

Vsak klaster je mogoče prilagoditi aplikaciji, ki deluje v njem, tako da vsebuje le tisto, kar je potrebno.

− Različna okolja v enem klastru

Pomanjkljivost tega pristopa je, da instance aplikacij iz različnih okolij sobivajo v enem klastru.

Na primer, produkcijska različica aplikacije deluje v istem klastru kot različica za razvoj. To prav tako pomeni, da razvijalci delujejo v istem klastru, v katerem deluje produkcijska različica aplikacije.

Če pride do okvare v klastru zaradi dejanj razvijalcev ali napak v verziji za razvoj, lahko potencialno trpi tudi produkcijska različica — kar je ogromen minus tega pristopa.

In končno, zadnji scenarij na našem seznamu.

4. En klaster za vsako okolje

Ta scenarij predvideva dodelitev ločenega klastru za vsako okolje:

Načrtovanje Kubernetes grozdov: koliko jih mora biti?
En klaster za okolje

Na primer, lahko imate klastre dev, test in prod, v katerih boste zagnali vse instance aplikacij, namenjene določenemu okolju.

Tukaj so prednosti in slabosti tega pristopa.

+ Izolacija produkcijskega okolja

V okviru tega pristopa so vsa okolja medsebojno izolirana. V praksi je to še posebej pomembno za produkcijsko okolje.

Produkcijske različice aplikacij zdaj niso odvisne od dogajanja v drugih grozdih in okoljih.

Tako, če v razvojnem grozdu pride do težave, produkcijske različice aplikacij nadaljujejo z delovanjem, kot da se nič ni zgodilo.

+ Grozd se lahko prilagodi okolju

Vsak grozd se lahko prilagodi svojemu okolju. Na primer, lahko:

  • namestite orodja za razvoj in odpravljanje napak v razvojnem grozdu;
  • namestite testne okvire in orodja v grozdu test;
  • uporabite zmogljivejšo opremo in omrežne povezave v grozdu prod.

To povečuje učinkovitost tako pri razvoju kot pri delovanju aplikacij.

+ Omejitev dostopa do produkcijskega grozda

Potreba po neposrednem delu s produkcijskim grozdom se redko pojavi, zato lahko znatno omejite krog oseb, ki imajo dostop do njega.

Lahko greste še dlje in popolnoma odvzamete dostop ljudem do tega grozda, vse uvajanje pa izvajate z avtomatiziranim orodjem CI/CD. Tak pristop znatno zmanjša tveganje človeških napak ravno tam, kjer je to najbolj aktualno.

Sedaj pa nekaj besed o slabostih.

− Pomanjkanje izolacije med aplikacijami

Glavna slabost pristopa je pomanjkanje strojne in zmogljivostne izolacije med aplikacijami.

Nesrelatedne aplikacije skupaj uporabljajo vire grozda: jedro sistema, procesor, pomnilnik in nekatere druge storitve.

Kot je bilo že omenjeno, je to lahko potencialno nevarno.

− Nemogoče lokalizirati odvisnosti aplikacij

Če ima aplikacija posebne zahteve, jih je treba izpolniti v vseh grozdih.

Na primer, če aplikaciji potrebujete GPU, mora vsak grozd vsebovati vsaj enega delavca z GPU (tudi če ga uporablja samo ta aplikacija).

Zaradi tega tvegamo višje stroške in neučinkovito uporabo virov.

Zaključek

Ob prisotnosti določenega nabora aplikacij jih lahko postavimo v več velikih grozdih ali v številnih majhnih.

V članku so obravnavane prednosti in slabosti različnih pristopov, od enega globalnega grozda do več manjših in specializiranih:

  • en velik skupni klaster;
  • veliko majhnih specializiranih grozdov;
  • en grozd za vsako aplikacijo;
  • en grozd za vsako okolje.

Torej, katero pristop izbrati?

Kot ponavadi je odgovor odvisen od uporabe: potrebno je pretehtati prednosti in slabosti različnih pristopov ter izbrati najbolj optimalno rešitev.

Vendar pa izbira ni omejena le na zgoraj navedene primere — lahko uporabimo katerokoli kombinacijo!

Na primer, lahko organizirate par klasterjev za vsak tim: klaster za razvoj (v katerem bodo okolja dev in test) in klaster za production (kjer bo produkcijsko okolje).

Na podlagi informacij v tem članku boste lahko ustrezno optimizirali prednosti in slabosti za konkretno uporabo. Srečno!

P.S.

Preberite tudi na našem blogu:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster