Sējuma spraudņi Kubernetes krātuvei: no Flexvolume līdz CSI

Sējuma spraudņi Kubernetes krātuvei: no Flexvolume līdz CSI

Kad Kubernetes vēl bija 1.0.0 versijā, pastāvēja apjoma spraudņi. Tie bija nepiecieÅ”ami, lai savienotu pastāvÄ«gu konteineru datu glabāŔanas sistēmas ar Kubernetes. To nebija daudz, un tādi glabāŔanas pakalpojumu sniedzēji kā GCE PD, Ceph, AWS EBS un citi bija vieni no pirmajiem, kas tos ieviesa.

Kubernetes komplektā tika iekļauti spraudņi, tāpēc arÄ« nosaukums "in-tree". Tomēr daudzi uzskatÄ«ja, ka esoÅ”ais Ŕādu spraudņu komplekts ir nepietiekams. Daži "dari pats" entuziasti pievienoja Kubernetes kodolam vienkārÅ”us spraudņus, izmantojot ielāpus, pēc tam izveidoja savu Kubernetes un izvietoja to savos serveros. Taču laika gaitā Kubernetes izstrādātāji saprata, ka zivis problēmu nevar atrisināt. Cilvēkiem ir nepiecieÅ”ams makŔķereUn Kubernetes v1.2.0 laidienā tas parādÄ«jās…

Flexvolume spraudnis: makŔķere ar minimāliem iestatījumiem

Kubernetes izstrādātāji izveidoja spraudni FlexVolume, kas bija loģisks mainīgo un metožu apvalks darbam ar Flexvolume draiveriem, ko ieviesa treŔo puŔu izstrādātāji.

Apstāsimies un tuvāk aplÅ«kosim, kas ir FlexVolume draiveris. Tas ir sava veida izpildāmais fails (binārais fails, Python skripts, Bash skripts utt.), kas izpildot pieņem komandrindas argumentus un atgriež ziņojumu ar iepriekÅ” definētiem laukiem JSON formātā. Pēc vienoÅ”anās pirmais komandrindas arguments vienmēr ir metode, bet pārējie argumenti ir tās parametri.

Sējuma spraudņi Kubernetes krātuvei: no Flexvolume līdz CSI
CIFS koplieto savienojuma shēmu programmā OpenShift. Flexvolume draiveris atrodas tieÅ”i centrā.

Minimālais metožu kopums izskatās Ŕādi:

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

Izmantojot metodes attach Šø detach definēs scenāriju, kuru kubelet ievēros nākotnē, izsaucot draiveri. Ir arÄ« Ä«paÅ”as metodes expandvolume Šø expandfs, kas ir atbildÄ«gi par skaļuma lieluma dinamisko mainīŔanu.

Kā piemēru izmaiņām, ko metode pievieno expandvolume, un līdz ar to iespēju veikt skaļuma maiņu reāllaikā, varat apskatīt mūsu pieprasījuma Krauķa Cefa operatorā.

Å eit ir Flexvolume draivera ievieÅ”anas piemērs darbam ar NFS:

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

Tātad, pēc faktiskā izpildāmā faila sagatavoÅ”anas ir nepiecieÅ”ams Izvietot draiveri Kubernetes klasterÄ«Draiverim jāatrodas katrā klastera mezglā saskaņā ar iepriekÅ” norādÄ«tu ceļu. Pēc noklusējuma tika atlasÄ«ts Ŕāds ceļŔ:

/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ŠøŠ¼Ń_поставщика_хранилища~ŠøŠ¼Ń_Грайвера/

...bet, izmantojot dažādus Kubernetes izplatÄ«jumus (OpenShift, Rancher…), ceļŔ var atŔķirties.

Flexvolume problēmas: Kā pareizi mest makŔķeri?

Flexvolume draivera izvietoÅ”ana klastera mezglos izrādÄ«jās nebÅ«t ne triviāls uzdevums. Pēc operācijas manuālas veikÅ”anas vienu reizi var viegli nonākt situācijā, kad klasterim tiek pievienoti jauni mezgli: jauna mezgla pievienoÅ”anas, automātiskas horizontālas mērogoÅ”anas vai — vēl ļaunāk — mezgla aizstāŔanas dēļ darbÄ«bas traucējumu dēļ. Šādā gadÄ«jumā piekļuve krātuvei Å”ajos mezglos tiks ierobežota. nav iespējams, lÄ«dz manuāli pievienojat tiem Flexvolume draiveri.

Å Ä«s problēmas risinājums bija viens no Kubernetes primitÄ«vajiem elementiem — DaemonSetKad klasterÄ« parādās jauns mezgls, tajā automātiski tiek izveidots mÅ«su DaemonSet pods, pievienojot tam lokālu sējumu, izmantojot FlexVolume draiveru meklēŔanas ceļu. Pēc veiksmÄ«gas izveides pods kopē draiverim nepiecieÅ”amos failus diskā.

Å eit ir Ŕāda DaemonSet piemērs Flexvolume spraudņa izvietoÅ”anai:

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>

...un Bash skripta piemērs Flexvolume draivera izvietoÅ”anai:

#!/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

Ir svarÄ«gi neaizmirst par kopēŔanas darbÄ«bu nav atomisksPastāv liels risks, ka kubelets sāks izmantot draiveri pirms tā sagatavoÅ”anas procesa pabeigÅ”anas, kas izraisÄ«s sistēmas kļūdu. Pareizā pieeja ir vispirms kopēt draivera failus ar citu nosaukumu un pēc tam izmantot atomāro pārdēvēŔanas darbÄ«bu.

Sējuma spraudņi Kubernetes krātuvei: no Flexvolume līdz CSI
Ceph darbÄ«bas diagramma Rook operatorā: diagrammā redzamais Flexvolume draiveris atrodas Rook aÄ£enta iekÅ”pusē.

Nākamā problēma, izmantojot Flexvolume draiverus, ir tā, ka lielākajai daļai krātuves klastera mezglā Å”im nolÅ«kam ir jāinstalē nepiecieÅ”amā programmatÅ«ra (piemēram, Ceph pakotne ceph-common). Flexvolume spraudnis sākotnēji nebija paredzēts tik sarežģītu sistēmu ievieÅ”anai.

OriÄ£ināls risinājums Å”ai problēmai ir redzams Rook operatora Flexvolume draivera ievieÅ”anā:

Pats draiveris ir ieviests kā RPC klients. IPC ligzda saziņai atrodas tajā paŔā direktorijā, kur pats draiveris. Atceramies, ka draivera failu kopēŔanai vislabāk ir izmantot DaemonSet, kas pievieno draivera direktoriju kā sējumu. Pēc nepiecieÅ”amo draivera failu kopēŔanas rook pods nemirst, bet gan izveido savienojumu ar IPC ligzdu caur pievienoto sējumu kā pilnvērtÄ«gs RPC serveris. ceph-common pakotne jau ir instalēta poda konteinerā. IPC ligzda nodroÅ”ina, ka kubelets sazināsies ar podu, kas atrodas tajā paŔā mezglā. Ä¢eniāli vienkārÅ”i!

Ardievu, mÅ«su jaukie… kokā iebÅ«vētie spraudņi!

Kubernetes izstrādātāji atklāja, ka kodolā ir divdesmit krātuves spraudņi. Izmaiņas katrā no tiem, vienā vai otrā veidā, tiek veiktas visā Kubernetes izlaiÅ”anas ciklā.

Izrādās, ka, lai izmantotu jauno krātuves spraudņa versiju, viss klasteris ir jāatjauninaTurklāt jÅ«s varētu pārsteigt, ka jauna Kubernetes versija pēkŔņi kļūst nesaderÄ«ga ar jÅ«su izmantoto kodolu. Linux...Un tā jÅ«s noslaucāt asaras un, sakodis zobus, saskaņojat ar priekÅ”niecÄ«bu un lietotājiem kodola atjaunināŔanas laiku. Linux un Kubernetes klasteris. Tas var izraisÄ«t pakalpojuma dÄ«kstāvi.

Situācija ir vairāk nekā komiska, vai ne? Visai kopienai ir kļuvis skaidrs, ka Ŕī pieeja nedarbojas. Kubernetes izstrādātāji izlēmÄ«gi paziņoja, ka kodolā vairs netiks pieņemti jauni krātuves spraudņi. Turklāt, kā jau zināms, Flexvolume spraudņa ievieÅ”anā ir konstatētas vairākas nepilnÄ«bas…

Jaunākais Kubernetes papildinājums, CSI apjoma spraudnis, bija paredzēts, lai vienreiz un uz visiem laikiem atrisinātu pastāvÄ«go datu glabāŔanas problēmu. Tā alfa versija, kas plaŔāk pazÄ«stama kā Out-of-Tree CSI Volume Plugins, tika izziņota laidienā. Kubernetes 1.9.

Konteineru uzglabāŔanas saskarne jeb CSI 3000 spininga kāts!

Pirmkārt, es vēlētos norādÄ«t, ka CSI nav tikai apjoma spraudnis, bet gan Ä«sts. standarta par pielāgotu komponentu izveidi darbam ar datu noliktavāmBija paredzēts, ka konteineru orÄ·estrēŔanas sistēmas, piemēram, Kubernetes un Mesos, "iemācÄ«sies" strādāt ar komponentiem, kas ieviesti saskaņā ar Å”o standartu. Un tagad Kubernetes to ir izdarÄ«jusi.

Kā CSI spraudnis darbojas Kubernetes vidē? CSI spraudnis darbojas ar Ä«paÅ”iem draiveriem (CSI draiveri), ko izstrādājuÅ”i treÅ”o puÅ”u izstrādātāji. Kubernetes CSI draiverim jāsastāv no vismaz diviem komponentiem (podiem):

  • kontrolieris — pārvalda ārējo pastāvÄ«go krātuvi. Tā ir ieviesta kā gRPC serveris, kas izmanto primitÄ«vu StatefulSet.
  • mezgls — ir atbildÄ«gs par pastāvÄ«gās krātuves pievienoÅ”anu klastera mezgliem. Tas ir ieviests arÄ« kā gRPC serveris, taču tas izmanto primitÄ«vu. DaemonSet.

Sējuma spraudņi Kubernetes krātuvei: no Flexvolume līdz CSI
Kā CSI spraudnis darbojas Kubernetes vidē

Par citām CSI darba detaļām varat uzzināt, piemēram, no raksta ā€œCSI izpratne" kura tulkojums Mēs to publicējām pirms gada.

Šādas ievieŔanas priekŔrocības

  • Pamatuzdevumu veikÅ”anai, piemēram, draivera reÄ£istrēŔanai mezglam, Kubernetes izstrādātāji ieviesa konteineru kopu. Vairs nav manuāli jāģenerē JSON atbilde ar iespējām, kā tas tika darÄ«ts ar Flexvolume spraudni.
  • Izpildāmo failu vietā mezglos mēs tagad izvietojam podus klasterÄ«. To mēs vienmēr esam gaidÄ«juÅ”i no Kubernetes: visi procesi notiek konteineros, kas izvietoti, izmantojot Kubernetes primitÄ«vus.
  • Sarežģītu draiveru ievieÅ”anai vairs nav nepiecieÅ”ams izstrādāt RPC serveri un RPC klientu. Kubernetes izstrādātāji ir ieviesuÅ”i klientu mÅ«su vietā.
  • Argumentu nodoÅ”ana darbam, izmantojot gRPC protokolu, ir daudz ērtāka, elastÄ«gāka un uzticamāka nekā to nodoÅ”ana, izmantojot komandrindas argumentus. Lai saprastu, kā pievienot apjoma lietojuma metrikas atbalstu CSI, pievienojot standartizētu gRPC metodi, lÅ«dzu, skatiet sadaļu mÅ«su pieprasÄ«juma vsphere-csi draiverim.
  • Saziņa notiek, izmantojot IPC ligzdas, lai izvairÄ«tos no neskaidrÄ«bām par to, vai kubelets nosÅ«tÄ«ja pieprasÄ«jumu uz pareizo podu.

Vai Å”is saraksts jums Ŕķiet saistoÅ”s? CSI priekÅ”rocÄ«bas ir Ŕādas: risinājumu tieÅ”i Ŕīm problēmām, kas netika ņemti vērā, izstrādājot Flexvolume spraudni.

Atzinumi

CSI kā standarts pielāgotu spraudņu ievieÅ”anai mijiedarbÄ«bai ar datu glabātuvi ir guvis sabiedrÄ«bas atzinÄ«bu. Turklāt, pateicoties tā priekÅ”rocÄ«bām un daudzpusÄ«bai, CSI draiveri tiek veidoti pat tādām glabāŔanas sistēmām kā Ceph vai AWS EBS, kuru spraudņi tika pievienoti jau pirmajā Kubernetes versijā.

2019. gada sākumā koka spraudņi tika pasludināti par novecojuÅ”iemMēs plānojam turpināt atbalstÄ«t Flexvolume spraudni, bet neizstrādāsim tam jaunas funkcijas.

Mums jau ir pieredze, izmantojot ceph-csi un vsphere-csi, un esam gatavi paplaÅ”ināt Å”o sarakstu! LÄ«dz Å”im CSI ir lieliski ticis galā ar paredzētajiem uzdevumiem, taču laiks rādÄ«s.

Neaizmirstiet, ka viss jaunais ir pārdomāta vecā pārvērtēŔana!

PS

Lasi arī mūsu emuārā:

Avots: www.habr.com

Iegādājieties uzticamu mitināŔanu vietnēm ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa vietņu mitināŔanu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster