L-esperjenza tagħna fl-iżvilupp ta 'sewwieq CSI f'Kubernetes għal Yandex.Cloud

L-esperjenza tagħna fl-iżvilupp ta 'sewwieq CSI f'Kubernetes għal Yandex.Cloud

Għandna pjaċir inħabbru li Flant qed jespandi l-kontribut tiegħu għal għodod Open Source għal Kubernetes billi joħroġ verżjoni alfa tas-sewwieq CSI (Interface tal-Ħażna tal-Kontenitur) għal Yandex.Cloud.

Iżda qabel ma ngħaddu għad-dettalji tal-implimentazzjoni, ejja nwieġbu l-mistoqsija għaliex dan huwa meħtieġ meta Yandex diġà għandu servizz Servizz Immexxi għal Kubernetes.

Introduzzjoni

Għaliex dan?

Fi ħdan il-kumpanija tagħna, mill-bidu nett tal-użu ta' Kubernetes fil-produzzjoni (jiġifieri għal bosta snin issa), ilna niżviluppaw l-għodda tagħna stess (deckhouse), li, mill-mod, qed nippjanaw ukoll li dalwaqt nagħmlu disponibbli bħala proġett Open Source. . Bl-għajnuna tagħha, aħna nikkonfiguraw u kkonfiguraw b'mod uniformi l-clusters kollha tagħna, u bħalissa diġà hemm aktar minn 100 minnhom, fuq varjetà wiesgħa ta 'konfigurazzjonijiet ta' ħardwer u fis-servizzi cloud kollha disponibbli.

Clusters li jużaw deckhouse għandhom il-komponenti kollha meħtieġa għall-operazzjoni: balancers, monitoraġġ b'charts konvenjenti, metriċi u twissijiet, awtentikazzjoni tal-utent permezz ta 'fornituri esterni għall-aċċess għad-dashboards kollha, eċċ. M'hemm l-ebda punt li jiġi installat raggruppament "ippumpjat" bħal dan f'soluzzjoni ġestita, peress li ħafna drabi dan huwa jew impossibbli jew iwassal għall-ħtieġa li nofs il-komponenti jiġu diżattivati.

NB: Din hija l-esperjenza tagħna, u hija pjuttost speċifika. Aħna bl-ebda mod qed nissuġġerixxu li kulħadd għandu juża raggruppamenti Kubernetes waħdu minflok juża soluzzjonijiet lesti. Mill-mod, m'għandna l-ebda esperjenza reali fl-operat ta 'Kubernetes minn Yandex u mhux se nagħtu l-ebda valutazzjoni ta' dan is-servizz f'dan l-artikolu.

X'inhu u għal min?

Allura, diġà tkellimna dwar l-approċċ modern għall-ħażna f'Kubernetes: kif taħdem is-CSI? и kif ġiet il-komunità għal dan l-approċċ.

Bħalissa, ħafna fornituri kbar tas-servizz tal-cloud żviluppaw sewwieqa biex jużaw id-diski tal-cloud tagħhom bħala Volum Persistenti f'Kubernetes. Jekk il-fornitur ma jkollux sewwieq bħal dan, iżda l-funzjonijiet kollha meħtieġa huma pprovduti permezz tal-API, allura xejn ma jipprevjenik milli timplimenta s-sewwieq lilek innifsek. Dan huwa dak li ġara ma' Yandex.Cloud.

Ħadna bħala bażi għall-iżvilupp Sewwieq CSI għal DigitalOcean cloud u ftit ideat minn sewwieqa għall-GCP, peress li l-interazzjoni mal-API ta 'dawn is-sħab (Google u Yandex) għandha numru ta' xebh. B'mod partikolari, l-API u GCP, u y Yandex jirritorna oġġett Operation biex issegwi l-istatus ta 'operazzjonijiet li ilhom għaddejjin (per eżempju, il-ħolqien ta' disk ġdid). Biex jinteraġixxu mal-API Yandex.Cloud, uża Yandex.Cloud Go SDK.

Ir-riżultat tax-xogħol li sar ippubblikat fuq GitHub u jista 'jkun utli għal dawk li, għal xi raġuni, jużaw l-installazzjoni Kubernetes tagħhom stess fuq magni virtwali Yandex.Cloud (iżda mhux cluster ġestiti lesti) u jixtiequ jużaw (ordni) diski permezz ta' CSI.

Реализация

Karatteristiċi ewlenin

Bħalissa s-sewwieq jappoġġja l-funzjonijiet li ġejjin:

  • Diski li jordnaw fiż-żoni kollha tal-cluster skont it-topoloġija tan-nodi fil-cluster;
  • Tneħħija ta' diski ordnati qabel;
  • Id-daqs offline għad-diski (Yandex.Cloud ma tappoġġjax tiżdied id-diski li huma mmuntati mal-magna virtwali). Għal informazzjoni dwar kif is-sewwieq kellu jiġi modifikat biex id-daqs mill-ġdid ikun bla tbatija kemm jista' jkun, ara hawn taħt.

Fil-futur, qed nippjanaw li nimplimentaw appoġġ għall-ħolqien u t-tħassir ta 'snapshots tad-disk.

Id-diffikultà ewlenija u kif tegħlebha

In-nuqqas tal-kapaċità li jiżdiedu d-diski f'ħin reali fl-API Yandex.Cloud hija limitazzjoni li tikkomplika l-operazzjoni ta 'resize għal PV (Volum Persistenti): f'dan il-każ, huwa meħtieġ li l-pod tal-applikazzjoni li juża d-diska jitwaqqaf, u dan jista 'jikkawża applikazzjonijiet ta' waqfien.

Skond Speċifikazzjonijiet CSI, jekk il-kontrollur CSI jirrapporta li jista 'jbiddel id-daqs tad-diski biss "offline" (VolumeExpansion.OFFLINE), allura l-proċess taż-żieda tad-disk għandu jimxi hekk:

Jekk il-plugin għandu biss VolumeExpansion.OFFLINE il-kapaċità u l-volum ta 'espansjoni bħalissa huma ppubblikati jew disponibbli fuq node allura ControllerExpandVolume GĦANDU jissejjaħ BISS wara jew:

  • Il-plugin għandu kontrollur PUBLISH_UNPUBLISH_VOLUME kapaċità u ControllerUnpublishVolume ġie invokat b'suċċess.

JEW INKELLA

  • Il-plugin MA għandux kontrollur PUBLISH_UNPUBLISH_VOLUME kapaċità, il-plugin għandu node STAGE_UNSTAGE_VOLUME kapaċità, u NodeUnstageVolume tlestiet b'suċċess.

JEW INKELLA

  • Il-plugin MA għandux kontrollur PUBLISH_UNPUBLISH_VOLUME kapaċità, u lanqas node STAGE_UNSTAGE_VOLUME kapaċità, u NodeUnpublishVolume tlestiet b'suċċess.

Dan essenzjalment ifisser li għandek bżonn tneħħi d-diska mill-magna virtwali qabel tespandiha.

Madankollu, sfortunatament implimentazzjoni L-ispeċifikazzjoni CSI permezz tal-sidecars ma tissodisfax dawn ir-rekwiżiti:

  • F'kontenitur sidecar csi-attacher, li għandu jkun responsabbli għall-preżenza tad-distakk meħtieġ bejn il-muntaturi, din il-funzjonalità sempliċement mhix implimentata fir-riżors offline. Inbdiet diskussjoni dwar dan hawn.
  • X'inhu eżattament kontenitur sidecar f'dan il-kuntest? Il-plugin CSI innifsu ma jinteraġixxix mal-API Kubernetes, iżda jwieġeb biss għal sejħiet gRPC mibgħuta lilha minn kontenituri sidecar. Latest qed jiġu żviluppati mill-komunità Kubernetes.

Fil-każ tagħna (plugin CSI), l-operazzjoni taż-żieda tad-diska tidher bħal din:

  1. Nirċievu telefonata gRPC ControllerExpandVolume;
  2. Qed nippruvaw inżidu d-disk fl-API, iżda nirċievu żball dwar l-impossibbiltà li titwettaq l-operazzjoni minħabba li d-disk huwa mmuntat;
  3. Aħna nissejvjaw l-identifikatur tad-diska f'mappa li fiha d-diski li għalihom trid titwettaq l-operazzjoni taż-żieda. Hawn taħt, għall-qosor, aħna se nsejħu din il-mappa bħala volumeResizeRequired;
  4. Neħħi manwalment il-pod li qed juża d-diska. Kubernetes se jerġa' jibda. Sabiex id-disk ma jkollux ħin biex jintrama (ControllerPublishVolume) qabel ma tlesti l-operazzjoni ta 'żieda meta tipprova timmonta, aħna niċċekkjaw li d-disk mogħti għadu fih volumeResizeRequired u jirritorna żball;
  5. Is-sewwieq tas-CSI jipprova jerġa' jesegwixxi l-operazzjoni ta' resize. Jekk l-operazzjoni kienet ta 'suċċess, imbagħad neħħi d-diska minn volumeResizeRequired;
  6. Għax ID tad-disk hija nieqsa minn volumeResizeRequired, ControllerPublishVolume jgħaddi b'suċċess, id-diska tiġi mmuntata, il-powd jibda.

Kollox jidher sempliċi biżżejjed, iżda bħal dejjem hemm in-nases. Tkabbar id-diski resizer estern, li f'każ ta 'żball waqt l-operazzjoni juża kju b'żieda esponenzjali fil-ħin ta' timeout sa 1000 sekonda:

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)},
  )
}

Dan jista 'jwassal perjodikament fl-operazzjoni ta' espansjoni tad-diska tiġi estiża għal 15+ minuta u, għalhekk, il-pod korrispondenti ma jkunx disponibbli.

L-unika għażla li pjuttost faċilment u mingħajr tbatija ppermettietna nnaqqsu l-perijodi ta’ waqfien potenzjali kienet l-użu tal-verżjoni tagħna ta’ external-resizer b’limitu massimu ta’ timeout f'5 sekondi:

workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)

Aħna ma qisniex meħtieġ li tinbeda b'mod urġenti diskussjoni u garża l-externa-resizer, għaliex offline resize tad-diski huwa throwback li dalwaqt se jisparixxi mill-fornituri kollha tal-cloud.

Kif tibda tuża?

Is-sewwieq huwa appoġġjat fuq Kubernetes verżjoni 1.15 u ogħla. Biex ix-xufier jaħdem, iridu jiġu ssodisfati r-rekwiżiti li ġejjin:

  • Bandiera --allow-privileged issettjat għall-valur true għal server API u kubelet;
  • Inkluż --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true għal server API u kubelet;
  • Propagazzjoni tal-muntanji (propagazzjoni impunjazzjoni) għandhom ikunu attivati ​​fuq il-cluster. Meta tuża Docker, id-daemon għandu jiġi kkonfigurat biex jippermetti muntaġġi kondiviżi.

Il-passi kollha meħtieġa għall-installazzjoni nnifisha deskritt f'README. L-installazzjoni tinvolvi l-ħolqien ta 'oġġetti f'Kubernetes minn manifesti.

Biex ix-xufier jaħdem ser ikollok bżonn dan li ġej:

  • Speċifika l-identifikatur tad-direttorju fil-manifest (folder-id) Yandex.Cloud (ara d-dokumentazzjoni);
  • Biex jinteraġixxi mal-API Yandex.Cloud, is-sewwieq CSI juża kont tas-servizz. Fil-manifest, Sigriet għandu jiġi mgħoddi ċwievet awtorizzati mill-kont tas-servizz. Fid-dokumentazzjoni deskritt, kif toħloq kont tas-servizz u tikseb ċwievet.

Kollox f 'Kollox - ipprova, u se nkunu ferħanin li nirċievu feedback u kwistjonijiet ġoddajekk tiltaqa' ma' xi problemi!

Aktar appoġġ

B’riżultat ta’ dan, nixtiequ ninnutaw li dan ix-xufier tas-CSI implimentajna mhux b’xewqa kbira li nieħdu gost bil-miktub tal-applikazzjonijiet fil-Go, iżda minħabba ħtieġa urġenti fi ħdan il-kumpanija. Ma jidhirx prattiku għalina li nżommu l-implimentazzjoni tagħna stess, għalhekk jekk Yandex juri interess u jiddeċiedi li jkompli jappoġġja lis-sewwieq, inkunu kuntenti li nittrasferixxu r-repożitorju lilhom.

Barra minn hekk, Yandex probabbilment għandu l-implimentazzjoni tiegħu stess tas-sewwieq CSI fil-cluster Kubernetes ġestit tiegħu, li jista 'jiġi rilaxxat f'Open Source. Aħna naraw ukoll din l-għażla ta 'żvilupp bħala favorevoli - il-komunità tkun tista' tuża sewwieq ippruvat minn fornitur tas-servizz, u mhux minn kumpanija ta 'parti terza.

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment