
Jemi të lumtur të njoftojmë se kompania «Flant» po kontribuon më tej në mjetet Open Source për Kubernetes duke lëshuar (Container Storage Interface) për Yandex.Cloud.
Por para se të kalojmë në detajet e zbatimit, le të përgjigjemi në pyetjen: përse është kjo e nevojshme, kur Yandex tashmë ka shërbimin .
Hyrje
Pse kjo?
Që nga fillimi i përdorimit të Kubernetes në prodhim (në fakt, prej disa vitesh), brenda kompanisë tonë është zhvilluar një mjet i veçantë (deckhouse), i cili, për ta thënë me të vërtetë, ne gjithashtu planifikojmë ta bëjmë në dispozicion si një projekt Open Source së shpejti. Me këtë mjet ne konfigurojmë dhe rregullojmë njëlloj të gjithë klasterët tanë, dhe aktualisht kemi më shumë se 100, në konfigurime të ndryshme hardueri dhe në të gjitha shërbimet e disponueshme në cloud.
Klasterët që përdorin deckhouse kanë të gjithë komponentët e nevojshëm për funksionimin: balancues, monitorim me grafikë të rehatshme, metrika dhe alerte, autentifikimin e përdoruesve përmes ofruesve të jashtëm për qasje në të gjithë dashboard-et dhe kështu me radhë. Një klaster i tillë "i fuqizuar" nuk ka kuptim të vendoset në një zgjidhje të menaxhuar, sepse shpesh kjo është e pamundur ose do të kërkojë çaktivizimin e gjysmës së komponentëve.
NB: Ky është përvoja jonë dhe ajo është mjaft specifike. Ne asnjëherë nuk pretendojmë se të gjithë duhet të merren me vendosjen e klasterëve Kubernetes në vend të përdorimit të zgjidhjeve të gatshme. Po ashtu, ne nuk kemi përvojë të vërtetë në përdorimin e Kubernetes nga Yandex dhe nuk do të japim ndonjë vlerësim për këtë shërbim në këtë artikull.
ĂfarĂ« Ă«shtĂ« kjo dhe pĂ«r kĂ«?
Kështu, ne tashmë kemi folur për qasjen moderne ndaj ruajtjes në Kubernetes: dhe në këtë qasje.
Aktualisht, shumë ofrues të mëdhenj të shërbimeve cloud kanë zhvilluar ndihmës për të përdorur diskët e tyre "cloud" si Volume të Eshte zgjatur në Kubernetes. Nëse një ndihmës i tillë nuk ekziston te ofruesi, por të gjitha funksionet e nevojshme janë në dispozicion përmes API, atëherë askush nuk e pengon atëherë të implementojë ndihmësin me forcat e tij. Kjo ndodhi me ne me Yandex.Cloud.
Ne morëm si bazë për zhvillim dhe disa ide nga , pasi ndërveprimi me API-në e këtyre cloud-eve (Google dhe Yandex) ka disa ngjashmëri. Në veçanti, API ka , dhe kthen objekti Operacioni për të ndjekur statusin e operacioneve të gjata (p.sh., krijimi i një disku të ri). Për të ndërvepruar me API-në e Yandex.Cloud përdoret .
Rezultati i punës së kryer dhe mund të jetë i dobishëm për ata që për një arsye apo tjetër përdorin instalimin e tyre të Kubernetes në makinat virtuale të Yandex.Cloud (por jo një klastri të menaxhuar) dhe do të donin të përdorin (të porositin) disqet përmes CSI.
Realizimi
Përgjegjësi kryesore
Aktualisht, drejtori mbështet funksionet e mëposhtme:
- Porositë e disqeve në të gjitha zonat e klastri sipas topologjisë së nyjeve të disponueshme në klasër;
- Fshirja e disqeve të porositura më parë;
- Resize offline për disqet (Yandex.Cloud rritja e disqeve që janë të montuara në makinat virtuale). Për mënyrën se si u desh të rregullohej drejtori për të kryer resize në mënyrë sa më pa dhimbje, shiko më poshtë.
Në të ardhmen, është parashikuar të realizohet mbështetje për krijimin dhe fshirjen e snapshoteve të disqeve.
Vështirësia kryesore dhe tejkalimi i saj
Mungesa në API-në e Yandex.Cloud e mundësisë për të rritur disqet në kohë reale - një kufizim që e komplikon operacionin e resize për PV (Volume të Përshtatshëm): pasi në këtë rast është e nevojshme që pod-i i aplikacionit që përdor disku të ndalet, dhe kjo mund të shkaktojë ndalim të aplikacionit.
Sipas , nĂ«se CSI-kontrolleri raporton se di tĂ« bĂ«jĂ« resize disqesh vetĂ«m ânĂ« offlineâ (VolumeExpansion.OFFLINE), atĂ«herĂ« procesi i rritjes sĂ« diskut duhet tĂ« kalojĂ« kĂ«shtu:
Nëse plugu i ka vetëm
VolumeExpansion.OFFLINEkapacitetin e zgjerimit dhe volumi aktualisht Ă«shtĂ« publikuar ose nĂ« dispozitĂ« nĂ« njĂ« nyje, atĂ«herĂ«ControllerExpandVolumeDUHET tĂ« thirret VETĂM pas ose:
- Pluga ka
PUBLISH_UNPUBLISH_VOLUMEkapacitetin dheControllerUnpublishVolumeĂ«shtĂ« thirrur me sukses.OSE NJĂTJETĂR
- Pluga NUK ka kapacitetin e kontrollit, pluga ka nyjë
PUBLISH_UNPUBLISH_VOLUMESTAGE_UNSTAGE_VOLUMEkapacitetin, dheNodeUnstageVolumeĂ«shtĂ« pĂ«rfunduar me sukses.kapaciteti, as nyjaOSE NJĂTJETĂR
- Pluga NUK ka kapacitetin e kontrollit, pluga ka nyjë
PUBLISH_UNPUBLISH_VOLUMENodeUnpublishVolumekapacitetin, dheNodeUnstageVolumenuk është përfunduar me sukses.ka përfunduar me sukses.
Në thelb, kjo do të thotë se është e nevojshme të shkëputet disku nga makinat virtuale përpara se të rritet.
Megjithatë, fatkeqësisht, implementimi specifikimet e CSI përmes sidecar-ëve nuk i përmbushin këto kërkesa:
- NĂ« kontejnerin sidecar
csi-attacher, i cili duhet tĂ« pĂ«rgjigjet pĂ«r tĂ« siguruar intervalin e nevojshĂ«m midis montimeve, gjatĂ« offline-resize nuk Ă«shtĂ« realizuar ky funksionalitet. Diskutimi pĂ«r kĂ«tĂ« e iniciuan . - ĂfarĂ« Ă«shtĂ« njĂ« kontenier sidecar nĂ« kĂ«tĂ« kontekst? Plugins-i CSI nuk merret me ndĂ«rveprimin me API-nĂ« Kubernetes, ai vetĂ«m reagon nĂ« thirrjet gRPC, tĂ« cilat i dĂ«rgojnĂ« kontenierĂ«t sidecar. KĂ«ta tĂ« fundit nga komuniteti Kubernetes.
Në rastin tonë (plugin-i CSI) operacioni i zgjerimit të diskut duket kështu:
- Marrim thirrjen gRPC
ControllerExpandVolume; - Përpiqemi të zgjedhim diskun në API, por marrim një gabim për pamundësinë e realizimit të operacionit, sepse disku është i montuar;
- Ruajmë identifikuesin e diskut në një hartë, që përmban disqet, për të cilat duhet të kryhet operacioni i zgjerimit. Më vonë, për shkak të shkurtësisë, do ta quajmë këtë hartë si
volumeResizeRequired; - Manualisht heqim pod-in, i cili përdor diskun. Kubernetes do ta rindezë atë. Në mënyrë që disku të mos montohen
ControllerPublishVolumepara përfundimit të operacionit të zgjerimit gjatë përpjekjes për montim, kontrollojmë që ky disk të jetë ende nëvolumeResizeRequireddhe kthejmë një gabim; - Shoferi CSI përpiqet ta kryejë përsëri operacionin e zgjerimit. Nëse operacioni kalon me sukses, atëherë heqim diskun nga
volumeResizeRequired; - Nëse identifikuesi i diskut nuk është i pranishëm në
volumeResizeRequired,ControllerPublishVolumekalon me sukses, disku montohen, pod-i aktivizohet.
E gjithë kjo duket mjaft e thjeshtë, por siç ndodh gjithmonë, ka disa pengesa. Zgjerimin e disqeve e menaxhon , i cili në rast gabimi gjatë realizimit të operacionit me rritje eksponenciale të kohës së skadimit deri në 1000 sekonda:
func DefaultControllerRateLimiter() RateLimiter {
return NewMaxOfRateLimiter(
NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
\/\/ 10 qps, 100 bucket size. Kjo është vetëm për shpejtësinë e riprovimit dhe është vetëm faktori i përgjithshëm (jo për çdo artikull)
&BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
)
}Kjo mund të çojë përherë në rritjen e operacionit të zgjerimit të diskut për 15+ minuta dhe, kështu, në mungesën e përkatës të pod-it.
E vetmja mundësi, e cila na lejojë të reduktojmë kohën e mundshme të papunësisë lehtësisht dhe pa dhimbje, ishte përdorimi i versionit tonë të external-resizer me maximin e kohës së skadimit :
workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)Nuk arritëm të diskutojmë me urgjencë dhe të patch-ojmë external-resizer, sepse rritja offline e disqeve është një relikt, i cili së shpejti do të zhduket nga të gjithë ofruesit e reja cloud.
Si të filloni ta përdorni?
Shoferi mbështetet në Kubernetes versionin 1.15 dhe më të lartë. Për të punuar shoferi duhet të plotësojnë kërkesat e mëposhtme:
- Flamuri
--allow-privilegedcaktuar në vlerëe vërtetëpër serverin API dhe kubelet; - Aktivizuar
--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=truepër serverin API dhe kubelet; - Propagimi i montimit () duhet të jetë i aktivizuar në klaster. Kur përdoret Docker, demon duhet të jetë i konfiguruar në mënyrë që të lejojë objektet e ndara të montimit (shared mounts).
Të gjitha hapat e nevojshëm për instalimin e vetë . Instalimi përfshin krijimin e objekteve në Kubernetes nga manifestet.
Për të punuar me driverin do t'ju nevojitet ajo që vijon:
- Të specifikoni në manifest identifikuesin e katalogut (
folder-id) të Yandex.Cloud (); - Për të komunikuar me API-në e Yandex.Cloud në driverin CSI përdoret një llogari shërbyese. Në manifestin Secret nevojitet të kaloni nga llogaria e shërbimit. Në dokumentacionin , si të krijoni një llogari shërbimi dhe të merrni çelësat.
NĂ« pĂ«rgjithĂ«si â , dhe ne do tĂ« ishim tĂ« lumtur pĂ«r çdo feedback dhe , nĂ«se hasni ndonjĂ« problem!
Mbështetje e mëtejshme
Në përfundim, do të donim të theksonim se ky driver CSI është realizuar jo për një dëshirë të madhe për të ndihmuar me shkruar aplikacione në Go, por për shkak të një nevoje të ngutshme brenda kompanisë. Të mbash një implementim tëndin nuk na duket praktik, prandaj, nëse Yandex tregon interes dhe vendos të vazhdojë mbështetje e driverit, do ta kalojmë repo-n me kënaqësi në duar e tyre.
PĂ«r mĂ« tepĂ«r, ndoshta Yandex ka njĂ« implementim tĂ« vetin tĂ« driverit CSI nĂ« klasterin e menaxhuar Kubernetes, qĂ« mund tĂ« lĂ«shohet nĂ« Open Source. NjĂ« zhvillim i tillĂ« na duket gjithashtu favorizues â komuniteti mund tĂ« pĂ«rfitojĂ« nga njĂ« driver i provuar nga ofruesi i shĂ«rbimeve, e jo nga njĂ« kompani e jashtme.
P.S.
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «»;
- «».
Burimi: habr.com
