Kubernetesi mahutite pluginate haldus: Flexvolume'ist CSI-ni

Kubernetesi mahutite pluginate haldus: Flexvolume'ist CSI-ni

Aegadel, mil Kubernetes oli veel v1.0.0, eksisteerisid mahutite pluginaid (volume plugins). Need olid vajalikud Kubernetes'i sĂŒsteemide ĂŒhendamiseks, mis salvestasid konteinerite pĂŒsivaid (pĂŒsivaid) andmeid. Nende arv oli vĂ€ike, ja esimesed olid sellised salvestusteenuse pakkujad nagu GCE PD, Ceph, AWS EBS ja teised.

Pluginaid tarniti koos Kubernetesiga, miks neid nimetatakse ka in-tree. Kuid paljudele praegusest komplektist ei piisanud. KĂ€tetöölised lisasid lihtsaid pluginaid Kubernetes'i tuumale lĂ€bi plaastrite, pĂ€rast mida kogusid nad omaenda Kubernetes'i ja paigaldasid selle oma serveritesse. Kuid aja jooksul mĂ”istsid Kubernetes'i arendajad, et probleemi niisama ei lahenda. Inimesele on vaja kalapĂŒĂŒgi varustust. Ja Kubernetesi versioonis v1.2.0 ilmnes see...

Flexvolume plugin: lihtne kalapĂŒĂŒgivahend

Kubernetes'i arendajad lÔid FlexVolume'i plugina, mis oli loogiline sidumine muutujaid ja meetodeid, et töötada vÀlja kolmandate osapoolte Flexvolume-draiveritega.

Vaatame lĂ€hemalt, mida FlexVolume'i draiver endast kujutab. See on teatud tĂ€itmisfail. (binaarfail, Python-skript, Bash-skript jne), mis tĂ€itmisel vĂ”tab sisendiks kĂ€skude rea argumendid ja tagastab sĂ”numi, millel on eelnevalt mÀÀratletud vĂ€ljad JSON-formaadis. Esimene kĂ€skude rea argument on kokkuleppe kohaselt alati meetod ja ĂŒlejÀÀnud argumendid on tema parameetrid.

Kubernetesi mahutite pluginate haldus: Flexvolume'ist CSI-ni
CIFS Share'ide ĂŒhendusskeem OpenShiftis. Flexvolume draiver — tĂ€pselt keskel

Minimaalne meetodite komplekt nÀeb vÀlja nii:

flexvolume_driver mount # vastutab mahuti liitmise eest pod'iga
# Tagastatava sÔnumi formaat:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "Miks see staatus tagastati",
}

flexvolume_driver unmount # vastutab mahuti lahtiĂŒhendamise eest pod'ist
# Tagastatava sÔnumi formaat:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "Miks see staatus tagastati",
}

flexvolume_driver init # vastutab plugina initsialiseerimise eest
# Tagastatava sÔnumi formaat:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "Miks see staatus tagastati",
  // MÀÀrab, kas draiver kasutab meetodeid attach/detach
  "capabilities":{"attach": True/False}
}

Meetodite kasutamine attach ja detach mÀÀrab stsenaariumi, mille alusel kubelet tulevikus draiveri kutse tegemisel tegutseb. Samuti on olemas spetsiaalsed meetodid expandvolume ja expandfs, mis vastutavad mahuti dĂŒnaamilise suuruse muutmise eest.

Muudatuste nĂ€itena, mida meetod lisab expandvolume, ja koos sellega — vĂ”imalus teostada mahutite suuruse muutmist reaalajas, saate tutvuda meie pull request’iga Rook Ceph Operatori juures.

Siin on Flexvolume-draiveri teostuse nÀide NFS-i toe jaoks:

usage() {
    err "Vale vale. Kasutamine: "
    err "t$0 init"
    err "t$0 mount  "
    err "t$0 unmount "
    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": "Mountimine ebaÔnnestus: ${NFS_SERVER}:${SHARE} asukohas ${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": "Eemaldamine ebaÔnnestus asukohas ${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

NĂŒĂŒd, pĂ€rast tĂ€idetud tĂ€itefaili ettevalmistamist, on vajalik lastata draiver Kubernetes klastrisse. Draiver peab olema igas klastrisĂ”lmes, jĂ€rgides eelnevalt kokkulepitud teed. Vaikimisi on valitud:

/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ĐžĐŒŃ_ĐżĐŸŃŃ‚Đ°ĐČщоĐșа_Ń…Ń€Đ°ĐœĐžĐ»ĐžŃ‰Đ°~ĐžĐŒŃ_ЮраĐčĐČДра/


 kuid erinevate Kubernetes'i jaotuste (OpenShift, Rancher
) puhul vÔib tee olla teine.

Flexvolume probleemid: kuidas Ôigesti vasardada?

Flexvolume draiveri paigaldamine klastrisĂ”lmedesse osutus mitte triviaalseks ĂŒlesandeks. Kui teha operatsioon kord kĂ€sitsi, vĂ”ib juhtuda, et klastris lisanduvad uued sĂ”lmed: uue sĂ”lme lisamise, automaatse horisontaalse skaleerimise tĂ”ttu vĂ”i — mis veelgi hullem — sĂ”lme asendamise tĂ”ttu rikke tĂ”ttu. Sellisel juhul tuleb neid sĂ”lmi kasutada ei ole vĂ”imalik, kuni lisate neile Flexvolume draiveri ikka veel kĂ€sitsi.

Selle probleemi lahenduseks osutus Kubernetes'e primitiiv — DaemonSet. Kui klastris ilmub uus sĂ”lm, paigaldatakse sellele automaatselt pod meie DaemonSet'ist, millele liitub kohalik maht teel, kus asuvad Flexvolume draiverid. Kui pod on edukalt loodud, kopeerib see draiveri töötamiseks vajalikud failid kettale.

Siin on nÀide sellisest DaemonSet'ist Flexvolume pistiku paigaldamiseks:

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


 ja Bash-skripti nÀide Flexvolume-draiveri kasutamiseks:

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

Oluline on mitte unustada, et koopiamoodul ei ole atomaarne. On suur tĂ”enĂ€osus, et kubelet hakkab draiverit kasutama enne, kui selle ettevalmistamise protsess on lĂ”ppenud, mis pĂ”hjustab sĂŒsteemi tĂ”rke. Õige lĂ€henemine on esmalt kopeerida draiverifailid teise nime alla, seejĂ€rel kasutada atomaarset ĂŒmbernimetamist.

Kubernetesi mahutite pluginate haldus: Flexvolume'ist CSI-ni
Cephi töötamise skeem Rooki operaatoris: Flexvolume-draiver asub skeemil Rooki agendi sees

J volgende probleem, kui kasutada Flexvolume-draivereid, on see, et kliendi sĂ”lme peab olema vajalik tarkvara (nĂ€iteks ceph-common paket Cephi jaoks). Alguses ei olnud Flexvolume plugin mĂ”eldud nii keeruliste sĂŒsteemide rakendamiseks. (nĂ€iteks, pakett ceph-common Cephi jaoks). Flexvolume'i pistikprogrammi ei olnud algselt mĂ”eldud nii keeruliste sĂŒsteemide rakendamiseks.

Originaalne lahendus selle probleemiga on nÀhtav Rooki operaatori Flexvolume-draiveri teostuses:

Ise draiver on teostatud RPC-klientina. IPC-sokkel suhtlemiseks asub samas kataloogis, kus on ise draiver. Me mĂ€letame, et draiveri failide koopiate tegemiseks oleks hea kasutada DaemonSet'i, mis ĂŒhendab endale draiveriga katalooge kui mahtu. PĂ€rast Rooki draiveri vajalike failide kopeerimist ei sure see pod, vaid ĂŒhendub IPC-sokliga kinnitatud mahu kaudu tĂ€isfunktsionaalse RPC-serverina. Pakett ceph-common on juba paigaldatud pod'i konteinerisse. IPC-sokkel tagab, et kubelet suhtleb just selle pod'iga, mis asub koos temaga ĂŒhel sĂ”lmel. KĂ”ik geniaalne on lihtne!..

Head aega, meie armsad
 in-tree pluginate!

Kubernetes'i arendajad avastasid, et tuumapĂ”histe salvestuspluginate arv on kakskĂŒmmend. Ja igas neist muudatused lĂ€bivad igal juhul tĂ€iskohalise Kubernetes'i vĂ€ljaandetsĂŒkli.

Selgub, et uue salvestusplugina versiooni kasutamiseks, on vaja vĂ€rskendada tervet klastrit.. Lisaks sellele vĂ”ite ĂŒllatuda, et uus Kubernetes versioon osutub Ă€kki ĂŒhilduvaks kasutatava Linuxi kĂ€rgaga... Ja seetĂ”ttu pĂŒhite pisarad ja hammastega nĂ€ksides lepite ĂŒlemuse ja kasutajatega kokku Linuxi kĂ€rje ja Kubernetes klastrite uuendamise aja. VĂ”imaliku teenusekatkestusega.

Situatsioon on rohkem kui koomiline, eks? Kogu kogukond mÔistis, et lÀhenemine ei toimi. Otsustavatel hetkedel kuulutavad Kubernetes arendajad, et uusi pluginaid andmete salvestamiseks ei vÔeta enam tuuma. Lisaks teame, et Flexvolume plugina rakenduses on tuvastatud mitmeid puudujÀÀke...

LĂ”puks tuleb kĂŒsimus pĂŒsivatest andmete salvestamisest selgeks teha viimasena lisatud plugina abil Kubernetesest — CSI. Selle alfa versioon, mida nimetatakse tĂ€ielikult Out-of-Tree CSI Volume Plugins, kuulutati vĂ€lja vĂ€ljaandes Kubernetes 1.9.

Container Storage Interface, vÔi jÀrgnevalt CSI 3000!

Esimese asjana sooviksin mĂ€rkida, et CSI — see pole lihtsalt volume plugin, vaid tĂ”eline standard kasutajate komponentide loomise jaoks andmete salvestamiseks. Eeldati, et konteinerite orkestreerimise sĂŒsteemid, nagu Kubernetes ja Mesos, peavad Ă”ppima selle standardi jĂ€rgi rakendatud komponentidega töötama. Ja siit juba Kubernetes on Ă”ppinud.

Milline on CSI-plugina struktuur Kuberneteses? CSI-plugin töötab spetsiaalsete draiveritega (CSI-draiveritega), mille on kirjutanud kolmanda osapoole arendajad. CSI-draiver Kuberneteses peab minimaalset koosnema kahest komponendist (pod’ist):

  • Kontroller — haldab vĂ€liseid pĂŒsivaid ladustamisi. Vabastatakse gRPC-serverina, mille jaoks kasutatakse primitiivi StatefulSet.
  • SĂ”lm — vastutab pĂŒsivate ladustamiste mountimise eest klastrisĂ”lmedes. Samuti rakendatakse gRPC-serverina, kuid selle jaoks kasutatakse primitiivi DaemonSet.

Kubernetesi mahutite pluginate haldus: Flexvolume'ist CSI-ni
CSI-plugina tööskeem Kuberneteses

MÔningate teiste CSI töödetailide kohta saate lugeda nÀiteks artiklist «Understanding the CSI», mille tÔlked me avaldasime aasta tagasi.

Sellise rakenduse plussid

  • PĂ”hiasjade jaoks — nĂ€iteks sĂ”lme draiveri registreerimiseks — on Kubernetes arendajad rakendanud konteinerite komplekti. Ei ole enam vaja ise luua JSON-vastust capabilities'idega, nagu see tehti Flexvolume plugina puhul.
  • KĂ€ivitatavates failidesse «sisestamise» asemel laadime nĂŒĂŒd klastrisse pod’id. Just seda me Kuberneteselt ootame: kĂ”ik protsessid toimuvad konteinerites, mis on paigutatud Kubernetes'e primitiivide abil.
  • Komplekssete draiverite rakendamiseks ei pea enam arendama RPC-serverit ja RPC-klienti. Klienti on meie eest rakendanud Kubernetes'e arendajad.
  • Argumentide edastamine gRPC-protokolli kaudu on palju mugavam, paindlikum ja usaldusvÀÀrsem kui nende edastamine kĂ€surea argumentidena. Kuidas lisada CSI-sse mahude kasutamise mÔÔdikute toeks standardiseeritud gRPC-meetodi, saab tutvuda meie pull request’iga vsphere-csi draiveri jaoks.
  • Suhtlus toimub IPC-soketite kaudu, et mitte segadusse minna, millisele pod’ile kubelet pĂ€ringu saatis.

Kas see nimekiri meenutab teile midagi? CSI eelised on lahendus nendele probleemidele, mis ei olnud arvesse vÔetud Flexvolume'i pistiku loomisel.

JĂ€reldused

CSI kui kasutajapoolsete pluginite standard andmesalvestussektoritega suhtlemiseks on kogukonna poolt vÀga soojalt vastu vÔetud. Veelgi enam, oma eeliste ja mitmekesisuse tÔttu luuakse CSI draivereid isegi selliste salvestuslahenduste jaoks nagu Ceph vÔi AWS EBS, mille pluginad on lisatud juba Kubernetes'i esimeses versioonis.

2019. aasta alguses kuulutati in-tree pluginad aegunud. Flexvolume'i plugina toetamine jÀtkub, kuid selle jaoks uusi funktsioone ei arendata.

Meil on juba kogemus ceph-csi ja vsphere-csi kasutamisel ning oleme valmis seda nimekirja tĂ€iendama! Praegu tĂ€idab CSI sellele pandud ĂŒlesandeid suurepĂ€raselt, aga eks nĂ€eme, mis edasi saab.

Ärge unustage, et kĂ”ik uus on hĂ€sti ĂŒmber mĂ”testatud vana!

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster