Eksperyans nou nan devlope yon chofè CSI nan Kubernetes pou Yandex.Cloud

Eksperyans nou nan devlope yon chofè CSI nan Kubernetes pou Yandex.Cloud

Nou kontan anonse ke Flant ap agrandi kontribisyon li nan zouti Open Source pou Kubernetes lè li pibliye vèsyon alfa chofè CSI a (Entèfas Depo Container) pou Yandex.Cloud.

Men, anvan ou ale nan detay aplikasyon yo, ann reponn kesyon an poukisa sa nesesè lè Yandex deja gen yon sèvis. Jere sèvis pou Kubernetes.

Entwodiksyon

Poukisa sa a?

Nan konpayi nou an, depi nan konmansman an nan sèvi ak Kubernetes nan pwodiksyon (sa vle di pou plizyè ane kounye a), nou te devlope pwòp zouti nou an (deckhouse), ki, nan chemen an, nou planifye tou pou byento disponib kòm yon pwojè Open Source. . Avèk èd li, nou konfigirasyon ak konfigirasyon inifòm tout grap nou yo, e kounye a gen plis pase 100 ladan yo, sou yon gran varyete konfigirasyon pyès ki nan konpitè ak nan tout sèvis nwaj ki disponib.

Gwoup ki sèvi ak deckhouse gen tout eleman ki nesesè pou operasyon an: balanse, siveyans ak tablo pratik, mezi ak alèt, otantifikasyon itilizatè atravè founisè ekstèn pou aksè nan tout tablodbò, ak sou sa. Pa gen okenn pwen nan enstale tankou yon gwoup "ponpe moute" nan yon solisyon jere, paske sa a se souvan swa enposib oswa ap mennen nan bezwen an enfim mwatye nan eleman yo.

NB: Sa a se eksperyans nou an, epi li se byen espesifik. Nou pa nan okenn fason sijere ke tout moun ta dwe deplwaye grap Kubernetes poukont yo olye pou yo sèvi ak solisyon pare yo. By wout la, nou pa gen okenn eksperyans reyèl nan opere Kubernetes soti nan Yandex epi nou pa pral bay okenn evalyasyon nan sèvis sa a nan atik sa a.

Ki sa li ye ak pou ki moun?

Se konsa, nou te deja pale sou apwòch modèn nan depo nan Kubernetes: ki jan CSI travay? и ki jan kominote a te vini nan apwòch sa a.

Kounye a, anpil gwo founisè sèvis nwaj yo te devlope chofè pou itilize disk nwaj yo kòm Volim Pèsistan nan Kubernetes. Si founisè a pa gen yon chofè konsa, men tout fonksyon ki nesesè yo bay atravè API a, Lè sa a, pa gen anyen ki anpeche w aplike chofè a tèt ou. Sa a se sa ki te pase ak Yandex.Cloud.

Nou te pran kòm baz pou devlopman Chofè CSI pou nwaj DigitalOcean ak yon koup nan lide soti nan chofè pou GCP, depi entèraksyon ak API nan nwaj sa yo (Google ak Yandex) gen yon kantite resanblans. An patikilye, API a ak GCP, ak nan Yandèks retounen yon objè Operation pou swiv estati operasyon ki dire lontan (pa egzanp, kreye yon nouvo disk). Pou kominike avèk Yandex.Cloud API, sèvi ak Yandex.Cloud Go SDK.

Rezilta travay la fè pibliye sou GitHub epi yo ka itil pou moun ki, pou kèk rezon, sèvi ak pwòp enstalasyon Kubernetes yo sou Yandex.Cloud machin vityèl (men se pa yon gwoup ki pare jere) epi ki ta renmen sèvi ak (lòd) disk atravè CSI.

Aplikasyon

Karakteristik prensipal la

Kounye a chofè a sipòte fonksyon sa yo:

  • Kòmande disk nan tout zòn nan gwoup la dapre topoloji nan nœuds yo nan gwoup la;
  • Retire disk ki te deja bay lòd;
  • Offline redimensionner pou disk (Yandex.Cloud pa sipòte ogmante disk yo ki monte sou machin vityèl la). Pou enfòmasyon sou fason chofè a te dwe modifye pou fè redimensionnement san doulè ke posib, gade anba a.

Nan tan kap vini an, nou planifye aplike sipò pou kreye ak efase snapshots disk.

Difikilte prensipal la ak ki jan yo simonte li

Mank kapasite pou ogmante disk an tan reyèl nan Yandex.Cloud API a se yon limit ki konplike operasyon an redimansyon pou PV (Persistent Volim): nan ka sa a, li nesesè ke gous aplikasyon an ki sèvi ak disk la sispann, ak sa a ka lakòz aplikasyon pou D '.

Dapre Espesifikasyon CSI, si kontwolè CSI a rapòte ke li ka redimensionne disk sèlman "offline" (VolumeExpansion.OFFLINE), Lè sa a, pwosesis pou ogmante disk la ta dwe ale tankou sa a:

Si plugin a gen sèlman VolumeExpansion.OFFLINE kapasite ekspansyon ak volim kounye a pibliye oswa disponib sou yon ne lè sa a ControllerExpandVolume DWE rele SÈLMAN apre swa:

  • Plugin a gen kontwolè PUBLISH_UNPUBLISH_VOLUME kapasite ak ControllerUnpublishVolume te envoke avèk siksè.

OUBYEN

  • Plugin a PA gen kontwolè PUBLISH_UNPUBLISH_VOLUME kapasite, Plugin a gen ne STAGE_UNSTAGE_VOLUME kapasite, ak NodeUnstageVolume te konplete avèk siksè.

OUBYEN

  • Plugin a PA gen kontwolè PUBLISH_UNPUBLISH_VOLUME kapasite, ni ne STAGE_UNSTAGE_VOLUME kapasite, ak NodeUnpublishVolume te konplete avèk siksè.

Sa vle di esansyèlman ou bezwen detache disk la nan machin vityèl la anvan ou agrandi li.

Sepandan, malerezman aplikasyon Spesifikasyon CSI atravè sidecars pa satisfè kondisyon sa yo:

  • Nan yon veso sidecar csi-attacher, ki ta dwe responsab pou prezans diferans ki nesesè ant mòn yo, fonksyonalite sa a tou senpleman pa aplike nan redimansyon an offline. Yon diskisyon sou sa a te kòmanse isit la.
  • Ki sa egzakteman se yon veso sidecar nan kontèks sa a? Plugin CSI nan tèt li pa kominike avèk API Kubernetes, men sèlman reponn a apèl gRPC voye ba li pa veso sidecar. Dènye yo ap devlope pa kominote Kubernetes.

Nan ka nou an (CSI plugin), operasyon an pou ogmante disk la sanble sa a:

  1. Nou resevwa yon apèl gRPC ControllerExpandVolume;
  2. Nou ap eseye ogmante disk la nan API a, men nou resevwa yon erè sou enposib pou fè operasyon an paske disk la monte;
  3. Nou estoke idantifyan ki gen kapasite a nan kat jeyografik, ki gen disk yo pou ki operasyon an ogmantasyon bezwen yo dwe fèt. Anba a, pou konsizyon, nou pral rele kat sa a kòm volumeResizeRequired;
  4. Manyèlman retire gous la ki ap itilize disk la. Kubernetes pral rekòmanse li. Pou disk la pa gen tan monte (ControllerPublishVolume) anvan ou fini operasyon an ogmantasyon lè w ap eseye monte, nou tcheke si disk yo bay la toujou nan volumeResizeRequired epi retounen yon erè;
  5. Chofè CSI a eseye re-egzekisyon operasyon an redimensionner. Si operasyon an te reyisi, Lè sa a, retire disk la volumeResizeRequired;
  6. Paske ID disk ki manke nan volumeResizeRequired, ControllerPublishVolume pase avèk siksè, disk la monte, gous la kòmanse.

Tout sanble senp ase, men kòm toujou gen enkonvenyans. Elaji disk ekstèn-resizer, ki nan ka ta gen yon erè pandan operasyon an sèvi ak yon keu ak yon ogmantasyon eksponansyèl nan tan delè jiska 1000 segonn:

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

Sa a ka detanzantan lakòz operasyon ekspansyon disk la pwolonje pou plis pase 15 minit epi, kidonk, gous korespondan an pa disponib.

Sèl opsyon ki byen fasil epi san doulè te pèmèt nou diminye potansyèl D 'te itilize nan vèsyon nou an nan ekstèn-resizer ak yon limit delè maksimòm. nan 5 segonn:

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

Nou pa t 'konsidere li nesesè ijan kòmanse yon diskisyon ak plak ekstèn-resizer a, paske offline redimansyon nan disk se yon throwback ki pral byento disparèt nan tout founisè nwaj yo.

Ki jan yo kòmanse itilize?

Chofè a sipòte sou Kubernetes vèsyon 1.15 ak pi wo. Pou chofè a travay, kondisyon sa yo dwe ranpli:

  • Drapo --allow-privileged mete nan valè true pou sèvè API ak kubelet;
  • Enkli --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true pou sèvè API ak kubelet;
  • Pwopagasyon mòn (pwopagasyon mòn) dwe aktive sou gwoup la. Lè w ap itilize Docker, demon an dwe konfigirasyon pou pèmèt monn pataje.

Tout etap ki nesesè yo pou enstalasyon an tèt li ki dekri nan README. Enstalasyon enplike nan kreye objè nan Kubernetes soti nan manifeste.

Pou chofè a travay, w ap bezwen bagay sa yo:

  • Espesifye idantifyan anyè a nan manifest la (folder-id) Yandex.Cloud (gade dokimantasyon);
  • Pou kominike avèk Yandex.Cloud API, chofè CSI a sèvi ak yon kont sèvis. Nan manifest la, sekrè dwe pase kle otorize soti nan kont sèvis la. Nan dokiman an dekri, ki jan yo kreye yon kont sèvis epi jwenn kle.

An tou - eseye, epi nou pral kontan resevwa fidbak ak nouvo pwoblèmsi ou rankontre nenpòt pwoblèm!

Plis sipò

Kòm yon rezilta, nou ta renmen remake ke nou te aplike chofè CSI sa a pa soti nan yon gwo dezi yo pran plezi ekri aplikasyon nan Go, men akòz yon bezwen ijan nan konpayi an. Li pa sanble pratik pou nou kenbe pwòp aplikasyon nou an, kidonk si Yandex montre enterè epi li deside kontinye sipòte chofè a, nou pral kontan transfere repozitwa a ba yo.

Anplis de sa, Yandex pwobableman gen pwòp aplikasyon chofè a CSI nan gwoup Kubernetes jere li yo, ki ka lage nan Open Source. Nou menm tou nou wè opsyon devlopman sa a kòm favorab - kominote a pral kapab sèvi ak yon chofè pwouve ki soti nan yon founisè sèvis, epi yo pa soti nan yon konpayi twazyèm pati.

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè