Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

8. априла на конференцији Саинт ХигхЛоад++ 2019, у оквиру секције „ДевОпс и операције“, дат је извештај „Проширивање и допуна Кубернетеса“ у чијем креирању су учествовала три запослена у компанији Флант. У њему говоримо о бројним ситуацијама у којима смо желели да проширимо и допунимо могућности Кубернетеса, али за које нисмо нашли готово и једноставно решење. Имамо неопходна решења у виду Опен Соурце пројеката, а њима је посвећен и овај говор.

По традицији, са задовољством представљамо видео извештаја (50 минута, много информативније од чланка) и главни резиме у текстуалном облику. Иди!

Језгро и додаци у К8с

Кубернетес мења индустрију и приступе администрацији који су одавно успостављени:

  • Захваљујући њему апстракције, више не оперишемо са концептима као што је подешавање конфигурације или покретање команде (Цхеф, Ансибле...), већ користимо груписање контејнера, сервиса итд.
  • Можемо припремити апликације без размишљања о нијансама одређени сајт, на којој ће бити покренут: голи метал, облак неког од провајдера итд.
  • Са К8с никада нисте били приступачнији најбоље праксе о организовању инфраструктуре: технике скалирања, самоизлечења, толеранције грешака итд.

Међутим, наравно, није све тако глатко: Кубернетес је донео и своје нове изазове.

Кубернетес не је комбајн који решава све проблеме свих корисника. Језгро Кубернетес је одговоран само за скуп минимално неопходних функција које су присутне у сваки кластер:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Кубернетес језгро дефинише основни скуп примитива за груписање контејнера, управљање саобраћајем и тако даље. О њима смо разговарали детаљније у извештај пре 2 године.

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

С друге стране, К8с нуди велике могућности за проширење доступних функција, које помажу да се затвори други - специфичним — потребе корисника. Додаци Кубернетес-у су одговорност администратора кластера, који морају да инсталирају и конфигуришу све што је потребно да би њихов кластер довео „у прави облик“ [да би решили своје специфичне проблеме]. Какви су ово додаци? Погледајмо неке примере.

Примери додатака

Након што смо инсталирали Кубернетес, могли бисмо бити изненађени да умрежавање које је толико неопходно за интеракцију подова и унутар чвора и између чворова не функционише самостално. Кубернетес кернел не гарантује потребне везе; уместо тога, одређује мрежу интерфејс (ЦНИ) за додатке трећих страна. Морамо да инсталирамо један од ових додатака, који ће бити одговоран за конфигурацију мреже.

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

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

Други примери укључују:

  • Улаз-контролори (погледајте њихову рецензију у наш недавни чланак).
  • церт-манагер:

    Проширивање и допуна Кубернетес-а (преглед и видео извештај)

  • Оператори је читава класа додатака (који укључује поменути церт-менаџер), они дефинишу примитив(е) и контролер(е). Логика њиховог рада ограничена је само нашом маштом и омогућава нам да готове инфраструктурне компоненте (на пример, ДБМС) претворимо у примитиве, са којима је много лакше радити (него са скупом контејнера и њиховим подешавањима). Огроман број оператера је написан - чак и ако многи од њих још нису спремни за производњу, само је питање времена:

    Проширивање и допуна Кубернетес-а (преглед и видео извештај)

  • метрике - још једна илустрација како је Кубернетес одвојио интерфејс (Метрицс АПИ) од имплементације (додатци треће стране као што је Прометхеус адаптер, Датадог кластер агент...).
  • За праћење и статистику, где у пракси нису само потребни Прометеј и Графана, али и кубе-стате-метрицс, ноде-екпортер, итд.

И ово није потпуна листа додатака... На пример, у компанији Флант коју тренутно инсталирамо 29 додатака (сви стварају укупно 249 Кубернетес објеката). Једноставно речено, не можемо видети живот кластера без додатака.

Аутоматизација

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

  1. Постоји приватни регистар (тј. који захтева пријаву) са сликама за апликацију. Претпоставља се да је свакој подлози додељена посебна тајна која омогућава аутентификацију у регистру. Наш задатак је да обезбедимо да се ова тајна пронађе у именском простору како би подови могли да преузимају слике. Може бити много апликација (од којих је свакој потребна тајна), а корисно је редовно ажурирати саме тајне, тако да је елиминисана опција ручног излагања тајни. Овде оператер долази у помоћ: креирамо контролер који ће чекати да се појави именски простор и на основу овог догађаја ће додати тајну у именски простор.
  2. Дозволите подразумевано приступ са подова на Интернет је забрањен. Али понекад може бити потребно: логично је да механизам дозволе приступа ради једноставно, без посебних вештина, на пример, присуством одређене ознаке у простору имена. Како нам оператер овде може помоћи? Креиран је контролер који чека да се ознака појави у именском простору и додаје одговарајућу политику за приступ Интернету.
  3. Слична ситуација: претпоставимо да треба да додамо одређени нечистоћа, ако има сличну ознаку (са неком врстом префикса). Радње са оператером су очигледне...

У било ком кластеру се рутински задаци морају решавати, и исправно ово се може урадити помоћу оператора.

Сумирајући све описане приче, дошли смо до закључка да за удобан рад у Кубернетесу који вам је потребан: А) инсталирајте додатке, б) развијати оператере (за решавање свакодневних администраторских задатака).

Како написати изјаву за Кубернетес?

Генерално, шема је једноставна:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

... али онда се испостави да:

  • Кубернетес АПИ је прилично нетривијална ствар за коју је потребно много времена да се савлада;
  • програмирање такође није за свакога (Го језик је изабран као преферирани језик јер постоји посебан оквир за њега - Оператор СДК);
  • Слична је ситуација и са самим оквиром.

Доња линија: да напише контролор (оператер) мора троше значајна средства да учи материјално. Ово би било оправдано за „велике” операторе – рецимо, за МиСКЛ ДБМС. Али ако се сетимо горе описаних примера (откривање тајни, приступ подовима на Интернет...), које такође желимо да урадимо исправно, онда ћемо схватити да ће уложени труд надмашити резултат који нам је сада потребан:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Генерално, поставља се дилема: потрошити много ресурса и пронаћи прави алат за писање изјава, или то учинити на старински начин (али брзо). Да бисмо то решили - да бисмо пронашли компромис између ових екстрема - креирали смо сопствени пројекат: схелл-оператор (види и његову недавно саопштење на чворишту).

Схелл-оператор

Како он ради? Кластер има под који садржи Го бинарни фајл са схелл-оператором. Поред ње је скуп од куке (више детаља о њима - погледајте испод). Схелл-оператор се сам претплатио на одређене развој у Кубернетес АПИ-ју, по чијој појави покреће одговарајуће куке.

Како схелл-оператор зна које куке да позове на које догађаје? Ове информације шаљу оператеру преносе саме куке, и они то раде врло једноставно.

Хоок је Басх скрипта или било која друга извршна датотека која прихвата један аргумент --config и одговара са ЈСОН-ом. Ово последње одређује који су објекти за њега од интереса и на које догађаје (за ове објекте) треба реаговати:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Илустроваћу имплементацију на схелл-оператору једног од наших примера - декомпоновање тајни за приступ приватном регистру са сликама апликације. Састоји се од две фазе.

Вежбајте: 1. Напишите куку

Пре свега, у куку ћемо обрадити --config, што указује да нас занимају простори имена, а конкретно, тренутак њиховог стварања:

[[ $1 == "--config" ]] ; then
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF
…

Како би изгледала логика? Такође прилично једноставно:

…
else
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

Први корак је да сазнате који је именски простор креиран, а други је да га креирате користећи kubectl тајна за овај именски простор.

Вежбање: 2. Састављање слике

Остаје само да се створена кука пренесе на схелл-оператор - како то учинити? Сам схелл-оператор долази као Доцкер слика, тако да је наш задатак да додамо куку у посебан директоријум на овој слици:

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

Остаје само да га саставите и гурнете:

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

Последњи додир је постављање слике у кластер. Да бисмо то урадили, хајде да напишемо развој:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

Постоје две тачке на које треба обратити пажњу:

  1. индикација новонастале слике;
  2. Ово је системска компонента којој (најмање) су потребна права да се претплати на догађаје у Кубернетесу и да додељује тајне просторима имена, тако да креирамо СервицеАццоунт (и скуп правила) за куку.

Резултат - решили смо наш проблем рођаци за Кубернетес на начин који креира оператор за декомпоновање тајни.

Остале карактеристике схелл-оператора

Да бисте ограничили објекте одабраног типа са којима ће кука радити, могу се филтрирати, бирајући према одређеним ознакама (или користећи matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     …
  }
]

Под условом механизам дедупликације, који вам – помоћу јк филтера – омогућава да велике ЈСОН објекте претворите у мале, при чему остају само они параметри које желимо да пратимо ради промена.

Када се позове кука, схелл-оператер је прослеђује подаци о објекту, који се може користити за све потребе.

Догађаји који покрећу куке нису ограничени на Кубернетес догађаје: схелл-оператор пружа подршку за позивајући куке по времену (слично цронтаб-у у традиционалном планеру), као и посебан догађај на почетку. Сви ови догађаји се могу комбиновати и доделити истој куки.

И још две карактеристике схелл-оператора:

  1. То ради асинхроно. Пошто је примљен Кубернетес догађај (као што је објекат који се креира), други догађаји (као што је исти објекат који је обрисан) су се могли догодити у кластеру, а закачице треба да воде рачуна о томе. Ако је кука извршена са грешком, онда ће подразумевано бити поврат до успешног завршетка (ово понашање се може променити).
  2. Извози метрике за Прометхеус, са којим можете да разумете да ли схелл-оператор ради, сазнајте број грешака за сваку куку и тренутну величину реда.

Да резимирамо овај део извештаја:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Инсталирање додатака

За удобан рад са Кубернетес-ом поменута је и потреба за инсталирањем додатака. Рећи ћу вам о томе користећи пример пута наше компаније до тога како то сада радимо.

Почели смо да радимо са Кубернетес-ом са неколико кластера, чији је једини додатак био Ингресс. Требало је другачије да се инсталира у сваком кластеру и направили смо неколико ИАМЛ конфигурација за различита окружења: голи метал, АВС...

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

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Да бисмо све довели у ред, почели смо са скриптом (install-ingress.sh), који је као аргумент узео тип кластера на који ћемо применити, генерисао је неопходну ИАМЛ конфигурацију и увео је у Кубернетес.

Укратко, наш даљи пут и резоновање везано за њега било је следеће:

  • за рад са ИАМЛ конфигурацијама, потребан је механизам за шаблоне (у првим фазама ово је једноставан сед);
  • са повећањем броја кластера појавила се потреба за аутоматским ажурирањем (најраније решење је било да се скрипта стави у Гит, ажурира помоћу црон-а и покрене);
  • сличан сценарио је био потребан за Прометеја (install-prometheus.sh), међутим, истиче се по томе што захтева много више улазних података, као и њихово складиштење (на добар начин – централизовано и у кластеру), а неки подаци (лозинке) би се могли аутоматски генерисати:

    Проширивање и допуна Кубернетес-а (преглед и видео извештај)

  • ризик од увођења нечег погрешног у све већи број кластера је стално растао, па смо схватили да инсталатери (тј. две скрипте: за Ингресс и Прометхеус) било је потребно постављање (неколико грана у Гиту, неколико црон-ова да би се ажурирали у одговарајућим: стабилним или тестним кластерима);
  • с kubectl apply са њим је постало тешко радити јер није декларативно и може само да креира објекте, али не и доноси одлуке о њиховом статусу/брише их;
  • Недостајале су нам неке функције које у то време уопште нисмо имплементирали:
    • потпуна контрола над резултатом ажурирања кластера,
    • аутоматско одређивање неких параметара (унос за инсталационе скрипте) на основу података који се могу добити из кластера (откривање),
    • његов логички развој у виду непрекидног откривања.

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

Аддон-оператор

Заснован је на већ поменутом схелл-оператору. Цео систем изгледа овако:

Следеће је додато кукицама за схелл-оператор:

  • складиштење вредности,
  • Хелм цхарт,
  • компонента која прати складиште вредности и - у случају било каквих промена - тражи од Хелма да поново окрене графикон.

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Тако можемо да реагујемо на догађај у Кубернетес-у, покренемо закачивање и са овог кука можемо да извршимо промене у складишту, након чега ће графикон бити поново преузет. У резултујућем дијаграму раздвајамо скуп кукица и графикон у једну компоненту, коју називамо модул:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Модула може бити много, а њима додајемо глобалне куке, глобално складиште вредности и компоненту која надгледа ову глобалну продавницу.

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

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Ова шема задовољава све захтеве за инсталирање додатака који су горе наведени:

  • Хелм је одговоран за шаблонизацију и декларативност.
  • Проблем аутоматског ажурирања је решен коришћењем глобалне куке, која иде у регистар по распореду и, ако тамо види нову слику система, покреће је (тј. „себе“).
  • Чување подешавања у кластеру се имплементира помоћу ЦонфигМап, који садржи примарне податке за складишта (при покретању се учитавају у складишта).
  • Проблеми са генерисањем лозинки, откривањем и континуираним откривањем решени су помоћу кукица.
  • Стагинг се постиже захваљујући таговима, које Доцкер подржава из кутије.
  • Резултат се прати помоћу метрика по којима можемо да разумемо статус.

Цео овај систем је имплементиран у облику једне бинарне датотеке у Го, која се зове аддон-оператор. Ово чини дијаграм једноставнијим:

Проширивање и допуна Кубернетес-а (преглед и видео извештај)

Главна компонента у овом дијаграму је скуп модула (истакнуто сивом бојом испод). Сада можемо да напишемо модул за потребан додатак уз мало труда и да будемо сигурни да ће бити инсталиран у сваки кластер, да ће бити ажуриран и одговорити на догађаје који су му потребни у кластеру.

"Флант" користи аддон оператор на 70+ Кубернетес кластера. Тренутни статус - алфа верзија. Сада припремамо документацију за пуштање бета верзије, али за сада у спремишту доступни примери, на основу којих можете креирати сопствени додатак.

Где могу да набавим модуле за аддон-оператор? Издавање наше библиотеке је следећа фаза за нас, планирамо да то урадимо на лето.

Видео снимци и слајдови

Видео са наступа (~50 минута):

Презентација извештаја:

ПС

Остали извештаји на нашем блогу:

Можда ће вас занимати и следеће публикације:

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

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