Kubernetes ããŸã v1.0.0 ã ã£ãé ãããªã¥ãŒã ãã©ã°ã€ã³ããããŸããã ãããã¯ãã·ã¹ãã ã Kubernetes ã«æ¥ç¶ããŠæ°žç¶ç㪠(æ°žç¶çãª) ã³ã³ãã㌠ããŒã¿ãä¿åããããã«å¿
èŠã§ããã ãã®æ°ã¯å°ãªããæåã®ãããã€ããŒã«ã¯ GCE PDãCephãAWS EBS ãªã©ã®ã¹ãã¬ãŒãž ãããã€ããŒããããŸããã
ãã©ã°ã€ã³ã¯ Kubernetes ãšãšãã«é
ä¿¡ããããããã€ã³ããªãŒãšããååãä»ããããŸããã ããããå€ãã®äººã«ãšã£ãŠããã®ãããªãã©ã°ã€ã³ã®æ¢åã®ã»ããã§ã¯äžååã§ããããšãå€æããŸããã è·äººãã¡ã¯ãããã䜿çšããŠç°¡åãªãã©ã°ã€ã³ã Kubernetes ã³ã¢ã«è¿œå ãããã®åŸç¬èªã® Kubernetes ãçµã¿ç«ãŠãŠãµãŒããŒã«ã€ã³ã¹ããŒã«ããŸããã ãããæéãçµã€ã«ã€ããŠãKubernetes éçºè
ã¯æ¬¡ã®ããšã«æ°ã¥ããŸããã é åé¡ã¯è§£æ±ºã§ããŸããã 人ã
ã¯å¿
èŠãšãã é£ãç«¿ã ãããŠãKubernetes v1.2.0 ã®ãªãªãŒã¹ã§ãããç»å ŽããŸãã...
Flexvolume ãã©ã°ã€ã³: æå°éã®é£ãç«¿
Kubernetes éçºè ã¯ããµãŒãããŒãã£éçºè ãå®è£ ãã Flexvolume ãã©ã€ããæäœããããã®å€æ°ãšã¡ãœããã®è«çãã¬ãŒã ã¯ãŒã¯ã§ãã FlexVolume ãã©ã°ã€ã³ãäœæããŸããã
ããã§ç«ã¡æ¢ãŸã£ãŠãFlexVolume ãã©ã€ããŒãäœã§ãããã詳ããèŠãŠã¿ãŸãããã ããã¯ç¢ºãã§ã å®è¡å¯èœãã¡ã€ã« (ãã€ã㪠ãã¡ã€ã«ãPython ã¹ã¯ãªãããBash ã¹ã¯ãªãããªã©)ãå®è¡ãããšãã³ãã³ã ã©ã€ã³åŒæ°ãå ¥åãšããŠåãåããæ¢ç¥ã®ãã£ãŒã«ããå«ãã¡ãã»ãŒãžã JSON 圢åŒã§è¿ããŸãã æ £äŸã«ãããæåã®ã³ãã³ãã©ã€ã³åŒæ°ã¯åžžã«ã¡ãœããã§ãããæ®ãã®åŒæ°ã¯ãã®ãã©ã¡ãŒã¿ã§ãã
OpenShift ã® CIFS å
±æã®æ¥ç¶å³ã 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
ããªã¢ã«ã¿ã€ã ã§ããªã¥ãŒã ã®ãµã€ãºãå€æŽã§ããæ©èœã«ããã
次ã«ãNFS ãæäœããããã® Flexvolume ãã©ã€ããŒã®å®è£ äŸã瀺ããŸãã
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 ããªããã£ãã® XNUMX ã€ã§ããã DaemonSet
ã æ°ããããŒããã¯ã©ã¹ã¿ãŒã«è¡šç€ºããããšããã®ããŒãã«ã¯ DaemonSet ã®ããããèªåçã«å«ãŸããŸãããã®ãããã«ã¯ãFlexvolume ãã©ã€ããŒãèŠã€ããããã®ãã¹ã«æ²¿ã£ãŠããŒã«ã« ããªã¥ãŒã ãæ¥ç¶ãããŸãã äœæãæåãããšããããã¯ãã©ã€ããŒãåäœããããã«å¿
èŠãªãã¡ã€ã«ããã£ã¹ã¯ã«ã³ããŒããŸãã
以äžã¯ãFlexvolume ãã©ã°ã€ã³ãã¬ã€ã¢ãŠãããããã® DaemonSet ã®äŸã§ãã
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>
...ãããŠãFlexvolume ãã©ã€ããŒãã¬ã€ã¢ãŠãããããã® Bash ã¹ã¯ãªããã®äŸ:
#!/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 ããã©ã€ããŒã®äœ¿çšãéå§ããå¯èœæ§ãé«ããããã«ããã·ã¹ãã ã§ãšã©ãŒãçºçããŸãã æ£ããã¢ãããŒãã¯ããŸããã©ã€ã㌠ãã¡ã€ã«ãå¥ã®ååã§ã³ããŒãã次ã«ã¢ãããã¯ãªååå€æŽæäœã䜿çšããããšã§ãã
Rook ãªãã¬ãŒã¿ãŒã§ã® Ceph ã®æäœã®å³: å³ã® Flexvolume ãã©ã€ããŒã¯ Rook ãšãŒãžã§ã³ãå
ã«ãããŸã
Flexvolume ãã©ã€ããŒã䜿çšããå Žåã®æ¬¡ã®åé¡ã¯ãã¯ã©ã¹ã¿ãŒ ããŒãäžã®ã»ãšãã©ã®ã¹ãã¬ãŒãžã§åé¡ãçºçããããšã§ãã ããã«å¿ èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸã (ããšãã°ãCeph ã® ceph-common ããã±ãŒãž)ã åœåãFlexvolume ãã©ã°ã€ã³ã¯ããã®ãããªè€éãªã·ã¹ãã ãå®è£ ããããã«èšèšãããŠããŸããã§ããã
ãã®åé¡ã«å¯Ÿããç¬èªã®è§£æ±ºçã¯ãRook ãªãã¬ãŒã¿ãŒã® Flexvolume ãã©ã€ããŒå®è£ ã«èŠãããšãã§ããŸãã
ãã©ã€ããŒèªäœã¯ RPC ã¯ã©ã€ã¢ã³ããšããŠèšèšãããŠããŸãã éä¿¡çšã® IPC ãœã±ããã¯ããã©ã€ããŒèªäœãšåããã£ã¬ã¯ããªã«ãããŸãã ãã©ã€ã㌠ãã¡ã€ã«ãã³ããŒããã«ã¯ããã£ã¬ã¯ããªãšãã©ã€ããŒãããªã¥ãŒã ãšããŠæ¥ç¶ãã DaemonSet ã䜿çšãããšããããšãèŠããŠããŸãã å¿ èŠãª Rook ãã©ã€ã㌠ãã¡ã€ã«ãã³ããŒããåŸããã®ãããã¯åæ¢ãããæ¥ç¶ãããããªã¥ãŒã ãä»ããŠæ¬æ Œç㪠RPC ãµãŒããŒãšã㊠IPC ãœã±ããã«æ¥ç¶ããŸãã ceph-common ããã±ãŒãžã¯ããã ã³ã³ããå ã«ãã§ã«ã€ã³ã¹ããŒã«ãããŠããŸãã IPC ãœã±ããã«ãããkubelet ãåãããŒãäžã«ããããããšæ£ç¢ºã«éä¿¡ã§ããããã«ãªããŸãã ç¬åµçãªãã®ã¯ãã¹ãŠã·ã³ãã«ã§ãïŒ
ããããªããç§ãã¡ã®ææ æ·±ã... ããªãŒå ãã©ã°ã€ã³!
Kubernetes éçºè ã¯ãã³ã¢å ã®ã¹ãã¬ãŒãžçšã®ãã©ã°ã€ã³ã®æ°ã XNUMX ã§ããããšãçºèŠããŸããã ãããŠãããããã®å€æŽã¯ãäœããã®åœ¢ã§ãKubernetes ãªãªãŒã¹ ãµã€ã¯ã«å šäœãéããŠè¡ãããŸãã
æ°ããããŒãžã§ã³ã®ã¹ãã¬ãŒãž ãã©ã°ã€ã³ã䜿çšããã«ã¯ã ã¯ã©ã¹ã¿ãŒå šäœãæŽæ°ããå¿ èŠãããã ããã«å ããŠãKubernetes ã®æ°ããããŒãžã§ã³ãã䜿çšããŠãã Linux ã«ãŒãã«ãšçªç¶äºææ§ããªããªãããšã«é©ããããããŸãã... ããã§ãããªãã¯æ¶ãã¬ãããæ¯ãé£ããã°ããªããã管çè ããŠãŒã¶ãŒãšæéã調æŽããŠã Linux ã«ãŒãã«ãš Kubernetes ã¯ã©ã¹ã¿ãŒãæŽæ°ããŸãã ãµãŒãã¹ã®æäŸäžã«ããŠã³ã¿ã€ã ãçºçããå¯èœæ§ããããŸãã
ãã®ç¶æ³ã¯æ»çšœä»¥äžã®ãã®ã ãšæããŸããã? ãã®ã¢ãããŒããæ©èœããŠããªãããšãã³ãã¥ããã£å šäœã«æããã«ãªããŸããã Kubernetes éçºè ã¯ãæå³çãªæ±ºå®ã«ãããã¹ãã¬ãŒãžãæäœããããã®æ°ãããã©ã°ã€ã³ãã«ãŒãã«ã«åãå ¥ããããªããªãããšãçºè¡šããŸããã ããã«ããã§ã«ãåç¥ã®ãšãããFlexvolume ãã©ã°ã€ã³ã®å®è£ ã«ã¯å€ãã®æ¬ ç¹ãå€æããŸããã
Kubernetes ã®ããªã¥ãŒã çšã«ææ°ã«è¿œå ããããã©ã°ã€ã³ã§ãã CSI ã¯ãæ°žç¶çãªããŒã¿ ã¹ãã¬ãŒãžã®åé¡ãå®å
šã«è§£æ±ºããããã«å¿
èŠãšãããŸããã ãã®ã¢ã«ãã¡çã¯ãããå®å
šã«ã¯ Out-of-Tree CSI Volume Plugins ãšåŒã°ãããªãªãŒã¹ã§çºè¡šãããŸããã
ã³ã³ãã ã¹ãã¬ãŒãž ã€ã³ã¿ãŒãã§ã€ã¹ããŸã㯠CSI 3000 ã¹ããã³ã° ããã!
ãŸãæåã«ãCSI ã¯åãªãããªã¥ãŒã ãã©ã°ã€ã³ã§ã¯ãªããæ¬ç©ã®ããªã¥ãŒã ãã©ã°ã€ã³ã§ããããšã«æ³šæããŠãã ããã
Kubernetes ã® CSI ãã©ã°ã€ã³ã®æ§é ã¯äœã§ãã? CSI ãã©ã°ã€ã³ã¯ç¹å¥ãªãã©ã€ã㌠(CSIãã©ã€ããŒïŒãµãŒãããŒãã£ã®éçºè ã«ãã£ãŠæžãããŠããŸãã Kubernetes ã® CSI ãã©ã€ããŒã¯ãå°ãªããšã XNUMX ã€ã®ã³ã³ããŒãã³ã (ããã) ã§æ§æãããŠããå¿ èŠããããŸãã
- ã³ã³ãããŒã©ãŒ â å€éšæ°žç¶ã¹ãã¬ãŒãžã管çããŸãã gRPC ãµãŒããŒãšããŠå®è£
ãããããªããã£ãã䜿çšãããŸãã
StatefulSet
. - Node â æ°žç¶ã¹ãã¬ãŒãžãã¯ã©ã¹ã¿ãŒ ããŒãã«ããŠã³ããã圹å²ãæãããŸãã gRPC ãµãŒããŒãšããŠãå®è£
ãããŠããŸãããããªããã£ãã䜿çšããŸãã
DaemonSet
.
Kubernetes ã§ã® CSI ãã©ã°ã€ã³ã®ä»çµã¿
CSI ã®æŽ»åã®ãã®ä»ã®è©³çŽ°ã«ã€ããŠã¯ãããšãã°èšäºã
ãã®ãããªå®è£ ã®å©ç¹
- ããŒãã®ãã©ã€ããŒã®ç»é²ãªã©ã®åºæ¬çãªããšã®ããã«ãKubernetes éçºè ã¯äžé£ã®ã³ã³ãããŒãå®è£ ããŸããã Flexvolume ãã©ã°ã€ã³ã®å Žåã®ããã«ãæ©èœãåãã JSON å¿çãèªåã§çæããå¿ èŠã¯ãªããªããŸããã
- å®è¡å¯èœãã¡ã€ã«ãããŒãã«ãã¹ãªããããã代ããã«ãããããã¯ã©ã¹ã¿ãŒã«ã¢ããããŒãããããã«ãªããŸããã ãããç§ãã¡ãæåã« Kubernetes ã«æåŸ ããŠããããšã§ãããã¹ãŠã®ããã»ã¹ã¯ãKubernetes ããªããã£ãã䜿çšããŠãããã€ãããã³ã³ãããŒå ã§çºçããŸãã
- è€éãªãã©ã€ããŒãå®è£ ããããã« RPC ãµãŒããŒãš RPC ã¯ã©ã€ã¢ã³ããéçºããå¿ èŠã¯ãªããªããŸããã ã¯ã©ã€ã¢ã³ã㯠Kubernetes éçºè ã«ãã£ãŠå®è£ ãããŸããã
- gRPC ãããã³ã«çµç±ã§åŒæ°ãæž¡ãæ¹ããã³ãã³ã ã©ã€ã³åŒæ°çµç±ã§æž¡ããããã¯ããã«äŸ¿å©ã§ãæè»æ§ããããä¿¡é Œæ§ãé«ããªããŸãã æšæºåããã gRPC ã¡ãœãããè¿œå ããŠããªã¥ãŒã 䜿çšéã¡ããªã¯ã¹ã®ãµããŒãã CSI ã«è¿œå ããæ¹æ³ãç解ããã«ã¯ã以äžãåç
§ããŠãã ããã
ç§ãã¡ã®ãã«ãªã¯ãšã¹ã vsphere-csi ãã©ã€ããŒçšã - kubelet ãæ£ãããããã«ãªã¯ãšã¹ããéä¿¡ãããã©ãããæ··ä¹±ããªãããã«ãé信㯠IPC ãœã±ããçµç±ã§è¡ãããŸãã
ãã®ãªã¹ããèŠãŠäœãæãåºããããšã¯ãããŸãã? CSIã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã ããããšåãåé¡ã解決ãããFlexvolume ãã©ã°ã€ã³ã®éçºæã«ã¯èæ ®ãããŸããã§ããã
æèŠ
ããŒã¿ ãŠã§ã¢ããŠã¹ãšå¯Ÿè©±ããããã®ã«ã¹ã¿ã ãã©ã°ã€ã³ãå®è£ ããããã®æšæºãšããŠã® CSI ã¯ãã³ãã¥ããã£ããéåžžã«æž©ããåãå ¥ããããŸããã ããã«ãCSI ãã©ã€ããŒã¯ãã®å©ç¹ãšæ±çšæ§ã«ãããCeph ã AWS EBS ãªã©ã®ã¹ãã¬ãŒãž ã·ã¹ãã çšã«ãäœæãããŠãããããããšé£æºããããã®ãã©ã°ã€ã³ã¯ Kubernetes ã®æåã®ããŒãžã§ã³ã§è¿œå ãããŸããã
2019 幎ã®åãã«ãããªãŒå
ãã©ã°ã€ã³
ç§ãã¡èªèº«ããã§ã« ceph-csiãvsphere-csi ã®äœ¿çšçµéšãããããã®ãªã¹ãã«è¿œå ããæºåãã§ããŠããŸãã ãããŸã§ã®ãšãããCSI ã¯å²ãåœãŠãããã¿ã¹ã¯ã«é 調ã«å¯ŸåŠããŠããŸãããæ§åèŠãšãªããŸãã
æ°ãããã®ã¯ãã¹ãŠå€ããã®ãåèãããã®ã§ããããšãå¿ããªãã§ãã ããã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
ç§ãã¡ã¯ã³ã³ãã ã¹ãã¬ãŒãž ã€ã³ã¿ãŒãã§ã€ã¹ (Kubernetes ã ãã§ãªã) ãç解ããŠããŸãã "; - «
ã«ãŒã¯ã«è¡ãããã«ãŒã¯ã«è¡ããªããããããåé¡ã "; - «
Kubernetes ã®ããªã¥ãŒã ã¹ãããã·ã§ããã®ã¢ã«ãã¡çã®å°å ¥ 'ã
åºæïŒ habr.com