ΠΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π°, ΠΊΠΎΠ³Π΄Π° Kubernetes Π±ΡΠ» Π΅ΡΡ v1.0.0, ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄Π»Ρ ΡΠΎΠΌΠΎΠ² (volume plugins). ΠΡΠΆΠ½Ρ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Kubernetes ΡΠΈΡΡΠ΅ΠΌ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΡΡ
(ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ
) Π΄Π°Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡ
Π±ΡΠ»ΠΎ Π½Π΅Π²Π΅Π»ΠΈΠΊΠΎ, Π° Π² ΡΠΈΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΡΡ
β ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡ, ΠΊΠ°ΠΊ GCE PD, Ceph, AWS EBS ΠΈ Π΄ΡΡΠ³ΠΈΠ΅.
ΠΠΎΡΡΠ°Π²Π»ΡΠ»ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Kubernetes, Π·Π° ΡΡΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ²ΠΎΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ β in-tree. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡΠ° ΡΠ°ΠΊΠΈΡ
ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌ. Π£ΠΌΠ΅Π»ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ»ΠΈ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π² ΡΠ΄ΡΠΎ Kubernetes ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠ°ΡΡΠ΅ΠΉ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΈΡΠ°Π»ΠΈ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Kubernetes ΠΈ ΡΡΠ°Π²ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½Π° ΡΠ²ΠΎΠΈ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΠΎ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Kubernetes ΠΏΠΎΠ½ΡΠ»ΠΈ, ΡΡΠΎ ΡΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ ΡΠ΅ΡΠΈΡΡ. ΠΡΠ΄ΡΠΌ Π½ΡΠΆΠ½Π° ΡΠ΄ΠΎΡΠΊΠ°. Π Π² ΡΠ΅Π»ΠΈΠ·Π΅ Kubernetes v1.2.0 ΠΎΠ½Π° ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡβ¦
ΠΠ»Π°Π³ΠΈΠ½ Flexvolume: ΡΠ΄ΠΎΡΠΊΠ° Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΊΠ°Ρ
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Kubernetes Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ ΠΏΠ»Π°Π³ΠΈΠ½ FlexVolume, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ»ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π²ΡΠ·ΠΊΠΎΠΉ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΡΠΌΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°ΠΌΠΈ.
ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ FlexVolume. ΠΡΠΎ Π½Π΅ΠΊΠΈΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» (Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Python-ΡΠΊΡΠΈΠΏΡ, Bash-ΡΠΊΡΠΈΠΏΡ ΠΈ Ρ.ΠΏ.), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ Π² JSON-ΡΠΎΡΠΌΠ°ΡΠ΅. ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄, Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ β Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
Π‘Ρ
Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ CIFS Shares Π² OpenShift. ΠΡΠ°ΠΉΠ²Π΅Ρ Flexvolume β ΠΏΡΡΠΌΠΎ ΠΏΠΎ ΡΠ΅Π½ΡΡΡ
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
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}
}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² attach
ΠΈ detach
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ kubelet Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ expandvolume
ΠΈ expandfs
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΠΌΠ°.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ expandvolume
, Π° Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½ΠΈΠΌ β ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΠΌΠΎΠ² Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ
Π Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ 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
ΠΡΠ°ΠΊ, ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ»ΠΎΠΆΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π² Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ. ΠΡΠ°ΠΉΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ·Π»Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠ³ΠΎΠ²ΠΎΡΠ΅Π½Π½ΠΎΠΌΡ ΠΏΡΡΠΈ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΡΠ» Π²ΡΠ±ΡΠ°Π½:
/usr/libexec/kubernetes/kubelet-plugins/volume/exec/ΠΈΠΌΡ_ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°_Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°~ΠΈΠΌΡ_Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°/
β¦ Π½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² Kubernetes (OpenShift, Rancherβ¦) ΠΏΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Flexvolume: ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΊΠΈΠ΄ΡΠ²Π°ΡΡ ΡΠ΄ΠΎΡΠΊΡ?
ΠΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π½Π° ΡΠ·Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΡΠΎΠ΄Π΅Π»Π°Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ Π²ΡΡΡΠ½ΡΡ, Π»Π΅Π³ΠΊΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠΈΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΏΠΎΡΠ²ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ·Π»Ρ: ΠΈΠ·-Π·Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ β ΡΡΠΎ ΡΡΡΠ°ΡΠ½Π΅Π΅ β Π·Π°ΠΌΠ΅Π½Ρ ΡΠ·Π»Π° ΠΈΠ·-Π·Π° Π½Π΅ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π±ΠΎΡΡ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ Π½Π° Π΄Π°Π½Π½ΡΡ ΡΠ·Π»Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠΊΠ° Π²Ρ Π²ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ Π² ΡΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½Π° Π½ΠΈΡ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅Ρ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΡΠ»ΡΠΆΠΈΠ» ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² Kubernetes β DaemonSet
. ΠΡΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Π½Π° Π½Π΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ pod ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ DaemonSet’a, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠΎΠΌ ΠΏΠΎ ΠΏΡΡΠΈ Π΄Π»Ρ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ². ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ pod ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½Π° Π΄ΠΈΡΠΊ.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ DaemonSet’Π° Π΄Π»Ρ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π½ΠΈΡ 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>
β¦ ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Bash-ΡΠΊΡΠΈΠΏΡΠ° Π΄Π»Ρ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π½ΠΈΡ 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
ΠΠ°ΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±ΡΡΡ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ. ΠΠ΅Π»ΠΈΠΊΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ, ΡΡΠΎ kubelet Π½Π°ΡΠ½Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠ΅ΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΠ°Π±ΠΎΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΏΠΎΠ΄ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ.
Π‘Ρ
Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ρ Ceph Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ Rook: Π΄ΡΠ°ΠΉΠ²Π΅Ρ Flexvolume Π½Π° ΡΡ
Π΅ΠΌΠ΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ Π°Π³Π΅Π½ΡΠ° Rook
Π‘Π»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ Π½Π° ΡΠ·Π»Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ°ΠΊΠ΅Ρ ceph-common Π΄Π»Ρ Ceph). ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Flexvolume Π½Π΅ Π±ΡΠ» Π·Π°Π΄ΡΠΌΠ°Π½ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ.
ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Flexvolume-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Rook:
Π‘Π°ΠΌ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π² Π²ΠΈΠ΄Π΅ RPC-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. IPC-ΡΠΎΠΊΠ΅Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π»Π΅ΠΆΠΈΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΡΠΎ ΠΈ ΡΠ°ΠΌ Π΄ΡΠ°ΠΉΠ²Π΅Ρ. ΠΡ Ρ Π²Π°ΠΌΠΈ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Ρ ΠΎΡΠΎΡΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ DaemonSet, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΎΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ΅Π±Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ. ΠΠΎΡΠ»Π΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° rook ΡΡΠΎΡ pod Π½Π΅ ΡΠΌΠΈΡΠ°Π΅Ρ, Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ IPC-ΡΠΎΠΊΠ΅ΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ RPC-ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ°ΠΊΠ΅Ρ ceph-common ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° podβΠ°. IPC-ΡΠΎΠΊΠ΅Ρ Π΄Π°Π΅Ρ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ, ΡΡΠΎ kubelet Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ ΡΠ΅ΠΌ pod’ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Ρ Π½ΠΈΠΌ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ·Π»Π΅. ΠΡΡ Π³Π΅Π½ΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΠΎ!..
ΠΠΎ ΡΠ²ΠΈΠ΄Π°Π½ΠΈΡ, Π½Π°ΡΠΈ Π»Π°ΡΠΊΠΎΠ²ΡΠ΅β¦ ΠΏΠ»Π°Π³ΠΈΠ½Ρ in-tree!
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Kubernetes ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π΄Π»Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ Π²Π½ΡΡΡΠΈ ΡΠ΄ΡΠ° ΡΠ°Π²Π½ΡΠ΅ΡΡΡ Π΄Π²Π°Π΄ΡΠ°ΡΠΈ. Π ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ ΡΠ°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ΅Π»ΠΈΠ·Π½ΡΠΉ ΡΠΈΠΊΠ» Kubernetes.
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²Π΅ΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ. Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄ΠΈΠ²ΠΈΡΡΡΡ, ΡΡΠΎ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ Kubernetes Π²Π΄ΡΡΠ³ ΡΡΠ°Π½Π΅Ρ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ ΡΠ΄ΡΠΎΠΌ Linuxβ¦ Π ΠΏΠΎΡΠ΅ΠΌΡ Π²Ρ Π²ΡΡΠΈΡΠ°Π΅ΡΠ΅ ΡΠ»Π΅Π·Ρ ΠΈ ΡΠΊΡΠΈΠΏΡ Π·ΡΠ±Π°ΠΌΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²ΡΠ²Π°Π΅ΡΠ΅ Ρ Π½Π°ΡΠ°Π»ΡΡΡΠ²ΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ Π²ΡΠ΅ΠΌΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ΄ΡΠ° Linux ΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kubernetes. Π‘ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΏΡΠΎΡΡΠΎΠ΅ΠΌ Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΡΡΠ»ΡΠ³.
Π‘ΠΈΡΡΠ°ΡΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΈΡΠ½Π°Ρ, Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΠ΅? ΠΡΠ΅ΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Ρ ΡΡΠ°Π»ΠΎ ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΠ»Π΅Π²ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Kubernetes ΠΎΠ±ΡΡΠ²Π»ΡΡΡ, ΡΡΠΎ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ Π² ΡΠ΄ΡΠΎ. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Flexvolume-ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Π±ΡΠ» Π²ΡΡΠ²Π»Π΅Π½ ΡΡΠ΄ Π½Π΅Π΄ΠΎΡΠ°Π±ΠΎΡΠΎΠΊβ¦
Π Π°Π· ΠΈ Π½Π°Π²ΡΠ΅Π³Π΄Π° Π·Π°ΠΊΡΡΡΡ Π²ΠΎΠΏΡΠΎΡ Ρ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΡΠΌΠΈ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
Π±ΡΠ» ΠΏΡΠΈΠ·Π²Π°Π½ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΡΠΎΠΌΠΎΠ² Π² Kubernetes β CSI. ΠΠ³ΠΎ Π°Π»ΡΡΠ°-Π²Π΅ΡΡΠΈΡ, Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΊΠ°ΠΊ Out-of-Tree CSI Volume Plugins, Π°Π½ΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π² ΡΠ΅Π»ΠΈΠ·Π΅
Container Storage Interface, ΠΈΠ»ΠΈ ΡΠΏΠΈΠ½Π½ΠΈΠ½Π³ CSI 3000!
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ CSI β ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ volume plugin, Π° ΡΠ°ΠΌΡΠΉ Π½Π°ΡΡΠΎΡΡΠΈΠΉ
ΠΠ°ΠΊΠΎΠ²ΠΎ ΠΆΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ CSI-ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² Kubernetes? CSI-ΠΏΠ»Π°Π³ΠΈΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°ΠΌΠΈ (CSI-Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°ΠΌΠΈ), Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ. CSI-Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π² Kubernetes ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· Π΄Π²ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (podβΠΎΠ²):
- Controller β ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΡΠΌΠΈ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ. Π Π΅Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ gRPC-ΡΠ΅ΡΠ²Π΅ΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²
StatefulSet
. - Node β ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΡΡ
Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡ ΠΊ ΡΠ·Π»Π°ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. Π’ΠΎΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ gRPC-ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½ΠΎ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²
DaemonSet
.
Π‘Ρ
Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ CSI-ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² Kubernetes
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
Π΄ΡΡΠ³ΠΈΡ
ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΡ
ΡΠ°Π±ΠΎΡΡ CSI Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ·Π½Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· ΡΡΠ°ΡΡΠΈ Β«
ΠΠ»ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
- ΠΠ»Ρ Π±Π°Π·ΠΎΠ²ΡΡ Π²Π΅ΡΠ΅ΠΉ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π΄Π»Ρ ΡΠ·Π»Π° β ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Kubernetes ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π½Π°Π±ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². ΠΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΌΠΈΠΌ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ JSON-ΠΎΡΠ²Π΅Ρ Ρ capabilities, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΎΡΡ Π΄Π»Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π° Flexvolume.
- ΠΠΌΠ΅ΡΡΠΎ Β«ΠΏΠΎΠ΄ΡΠΎΠ²ΡΠ²Π°Π½ΠΈΡΒ» Π½Π° ΡΠ·Π»Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π² ΠΊΠ»Π°ΡΡΠ΅Ρ podβΡ. ΠΡΠΎΠ³ΠΎ ΠΌΡ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΈ ΠΆΠ΄Π΅ΠΌ ΠΎΡ Kubernetes: Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² Kubernetes.
- ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ RPC-ΡΠ΅ΡΠ²Π΅Ρ ΠΈ RPC-ΠΊΠ»ΠΈΠ΅Π½Ρ. ΠΠ»ΠΈΠ΅Π½Ρ Π·Π° Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Kubernetes.
- ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ gRPC Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅, Π³ΠΈΠ±ΡΠ΅ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΈΡ
ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ΅ΡΠ΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΠ»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² CSI ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΌΠ° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ gRPC-ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ
Π½Π°ΡΠΈΠΌ pull request’ΠΎΠΌ Π΄Π»Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° vsphere-csi. - ΠΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· IPC-ΡΠΎΠΊΠ΅ΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΡΠ°ΡΡΡΡ, ΡΠΎΠΌΡ Π»ΠΈ pod’Ρ kubelet ΠΎΡΠΏΡΠ°Π²ΠΈΠ» Π·Π°ΠΏΡΠΎΡ.
ΠΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ Π²Π°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ? ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° CSI β ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Ρ ΡΠ°ΠΌΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΡΠΎ Π½Π΅ Π±ΡΠ»ΠΈ ΡΡΡΠ΅Π½Ρ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Flexvolume.
ΠΡΠ²ΠΎΠ΄Ρ
CSI ΠΊΠ°ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ Π±ΡΠ» ΠΏΡΠΈΠ½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΡΠ΅ΠΏΠ»ΠΎ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌ ΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΠΈ, CSI-Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π°ΠΆΠ΅ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ, ΠΊΠ°ΠΊ Ceph ΠΈΠ»ΠΈ AWS EBS, ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π΅ΡΡ Π² ΡΠ°ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Kubernetes.
Π Π½Π°ΡΠ°Π»Π΅ 2019 Π³ΠΎΠ΄Π° ΠΏΠ»Π°Π³ΠΈΠ½Ρ in-tree
Π‘Π°ΠΌΠΈ ΠΌΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ ΠΎΠΏΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ceph-csi, vsphere-csi ΠΈ Π³ΠΎΡΠΎΠ²Ρ ΠΏΠΎΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ! ΠΠΎΠΊΠ° ΡΡΠΎ CSI Ρ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π½Π° Π½Π΅Π³ΠΎ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π° ΡΡΠ°, Π° ΡΠ°ΠΌ ΠΏΠΎΠΆΠΈΠ²Π΅ΠΌ-ΡΠ²ΠΈΠ΄ΠΈΠΌ.
ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ Π²ΡΡ Π½ΠΎΠ²ΠΎΠ΅ β ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠ΅ΡΠ΅ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΠ΅ ΡΡΠ°ΡΠΎΠ΅!
P.S.
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
ΠΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ Container Storage Interface (Π² Kubernetes ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ) Β»; - Β«
Rook ΠΈΠ»ΠΈ Π½Π΅ Rook β Π²ΠΎΡ Π² ΡΡΠΌ Π²ΠΎΠΏΡΠΎΡ Β»; - Β«
ΠΠ½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Π°Π»ΡΡΠ°-Π²Π΅ΡΡΠΈΠ΅ΠΉ ΡΠ½Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΎΠΌΠΎΠ² Π² Kubernetes Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com