Plugins tal-volum għall-ħażna Kubernetes: minn Flexvolume għal CSI

Plugins tal-volum għall-ħażna Kubernetes: minn Flexvolume għal CSI

Lura meta Kubernetes kien għadu v1.0.0, kien hemm plugins tal-volum. Kienu meħtieġa biex jgħaqqdu s-sistemi ma' Kubernetes għall-ħażna tad-dejta tal-kontenitur persistenti (permanenti). In-numru tagħhom kien żgħir, u fost l-ewwel kien hemm fornituri tal-ħażna bħal GCE PD, Ceph, AWS EBS u oħrajn.

Il-plugins ġew ikkunsinnati flimkien ma 'Kubernetes, u huwa għalhekk li kisbu isimhom - in-tree. Madankollu, għal ħafna, is-sett eżistenti ta 'plugins bħal dawn irriżulta li ma kienx biżżejjed. L-artiġjani żiedu plugins sempliċi mal-qalba tal-Kubernetes bl-użu ta 'garża, u wara assemblaw il-Kubernetes tagħhom stess u installawha fuq is-servers tagħhom. Iżda maż-żmien, l-iżviluppaturi Kubernetes indunaw dan ħut il-problema ma tistax tissolva. In-nies għandhom bżonn qasba tas-sajd. U fir-rilaxx ta 'Kubernetes v1.2.0 deher...

Plugin Flexvolume: qasba tas-sajd minimu

L-iżviluppaturi ta 'Kubernetes ħolqu l-plugin FlexVolume, li kien qafas loġiku ta' varjabbli u metodi biex taħdem ma 'sewwieqa Flexvolume implimentati minn żviluppaturi ta' partijiet terzi.

Ejja nieqfu u nagħtu ħarsa aktar mill-qrib lejn x'inhu s-sewwieq FlexVolume. Dan huwa ċert fajl eżekutibbli (fajl binarju, skript Python, skript Bash, eċċ.), li, meta jiġi eżegwit, jieħu argumenti tal-linja tal-kmand bħala input u jirritorna messaġġ b'oqsma magħrufa minn qabel f'format JSON. B'konvenzjoni, l-ewwel argument tal-linja tal-kmand huwa dejjem metodu, u l-argumenti li jifdal huma l-parametri tiegħu.

Plugins tal-volum għall-ħażna Kubernetes: minn Flexvolume għal CSI
Dijagramma tal-konnessjoni għall-Ishma CIFS f'OpenShift. Sewwieq Flexvolume - Dritt fiċ-Ċentru

Sett minimu ta' metodi tidher bħal din:

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

Użu ta 'Metodi attach и detach se jiddefinixxi x-xenarju li fih il-kubelet se jaġixxi fil-futur meta jsejjaħ lis-sewwieq. Hemm ukoll metodi speċjali expandvolume и expandfs, li huma responsabbli biex b'mod dinamiku d-daqs tal-volum.

Bħala eżempju tal-bidliet li jżid il-metodu expandvolume, u magħha l-abbiltà li tibdel id-daqs tal-volumi f'ħin reali, tista 'tiffamiljarizza ruħek magħha it-talba tal-ġibda tagħna f'Rook Ceph Operatur.

U hawn eżempju tal-implimentazzjoni tas-sewwieq Flexvolume biex taħdem ma '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

Għalhekk, wara li tħejji l-fajl eżekutibbli attwali, għandek bżonn ittella s-sewwieq fil-cluster Kubernetes. Is-sewwieq għandu jkun jinsab fuq kull node tal-cluster skont mogħdija predeterminata. B'mod awtomatiku ġie magħżul:

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

... imma meta tuża distribuzzjonijiet differenti ta' Kubernetes (OpenShift, Rancher...) it-triq tista' tkun differenti.

Problemi tal-flexvolume: kif titfa 'qasba tas-sajd b'mod korrett?

It-tlugħ tas-sewwieq Flexvolume fin-nodi tal-cluster irriżulta li kien kompitu mhux trivjali. Wara li tkun għamilt l-operazzjoni manwalment darba, huwa faċli li tiltaqa 'ma' sitwazzjoni fejn nodi ġodda jidhru fil-cluster: minħabba ż-żieda ta 'node ġdid, skalar orizzontali awtomatiku, jew - dak li hu agħar - sostituzzjoni ta' nodu minħabba malfunzjoni. F'dan il-każ, ix-xogħol bil-ħażna fuq dawn in-nodi għandu jsir huwa impossibbli, sakemm xorta żżid manwalment is-sewwieq Flexvolume magħhom.

Is-soluzzjoni għal din il-problema kienet waħda mill-primittivi ta' Kubernetes - DaemonSet. Meta node ġdid jidher fil-cluster, awtomatikament fih pod mid-DaemonSet tagħna, li miegħu jitwaħħal volum lokali tul il-mogħdija biex jinstabu sewwieqa Flexvolume. Mal-ħolqien b'suċċess, il-pod tikkopja l-fajls meħtieġa biex is-sewwieq jaħdem fuq id-disk.

Hawn hu eżempju ta’ DaemonSet bħal dan għat-tqegħid ta’ plugin Flexvolume:

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>

... u eżempju ta 'skript Bash għat-tqegħid tas-sewwieq Flexvolume:

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

Huwa importanti li ma ninsewx li l-operazzjoni tal-kopja mhix atomika. Hemm ċans kbir li l-kubelet jibda juża s-sewwieq qabel ma jitlesta l-proċess ta’ forniment tiegħu, u dan jikkawża li s-sistema tiġġarraf. L-approċċ korrett huwa li l-ewwel tikkopja l-fajls tas-sewwieq taħt isem differenti, u mbagħad tuża operazzjoni atomika b'isem ġdid.

Plugins tal-volum għall-ħażna Kubernetes: minn Flexvolume għal CSI
Dijagramma ta 'ħidma ma' Ceph fl-operatur Rook: is-sewwieq Flexvolume fid-dijagramma jinsab ġewwa l-aġent Rook

Il-problema li jmiss meta tuża sewwieqa Flexvolume hija dik għall-biċċa l-kbira tal-ħażna fuq node ta 'cluster is-softwer meħtieġ għal dan għandu jiġi installat (pereżempju, il-pakkett ceph-common għal Ceph). Inizjalment, il-plugin Flexvolume ma kienx iddisinjat biex jimplimenta sistemi kumplessi bħal dawn.

Soluzzjoni oriġinali għal din il-problema tista' tidher fl-implimentazzjoni tas-sewwieq Flexvolume tal-operatur Rook:

Is-sewwieq innifsu huwa ddisinjat bħala klijent RPC. Is-socket IPC għall-komunikazzjoni jinsab fl-istess direttorju bħas-sewwieq innifsu. Niftakru li biex tikkopja fajls tas-sewwieq ikun tajjeb li tuża DaemonSet, li jgħaqqad id-direttorju mas-sewwieq bħala volum. Wara li tikkopja l-fajls meħtieġa tas-sewwieq tar-rook, dan il-pod ma jmutx, iżda jgħaqqad mas-socket IPC permezz tal-volum mehmuż bħala server RPC sħiħ. Il-pakkett ceph-common huwa diġà installat ġewwa l-kontenitur tal-pod. Is-sokit IPC jiżgura li l-kubelet se jikkomunika eżattament mal-pod li jinsab fuq l-istess node. Kollox inġenjuż huwa sempliċi!...

Adieu, il-plugins affettivi tagħna... fis-siġra!

L-iżviluppaturi ta 'Kubernetes skoprew li n-numru ta' plugins għall-ħażna fil-qalba huwa għoxrin. U bidla f'kull wieħed minnhom, b'xi mod jew ieħor, tgħaddi miċ-ċiklu sħiħ ta 'rilaxx ta' Kubernetes.

Jirriżulta li biex tuża l-verżjoni l-ġdida tal-plugin tal-ħażna, għandek bżonn taġġorna l-cluster kollu. Flimkien ma' dan, tista' tkun sorpriż li l-verżjoni l-ġdida ta' Kubernetes f'daqqa waħda ssir inkompatibbli mal-kernel tal-Linux li qed tuża... Allura inti timsaħ id-dmugħ tiegħek u, tħabbat snienek, tikkoordina mal-maniġment tiegħek u mal-utenti l-ħin biex taġġorna l-kernel tal-Linux u l-cluster Kubernetes. B'waqfien possibbli fil-provvista tas-servizzi.

Is-sitwazzjoni hija aktar minn komika, ma taħsibx? Deher ċar għall-komunità kollha li l-approċċ ma kienx qed jaħdem. B'deċiżjoni intenzjonata, l-iżviluppaturi ta' Kubernetes iħabbru li plugins ġodda biex jaħdmu mal-ħażna mhux se jibqgħu jiġu aċċettati fil-kernel. Barra minn hekk, kif nafu diġà, ġew identifikati għadd ta’ nuqqasijiet fl-implimentazzjoni tal-plugin Flexvolume...

L-aħħar plugin miżjud għall-volumi f'Kubernetes, CSI, ġie msejjaħ biex jagħlaq il-kwistjoni b'ħażna ta 'dejta persistenti darba għal dejjem. Il-verżjoni alpha tagħha, magħrufa b'mod aktar sħiħ bħala Out-of-Tree CSI Volume Plugins, tħabbret fir-rilaxx Kubernetes 1.9.

Interface tal-Ħażna tal-Kontenitur, jew virga tal-għażil CSI 3000!

L-ewwelnett, nixtieq ninnota li CSI mhuwiex biss plugin tal-volum, iżda reali standard dwar il-ħolqien ta 'komponenti tad-dwana għall-ħidma ma' mħażen tad-dejta. Sistemi ta 'orkestrazzjoni tal-kontejners bħal Kubernetes u Mesos suppost kellhom "jitgħallmu" kif jaħdmu ma' komponenti implimentati skont dan l-istandard. U issa diġà tgħallimt Kubernetes.

X'inhi l-istruttura tal-plugin CSI f'Kubernetes? Il-plugin CSI jaħdem ma 'sewwieqa speċjali (Is-sewwieqa tas-CSI) miktuba minn żviluppaturi terzi. Sewwieq CSI f'Kubernetes għandu jikkonsisti minimament f'żewġ komponenti (imżiewed):

  • Kontrollur — jimmaniġġja ħażniet persistenti esterni. Huwa implimentat bħala server gRPC, li għalih jintuża l-primittiv StatefulSet.
  • nodu — huwa responsabbli għall-immuntar ta' ħażna persistenti fuq cluster nodes. Huwa implimentat ukoll bħala server gRPC, iżda juża l-primittiv DaemonSet.

Plugins tal-volum għall-ħażna Kubernetes: minn Flexvolume għal CSI
Kif jaħdem il-plugin CSI f'Kubernetes

Tista 'titgħallem dwar xi dettalji oħra tax-xogħol ta' CSI, pereżempju, mill-artiklu "Nifhmu s-C.S.I." traduzzjoni tagħha ppublikajna sena ilu.

Il-vantaġġi ta 'tali implimentazzjoni

  • Għal affarijiet bażiċi bħar-reġistrazzjoni ta 'sewwieq għal node, l-iżviluppaturi ta' Kubernetes implimentaw sett ta 'kontenituri. M'għadx għandek bżonn tiġġenera rispons JSON b'kapaċitajiet lilek innifsek, kif sar għall-plugin Flexvolume.
  • Minflok "niżżelqu" fajls eżekutibbli fuq in-nodi, issa ntellgħu l-imżiewed fil-cluster. Dan huwa dak li inizjalment nistennew minn Kubernetes: il-proċessi kollha jseħħu ġewwa kontenituri skjerati bl-użu ta 'primittivi ta' Kubernetes.
  • M'għadx għandek bżonn tiżviluppa server RPC u klijent RPC biex timplimenta sewwieqa kumplessi. Il-klijent ġie implimentat għalina mill-iżviluppaturi Kubernetes.
  • Li tgħaddi argumenti biex taħdem fuq il-protokoll gRPC hija ħafna aktar konvenjenti, flessibbli u affidabbli milli tgħaddihom permezz ta 'argumenti tal-linja tal-kmand. Biex tifhem kif iżżid appoġġ għall-metriċi tal-użu tal-volum għas-CSI billi żżid metodu standardizzat gRPC, tista 'taqra: it-talba tal-ġibda tagħna għas-sewwieq vsphere-csi.
  • Il-komunikazzjoni sseħħ permezz ta 'sokits IPC, sabiex ma tiġix konfuża jekk il-kubelet bagħatx it-talba lill-pod korrett.

Din il-lista tfakkarkom f'xi ħaġa? Il-vantaġġi ta 'CSI huma issolvi dawk l-istess problemi, li ma ġewx ikkunsidrati meta żviluppaw il-plugin Flexvolume.

Sejbiet

CSI bħala standard għall-implimentazzjoni ta 'plugins tad-dwana għall-interazzjoni ma' mħażen tad-dejta ntlaqgħet bi pjaċir mill-komunità. Barra minn hekk, minħabba l-vantaġġi u l-versatilità tagħhom, is-sewwieqa CSI huma maħluqa anke għal sistemi ta 'ħażna bħal Ceph jew AWS EBS, plugins biex jaħdmu magħhom ġew miżjuda fl-ewwel verżjoni ta' Kubernetes.

Fil-bidu tal-2019, plugins fis-siġra ġew iddikjarati skaduti. Qed nippjanaw li nkomplu nappoġġaw il-plugin Flexvolume, iżda mhux se niżviluppaw funzjonalità ġdida għalih.

Aħna nfusna diġà għandna esperjenza bl-użu ta 'ceph-csi, vsphere-csi u lesti li nżidu ma' din il-lista! S'issa, CSI qed tlaħħaq mal-kompiti assenjati lilha b'daqqa, iżda nistennew u naraw.

Tinsiex li kollox ġdid huwa ħsieb mill-ġdid tajjeb tal-antik!

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment