Додаци за запремину за Кубернетес складиште: од Флекволуме до ЦСИ

Додаци за запремину за Кубернетес складиште: од Флекволуме до ЦСИ

Када је Кубернетес још био в1.0.0, постојали су додаци за јачину звука. Били су потребни за повезивање система са Кубернетесом за складиштење трајних (трајних) података контејнера. Њихов број је био мали, а међу првима су били такви провајдери складиштења као што су ГЦЕ ПД, Цепх, АВС ЕБС и други.

Додаци су испоручени заједно са Кубернетес-ом, због чега су и добили име - у стаблу. Међутим, за многе се испоставило да је постојећи скуп таквих додатака недовољан. Мајстори су додали једноставне додатке у језгро Кубернетеса користећи закрпе, након чега су саставили сопствени Кубернетес и инсталирали га на своје сервере. Али временом су програмери Кубернетеса то схватили риба проблем се не може решити. Људима треба штап за пецање. А у издању Кубернетес в1.2.0 појавило се...

Флекволуме додатак: минималан штап за пецање

Кубернетес програмери су креирали додатак ФлекВолуме, који је био логички оквир варијабли и метода за рад са Флекволуме драјверима које су имплементирали програмери треће стране.

Зауставимо се и погледајмо ближе шта је ФлекВолуме драјвер. Ово је извесно извршна датотека (бинарна датотека, Питхон скрипта, Басх скрипта, итд.), која, када се изврши, узима аргументе командне линије као улаз и враћа поруку са унапред познатим пољима у ЈСОН формату. По конвенцији, први аргумент командне линије је увек метод, а преостали аргументи су његови параметри.

Додаци за запремину за Кубернетес складиште: од Флекволуме до ЦСИ
Дијаграм повезивања за ЦИФС дељења у ОпенСхифт. Флекволуме драјвер – право у центру

Минимални скуп метода изгледа овако:

flexvolume_driver mount # отвечает за присоединение тома к pod'у
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
}

flexvolume_driver unmount # отвечает за отсоединение тома от pod'а
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
}

flexvolume_driver init # отвечает за инициализацию плагина
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
  // Определяет, использует ли драйвер методы attach/deatach
  "capabilities":{"attach": True/False}
}

Коришћење метода attach и detach ће дефинисати сценарио у коме ће кубелет деловати у будућности приликом позивања драјвера. Постоје и посебне методе expandvolume и expandfs, који су одговорни за динамичку промену величине запремине.

Као пример промена које метод додаје expandvolume, а уз то и могућност промене величине волумена у реалном времену, са којом се можете упознати наш захтев за повлачење у Роок Цепх Оператор.

А ево примера имплементације Флекволуме драјвера за рад са НФС:

usage() {
    err "Invalid usage. Usage: "
    err "t$0 init"
    err "t$0 mount <mount dir> <json params>"
    err "t$0 unmount <mount dir>"
    exit 1
}

err() {
    echo -ne $* 1>&2
}

log() {
    echo -ne $* >&1
}

ismounted() {
    MOUNT=`findmnt -n ${MNTPATH} 2>/dev/null | cut -d' ' -f1`
    if [ "${MOUNT}" == "${MNTPATH}" ]; then
        echo "1"
    else
        echo "0"
    fi
}

domount() {
    MNTPATH=$1

    NFS_SERVER=$(echo $2 | jq -r '.server')
    SHARE=$(echo $2 | jq -r '.share')

    if [ $(ismounted) -eq 1 ] ; then
        log '{"status": "Success"}'
        exit 0
    fi

    mkdir -p ${MNTPATH} &> /dev/null

    mount -t nfs ${NFS_SERVER}:/${SHARE} ${MNTPATH} &> /dev/null
    if [ $? -ne 0 ]; then
        err "{ "status": "Failure", "message": "Failed to mount ${NFS_SERVER}:${SHARE} at ${MNTPATH}"}"
        exit 1
    fi
    log '{"status": "Success"}'
    exit 0
}

unmount() {
    MNTPATH=$1
    if [ $(ismounted) -eq 0 ] ; then
        log '{"status": "Success"}'
        exit 0
    fi

    umount ${MNTPATH} &> /dev/null
    if [ $? -ne 0 ]; then
        err "{ "status": "Failed", "message": "Failed to unmount volume at ${MNTPATH}"}"
        exit 1
    fi

    log '{"status": "Success"}'
    exit 0
}

op=$1

if [ "$op" = "init" ]; then
    log '{"status": "Success", "capabilities": {"attach": false}}'
    exit 0
fi

if [ $# -lt 2 ]; then
    usage
fi

shift

case "$op" in
    mount)
        domount $*
        ;;
    unmount)
        unmount $*
        ;;
    *)
        log '{"status": "Not supported"}'
        exit 0
esac

exit 1

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

/usr/libexec/kubernetes/kubelet-plugins/volume/exec/имя_поставщика_хранилища~имя_драйвера/

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

Проблеми са флексволуменом: како правилно забацити штап за пецање?

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

Решење за овај проблем био је један од Кубернетес примитивних - DaemonSet. Када се нови чвор појави у кластеру, он аутоматски садржи под из нашег ДаемонСет-а, на који је повезан локални волумен дуж путање за проналажење Флекволуме драјвера. Након успешног креирања, под копира потребне датотеке за рад драјвера на диск.

Ево примера таквог ДаемонСет-а за постављање Флекволуме додатка:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: flex-set
spec:
  template:
    metadata:
      name: flex-deploy
      labels:
        app: flex-deploy
    spec:
      containers:
        - image: <deployment_image>
          name: flex-deploy
          securityContext:
              privileged: true
          volumeMounts:
            - mountPath: /flexmnt
              name: flexvolume-mount
      volumes:
        - name: flexvolume-mount
          hostPath:
            path: <host_driver_directory>

... и пример Басх скрипте за постављање Флекволуме драјвера:

#!/bin/sh

set -o errexit
set -o pipefail

VENDOR=k8s.io
DRIVER=nfs

driver_dir=$VENDOR${VENDOR:+"~"}${DRIVER}
if [ ! -d "/flexmnt/$driver_dir" ]; then
  mkdir "/flexmnt/$driver_dir"
fi

cp "/$DRIVER" "/flexmnt/$driver_dir/.$DRIVER"
mv -f "/flexmnt/$driver_dir/.$DRIVER" "/flexmnt/$driver_dir/$DRIVER"

while : ; do
  sleep 3600
done

Важно је не заборавити да је операција копирања није атомска. Постоји велика шанса да ће кубелет почети да користи драјвер пре него што се процес обезбеђивања заврши, што ће довести до пада система. Исправан приступ је да прво копирате датотеке драјвера под другим именом, а затим користите операцију атомског преименовања.

Додаци за запремину за Кубернетес складиште: од Флекволуме до ЦСИ
Дијаграм рада са Цепх у Роок оператору: Флекволуме драјвер на дијаграму се налази унутар Роок агента

Следећи проблем када користите Флекволуме драјвере је тај за већину складишта на чвору кластера потребан софтвер за ово мора бити инсталиран (на пример, цепх-цоммон пакет за Цепх). У почетку, додатак Флекволуме није био дизајниран за имплементацију тако сложених система.

Оригинално решење овог проблема може се видети у имплементацији Флекволуме драјвера Роок оператора:

Сам драјвер је дизајниран као РПЦ клијент. ИПЦ утичница за комуникацију се налази у истом директоријуму као и сам драјвер. Сетимо се да би за копирање датотека драјвера било добро користити ДаемонСет, који повезује директоријум са драјвером као волумен. Након копирања неопходних фајлова драјвера за роок, овај под не умире, већ се повезује на ИПЦ сокет преко приложеног волумена као пуноправни РПЦ сервер. Цепх-цоммон пакет је већ инсталиран унутар под контејнера. ИПЦ утичница осигурава да ће кубелет комуницирати управо са под која се налази на истом чвору. Све генијално је једноставно!..

Збогом, наши љубазни... додаци у стаблу!

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

Испоставило се да за коришћење нове верзије додатка за складиштење, потребно је да ажурирате цео кластер. Осим тога, можда ћете бити изненађени што ће нова верзија Кубернетеса одједном постати некомпатибилна са Линук кернелом који користите... Дакле, бришете сузе и, шкргућући зубе, координирате са својим менаџментом и корисницима време за ажурирајте Линук кернел и Кубернетес кластер. Уз могуће застоје у пружању услуга.

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

Најновији додани додатак за волумене у Кубернетесу, ЦСИ, позван је да једном заувек затвори проблем са упорним складиштењем података. Његова алфа верзија, потпуније названа Оут-оф-Трее ЦСИ Волуме Плугинс, објављена је у издању Кубернетес 1.9.

Интерфејс за складиштење контејнера, или ЦСИ 3000 спиннинг штап!

Пре свега, желео бих да напоменем да ЦСИ није само додатак за јачину звука, већ прави стандарт на креирању прилагођених компоненти за рад са складиштима података. Системи за оркестрацију контејнера као што су Кубернетес и Месос требало је да „науче“ како да раде са компонентама имплементираним у складу са овим стандардом. А сада сам већ научио Кубернетес.

Каква је структура ЦСИ додатка у Кубернетесу? ЦСИ додатак ради са посебним драјверима (ЦСИ драјвери) које су написали програмери треће стране. ЦСИ драјвер у Кубернетес-у треба минимално да се састоји од две компоненте (подс):

  • контролор — управља екстерним трајним складиштима. Имплементиран је као гРПЦ сервер, за који се користи примитив StatefulSet.
  • Чвор — одговоран је за монтирање трајног складишта у чворове кластера. Такође је имплементиран као гРПЦ сервер, али користи примитив DaemonSet.

Додаци за запремину за Кубернетес складиште: од Флекволуме до ЦСИ
Како ЦСИ додатак ради у Кубернетесу

О неким другим детаљима ЦСИ-јевог рада можете сазнати, на пример, из чланка „Разумевање Ц.С.И.' превод којих објавили смо пре годину дана.

Предности такве имплементације

  • За основне ствари као што је регистрација драјвера за чвор, Кубернетес програмери су имплементирали скуп контејнера. Више не морате сами да генеришете ЈСОН одговор са могућностима, као што је урађено за додатак Флекволуме.
  • Уместо „клизања“ извршних датотека на чворове, сада учитавамо подове у кластер. Ово је оно што у почетку очекујемо од Кубернетес-а: сви процеси се одвијају унутар контејнера који су распоређени користећи Кубернетес примитиве.
  • Више не морате да развијате РПЦ сервер и РПЦ клијент да бисте имплементирали сложене драјвере. Клијент су за нас имплементирали Кубернетес програмери.
  • Преношење аргумената за рад преко гРПЦ протокола је много згодније, флексибилније и поузданије од њиховог прослеђивања кроз аргументе командне линије. Да бисте разумели како да додате подршку за метрику коришћења обима у ЦСИ додавањем стандардизоване гРПЦ методе, можете прочитати: наш захтев за повлачење за драјвер вспхере-цси.
  • Комуникација се одвија преко ИПЦ сокета, да не би било забуне да ли је кубелет послао захтев на исправан под.

Да ли вас ова листа на нешто подсећа? Предности ЦСИ су решавање истих проблема, који нису узети у обзир при развоју додатка Флекволуме.

Налази

ЦСИ као стандард за имплементацију прилагођених додатака за интеракцију са складиштима података је веома топло примљен од стране заједнице. Штавише, због својих предности и свестраности, ЦСИ драјвери се креирају чак и за системе за складиштење као што су Цепх или АВС ЕБС, додаци за рад са којима су додати у прву верзију Кубернетеса.

Почетком 2019. додаци у стаблу су проглашени застарелим. Планирамо да наставимо да подржавамо додатак Флекволуме, али нећемо развијати нову функционалност за њега.

Ми сами већ имамо искуства у коришћењу цепх-цси, вспхере-цси и спремни смо да их додамо на ову листу! До сада, ЦСИ се носи са задацима који су му додељени са праском, али сачекаћемо и видети.

Не заборавите да је све ново добро промишљање старог!

ПС

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

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

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