Projektimi i klastereve Kubernetes: sa duhet të jenë ato?

Shën. përkth.: ky ky ky ky learnk8s — përgjigje për një pyetje të njohur në projektimin e infrastrukturës mbi bazën e Kubernetes. Shpresojmë që përshkrimet e detajuara të përparësive dhe disavantazheve të çdo opsioni do të ndihmojnë të bëni një zgjedhje optimale për projektin tuaj.

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?

TL;DR: e njëjta grup i ngarkesave pune mund të nisë në disa klasterë të mëdhenj (me çdo klaster që përmban një numër të madh workload'esh) ose në shumë të vegjël (me një numër të vogël ngarkesash në çdo klaster).

Në vijim është një tabelë që vlerëson përparësitë dhe disavantazhet e çdo qasjeje:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?

Kur përdorni Kubernetes si një platformë për eksploatimin e aplikacioneve, shpesh lindin disa pyetje themelore rreth hollësive të konfigurimit të klasterëve:

  • Sa klasterë duhet përdorur?
  • Sa të mëdhenj duhet të jenë?
  • Çfarë duhet të përmbajë çdo klaster?

Në këtë artikull do të përpiqem të përgjigjem për gjithë këto pyetje, duke analizuar përparësitë dhe disavantazhet e çdo qasjeje.

Formulimi i pyetjes

Si krijues i softuerit, ju ndoshta jeni duke zhvilluar dhe eksploatuar shumë aplikacione në të njëjtën kohë.

Për më tepër, shumë instance të këtyre aplikacioneve sigurisht që ekzekutohen në mjedise të ndryshme — për shembull, këto mund të jenë dev, test dhe prod.

Si rezultat, krijohet një matricë e tërë e aplikacioneve dhe mjediseve:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Aplikacione dhe mjedise

Në shembullin e mësipërm janë paraqitur 3 aplikacione dhe 3 mjedise, që në fund ofrojnë 9 variante të mundshme.

Çdo instance aplikacioni përbën një njësi deploy-i të vetë-mjaftueshme, me të cilën mund të punoni në mënyrë të pavarur nga të tjerat.

Vini re se instance aplikacioni mund të përbëhet nga shumë e komponentëve, si për shembull frontend, backend, baza e të dhënave etj. Në rastin e një aplikacioni mikrosërëvis, instance do të përfshijë të gjitha mikrosërviset.

Si pasojë, përdoruesit e Kubernetes kanë disa pyetje:

  • A është e duhshme të vendosen të gjitha instance-t e aplikacionit në një klaster?
  • A duhet të krijohet një klaster i veçantë për çdo instance aplikacioni?
  • Ose, ndoshta, duhet të përdoret një kombinim i qasjeve të sipërpërmendura?

Të gjitha këto variante janë plotësisht të mundshme, pasi Kubernetes është një sistem fleksibël që nuk e kufizon përdoruesin në mundësi.

Ja disa nga mundësitë e mundshme:

  • një klaster i madh i përbashkët;
  • një numër i madh klasteresh të specializuara;
  • një klaster për çdo aplikacion;
  • një klaster për çdo ambient.

Siç tregohet më poshtë, dy qasjet e para janë në pole të kundërta të spektrit të mundësive:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Nga disa klastere të mëdha (majtas) deri në shumë të vogla (djathtas)

Në përgjithësi, konsiderohet se një klaster është "më i madh" se një tjetër nëse ka më shumë node dhe pod-e. Për shembull, një klaster me 10 node dhe 100 pod është më i madh se një klaster me 1 nod dhe 10 pod-e.

Mirë, le të fillojmë!

1. Një klaster i madh i përbashkët

Opsioni i parë është të vendosni të gjitha ngarkesat e punës në një klaster:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Një klaster i madh

Në këtë qasje, klasteri përdoret si një platformë infrastrukturore — gjithçka që ju nevojitet thjesht e zhvilloni në klasterin ekzistues Kubernetes.

Namespace-et Kubernetes lejon ndarjen logjike të pjesëve të klasterit nga njëra-tjetra, kështu që për çdo instancë të aplikacionit mund të përdorni hapësirën tuaj të emrave.

Le të shqyrtojmë përparësitë dhe disavantazhet e këtij qasjes.

+ Përdorimi efikas i burimeve

Në rastin e një klasteri të vetëm, do të kërkohet vetëm një kopje e të gjitha burimeve të nevojshme për të filluar dhe menaxhuar klasterin Kubernetes.

Për shembull, kjo është e vërtetë për nodet e masterit. Zakonisht, për çdo klaster Kubernetes ka 3 nodë master, kështu që për një klaster të vetëm, numri i tyre do të mbetet i tillë (për krahasim, 10 klastere do të kërkojnë 30 nodë master).

Kjo hollësi e mësipërme i referohet edhe shërbimeve të tjera që funksionojnë në shkallën e klasterit të gjithëpërfshirës, siç janë balancuesit e ngarkesës, kontrollorët Ingress, sistemet e autentikimit, regjistrimit dhe monitorimit.

Në një klaster të vetme, të gjitha këto shërbime mund të përdoren menjëherë për të gjitha ngarkesat e punës (nuk është e nevojshme të krijoni kopje të tyre, si në rastin e disa klastereve).

+ Kosto më e ulët

Si pasojë e asaj që u tha më sipër, numri më i vogël i klastereve zakonisht është më i lirë, pasi nuk ka shpenzime për burime të panevojshme.

Kjo është veçanërisht e vërtetë për nodet e masterit, të cilat mund të kushtojnë shumë pavarësisht nga mënyra e vendosjes (on-premises ose në cloud).

Disa shërbime të menaxhuara të Kubernetes, siç janë Google Kubernetes Engine (GKE) ose Azure Kubernetes Service (AKS), ofrojnë një shtresë menaxhuese falas. Në këtë rast, çështja e kostove është më pak e rëndësishme.

Gjithashtu ekzistojnë shërbime të menaxhuara, që ngarkojnë një tarifë fikse për funksionimin e çdo klasteri Kubernetes (për shembull, Shërbimi Elastic Kubernetes i Amazon, EKS).

+ Menaxhim efikas

Të menaxhosh një klaster është më e lehtë se të menaxhosh disa.

Menaxhimi mund të përfshijë detyra të tilla si:

  • përditësimi i versionit të Kubernetes;
  • konfigurimi i pipeline-it CI/CD;
  • instalimi i plugin-it CNI;
  • konfigurimi i sistemit të autentikimit të përdoruesve;
  • instalimi i kontrolluesit të aksesit;

dhe shumë të tjera…

Në rastin e një klasteri, do të merret me të gjitha këto vetëm një herë.

Për shumë klastere, operacionet do të duhet të përsëriten shpesh, që ndoshta do të kërkojë automatizimin e proceseve dhe mjetet, për të siguruar sistematikën dhe uniformitetin e procesit.

Tani disa fjalë mbi disavantazhet.

− Pikë e vetme dështimi

Në rast dështimi të klasterit të vetëm ngarkesat e punës do të ndalojnë menjëherë të gjithë të funksionojnë!

Ekzistojnë shumë variante kur diçka mund të shkojë keq:

  • përditësimi i Kubernetesit shkakton efekte anësore të papritura;
  • komponenti i përbashkët të klasterit (për shembull, plugin-i CNI) fillon të funksionojë ndryshe nga sa pritej;
  • një nga komponentët e klasterit është konfigurimi jo korrekt;
  • dështimi në infrastrukturën nëntokësore.

Një incident i tillë mund të shkaktojë dëme serioze për të gjitha ngarkesat e punës të vendosura në klasterin e përbashkët.

− Mungesa e izolimit të fortë

Puna në një klaster të përbashkët do të thotë se aplikacionet ndajnë burimet harduerike, mundësitë rrjet dhe sistemin operativ në nyjat e klasterit.

Në një sens, dy kontejnerë me dy aplikacione të ndryshme që punojnë në të njëjtën nyje janë si dy procese që punojnë në të njëjtën makinë nën një bërthamë të njëjtë të OS-së.

Kontejnerët Linux ofrojnë një formë të caktuar izolimi, por ajo nuk është ashtu si ajo që ofrojnë, për shembull, makinat virtuale. Në esencë, një proces në një kontejner është i njëjti proces i ekzekutuar në sistemin operativ të hostit.

Kjo mund të bëhet problem nga pikëpamja e sigurisë: një organizim i tillë teorikisht lejon aplikacionet e papërlyera të ndjehen midis tyre (në mënyrë të qëllimshme ose rastësore).

Përveç kësaj, gjithë ngarkesat e punës në klasterin Kubernetes ndajnë disa shërbime të përbashkëta klasteri, siç janë DNS — kjo i lejon aplikacionet të gjeni Shërbimet e aplikacioneve të tjera në klaster.

Të gjitha pikët e lartpërmendura mund të kenë kuptime të ndryshme në varësi të kërkesave që i nënshtrohen sigurisë së aplikacioneve.

Kubernetes ofron mjete të ndryshme për të parandaluar problemet në sistemin e sigurisë, siç janë Politikat e Sigurisë së Pod-it dhe Politikat e Rrjetit. Megjithatë, për t'i konfiguruar ato siç duhet kërkohet një përvojë e caktuar, përveç kësaj, ato nuk janë në gjendje të mbyllin të gjitha dobësitë në siguri.

Është e rëndësishme të kujtojmë gjithmonë se Kubernetes fillimisht është dizajnuar për ndarjen, dhe jo për izolimin dhe sigurinë.

− Mungesa e multi-tenancy të ashpër

Duke marrë parasysh shumicën e burimeve të përbashkëta në klasterin Kubernetes, ekzistojnë shumë mënyra në të cilat aplikacionet e ndryshme mund të "ngacmojnë" njëra-tjetrën.

Për shembull, një aplikacion mund të monopolizojë një burim të përbashkët (siç është procesori ose memoria) dhe t'i heqë qasje burimeve të tjera që punojnë në të njëjtin nod.

Kubernetes siguron mekanizma të ndryshëm të kontrollit për këtë lloj sjelljeje, siç janë kërkesat për burime dhe kufizimet (shih gjithashtu artikullin “ Limitet e CPU dhe throttling agresiv në Kubernetes ” — shën. përkth.), Kufijtë e Burimeve dhe LimitRanges. Megjithatë, ashtu si në rastin e sigurisë, konfigurimi i tyre është në të vërtetë kompleks dhe ato nuk janë në gjendje të parandalojnë të gjitha efektet anësore të papritura.

− Numri i madh i përdoruesve

Në rastin e një klasteri të vetëm, duhet të hapet akses për shumë njerëz. Dhe sa më i madh të jetë numri i tyre, aq më i lartë është rreziku që ata të "thyejnë" diçka.

Brenda klasterit mund të kontrolloni se kush dhe çfarë mund të bëjë përmes menaxhimit të aksesit të bazuar në role (RBAC) (shih artikullin “ Përdoruesit dhe autorizimi RBAC në Kubernetes ” — shën. përkth.). Megjithatë, kjo nuk do ta parandalojë përdoruesit të "thyejnë" diçka brenda zonës së tyre të përgjegjësisë.

− Klasteret nuk mund të rriten deri në pafundësi

Një klaster që përdoret për të gjitha ngarkesat e punës do të jetë, ndoshta, shumë i madh (në numrin e nodëve dhe pod-ve).

Por këtu lind një problem tjetër: klasteret në Kubernetes nuk mund të rriten deri në pafundësi.

Ka një kufi teorik mbi madhësinë e klasterit. Në Kubernetes, ai është rreth 5000 nodë, 150,000 pod dhe 300,000 konteinerë.

Megjithatë, në jetë reale problemet mund të fillojnë shumë më herët — për shembull, vetëm me 500 node.

Çështja është se klasterat e mëdhenj ushtrojnë një ngarkesë të lartë në shtresën menaxhuese të Kubernetes. Me fjalë të tjera, për të mbajtur klasterin në gjendje pune dhe për të përdorur burimet efektivisht, nevojitet konfigurim i kujdesshëm.

Kjo çështje shqyrtohet në artikullin përkatës në blogun origjinal me titullin "Architecting Kubernetes clusters — choosing a worker node size».

Por le të shqyrtojmë qasjen e kundërt: shumë klastera të vegjël.

2. Shumë klastera të vegjël dhe të specializuar

Me këtë qasje, përdorni një klaster të veçantë për çdo element që është në zhvillim:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Shumë klastera të vegjël

Për qëllimet e këtij artikulli, elementin që është në zhvillim e kuptojmë si një instancë aplikacioni — për shembull, versionin dev të një aplikacioni të veçantë. Në këtë strategji, Kubernetes përdoret si një

mjedis ekzekutimi për instancat e veçanta të aplikacionit. + Rreziku i kufizuar

Le të shqyrtojmë përparësitë dhe disavantazhet e këtij qasjes.

Kur ndodh një "defekt" në klaster, pasojat negative kufizohen vetëm në ato ngarkesa pune që ishin të zhvilluara në këtë klaster. Të gjitha ngarkesat e tjera mbeten të paprekura.

+ Izolimi

Ngarkesat e punës të vendosura në klastera individuale nuk ndajnë burime të përbashkëta, siç janë procesori, memoria, sistemi operativ, rrjeti ose shërbime të tjera.

Si rezultat, ne marrim një izolim të fortë midis aplikacioneve të pa lidhura, që mund të ketë një ndikim pozitiv në sigurinë e tyre.

+ Numri i vogël i përdoruesve

Duke marrë parasysh se në çdo klaster ka vetëm një grup të kufizuar ngarkesash pune, numri i përdoruesve me qasje në të reduktohet.

Sa më pak njerëz të kenë qasje në klaster, aq më i ulët është rreziku që diçka të "prishet".

Tani le të shohim disavantazhet.

− Përdorimi jo efikas i burimeve

Siç u përmend më parë, çdo klaster Kubernetes kërkon një grup të caktuar burimesh menaxhimi: node master, komponentë të shtresës kontrolluese, zgjidhje për monitorim dhe regjistrim.

Në rastin e një numri të madh klasterash të vegjël, duhet të alokoni një përqindje më të madhe të burimeve për menaxhim.

− Kostoja

Përdorimi jo efikas i burimeve automatikisht sjell kosto të larta.

Përdorimi joefektiv i burimeve automatikisht sjell kostot të larta.

Për shembull, prania e 30 master node-ëve në vend të tre për të njëjtën kapaciteti përpunimi do të ndikojë patjetër në shpenzime.

− Vështirësitë e administratës

Të menaxhosh shumë klasterë Kubernetes është shumë më e vështirë se sa të punosh me një të vetëm.

Për shembull, do të duhet të konfigurosh autentikimin dhe autorizimin për secilin klaster. Përditësimi i versionit të Kubernetes gjithashtu do të duhet të kryhet disa herë.

Ndoshta do të duhet të aplikosh automatizimin për të rritur efikasitetin e të gjitha këtyre detyrave.

Tani le të shqyrtojmë skenarët më pak ekstremë.

3. Një klaster për secilën aplikacion

Brenda këtij qasjeje, krijoni një klaster të veçantë për të gjitha instancat e aplikacionit konkret:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Klaster për aplikacion

Ky rrugë mund të merret si një përmbledhje e parimit "klaster i veçantë për ekipin", pasi zakonisht një ekip inxhinierësh merret me zhvillimin e një ose më shumë aplikacioneve.

Le të shqyrtojmë përparësitë dhe disavantazhet e këtij qasjes.

+ Klasteri mund të përshtatet për aplikacionin

Nëse aplikacioni ka nevoja të veçanta, ato mund të realizohen në klaster, pa prekur klasterët e tjerë.

Këto nevoja mund të përfshijnë punëtorë me GPU, disa plugina CNI, service mesh ose ndonjë shërbim tjetër.

Çdo klaster mund të përshtatet për aplikacionin që punon në të, në mënyrë që të përmbajë vetëm atë që është e nevojshme.

− Mjedise të ndryshme në një klaster

Një disavantazh i këtij qasjeje është se instancat e aplikacioneve nga mjedise të ndryshme bashkëjetojnë në një klaster.

Për shembull, versioni prodhues i aplikacionit funksionon në të njëjtin klaster si versioni dev. Kjo do të thotë gjithashtu se zhvilluesit kryejnë aktivitetin e tyre në të njëjtin klaster ku eksploatohet versioni prodhues i aplikacionit.

Nëse për shkak të veprimeve të zhvilluesve ose gabimeve të versionit dev ndodh një çrregullim në klaster, potencialisht mund të dëmtosh edhe versionin prodhues — një disavantazh të madh të këtij qasjeje.

Dhe, përfundimisht, skenari i fundit në listën tonë.

4. Një klaster për çdo mjedis

Ky skenar parashikon ndarjen e një klasteri të veçantë për çdo mjedis:

Projektimi i klastereve Kubernetes: sa duhet të jenë ato?
Një klaster për mjedis

Për shembull, mund të keni klasterë dev, test dhe prod, ku do të запускohet të gjitha instancat e aplikacionit të destinuara për një mjedis të caktuar.

Ja përfitimet dhe disavantazhet e këtij qasjeje.

+ Izolimi i mjedisit prodhues

Në kuadër të këtij qasje, të gjitha mjediset janë të izoluar nga njëra-tjetra. Megjithatë, në praktikë kjo është veçanërisht e rëndësishme për ambientin prodhues.

Versionet e prodhimit të aplikacionit tani nuk varen nga ajo që ndodh në grupe dhe mjedise të tjera.

Kështu, nëse ndonjëherë ndodhin probleme në grupin e zhvillimit, versionet e prodhimit të aplikacioneve do të vazhdojnë të funksionojnë siç duhet.

+ Grupi mund të përshtatet sipas mjedisit

Çdo grup mund të përshtatet sipas mjedisit të tij. Për shembull, mund të:

  • instaloni në grupin e zhvillimit mjete për zhvillim dhe debug;
  • instaloni kornizat dhe mjetet testuese në grupin test;
  • përdorni pajisje dhe kanale rrjeti më të fuqishme në grupin prod.

Kjo lejon rritjen e efikasitetit si në zhvillimin ashtu edhe në operimin e aplikacioneve.

+ Kufizimi i aksesit në grupin e prodhimit

Nevoja për të punuar drejtpërdrejt me grupin e prodhimit ndodh rrallë, kështu që mund të kufizoni ndjeshëm grupin e personave që kanë akses në të.

Mund të shkojmë edhe më tej dhe t’i heqim njerëzit aksesin në këtë grup, dhe të gjitha shpërndarjet të realizohen përmes një strumenti automatizimi CI/CD. Ky qasje do të ndihmojë në minimizimin e rrezikut të gabimeve njerëzore pikërisht aty ku është më e rëndësishme.

Tani disa fjalë mbi disavantazhet.

− Mungesa e izolimit mes aplikacioneve

Dobësia kryesore e qasjes është mungesa e izolimit harduerik dhe të burimeve mes aplikacioneve.

Aplikacionet e pa lidhura ndajnë burimet e grupit: bërthamën sistemore, procesorin, kujtesën dhe disa shërbime të tjera.

Siç është përmendur më parë, kjo mund të jetë potencialisht e rrezikshme.

− Pamundësia për të lokalizuar varësitë e aplikacioneve

Nëse një aplikacion ka kërkesa të veçanta, ato duhet të përmbushen në të gjitha grupet.

Për shembull, nëse një aplikacion kërkon GPU, atëherë çdo grup duhet të ketë të paktën një punëtor me GPU (edhe nëse ai përdoret vetëm nga ky aplikacion).

Si rezultat, rrezikojmë të kemi kostot më të larta dhe përdorim jo efikas të burimeve.

Përfundim

Me një grup të caktuar aplikacionesh, ato mund të vendosen në disa grupe të mëdha ose në shumë të vogla.

Në këtë artikull shqyrtohen përfitimet dhe disavantazhet e qasjeve të ndryshme, duke filluar nga një grup global dhe duke përfunduar me disa grupe të vogla dhe të specializuara:

  • një grumbull i madh dhe i përbashkët;
  • një numër i madh klasteresh të specializuara;
  • një klaster për çdo aplikacion;
  • një klaster për çdo ambient.

Pra, cili qasje të zgjidhni?

Si zakonisht, përgjigjja varet nga skenari i përdorimit: duhet të vlerësoni përfitimet dhe disavantazhet e qasjeve të ndryshme dhe të zgjidhni opsionin më optimal.

Megjithatë, zgjedhja nuk kufizohet në shembujt e përmendur më sipër — mund të përdoren çdo kombinim i tyre!

Për shembull, mund të organizoni dy grumbuj për çdo ekip: një grumbull për zhvillimin (ku do të jenë mjediset dev dhe test) dhe një grumbull për production (ku do të ndodhet mjedisi production).

Duke mbështetur informacionin nga ky artikull, do të jeni në gjendje të optimizoni përfitimet dhe disavantazhet në përputhje me skenarin specifik. Fat të mirë!

P.S.

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster