MÅ«su pieredze CSI draivera izstrÄdÄ Kubernetes for Yandex.Cloud
Ar prieku paziÅojam, ka Flant paplaÅ”ina savu ieguldÄ«jumu Kubernetes atvÄrtÄ pirmkoda rÄ«kos, izlaižot CSI draivera alfa versija (konteinera krÄtuves interfeiss) Yandex.Cloud.
Bet pirms pÄriet pie ievieÅ”anas detaļÄm, atbildÄsim uz jautÄjumu, kÄpÄc tas vispÄr ir vajadzÄ«gs, ja Yandex jau ir pakalpojums PÄrvaldÄ«ts pakalpojums Kubernetes.
Ievads
KÄpÄc ir Å”is?
MÅ«su uzÅÄmumÄ jau no paÅ”a Kubernetes izmantoÅ”anas sÄkuma ražoÅ”anÄ (t.i., jau vairÄkus gadus) esam izstrÄdÄjuÅ”i paÅ”i savu rÄ«ku (deckhouse), kuru, starp citu, drÄ«zumÄ plÄnojam arÄ« padarÄ«t pieejamu kÄ atvÄrtÄ koda projektu. . Ar tÄs palÄ«dzÄ«bu mÄs vienoti konfigurÄjam un konfigurÄjam visus savus klasterus, un Å”obrÄ«d to jau ir vairÄk nekÄ 100 dažÄdÄs aparatÅ«ras konfigurÄcijÄs un visos pieejamajos mÄkoÅpakalpojumos.
Klasteriem, kas izmanto deckhouse, ir visas darbÄ«bai nepiecieÅ”amÄs sastÄvdaļas: balansÄtÄji, uzraudzÄ«ba ar ÄrtÄm diagrammÄm, metrika un brÄ«dinÄjumi, lietotÄju autentifikÄcija, izmantojot ÄrÄjos pakalpojumu sniedzÄjus, lai piekļūtu visiem informÄcijas paneļiem utt. Nav jÄgas instalÄt Å”Ädu āuzsÅ«knÄtuā klasteru pÄrvaldÄ«tÄ risinÄjumÄ, jo tas bieži vien ir neiespÄjami vai radÄ«s nepiecieÅ”amÄ«bu atspÄjot pusi komponentu.
NB: TÄ ir mÅ«su pieredze, un tÄ ir diezgan specifiska. MÄs nekÄdÄ gadÄ«jumÄ neiesakÄm, ka ikvienam vajadzÄtu izvietot Kubernetes klasterus atseviŔķi, nevis izmantot gatavus risinÄjumus. Starp citu, mums nav reÄlas pieredzes Kubernetes darbÄ«bÄ no Yandex, un Å”ajÄ rakstÄ mÄs nesniegsim Ŕī pakalpojuma novÄrtÄjumu.
PaÅ”laik daudzi lieli mÄkoÅpakalpojumu sniedzÄji ir izstrÄdÄjuÅ”i draiverus, lai izmantotu savus mÄkoÅdiskus kÄ pastÄvÄ«gu sÄjumu pakalpojumÄ Kubernetes. Ja piegÄdÄtÄjam nav Å”Äda draivera, bet visas nepiecieÅ”amÄs funkcijas tiek nodroÅ”inÄtas caur API, tad nekas neliedz jums paÅ”iem ieviest draiveri. Tas notika ar Yandex.Cloud.
MÄs ÅÄmÄm par pamatu attÄ«stÄ«bai CSI draiveris DigitalOcean mÄkonim un pÄris idejas no draiveri GCP, jo mijiedarbÄ«bai ar Å”o mÄkoÅu API (Google un Yandex) ir vairÄkas lÄ«dzÄ«bas. Jo Ä«paÅ”i API un GCPun plkst Yandex atgriezt objektu Operation lai izsekotu ilgstoÅ”u darbÄ«bu statusam (piemÄram, jauna diska izveidei). Lai mijiedarbotos ar Yandex.Cloud API, izmantojiet Yandex.Cloud Go SDK.
PaveiktÄ darba rezultÄts publicÄts vietnÄ GitHub un var bÅ«t noderÄ«gi tiem, kuri kaut kÄdu iemeslu dÄļ izmanto savu Kubernetes instalÄciju Yandex.Cloud virtuÄlajÄs maŔīnÄs (bet ne gatavu pÄrvaldÄ«tu klasteru) un vÄlas izmantot (pasÅ«tÄ«t) diskus, izmantojot CSI.
Bezsaistes izmÄru maiÅa diskiem (Yandex.Cloud neatbalsta palielinot disku skaitu, kas ir pievienoti virtuÄlajai maŔīnai). InformÄciju par to, kÄ draiveris bija jÄmaina, lai izmÄru maiÅa bÅ«tu pÄc iespÄjas nesÄpÄ«gÄka, skatiet tÄlÄk.
NÄkotnÄ plÄnojam ieviest atbalstu diska momentuzÅÄmumu izveidei un dzÄÅ”anai.
GalvenÄs grÅ«tÄ«bas un kÄ tÄs pÄrvarÄt
Disku palielinÄÅ”anas iespÄjas reÄllaikÄ trÅ«kums Yandex.Cloud API ir ierobežojums, kas sarežģī PV (Persistent Volume) lieluma maiÅas darbÄ«bu: Å”ajÄ gadÄ«jumÄ ir jÄaptur lietojumprogrammu komplekts, kas izmanto disku, un tas var izraisÄ«t dÄ«kstÄves lietojumprogrammas.
SaskaÅÄ ar CSI specifikÄcijas, ja CSI kontrolleris ziÅo, ka var mainÄ«t disku izmÄrus tikai ābezsaistÄā (VolumeExpansion.OFFLINE), tad diska palielinÄÅ”anas procesam vajadzÄtu notikt Å”Ädi:
Ja spraudnim ir tikai VolumeExpansion.OFFLINE paplaÅ”inÄÅ”anas iespÄjas un apjoms paÅ”laik ir publicÄts vai pieejams mezglÄ ControllerExpandVolume JÄizsauc TIKAI pÄc:
Spraudnim ir kontrolieris PUBLISH_UNPUBLISH_VOLUME spÄjas un ControllerUnpublishVolume ir veiksmÄ«gi izsaukts.
VAI ARÄŖ
Spraudnim NAV kontrollera PUBLISH_UNPUBLISH_VOLUME iespÄju, spraudnim ir mezgls STAGE_UNSTAGE_VOLUME spÄjas un NodeUnstageVolume ir veiksmÄ«gi pabeigts.
VAI ARÄŖ
Spraudnim NAV kontrollera PUBLISH_UNPUBLISH_VOLUME spÄja, ne mezgls STAGE_UNSTAGE_VOLUME spÄjas un NodeUnpublishVolume ir veiksmÄ«gi pabeigts.
Tas bÅ«tÄ«bÄ nozÄ«mÄ, ka pirms tÄ paplaÅ”inÄÅ”anas disks ir jÄatvieno no virtuÄlÄs maŔīnas.
TomÄr diemžÄl Ä«stenoÅ”anu CSI specifikÄcija, izmantojot blakusvÄÄ£us, neatbilst Ŕīm prasÄ«bÄm:
BlakusvÄÄ£a konteinerÄ csi-attacher, kam vajadzÄtu bÅ«t atbildÄ«gam par vajadzÄ«gÄs atstarpes esamÄ«bu starp stiprinÄjumiem, Ŕī funkcionalitÄte vienkÄrÅ”i nav ieviesta bezsaistes izmÄru maiÅÄ. Par to tika uzsÄkta diskusija Å”eit.
Kas Ä«sti ir blakusvÄÄ£a konteiners Å”ajÄ kontekstÄ? Pats CSI spraudnis nesadarbojas ar Kubernetes API, bet atbild tikai uz gRPC izsaukumiem, ko tam nosÅ«ta blakusvÄÄ£a konteineri. JaunÄkais tiek izstrÄdÄti Kubernetes kopiena.
MÅ«su gadÄ«jumÄ (CSI spraudnis) diska palielinÄÅ”anas darbÄ«ba izskatÄs Å”Ädi:
MÄs saÅemam gRPC zvanu ControllerExpandVolume;
MÄs cenÅ”amies palielinÄt disku API, bet mÄs saÅemam kļūdu par neiespÄjamÄ«bu veikt operÄciju, jo disks ir uzstÄdÄ«ts;
Diska identifikatoru saglabÄjam kartÄ, kurÄ ir diski, kuriem jÄveic palielinÄÅ”anas operÄcija. TÄlÄk Ä«suma labad mÄs Å”o karti sauksim kÄ volumeResizeRequired;
ManuÄli noÅemiet disku, kurÄ tiek izmantots disks. Kubernetes to restartÄs. Lai diskam nebÅ«tu laika uzstÄdÄ«t (ControllerPublishVolume) pirms palielinÄÅ”anas darbÄ«bas pabeigÅ”anas, mÄÄ£inot montÄt, mÄs pÄrbaudÄm, vai dotais disks joprojÄm ir iekÅ”Ä volumeResizeRequired un atgriezt kļūdu;
CSI draiveris mÄÄ£ina atkÄrtoti izpildÄ«t izmÄru maiÅas darbÄ«bu. Ja darbÄ«ba bija veiksmÄ«ga, izÅemiet disku no volumeResizeRequired;
Jo TrÅ«kst diska ID no volumeResizeRequired, ControllerPublishVolume veiksmÄ«gi iziet, disks ir uzstÄdÄ«ts, pods sÄkas.
Viss izskatÄs pietiekami vienkÄrÅ”i, taÄu, kÄ vienmÄr, ir nepilnÄ«bas. Palielina diskus ÄrÄjais izmÄra mainÄ«tÄjs, kas operÄcijas laikÄ raduÅ”Äs kļūdas gadÄ«jumÄ izmanto rindu ar eksponenciÄlu taimauta laika pieaugumu lÄ«dz 1000 sekundÄm:
func DefaultControllerRateLimiter() RateLimiter {
return NewMaxOfRateLimiter(
NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
// 10 qps, 100 bucket size. This is only for retry speed and its only the overall factor (not per item)
&BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
)
}
TÄ rezultÄtÄ periodiski diska paplaÅ”inÄÅ”anas darbÄ«ba var tikt pagarinÄta par 15 + minÅ«tÄm, un lÄ«dz ar to atbilstoÅ”ais pods nav pieejams.
VienÄ«gÄ iespÄja, kas diezgan viegli un nesÄpÄ«gi ļÄva samazinÄt iespÄjamo dÄ«kstÄvi, bija mÅ«su ÄrÄjÄ izmÄra mainÄ«tÄja versijas izmantoÅ”ana ar maksimÄlo taimauta ierobežojumu. 5 sekundÄs:
MÄs neuzskatÄ«jÄm par vajadzÄ«gu steidzami uzsÄkt diskusiju un lÄpÄ«t ÄrÄjo izmÄru mainÄ«tÄju, jo disku izmÄru maiÅa bezsaistÄ ir atgrieÅ”anÄs, kas drÄ«z pazudÄ«s no visiem mÄkoÅa pakalpojumu sniedzÄjiem.
KÄ sÄkt lietot?
Draiveris tiek atbalstÄ«ts Kubernetes versijÄ 1.15 un jaunÄkÄ versijÄ. Lai vadÄ«tÄjs varÄtu strÄdÄt, ir jÄievÄro Å”Ädas prasÄ«bas:
AtzÄ«mÄt --allow-privileged iestatÄ«t uz vÄrtÄ«bu true API serverim un kubelet;
Iekļauts --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true API serverim un kubelet;
Mount pavairoÅ”ana (mount pavairoÅ”ana) ir jÄiespÄjo klasterÄ«. Lietojot Docker, dÄmonam jÄbÅ«t konfigurÄtam, lai atļautu koplietotus stiprinÄjumus.
Visas nepiecieÅ”amÄs darbÄ«bas paÅ”ai instalÄÅ”anai aprakstÄ«ts README. InstalÄÅ”ana ietver objektu izveidi Kubernetes no manifestiem.
Lai vadÄ«tÄjs varÄtu strÄdÄt, jums bÅ«s nepiecieÅ”ams:
Lai mijiedarbotos ar Yandex.Cloud API, CSI draiveris izmanto pakalpojuma kontu. ManifestÄ jÄnodod Secret autorizÄtÄs atslÄgas no pakalpojuma konta. DokumentÄcijÄ aprakstÄ«ts, kÄ izveidot pakalpojuma kontu un iegÅ«t atslÄgas.
RezultÄtÄ vÄlamies atzÄ«mÄt, ka Å”o CSI draiveri ieviesÄm nevis aiz lielas vÄlmes izklaidÄties rakstÄ«t lietojumprogrammas Go, bet gan tÄdÄļ, ka uzÅÄmuma iekÅ”ienÄ bija steidzama nepiecieÅ”amÄ«ba. Mums neŔķiet praktiski saglabÄt savu ievieÅ”anu, tÄpÄc, ja Yandex izrÄdÄ«s interesi un nolems turpinÄt atbalstÄ«t draiveri, mÄs ar prieku nodosim krÄtuvi viÅiem.
TurklÄt Yandex, iespÄjams, savÄ pÄrvaldÄ«tajÄ Kubernetes klasterÄ« ir ieviesis CSI draiveri, ko var izlaist atvÄrtÄ pirmkoda režīmÄ. MÄs arÄ« uzskatÄm, ka Ŕī attÄ«stÄ«bas iespÄja ir labvÄlÄ«ga - sabiedrÄ«ba varÄs izmantot pÄrbaudÄ«tu draiveri no pakalpojumu sniedzÄja, nevis no treÅ”Äs puses uzÅÄmuma.