Mga plugin sa volume alang sa pagtipig sa Kubernetes: gikan sa Flexvolume hangtod sa CSI

Mga plugin sa volume alang sa pagtipig sa Kubernetes: gikan sa Flexvolume hangtod sa CSI

Sa dihang ang Kubernetes v1.0.0 pa, adunay mga volume plugins. Kinahanglan sila aron makonektar ang mga sistema sa Kubernetes alang sa pagtipig sa nagpadayon (permanente) nga datos sa sudlanan. Gamay ra ang ilang gidaghanon, ug lakip sa una mao ang mga tighatag sa pagtipig sama sa GCE PD, Ceph, AWS EBS ug uban pa.

Gihatud ang mga plugin kauban ang Kubernetes, mao nga nakuha nila ang ilang ngalan - in-tree. Bisan pa, alang sa kadaghanan, ang naglungtad nga set sa ingon nga mga plugin nahimo nga dili igo. Ang mga craftsman midugang og yano nga mga plugins sa Kubernetes core gamit ang mga patch, human niini ilang gitigom ang ilang kaugalingong Kubernetes ug gi-install kini sa ilang mga server. Apan sa paglabay sa panahon, ang mga developer sa Kubernetes nakaamgo niana isda dili masulbad ang problema. Nanginahanglan ang mga tawo pasol. Ug sa pagpagawas sa Kubernetes v1.2.0 kini nagpakita ...

Flexvolume plugin: gamay nga fishing rod

Gihimo sa mga developer sa Kubernetes ang FlexVolume plugin, nga usa ka lohikal nga balangkas sa mga variable ug mga pamaagi alang sa pagtrabaho sa mga driver sa Flexvolume nga gipatuman sa mga third-party nga developer.

Mohunong kita ug tan-awon pag-ayo kung unsa ang drayber sa FlexVolume. Kini usa ka piho executable nga file (binary file, Python script, Bash script, ug uban pa), nga, kung gipatuman, nagkuha sa mga argumento sa command line isip input ug nagbalik sa usa ka mensahe nga adunay pre-known fields sa JSON format. Pinaagi sa kombensyon, ang una nga argumento sa linya sa command kanunay usa ka pamaagi, ug ang nahabilin nga mga argumento mao ang mga parameter niini.

Mga plugin sa volume alang sa pagtipig sa Kubernetes: gikan sa Flexvolume hangtod sa CSI
Diagram sa koneksyon alang sa CIFS Shares sa OpenShift. Flexvolume Driver - Diha mismo sa Center

Minimum nga hugpong sa mga pamaagi ingon niini:

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

Paggamit sa mga Pamaagi attach ΠΈ detach maghubit sa senaryo diin ang kubelet molihok sa umaabot kung tawagan ang drayber. Adunay usab mga espesyal nga pamaagi expandvolume ΠΈ expandfs, nga maoy responsable sa dinamikong pag-usab sa gidaghanon.

Ingon usa ka pananglitan sa mga pagbag-o nga gidugang sa pamaagi expandvolume, ug uban niini ang abilidad sa pag-usab sa mga volume sa tinuod nga panahon, mahimo nimong pamilyar ang imong kaugalingon among hangyo sa pagbitad sa Rook Ceph Operator.

Ug ania ang usa ka pananglitan sa pagpatuman sa drayber sa Flexvolume alang sa pagtrabaho kauban ang 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

Busa, human sa pag-andam sa aktuwal nga executable file, kinahanglan nimo i-upload ang drayber sa Kubernetes cluster. Ang drayber kinahanglang mahimutang sa matag cluster node sumala sa gitakda nang daan. Pinaagi sa default gipili kini:

/usr/libexec/kubernetes/kubelet-plugins/volume/exec/имя_поставщика_Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°~имя_Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°/

... pero kung mogamit ug lain-laing mga distribusyon sa Kubernetes (OpenShift, Rancher...) mahimong lahi ang agianan.

Mga problema sa Flexvolume: unsaon paghulog sa usa ka sungkod sa husto?

Ang pag-upload sa drayber sa Flexvolume sa mga cluster node nahimo nga usa ka dili hinungdanon nga buluhaton. Kung nahimo ang operasyon nga mano-mano sa makausa, dali nga makit-an ang usa ka sitwasyon diin ang mga bag-ong node makita sa cluster: tungod sa pagdugang sa usa ka bag-ong node, awtomatik nga horizontal scaling, o - unsa ang mas grabe - pag-ilis sa usa ka node tungod sa usa ka malfunction. Sa kini nga kaso, ang pagtrabaho kauban ang pagtipig sa kini nga mga node kinahanglan buhaton dili mahimo, hangtod nga mano-mano nimo nga idugang ang drayber sa Flexvolume sa kanila.

Ang solusyon sa kini nga problema mao ang usa sa mga primitibo sa Kubernetes - DaemonSet. Kung adunay usa ka bag-ong node nga makita sa cluster, awtomatiko kini nga adunay usa ka pod gikan sa among DaemonSet, diin ang usa ka lokal nga volume gilakip sa agianan aron makit-an ang mga drayber sa Flexvolume. Sa malampuson nga paghimo, ang pod nagkopya sa gikinahanglan nga mga file aron ang drayber magtrabaho sa disk.

Ania ang usa ka pananglitan sa ingon nga DaemonSet alang sa pagbutang sa usa ka Flexvolume plugin:

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>

ug usa ka pananglitan sa usa ka Bash script alang sa pagbutang sa Flexvolume driver:

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

Importante nga dili kalimtan nga ang operasyon sa pagkopya dili atomic. Adunay usa ka taas nga higayon nga ang kubelet magsugod sa paggamit sa drayber sa dili pa makompleto ang proseso sa paghatag niini, nga mahimong hinungdan sa usa ka sayup sa sistema. Ang husto nga pamaagi mao ang una nga pagkopya sa mga file sa drayber sa ilawom sa usa ka lahi nga ngalan, ug dayon mogamit usa ka operasyon sa pag-usab sa ngalan sa atom.

Mga plugin sa volume alang sa pagtipig sa Kubernetes: gikan sa Flexvolume hangtod sa CSI
Diagram sa pagtrabaho kauban si Ceph sa Rook operator: ang Flexvolume driver sa diagram nahimutang sa sulod sa Rook agent

Ang sunod nga problema kung gigamit ang mga drayber sa Flexvolume mao kana alang sa kadaghanan nga pagtipig sa usa ka cluster node ang gikinahanglan nga software alang niini kinahanglan nga ma-install (pananglitan, ang ceph-common nga pakete para sa Ceph). Sa sinugdan, ang Flexvolume plugin wala gidesinyo sa pagpatuman sa ingon ka komplikado nga mga sistema.

Ang orihinal nga solusyon sa kini nga problema makita sa pagpatuman sa Flexvolume driver sa Rook operator:

Ang drayber mismo gidisenyo isip usa ka kliyente sa RPC. Ang IPC socket alang sa komunikasyon nahimutang sa parehas nga direktoryo sa drayber mismo. Nahinumdom kami nga ang pagkopya sa mga file sa drayber mas maayo nga gamiton ang DaemonSet, nga nagkonektar sa direktoryo sa drayber isip volume. Human sa pagkopya sa gikinahanglan nga rook driver files, kini nga pod dili mamatay, apan nagkonektar sa IPC socket pinaagi sa gilakip nga gidaghanon isip usa ka bug-os nga RPC server. Ang ceph-common nga pakete na-install na sulod sa sudlanan sa pod. Ang IPC socket nagsiguro nga ang kubelet makigkomunikar sa eksakto nga pod nga nahimutang sa samang node. Ang tanan nga mamugnaon yano ra! ..

Goodbye, among mapinanggaon... in-tree plugins!

Nadiskobrehan sa mga developer sa Kubernetes nga ang gidaghanon sa mga plugins alang sa pagtipig sulod sa kinauyokan kay baynte. Ug ang pagbag-o sa matag usa kanila, sa usa ka paagi o sa lain, moagi sa tibuuk nga siklo sa pagpagawas sa Kubernetes.

Kini nahimo nga sa paggamit sa bag-ong bersyon sa storage plugin, kinahanglan nimo nga i-update ang tibuok cluster. Dugang pa niini, tingali matingala ka nga ang bag-ong bersyon sa Kubernetes kalit nga mahimong incompatible sa Linux kernel nga imong gigamit... Mao nga imong pahiran ang imong mga luha ug, pagkagot sa imong ngipon, makig-coordinate sa imong management ug user sa oras aron i-update ang Linux kernel ug Kubernetes cluster. Uban sa posible nga downtime sa paghatag sa mga serbisyo.

Ang kahimtang labaw pa sa kataw-anan, dili ba? Nahimong tin-aw sa tibuok komunidad nga ang pamaagi wala molihok. Pinaagi sa tinuyo nga desisyon, ang mga developer sa Kubernetes nagpahibalo nga ang mga bag-ong plugins alang sa pagtrabaho uban sa storage dili na dawaton sa kernel. Dugang pa, ingon sa nahibal-an na naton, daghang mga kakulangan ang nahibal-an sa pagpatuman sa Flexvolume plugin...

Ang pinakabag-o nga gidugang nga plugin alang sa mga volume sa Kubernetes, CSI, gitawag aron tapuson ang isyu sa padayon nga pagtipig sa datos sa makausa ug alang sa tanan. Ang alpha nga bersyon niini, nga mas hingpit nga gitawag nga Out-of-Tree CSI Volume Plugins, gipahibalo sa pagpagawas Kubernet 1.9.

Container Storage Interface, o CSI 3000 spinning rod!

Una sa tanan, gusto nakong timan-an nga ang CSI dili lang usa ka volume plugin, apan tinuod sumbanan sa paghimo sa naandan nga mga sangkap alang sa pagtrabaho sa mga bodega sa datos. Ang mga sistema sa orkestra sa sudlanan sama sa Kubernetes ug Mesos kinahanglan nga "makat-on" kung giunsa ang pagtrabaho sa mga sangkap nga gipatuman sumala sa kini nga sumbanan. Ug karon nakat-on na ko sa Kubernetes.

Unsa ang istruktura sa CSI plugin sa Kubernetes? Ang CSI plugin nagtrabaho uban sa espesyal nga mga drayber (Mga drayber sa CSI) nga gisulat sa mga third party developers. Ang usa ka drayber sa CSI sa Kubernetes kinahanglan nga adunay labing gamay nga duha ka sangkap (mga pod):

  • pagmando, pagdumala - nagdumala sa gawas nga padayon nga pagtipig. Gipatuman kini isip gRPC server, diin gigamit ang primitive StatefulSet.
  • binurotan, hubag - ang responsable sa pag-mount sa padayon nga pagtipig sa mga cluster node. Gipatuman usab kini isip usa ka gRPC server, apan gigamit niini ang primitive DaemonSet.

Mga plugin sa volume alang sa pagtipig sa Kubernetes: gikan sa Flexvolume hangtod sa CSI
Giunsa ang CSI plugin nagtrabaho sa Kubernetes

Makakat-on ka bahin sa ubang mga detalye sa trabaho sa CSI, pananglitan, gikan sa artikulo nga "Pagsabot sa C.S.I.Β», hubad niini gimantala namo usa ka tuig na ang milabay.

Ang mga bentaha sa ingon nga pagpatuman

  • Alang sa sukaranang mga butang sama sa pagrehistro sa usa ka drayber alang sa usa ka node, ang mga developer sa Kubernetes nagpatuman usa ka set sa mga sudlanan. Dili na nimo kinahanglan nga maghimo usa ka tubag sa JSON nga adunay mga kapabilidad sa imong kaugalingon, sama sa gihimo alang sa Flexvolume plugin.
  • Imbis nga "i-slipping" ang mga executable nga mga file sa mga node, nag-upload na kami mga pod sa cluster. Mao kini ang una namong gipaabot gikan sa Kubernetes: ang tanang proseso mahitabo sulod sa mga sudlanan nga gi-deploy gamit ang Kubernetes primitives.
  • Dili na nimo kinahanglan nga maghimo usa ka RPC server ug kliyente sa RPC aron mapatuman ang mga komplikado nga drayber. Ang kliyente gipatuman alang kanamo sa mga developer sa Kubernetes.
  • Ang pagpasa sa mga argumento sa pagtrabaho sa gRPC protocol mas sayon, flexible ug kasaligan kay sa pagpasa niini pinaagi sa command line arguments. Aron masabtan kung giunsa pagdugang suporta alang sa mga sukatan sa paggamit sa volume sa CSI pinaagi sa pagdugang usa ka estandard nga pamaagi sa gRPC, mabasa nimo: among hangyo sa pagbitad alang sa vsphere-csi driver.
  • Nahitabo ang komunikasyon pinaagi sa mga socket sa IPC, aron dili malibog kung gipadala ba sa kubelet ang hangyo sa husto nga pod.

Kini ba nga listahan nagpahinumdom kanimo sa bisan unsa? Ang mga bentaha sa CSI mao ang pagsulbad sa parehas nga mga problema, nga wala gikonsiderar sa paghimo sa Flexvolume plugin.

kaplag

Ang CSI isip usa ka sumbanan alang sa pagpatuman sa custom nga mga plugins alang sa pagpakig-uban sa mga bodega sa datos mainiton kaayo nga nadawat sa komunidad. Dugang pa, tungod sa ilang mga bentaha ug versatility, ang mga drayber sa CSI gibuhat bisan alang sa mga sistema sa pagtipig sama sa Ceph o AWS EBS, mga plugins alang sa pagtrabaho nga gidugang sa labing una nga bersyon sa Kubernetes.

Sa sinugdanan sa 2019, in-tree nga mga plugin gideklarar nga obsolete. Nagplano kami nga magpadayon sa pagsuporta sa Flexvolume plugin, apan dili makahimo og bag-ong gamit alang niini.

Kami mismo adunay kasinatian sa paggamit sa ceph-csi, vsphere-csi ug andam nga idugang sa kini nga lista! Sa pagkakaron, ang CSI nagsagubang sa mga buluhaton nga gi-assign niini uban ang usa ka bang, apan maghulat kami ug makita.

Ayaw kalimti nga ang tanan nga bag-o usa ka maayong paghunahuna pag-usab sa daan!

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment