GlusterFS를 사용하면, kubernetes 동적 프로비저닝을 사용할 수 있다.
쿠버네티스 클러스터에 GlusterFS 를 설치하는 방법.
GlusterFS, heketi 컴포넌트를 설치한다.
쿠버네티스에서 관리되는 다른 pod 들 처럼 GlusterFS 도 동일하게 kubernetes 에 의해서 관리된다.

Infrastructure Requirements

각 노드에 dm_snapshot, dm_mirror, dm_thin_pool 커널 모듈이 로딩되어 있는지 확인한다.

$ lsmod | grep <name>

로딩되어 있지 않으면 아래 명령으로 로딩한다.

$ modprobe <name>

각 노드가 mount.glusterfs 커맨드 명령을 사용할 수 었어야한다. glusterfs-fuse 패키지를 설치하면 된다.

$ yum install -y glusterfs-fuse

확인

$ glusterfs --version

topology.json

heketi 가 아래 파일 정보를 참조한다.
topology.json

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "a1"
              ],
              "storage": [
                "192.168.10.21"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "a2"
              ],
              "storage": [
                "192.168.10.22"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "a3"
              ],
              "storage": [
                "192.168.10.23"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "a4"
              ],
              "storage": [
                "192.168.10.24"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "a5"
              ],
              "storage": [
                "192.168.10.25"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "a6"
              ],
              "storage": [
                "192.168.10.26"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sda3"
          ]
        }
      ]
    }
  ]
}

manage 필드
kubernetes 노드의 hostname
storage 필드
kubernetes 노드의 IP Address

devices 필드
노드에 설치되어 있는 disk path. pvc 요청시에 pv 를 만들어서 사용할 raw block device.

Deploy GlusterFS and heketi

gk-deploy 스크립트 다운로드

$ git clone https://github.com/gluster/gluster-kubernetes.git
$ cp topology.json gluster-kubernetes/deploy
$ cd gluster-kubernetes/deploy
$ ./gk-deploy -g

$ export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')
$ echo $HEKETI_CLI_SERVER
$ curl $HEKETI_CLI_SERVER/hello
Hello from Heketi

Create StorageClass

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi
provisioner: kubernetes.io/glusterfs
parameters:
  # $HEKETI_CLI_SERVER, heketi REST API 서버
  resturl: "http://10.233.13.35:8080"
  restauthenabled: "false"
  # user_authorization 을 사용 않하면 아무거나 상관없음
  restuser: "joe"
  restuserkey: "My Secret Life"
$ kubectl create -f gluster-storage-class.yaml
$ kubectl get sc

Remove all deployed components

$ ./gk-deploy -g --abort

각 노드에 접속해서

$ vgremove -ff $(sudo vgdisplay | grep -i "VG Name" | awk '{print $3}')
$ rm -rf /var/lib/heketi /etc/glusterfs /var/lib/glusterd /var/log/glusterfs 
$ pvremove /dev/sda3
$ wipefs -a -f /dev/sda3
$ fdisk -l

fdisk 출력에 device mapper 가 아직도 존재하면 아래 명령으로 지운다.

$ dmsetup remove_all

확인한다.

$ dmsetup ls
$ fdisk -l

heketi_endpoints.png

StorageClass