
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.

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 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 1TÄ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
doneIr 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.

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Ä. .
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. 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.

KÄ CSI spraudnis darbojas Kubernetes vidÄ
Par citÄm CSI darba detaļÄm varat uzzinÄt, piemÄram, no raksta ā" 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 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 MÄ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
