Наше искуство у развоју ЦСИ драјвера у Кубернетес-у за Иандек.Цлоуд

Наше искуство у развоју ЦСИ драјвера у Кубернетес-у за Иандек.Цлоуд

Задовољство нам је да објавимо да Флант проширује свој допринос алатима отвореног кода за Кубернетес издавањем алфа верзија ЦСИ драјвера (Интерфејс за складиштење контејнера) за Иандек.Цлоуд.

Али пре него што пређемо на детаље имплементације, хајде да одговоримо на питање зашто је то уопште потребно када Иандек већ има услугу Управљана услуга за Кубернетес.

Увод

Зашто је ово?

У оквиру наше компаније, од самог почетка коришћења Кубернетеса у производњи (тј. већ неколико година), развијамо сопствени алат (децкхоусе), који, иначе, планирамо да ускоро учинимо доступним као Опен Соурце пројекат . Уз његову помоћ, једнообразно конфигуришемо и конфигуришемо све наше кластере, а тренутно их има више од 100, на широком спектру хардверских конфигурација и у свим доступним цлоуд сервисима.

Кластери који користе палубу имају све компоненте неопходне за рад: балансере, праћење са погодним графиконима, метрикама и упозорењима, аутентификацију корисника преко спољних провајдера за приступ свим контролним таблама, итд. Нема смисла инсталирати такав „напумпани“ кластер у управљано решење, јер је то често или немогуће или ће довести до потребе да се половина компоненти онеспособи.

NB: Ово је наше искуство, и прилично је специфично. Ни на који начин не сугеришемо да свако треба самостално да примени Кубернетес кластере уместо да користи готова решења. Узгред, немамо правог искуства у управљању Кубернетес-ом из Иандек-а и нећемо давати никакву оцену ове услуге у овом чланку.

Шта је то и за кога?

Дакле, већ смо говорили о модерном приступу складиштењу у Кубернетес-у: како ради ЦСИ? и како је заједница дошла овом приступу.

Тренутно су многи велики добављачи услуга у облаку развили драјвере за коришћење својих дискова у облаку као Персистент Волуме у Кубернетес-у. Ако добављач нема такав драјвер, али су све потребне функције обезбеђене преко АПИ-ја, онда вас ништа не спречава да сами имплементирате драјвер. Ово се десило са Иандек.Цлоуд.

Узели смо као основу за развој ЦСИ драјвер за облак ДигиталОцеан и пар идеја из драјвери за ГЦП, пошто интеракција са АПИ-јем ових облака (Гоогле и Иандек) има низ сличности. Конкретно, АПИ и ИСП, и на иандек врати објекат Operation за праћење статуса дуготрајних операција (на пример, креирање новог диска). За интеракцију са Иандек.Цлоуд АПИ-јем, користите Иандек.Цлоуд Го СДК.

Резултат обављеног посла публиковано на ГитХуб и може бити корисно за оне који из неког разлога користе сопствену Кубернетес инсталацију на Иандек.Цлоуд виртуелним машинама (али не и готову управљану кластер) и желе да користе (наруче) дискове преко ЦСИ.

Имплементација

Главне карактеристике

Тренутно драјвер подржава следеће функције:

  • Наручивање дискова у свим зонама кластера према топологији чворова у кластеру;
  • Уклањање претходно наручених дискова;
  • Офлајн промена величине за дискове (Иандек.Цлоуд ne podržavaju повећање дискова који се монтирају на виртуелну машину). За информације о томе како је драјвер морао бити модификован да би промена величине била што безболнија, погледајте доле.

У будућности планирамо да имплементирамо подршку за креирање и брисање снимака диска.

Главна потешкоћа и како је превазићи

Недостатак могућности повећања дискова у реалном времену у Иандек.Цлоуд АПИ-ју је ограничење које компликује операцију промене величине за ПВ (Персистент Волуме): у овом случају, неопходно је да се модул апликације који користи диск заустави, а то може довести до прекида рада апликација.

Према ЦСИ спецификације, ако ЦСИ контролер пријави да може променити величину дискова само „ван мреже“ (VolumeExpansion.OFFLINE), онда би процес повећања диска требао ићи овако:

Ако додатак има само VolumeExpansion.OFFLINE могућност проширења и обим су тренутно објављени или тада доступни на чвору ControllerExpandVolume МОРА се позвати САМО након:

  • Додатак има контролер PUBLISH_UNPUBLISH_VOLUME способност и ControllerUnpublishVolume је успешно призвано.

ИНАЧЕ

  • Додатак НЕМА контролер PUBLISH_UNPUBLISH_VOLUME могућност, додатак има чвор STAGE_UNSTAGE_VOLUME способност, и NodeUnstageVolume је успешно завршен.

ИНАЧЕ

  • Додатак НЕМА контролер PUBLISH_UNPUBLISH_VOLUME способност, нити чвор STAGE_UNSTAGE_VOLUME способност, и NodeUnpublishVolume је успешно завршен.

Ово у суштини значи да морате да одвојите диск од виртуелне машине пре него што га проширите.

Међутим, нажалост имплементација ЦСИ спецификација преко бочних приколица не испуњава ове захтеве:

  • У контејнеру за приколицу csi-attacher, који би требало да буде одговоран за присуство потребног размака између монтирања, ова функционалност једноставно није имплементирана у офлајн промени величине. Покренута је дискусија о томе овде.
  • Шта је заправо контејнер за приколицу у овом контексту? Сам ЦСИ додатак не ступа у интеракцију са Кубернетес АПИ-јем, већ само одговара на гРПЦ позиве које му шаљу бочни контејнери. Најновије се развијају од стране Кубернетес заједнице.

У нашем случају (ЦСИ додатак), операција повећања диска изгледа овако:

  1. Добијамо гРПЦ позив ControllerExpandVolume;
  2. Покушавамо да повећамо диск у АПИ-ју, али добијамо грешку о немогућности извршења операције јер је диск монтиран;
  3. Идентификатор диска чувамо у мапи, која садржи дискове за које треба извршити операцију повећања. У наставку, ради краткоће, назваћемо ову карту као volumeResizeRequired;
  4. Ручно уклоните под који користи диск. Кубернетес ће га поново покренути. Тако да диск нема времена за монтирање (ControllerPublishVolume) пре него што завршимо операцију повећања када покушамо да монтирамо, проверавамо да ли је дати диск још увек унутра volumeResizeRequired и врати грешку;
  5. ЦСИ драјвер покушава да поново изврши операцију промене величине. Ако је операција била успешна, уклоните диск из volumeResizeRequired;
  6. Јер Недостаје ИД диска volumeResizeRequired, ControllerPublishVolume прође успешно, диск је монтиран, под почиње.

Све изгледа довољно једноставно, али као и увек постоје замке. Увећава дискове ектернал-ресизер, који у случају грешке у току операције користи ред са експоненцијалним повећањем времена чекања до 1000 секунди:

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

Ово може периодично довести до тога да се операција проширења диска продужи за 15+ минута и, према томе, одговарајући под буде недоступан.

Једина опција која нам је прилично лако и безболно омогућила да смањимо потенцијалне застоје била је употреба наше верзије екстерног ресизер-а са максималним ограничењем временског ограничења за 5 секунди:

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

Нисмо сматрали потребним да хитно покренемо дискусију и закрпимо екстерни-промена величине, јер је ванмрежна промена величине дискова повратна информација која ће ускоро нестати код свих добављача облака.

Како почети користити?

Драјвер је подржан на Кубернетес верзији 1.15 и новијим. Да би возач радио, морају бити испуњени следећи услови:

  • Застава --allow-privileged поставити на вредност true за АПИ сервер и кубелет;
  • Укључено --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true за АПИ сервер и кубелет;
  • размножавање (моунт пропагатион) мора бити омогућено на кластеру. Када користите Доцкер, демон мора бити конфигурисан да дозволи дељено монтирање.

Сви потребни кораци за саму инсталацију описано у РЕАДМЕ. Инсталација укључује креирање објеката у Кубернетесу из манифеста.

Да би драјвер радио биће вам потребно следеће:

  • Наведите идентификатор директоријума у ​​манифесту (folder-id) Иандек.Цлоуд (види документацију);
  • За интеракцију са Иандек.Цлоуд АПИ-јем, ЦСИ драјвер користи налог услуге. У манифесту, Тајна се мора пренети овлашћени кључеви са налога услуге. У документацији opisano, како да креирате сервисни налог и добијете кључеве.

Све у свему - пробај, и биће нам драго да добијемо повратне информације и нова питањаако наиђете на било какве проблеме!

Даља подршка

Као резултат тога, желимо да напоменемо да смо овај ЦСИ драјвер имплементирали не из велике жеље да се забавимо писањем апликација у Го-у, већ због хитне потребе унутар компаније. Не чини нам се практичним да одржавамо сопствену имплементацију, тако да ако Иандек покаже интересовање и одлучи да настави да подржава управљачке програме, биће нам драго да им пренесемо спремиште.

Поред тога, Иандек вероватно има сопствену имплементацију ЦСИ драјвера у свом управљаном Кубернетес кластеру, који може бити објављен у отвореном коду. Ову развојну опцију такође видимо као повољну – заједница ће моћи да користи проверени драјвер од добављача услуга, а не од компаније треће стране.

ПС

Прочитајте и на нашем блогу:

Извор: ввв.хабр.цом

Додај коментар