Kubernetes ์Šคํ† ๋ฆฌ์ง€์šฉ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ: Flexvolume์—์„œ CSI๊นŒ์ง€

Kubernetes ์Šคํ† ๋ฆฌ์ง€์šฉ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ: Flexvolume์—์„œ CSI๊นŒ์ง€

Kubernetes๊ฐ€ v1.0.0์ด์—ˆ์„ ๋•Œ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜๊ตฌ(์˜๊ตฌ) ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์„ Kubernetes์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆ˜๋Š” ์ ์—ˆ๊ณ  ์ฒซ ๋ฒˆ์งธ๋กœ๋Š” GCE PD, Ceph, AWS EBS ๋“ฑ๊ณผ ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€ ์ œ๊ณต์—…์ฒด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Kubernetes์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฆ„์ด in-tree์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ์กด ์„ธํŠธ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์žฅ์ธ๋“ค์€ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ์ฝ”์–ด์— ๊ฐ„๋‹จํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์ž์ฒด Kubernetes๋ฅผ ์กฐ๋ฆฝํ•˜๊ณ  ์„œ๋ฒ„์— ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ Kubernetes ๊ฐœ๋ฐœ์ž๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ํ•„์š” ๋‚š์‹ฏ๋Œ€. ๊ทธ๋ฆฌ๊ณ  Kubernetes v1.2.0 ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค...

Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ: ์ตœ์†Œ ๋‚š์‹ฏ๋Œ€

Kubernetes ๊ฐœ๋ฐœ์ž๋Š” ํƒ€์‚ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•œ Flexvolume ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ ๋ฐ ๋ฐฉ๋ฒ•์˜ ๋…ผ๋ฆฌ์  ํ”„๋ ˆ์ž„์›Œํฌ์ธ FlexVolume ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ž ์‹œ ๋ฉˆ์ถ”๊ณ  FlexVolume ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ์‹คํ–‰ ๊ฐ€๋Šฅ ํŒŒ์ผ (๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ, Python ์Šคํฌ๋ฆฝํŠธ, Bash ์Šคํฌ๋ฆฝํŠธ ๋“ฑ), ์‹คํ–‰ ์‹œ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  JSON ํ˜•์‹์˜ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ง„ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ก€์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋Š” ํ•ญ์ƒ ๋ฉ”์„œ๋“œ์ด๊ณ  ๋‚˜๋จธ์ง€ ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋งค๊ฐœ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

Kubernetes ์Šคํ† ๋ฆฌ์ง€์šฉ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ: Flexvolume์—์„œ CSI๊นŒ์ง€
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, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‹ค์Œ ์‚ฌํ•ญ์— ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ Rook Ceph Operator์—์„œ.

๋‹ค์Œ์€ 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 ๊ธฐ๋ณธ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. DaemonSet. ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒˆ ๋…ธ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด Flexvolume ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋กœ์ปฌ ๋ณผ๋ฅจ์ด ์—ฐ๊ฒฐ๋˜๋Š” DaemonSet์˜ ํฌ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด ํฌ๋“œ๋Š” ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋””์Šคํฌ์— ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ 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์ด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ์‹œ์Šคํ…œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋จผ์ € ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์›์ž์  ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Kubernetes ์Šคํ† ๋ฆฌ์ง€์šฉ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ: Flexvolume์—์„œ CSI๊นŒ์ง€
Rook ์šด์˜์ž์˜ Ceph ์ž‘์—… ๋‹ค์ด์–ด๊ทธ๋žจ: ๋‹ค์ด์–ด๊ทธ๋žจ์˜ Flexvolume ๋“œ๋ผ์ด๋ฒ„๋Š” Rook ์—์ด์ „ํŠธ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

Flexvolume ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋‹ค์Œ ๋ฌธ์ œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: Ceph์šฉ ceph-common ํŒจํ‚ค์ง€) ์ฒ˜์Œ์—๋Š” Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ด๋Ÿฌํ•œ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์›๋ž˜์˜ ํ•ด๊ฒฐ์ฑ…์€ Rook ์—ฐ์‚ฐ์ž์˜ Flexvolume ๋“œ๋ผ์ด๋ฒ„ ๊ตฌํ˜„์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋ผ์ด๋ฒ„ ์ž์ฒด๋Š” RPC ํด๋ผ์ด์–ธํŠธ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ†ต์‹ ์„ ์œ„ํ•œ IPC ์†Œ์ผ“์€ ๋“œ๋ผ์ด๋ฒ„ ์ž์ฒด์™€ ๋™์ผํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋ ค๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋“œ๋ผ์ด๋ฒ„์™€ ๋ณผ๋ฅจ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” DaemonSet์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ฃจํฌ ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•œ ํ›„ ์ด ํฌ๋“œ๋Š” ์ฃฝ์ง€ ์•Š๊ณ  ๋ณธ๊ฒฉ์ ์ธ RPC ์„œ๋ฒ„๋กœ์„œ ์—ฐ๊ฒฐ๋œ ๋ณผ๋ฅจ์„ ํ†ตํ•ด IPC ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ceph-common ํŒจํ‚ค์ง€๋Š” ์ด๋ฏธ ํฌ๋“œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. IPC ์†Œ์ผ“์€ kubelet์ด ๋™์ผํ•œ ๋…ธ๋“œ์— ์žˆ๋Š” Pod์™€ ์ •ํ™•ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋…์ฐฝ์ ์ธ ๋ชจ๋“  ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค!..

์•ˆ๋…•, ์šฐ๋ฆฌ์˜ ๋‹ค์ •ํ•œ... ํŠธ๋ฆฌ ๋‚ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค!

Kubernetes ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”์–ด ๋‚ด ์Šคํ† ๋ฆฌ์ง€์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆ˜๊ฐ€ XNUMX๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ „์ฒด Kubernetes ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์ €์žฅ์†Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋”ํ•ด, ์ƒˆ ๋ฒ„์ „์˜ Kubernetes๊ฐ€ ๊ฐ‘์ž๊ธฐ ์‚ฌ์šฉ ์ค‘์ธ Linux ์ปค๋„๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ผ์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค... ๋”ฐ๋ผ์„œ ๋ˆˆ๋ฌผ์„ ๋‹ฆ๊ณ  ์ด๋ฅผ ์•…๋ฌผ๊ณ  ๊ฒฝ์˜์ง„ ๋ฐ ์‚ฌ์šฉ์ž์™€ ํ˜‘์˜ํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Linux ์ปค๋„ ๋ฐ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ œ๊ณต ์‹œ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ์ด ์šฐ์Šค๊ฝ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋‚˜์š”? ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ํšจ๊ณผ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์ „์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์˜๋„์ ์ธ ๊ฒฐ์ •์— ๋”ฐ๋ผ Kubernetes ๊ฐœ๋ฐœ์ž๋Š” ์Šคํ† ๋ฆฌ์ง€ ์ž‘์—…์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋” ์ด์ƒ ์ปค๋„์— ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค...

Kubernetes์˜ ๋ณผ๋ฅจ์šฉ์œผ๋กœ ์ตœ๊ทผ ์ถ”๊ฐ€๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ CSI๋Š” ์˜๊ตฌ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์š”์ฒญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Out-of-Tree CSI Volume Plugins๋ผ๊ณ  ๋” ์ž์„ธํžˆ ์•Œ๋ ค์ง„ ์•ŒํŒŒ ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค์—์„œ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.9.

์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” CSI 3000 ์Šคํ”ผ๋‹ ๋กœ๋“œ!

์šฐ์„ , CSI๋Š” ๋‹จ์ˆœํ•œ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ผ๋Š” ์ ์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ์ž‘์—…์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ์— ๋Œ€ํ•ด. Kubernetes ๋ฐ Mesos์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ์€ ์ด ํ‘œ์ค€์— ๋”ฐ๋ผ ๊ตฌํ˜„๋œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ "ํ•™์Šต"ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์ €๋Š” ์ด๋ฏธ Kubernetes๋ฅผ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

Kubernetes์˜ CSI ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŠน์ˆ˜ ๋“œ๋ผ์ด๋ฒ„(CSI ๋“œ๋ผ์ด๋ฒ„) ํƒ€์‚ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Kubernetes์˜ CSI ๋“œ๋ผ์ด๋ฒ„๋Š” ์ตœ์†Œํ•œ ๋‘ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ(ํฌ๋“œ)๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ œ์–ด ์žฅ์น˜ โ€” ์™ธ๋ถ€ ์˜๊ตฌ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” gRPC ์„œ๋ฒ„๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. StatefulSet.
  • ๋…ธ๋“œ โ€” ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ๋งˆ์šดํŠธํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. gRPC ์„œ๋ฒ„๋กœ๋„ ๊ตฌํ˜„๋˜์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. DaemonSet.

Kubernetes ์Šคํ† ๋ฆฌ์ง€์šฉ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ: Flexvolume์—์„œ CSI๊นŒ์ง€
Kubernetes์—์„œ CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ CSI ์ž‘์—…์˜ ๋‹ค๋ฅธ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.C.S.I์— ๋Œ€ํ•œ ์ดํ•ด" ์–ด๋Š ๊ฒƒ์˜ ๋ฒˆ์—ญ ์šฐ๋ฆฌ๋Š” XNUMX๋…„ ์ „์— ์ถœํŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌํ˜„์˜ ์žฅ์ 

  • ๋…ธ๋“œ ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ๋ก๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…์„ ์œ„ํ•ด Kubernetes ๊ฐœ๋ฐœ์ž๋Š” ์ปจํ…Œ์ด๋„ˆ ์„ธํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ์ฒ˜๋Ÿผ ๋” ์ด์ƒ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ JSON ์‘๋‹ต์„ ์ง์ ‘ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ํŒŒ์ผ์„ ๋…ธ๋“œ์— "์Šฌ๋ฆฝ"ํ•˜๋Š” ๋Œ€์‹  ์ด์ œ ํด๋Ÿฌ์Šคํ„ฐ์— ํฌ๋“œ๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— Kubernetes์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” Kubernetes ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ด์ƒ RPC ์„œ๋ฒ„์™€ RPC ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” Kubernetes ๊ฐœ๋ฐœ์ž๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • gRPC ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ž‘์—…ํ•  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ณ  ์œ ์—ฐํ•˜๋ฉฐ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ํ™”๋œ gRPC ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜์—ฌ CSI์— ๋ณผ๋ฅจ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ฝ์–ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ์˜ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ vsphere-csi ๋“œ๋ผ์ด๋ฒ„์šฉ.
  • ํ†ต์‹ ์€ IPC ์†Œ์ผ“์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ kubelet์ด ์˜ฌ๋ฐ”๋ฅธ Pod์— ์š”์ฒญ์„ ๋ณด๋ƒˆ๋Š”์ง€ ํ˜ผ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์— ์ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ์ด ์žˆ๋‚˜์š”? CSI์˜ ์žฅ์ ์€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‹ค, ์ด๋Š” Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ณ ๋ ค๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ธ CSI๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋งค์šฐ ํ˜ธํ‰์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์žฅ์ ๊ณผ ๋‹ค์–‘์„ฑ์œผ๋กœ ์ธํ•ด Ceph ๋˜๋Š” AWS EBS์™€ ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์šฉ CSI ๋“œ๋ผ์ด๋ฒ„๋„ ์ƒ์„ฑ๋˜๋ฉฐ, Kubernetes์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์— ์ถ”๊ฐ€๋œ ์ž‘์—…์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค.

2019๋…„ ์ดˆ, ํŠธ๋ฆฌ ๋‚ด ํ”Œ๋Ÿฌ๊ทธ์ธ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.. ์šฐ๋ฆฌ๋Š” Flexvolume ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ณ„์† ์ง€์›ํ•  ๊ณ„ํš์ด์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ceph-csi, vsphere-csi๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ์œผ๋ฉฐ ์ด ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค! ์ง€๊ธˆ๊นŒ์ง€ CSI๋Š” ํ• ๋‹น๋œ ์ž‘์—…์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ๋‹ค๋ ค ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๊ฒƒ์€ ๋ชจ๋‘ ์ž˜ ์ƒ๊ฐํ•œ ์˜ค๋ž˜๋œ ๊ฒƒ์ž„์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค!

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€