Plugins volim pou depo Kubernetes: soti nan Flexvolume rive nan CSI

Plugins volim pou depo Kubernetes: soti nan Flexvolume rive nan CSI

Retounen lè Kubernetes te toujou v1.0.0, te gen grefon volim. Yo te bezwen konekte sistèm ak Kubernetes pou estoke done veso ki pèsistan (pèmanan). Nimewo yo te piti, e pami premye yo te gen founisè depo tankou GCE PD, Ceph, AWS EBS ak lòt moun.

Plugins yo te delivre ansanm ak Kubernetes, se poutèt sa yo te resevwa non yo - nan pye bwa. Sepandan, pou anpil moun, seri a ki deja egziste nan grefon sa yo te tounen ensifizan. Atizan yo te ajoute grefon senp nan nwayo Kubernetes lè l sèvi avèk plak, apre sa yo rasanble pwòp Kubernetes yo epi enstale li sou sèvè yo. Men, apre yon sèten tan, devlopè Kubernetes reyalize sa pwason pwoblèm nan pa ka rezoud. Moun bezwen baton lapèch. Ak nan liberasyon an nan Kubernetes v1.2.0 li parèt ...

Flexvolume plugin: baton lapèch minim

Devlopè Kubernetes te kreye Plugin FlexVolume, ki te yon fondasyon lojik varyab ak metòd pou travay ak chofè Flexvolume aplike pa devlopè twazyèm pati.

Ann sispann epi pran yon gade pi pre nan kisa chofè FlexVolume la ye. Sa a se yon sèten dosye ègzèkutabl (fichye binè, script Python, script Bash, elatriye), ki, lè egzekite, pran agiman liy lòd kòm opinyon epi retounen yon mesaj ak jaden pre-li te ye nan fòma JSON. Dapre konvansyon, premye agiman liy lòd la se toujou yon metòd, ak agiman ki rete yo se paramèt li yo.

Plugins volim pou depo Kubernetes: soti nan Flexvolume rive nan CSI
Dyagram koneksyon pou CIFS Shares nan OpenShift. Chofè Flexvolume - Dwa nan Sant lan

Minimòm seri metòd sanble tankou sa a:

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

Sèvi ak Metòd attach и detach pral defini senaryo a nan ki kubelet la pral aji nan lavni an lè w ap rele chofè a. Genyen tou metòd espesyal expandvolume и expandfs, ki responsab pou redimansyonman dinamik volim nan.

Kòm yon egzanp chanjman yo ke metòd la ajoute expandvolume, epi ak li kapasite nan redimensionne volim nan tan reyèl, ou ka familyarize tèt ou ak demann rale nou an nan Rook Ceph Operatè.

Ak isit la se yon egzanp aplikasyon an nan chofè a Flexvolume pou travay ak 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

Se konsa, apre w fin prepare dosye aktyèl la ègzèkutabl, ou bezwen telechaje chofè a nan gwoup Kubernetes la. Chofè a dwe lokalize sou chak ne grap dapre yon chemen predetèmine. Pa default li te chwazi:

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

... men lè w ap itilize distribisyon Kubernetes diferan (OpenShift, Rancher...) chemen an ka diferan.

Pwoblèm Flexvolume: ki jan yo jete yon baton lapèch kòrèkteman?

Téléchargement chofè Flexvolume pou nœuds grap te tounen yon travay ki pa trivial. Lè w fin fè operasyon an manyèlman yon fwa, li fasil pou rankontre yon sitiyasyon kote nouvo nœuds parèt nan gwoup la: akòz adisyon a nan yon nouvo ne, otomatik dechèl orizontal, oswa - sa ki pi mal - ranplasman nan yon ne akòz yon fonksyone byen. Nan ka sa a, travay ak depo a sou nœuds sa yo ta dwe fè se enposib, jiskaske ou toujou lamen ajoute chofè Flexvolume a pou yo.

Solisyon pwoblèm sa a se te youn nan primitif Kubernetes - DaemonSet. Lè yon nouvo ne parèt nan gwoup la, li otomatikman gen yon gous ki soti nan DaemonSet nou an, kote yo tache yon volim lokal sou chemen an pou jwenn chofè Flexvolume. Apre kreyasyon siksè, gous la kopye dosye ki nesesè yo pou chofè a travay sou disk.

Isit la se yon egzanp tankou yon DaemonSet pou mete deyò yon 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>

... ak yon egzanp yon script Bash pou mete chofè Flexvolume a:

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

Li enpòtan pou pa bliye ke operasyon an kopi se pa atomik. Gen yon gwo chans pou kubelet la kòmanse sèvi ak chofè a anvan pwosesis pwovizyon li yo fini, sa ki lakòz sistèm nan aksidan. Apwòch ki kòrèk la se premye kopye dosye chofè yo anba yon non diferan, ak Lè sa a, sèvi ak yon operasyon chanje non atomik.

Plugins volim pou depo Kubernetes: soti nan Flexvolume rive nan CSI
Dyagram nan travay ak Ceph nan operatè Rook la: chofè Flexvolume nan dyagram nan sitiye andedan ajan Rook la.

Pwoblèm nan pwochen lè w ap itilize chofè Flexvolume se ke pou pifò depo sou yon ne grap lojisyèl ki nesesè pou sa a dwe enstale (pa egzanp, pake ceph-komen pou Ceph). Okòmansman, Plugin Flexvolume pa te fèt pou aplike sistèm konplèks sa yo.

Yon solisyon orijinal pwoblèm sa a ka wè nan aplikasyon chofè Flexvolume operatè Rook la:

Se chofè a li menm ki fèt kòm yon kliyan RPC. Socket IPC pou kominikasyon an sitiye nan menm anyè ak chofè a li menm. Nou sonje ke pou kopye dosye chofè li ta bon pou itilize DaemonSet, ki konekte anyè a ak chofè a kòm yon volim. Apre kopye dosye chofè rook ki nesesè yo, gous sa a pa mouri, men konekte ak priz IPC la atravè volim ki atache a kòm yon sèvè RPC plen véritable. Pake ceph-common la deja enstale andedan veso gous la. Socket IPC la asire ke kubelet la pral kominike avèk egzakteman gous la ki sitiye sou menm ne. Tout bagay enjenyeu senp!...

Orevwa, afeksyon nou yo... grefon nan pye bwa!

Devlopè Kubernetes dekouvri ke kantite grefon pou depo nan nwayo a se ven. Ak yon chanjman nan chak nan yo, yon fason oswa yon lòt, ale nan sik la plen Kubernetes lage.

Li sanble ke yo sèvi ak nouvo vèsyon an nan Plugin nan depo, ou bezwen mete ajou tout gwoup la. Anplis de sa, ou ka sezi ke nouvo vèsyon an nan Kubernetes pral toudenkou vin enkonpatib ak nwayo Linux w ap itilize a... Se konsa, ou siye dlo nan je ou epi, griyen dan ou, kowòdone ak jesyon ou ak itilizatè yo tan pou mete ajou Kernel Linux ak gwoup Kubernetes. Avèk posib D 'nan dispozisyon pou sèvis yo.

Sitiyasyon an plis pase komik, ou pa panse? Li te vin klè pou tout kominote a ke apwòch la pa t ap travay. Pa yon desizyon volontè, devlopè Kubernetes anonse ke nouvo grefon pou travay ak depo yo p ap aksepte ankò nan nwayo a. Anplis de sa, kòm nou deja konnen, yo te idantifye yon kantite enpèfeksyon nan aplikasyon an nan Plugin Flexvolume la ...

Dènye plugin te ajoute pou volim nan Kubernetes, CSI, te rele pou fèmen pwoblèm nan ak depo done ki pèsistan yon fwa pou tout. Vèsyon alfa li a, ki rele plis konplètman kòm Out-of-Tree CSI Volim Plugins, te anonse nan liberasyon an. Kubernetes 1.9.

Container Storage Interface, oswa baton k ap vire CSI 3000!

Premye a tout, mwen ta renmen sonje ke CSI se pa sèlman yon Plugin volim, men yon reyèl estanda sou kreye konpozan koutim pou travay ak depo done. Sistèm orchestrasyon veso tankou Kubernetes ak Mesos te sipoze "aprann" ki jan yo travay ak konpozan aplike dapre estanda sa a. Epi, koulye a mwen te deja aprann Kubernetes.

Ki estrikti Plugin CSI a nan Kubernetes? Plugin CSI a travay ak chofè espesyal (CSI chofè yo) ekri pa devlopè twazyèm pati. Yon chofè CSI nan Kubernetes ta dwe omwen konpoze de de eleman (gous):

  • Kontwolè - jere depo ekstèn ki pèsistan. Li aplike kòm yon sèvè gRPC, pou yo itilize primitif la StatefulSet.
  • Node — se responsab pou monte depo ki pèsistan nan nœuds gwoup yo. Li se tou aplike kòm yon sèvè gRPC, men li itilize primitif la DaemonSet.

Plugins volim pou depo Kubernetes: soti nan Flexvolume rive nan CSI
Ki jan Plugin CSI a travay nan Kubernetes

Ou ka aprann sou kèk lòt detay sou travay CSI a, pou egzanp, nan atik la "Konprann C.S.I.' tradiksyon ki nou pibliye yon ane de sa.

Avantaj ki genyen nan yon aplikasyon konsa

  • Pou bagay debaz tankou enskri yon chofè pou yon ne, devlopè Kubernetes yo te aplike yon seri resipyan. Ou pa bezwen jenere yon repons JSON ak kapasite tèt ou ankò, jan sa te fè pou Plugin Flexvolume la.
  • Olye pou yo "glise" dosye ègzèkutabl sou nœuds, kounye a nou telechaje gous nan gwoup la. Sa a se sa nou espere okòmansman nan Kubernetes: tout pwosesis fèt andedan resipyan deplwaye lè l sèvi avèk primitif Kubernetes.
  • Ou pa bezwen devlope yon sèvè RPC ak yon kliyan RPC pou aplike chofè konplèks. Kliyan an te aplike pou nou pa devlopè Kubernetes.
  • Pase agiman pou travay sou pwotokòl gRPC a se pi plis pratik, fleksib ak serye pase pase yo atravè agiman liy lòd. Pou konprann kijan pou ajoute sipò pou mezi itilizasyon volim nan CSI lè w ajoute yon metòd gRPC estanda, ou ka li: demann rale nou an pou chofè vsphere-csi.
  • Kominikasyon fèt atravè priz IPC, se konsa yo pa dwe konfonn si kubelet la voye demann lan nan gous ki kòrèk la.

Èske lis sa a fè w sonje anyen? Avantaj ki genyen nan CSI yo se rezoud menm pwoblèm sa yo, ki pa te pran an kont lè yo devlope Plugin Flexvolume la.

Jwenn

CSI kòm yon estanda pou mete ann aplikasyon grefon koutim pou kominike avèk depo done yo te trè byen resevwa pa kominote a. Anplis de sa, akòz avantaj yo ak adaptabilite, chofè CSI yo kreye menm pou sistèm depo tankou Ceph oswa AWS EBS, grefon pou travay ak ki te ajoute nan vèsyon an trè premye nan Kubernetes.

Nan kòmansman 2019, grefon nan pye bwa yo te deklare demode. Nou planifye pou kontinye sipòte Plugin Flexvolume a, men nou p ap devlope nouvo fonksyonalite pou li.

Nou menm nou deja gen eksperyans lè l sèvi avèk ceph-csi, vsphere-csi epi nou pare pou ajoute nan lis sa a! Jiskaprezan, CSI ap fè fas ak travay yo asiyen li ak yon bang, men nou pral tann ak wè.

Pa bliye ke tout bagay nouvo se yon bon repanse de ansyen an!

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè