Kubernetes 또는 OpenShift 로 PaaS 를 구축할 경우에, 사용자 환경에 대응하는 인프라 측의 2개 부문의 솔루션을 반드시 고민해야 하는데 그중 하나가 Persistent Storage 에 대한 솔루션이다(다른 하나는 Overlay Network 을 위한 터널링 솔루션/Fabric 이 되겠다).


대개는 NFS 와 같은 일반적인 스토리지 모델을 적용하여 Persistent Volume을 일정 갯수 이상 만들어 놓고 사용/반납하는 식으로 사용(Static Provisioning)할 것 같은데, GlusterFS를 스토리지로 사용하고 각 워커노드에서 Native GlusterFS Client 를 활용한다면, Auto-healing 과 분산 파일 스토리지의 장점을 살리면서 스토리지 공간도 동적으로 사용(Dynamic Provisioning)할 수 있겠다(Ceph 의 경우도 비슷한 장점을 가지고 있기는 하다).


본 포스팅에서는 제목에서 알 수 있듯이 Kubernetes 또는 OpenShift Cluster 외부에 존재하는 Gluster 클러스터를, Kubernetes를 Persistent Volume을 위한 스토리지로 Gluster 를 활용하는 내용을 다룰 것이다. 참고로 Kubernetes 내에 Gluster+Heketi Pod 를 DaemonSet 으로 Deploy한 다음 Hyper-Converged 방식으로 사용하는 경우도 존재하는데, 다음에 한 번 따로 다루어 보기로 하겠다.



구현 목표


기존에 설치/사용중인 Kubernetes(또는 OpenShift) 클러스터가 이미 존재한다고 가정하고, Persistent Storage로 일정 대수의 Gluster 서버(여기서는 2대-뒤에 3대 이상이 필요하다는 것이 함정)을 구성한 후 Heketi RestAPI 서버를 이용, Container(또는 Pod)에서 마운트 해서 사용하는 모델을 구현해 보기로 한다. Heketi를 활용한다면, Gluster 스토리지를 Rest 방식으로 OpenStack Manilla, OpenShift, Kubernetes 와 연동/통합하는 좋은 방안 중 하나일 듯하다.



* Reference 1: https://github.com/heketi/heketi

* Reference 2: https://keithtenzer.com/2017/03/24/storage-for-containers-using-gluster-part-ii/


사전 준비


스토리지용 서버 2대와 Gluster Console/Heketi API 서버 1대를 준비한다. gluster 서버의 설치에 관해서는 따로 다루지 않는다(필요하면 기존 포스팅 중 http://bryan.wiki/270 를 참고하기를 권한다). 또한 모든 서버간의 시간동기화 설정은 꼭 해 두는 것이 좋다.


* Heketi 서버(Gluster Console/Client): CentOS 7, IP - 192.168.50.100

* Gluster-1: CentOS 7, 3 disks(/dev/sdb, /dev/sdc, /dev/sdd), IP - 192.168.50.101

* Gluster-2: CentOS 7, 3 disks(/dev/sdb, /dev/sdc, /dev/sdd), IP - 192.168.50.102

* Gluster-3: 뒤에 언급한다


2대의 Gluster 서버와 1대의 Heketi 서버에서 /etc/hosts 파일에 아래 호스트 정보를 추가해 둔다


# vi /etc/hosts

...

192.168.50.100 gfs-console

192.168.50.101 gfs-node01

192.168.50.102 gfs-node02


Gluster 서버의 환경 점검


Firewall을 사용중이라면 firewall-cmd 를 통해 포트를 개방해 둔다.


[root@gfs-node01 ~]# firewall-cmd --add-port=24007-24008/tcp --add-port=49152-49664/tcp --add-port=2222/tcp  --add-port=8080/tcp

[root@gfs-node01 ~]# firewall-cmd --runtime-to-permanent


기존에 Gluster Volume을 사용중인 서버들이었다면 모든 볼륨을 삭제하고, Gluster 용으로 사용중인 모든 디스크를 unmount해야 하며 /etc/fstab 도 그에 맞게 수정한 후(reboot), 각 디스크의 파티션을 삭제하고 Raw Device 상태로 만들어 둔다. lsblk 를 수행했을 때 디바이스(/dev/sdb 등) 아래에 파티션(sdb1 등)이 보인다면 반드시 삭제한다.


[root@gfs-node01 ~]# fdisk /dev/sdb

p

(... 파티션이 있다면 ...)

d

w


[root@gfs-node01 ~]# fdisk /dev/sdc

p

d

w

...

...

[root@gfs-node01 ~]# wipefs -a /dev/sdb

[root@gfs-node01 ~]# wipefs -a /dev/sdc

[root@gfs-node01 ~]# wipefs -a /dev/sdd



Heketi 서버 설정


* Heketi 서버 데몬과 클라이언트 모듈을 설치한다

[root@gfs-console ~]# yum install -y epel-release

[root@gfs-console ~]# yum install -y centos-release-gluster310.noarch

[root@gfs-console ~]# yum install -y glusterfs-client heketi heketi-client

[root@gfs-console ~]# yum update -y


* Gluster 노드 1, 2에 Passwordless ssh 접속을 가능하도록 키를 교환한다

[root@gfs-console ~]# ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''

[root@gfs-console ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@gfs-node01

[root@gfs-console ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@gfs-node02

[root@gfs-console ~]# chown heketi:heketi /etc/heketi/heketi_key*


* Heketi 동작 방식 및 키 파일 위치 설정

[root@gfs-console ~]# vi /etc/heketi/heketi.json

...

31     "executor": "ssh",

32 

33     "_sshexec_comment": "SSH username and private key file information",

34     "sshexec": {

35       "keyfile": "/etc/heketi/heketi_key",

36       "user": "root",

37       "port": "22",

38       "fstab": "/etc/fstab"

39     },

...

[root@gfs-console ~]# systemctl enable heketi

[root@gfs-console ~]# systemctl restart heketi

[root@gfs-console ~]# curl http://localhost:8080/hello

Hello from Heketi


*Gluster 서버의 Cluster 설정 정보와 디스크 Brick 구성을 정의한다

[root@gfs-console ~]# vi heketi_topology.json

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.50.101"
              ],
              "storage": [
                "192.168.50.101"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb",
            "/dev/sdc",
            "/dev/sdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.50.102"
              ],
              "storage": [
                "192.168.50.102"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb",
            "/dev/sdc",
            "/dev/sdd"
          ]
        }
      ]
    }
  ]
}

[root@gfs-console ~]# export HEKETI_CLI_SERVER=http://192.168.50.100:8080

[root@gfs-console ~]# echo "export HEKETI_CLI_SERVER=http://192.168.50.100:8080" | tee -a ~/.bashrc


[root@gfs-console ~]# heketi-cli topology load --json=heketi_topology.json

Creating cluster ... ID: fae7eb318f26475afbd552236670b979

    Creating node 192.168.50.101 ... ID: 325db3146610c1546c32159ce0ca5b2c 

        Adding device /dev/sdb ... OK 

        Adding device /dev/sdc ... OK         

        Adding device /dev/sdd ... OK 

    Creating node 192.168.50.102 ... ID: 8d59a92dc64963e58c650be192762784 

        Adding device /dev/sdb ... OK 

        Adding device /dev/sdc ... OK 

        Adding device /dev/sdd ... OK

[root@gfs-console ~]# heketi-cli volume create --size=1 --replica=2

[root@gluster-console ~]# heketi-cli volume delete 207ee2a905675bc7506cadb6cce4624f

Volume 207ee2a905675bc7506cadb6cce4624f deleted

* Gluster 노드 구성이 2대일 경우, replica=3(디폴트)로 볼륨을 생성하면 "No Space" 에러가 발생하게 됨에 유의



Kubernetes 노드(Minion) 설정


모든 k8s 노드에 GlusterFS Client 를 설치한다


[root@kubenode01 ~]# yum install -y centos-release-gluster310.noarch

[root@kubenode01 ~]# yum install -y glusterfs-client

[root@kubenode01 ~]# setsebool -P virt_sandbox_use_fusefs on

* SELinux 기본 설정에서는 Pod 등에서 remote Gluster 서버로의 write 가 불가능하게 되어 있다. 반드시 setsebool 로 fusefs 쓰기 가능 설정



[3-노드 구성의 필요성]


여기서, 현재 고려중인 2-노드 Gluster Server 구성으로는 Kubernetes 에서 Gluster Volume 생성이 불가능함이 확인되었다. 즉 Heketi-cli 로는 --replicas=2 로 명시적으로 replica 를 2로 지정할 수 있지만, Kubernetes 의 리소스 정의(yaml 파일)을 통한 PVC(Persistent Volume Claim) 방식에서는 replica 를 명시적으로 지정할 수 있는 옵션이 존재하지 않는다. 따라서 다음과 같은, 새로운 Gluster Server(node03)를 추가하는 과정이 별도로 필요하다.


* 3번째 Gluster Server 노드 셋업 및 노드 추가(1~6)


1, 2번 노드와 동일한 스펙과 디스크 구성의 새로운 서버 생성

 - Gluster-3: CentOS 7, 3 disks(/dev/sdb, /dev/sdc, /dev/sdd), IP - 192.168.50.103


2. Gluster Server 패키지 설치

# hostnamectl set-hostname gfs-node03

# yum install -y centos-release-gluster310.noarch #-> 2017/08 기준 Long Term Stable 버전

# yum install -y glusterfs-server ntp

# yum update -y

# systemctl enable glusterd

# systemctl start glusterd

# vi /etc/ntp.conf

....

server 192.168.x.y iburst # 다른 Gluster Server 노드와 동일하게 설정

...

# systemctl enable ntpd

# systemctl start ntpd

# ntpq -pn

    remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

*192.168.x.y    203.248.240.140  3 u    2   64    1    0.324    7.201   0.323


3. 각 Gluster 노드의 /etc/hosts 파일 수정

# vi /etc/hosts

...

192.168.50.100 gfs-console

192.168.50.101 gfs-node01

192.168.50.102 gfs-node02

192.168.50.103 gfs-node03


4. 새로운 노드(gfs-node03)의 방화벽 제거, 디스크 구성 등 최종 확인

[root@gfs-node03 ~]# systemctl stop firewalld

[root@gfs-node03 ~]# systemctl disable firewalld

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.


[root@gfs-node03 ~]# systemctl status glusterd

● glusterd.service - GlusterFS, a clustered file-system server

   Loaded: loaded (/usr/lib/systemd/system/glusterd.service; enabled; vendor preset: disabled)

   Active: active (running) since Fri 2017-08-11 08:25:36 EDT; 22min ago

 Main PID: 6953 (glusterd)

   CGroup: /system.slice/glusterd.service

           └─6953 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO


Aug 11 08:25:36 gfs-node03 systemd[1]: Starting GlusterFS, a clustered file-system server...

Aug 11 08:25:36 gfs-node03 systemd[1]: Started GlusterFS, a clustered file-system server.


[root@gfs-node03 ~]# lsblk

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

fd0           2:0    1    4K  0 disk 

sda           8:0    0   20G  0 disk 

├─sda1        8:1    0    1G  0 part /boot

└─sda2        8:2    0   19G  0 part 

  ├─cl-root 253:0    0   17G  0 lvm  /

  └─cl-swap 253:1    0    2G  0 lvm  [SWAP]

sdb           8:16   0   20G  0 disk 

sdc           8:32   0   20G  0 disk 

sdd           8:48   0   20G  0 disk 

sr0          11:0    1 1024M  0 rom

* 각 디스크는 포맷되거나 파티셔닝 되지 않은 Raw 상태 그대로 유지


5. 기존 Gluster Server 노드 중 아무 서버로 로그인, 새로운 peer 추가

[root@gfs-node02 ~]# gluster peer status

Number of Peers: 1


Hostname: gfs-node01

Uuid: 995a7229-fcde-4eeb-b699-4f5fd2829b20

State: Peer in Cluster (Connected)


[root@gfs-node02 ~]# gluster peer probe 192.168.50.103

peer probe: success.

* Gluster 클러스터 외부(Kubernetes 클러스터)에서 Gluster 클러스터로 접근하는 경우이므로, 되도록이면 IP로 probe 한다


6. Heketi 서버에서 새로운 노드 추가

[root@gluster-console ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@gfs-node03 #-> 키 교환 필수


[root@gluster-console ~]# heketi-cli node list

Id:d0517df692a2ebf40c47c73925ad21c4 Cluster:33b4b4ce590ca914e56aa606159e82c6

Id:f5a68d69da2c9f9d14243392ead4367c Cluster:33b4b4ce590ca914e56aa606159e82c6


[root@gluster-console ~]# heketi-cli node add \

> --zone=1 \

> --cluster=33b4b4ce590ca914e56aa606159e82c6 \

> --management-host-name=192.168.50.103 \

> --storage-host-name=192.168.50.103

Node information:

Id: 98c20ae34697f261ca6f45c05ca0105c

State: online

Cluster Id: 33b4b4ce590ca914e56aa606159e82c6

Zone: 1

Management Hostname 192.168.50.103

Storage Hostname 192.168.50.103

[root@gluster-console ~]# heketi-cli device add --name=/dev/sdb --node=98c20ae34697f261ca6f45c05ca0105c

Device added successfully

[root@gluster-console ~]# heketi-cli device add --name=/dev/sdc --node=98c20ae34697f261ca6f45c05ca0105c

Device added successfully

[root@gluster-console ~]# heketi-cli device add --name=/dev/sdd --node=98c20ae34697f261ca6f45c05ca0105c

Device added successfully

[root@gluster-console ~]# heketi-cli topology info

...클러스터 전체 노드/디스크 등 구성 정보...

* 기존 위에서 작업했던 heketi_topology.json 의 마지막에 새로운 노드 정보를 추가하고 heketi-cli topology load ... 를 해도 되고, 위와 같이 cli 명령을 통해 대화식으로 처리해도 된다



Kubernetes/OpenShift 에서 Heketi-Gluster 볼륨 사용을 위한 Secret, StorageClass 생성


[root@kubemaster ~]# mkdir kube-storage-gluster-heketi && cd kube-storage-gluster-heketi

[root@kubemaster kube-storage-gluster-heketi]# vi 00-gluster-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: default
type: "kubernetes.io/glusterfs"
data:
  # echo -n "PASSWORD" | base64
  # key: PASSWORD_BASE64_ENCODED
  key: "UEFTU1dPUkQ="

[root@kubemaster kube-storage-gluster-heketi]# kubectl create -f 00-gluster-secret.yaml

secret "heketi-secret" created


[root@kubemaster kube-storage-gluster-heketi]# vi 01-gluster-heketi-storage-class.yaml 

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi-external
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://192.168.50.100:8080"
  restuser: "admin"
  secretName: "heketi-secret"
  secretNamespace: "default"
  gidMin: "40000"
  gidMax: "50000"

[root@kubemaster kube-storage-gluster-heketi]# kubectl create -f 01-gluster-heketi-storage-class.yaml 

storageclass "gluster-heketi-external" created


[root@kubemaster kube-storage-gluster-heketi]# kubectl get secret,storageclass

NAME                            TYPE                                  DATA      AGE

secrets/default-token-10xkd     kubernetes.io/service-account-token   3         57d

secrets/heketi-secret           kubernetes.io/glusterfs               1         17h

secrets/heketi-storage-secret   Opaque                                1         1h


NAME                      TYPE

gluster-heketi-external   kubernetes.io/glusterfs

* gidMin~gidMax 값은 Storage Class 내에서 각 볼륨에 대해 유일한 값으로 순차적으로 정해지는 값이며, 볼륨이 삭제되면 gid Pool에 반납되도록 되어 있는 supplemental Group ID 값이다(PV가 attach된 Pod 내의 root 계정으로 전달되어 PV에 write 가능하게 된다. id 명령으로 확인 가능 - 참고), 별도 지정하지 않으면 2000~2147483647 사이의 값이 임의로 할당되는데, Heketi 3.x 이후 버전에서는 이 범위를 Storage Class 정의 시 지정하게 되어 있다 - 참고.


Kubernetes/OpenShift 에서 Heketi endpoint, job, secret 생성


* Heketi 서버에서 다음과 같이 실행하면 heketi-storage.json 파일이 생성된다(Gluster 서버쪽에는 heketidbstorage 볼륨이 생성)

[root@gluster-console ~]# heketi-cli setup-openshift-heketi-storage

Saving heketi-storage.json


* Kubernetes/OpenShift Master 쪽으로 Heketi 서버에서 생성한 heketi-storage.json 파일을 복사하여 kubectl create -f 한다

[root@kubemaster kube-storage-gluster-heketi]# scp root@192.168.50.100:~/heketi-storage.json ./02-heketi-storage.json

root@192.168.50.100's password: 

heketi-storage.json                                                                       100%   83KB  83.1KB/s   00:00    


[root@kubemaster kube-storage-gluster-heketi]# kubectl create -f 02-heketi-storage.json 

secret "heketi-storage-secret" created

endpoints "heketi-storage-endpoints" created

service "heketi-storage-endpoints" created

job "heketi-storage-copy-job" created


[root@kubemaster kube-storage-gluster-heketi]# kubectl get ep,job,pod,svc

NAME                                   ENDPOINTS                                            AGE

ep/heketi-storage-endpoints            192.168.50.101:1,192.168.50.102:1,192.168.50.103:1   1h

ep/kubernetes                          192.168.60.160:6443                                  58d


NAME                           DESIRED   SUCCESSFUL   AGE

jobs/heketi-storage-copy-job   1         1            1h


NAME                     READY     STATUS    RESTARTS   AGE

po/busybox-for-dnstest   1/1       Running   58         2d


NAME                                    CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE

svc/heketi-storage-endpoints            10.199.188.129   <none>        1/TCP     1h

svc/kubernetes                          10.199.0.1       <none>        443/TCP   58d

heketi-storage-copy-job이 완료(SUCCESSFUL=1) 되면 Kubernetes 클러스터 내에서 Heketi 를 통한 동적 볼륨 사용이 가능하게 된 것이다. 


Kubernetes/OpenShift 에서 PV/PVC 생성 & 확인 


Yaml 파일을 통해서 Gluster Volume으로 된 pvc, pv 생성 확인


[root@kubemaster kube-storage-gluster-heketi]# vi ex1-gluster-pvc-example.yaml 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster-dyn-pvc
 annotations:
   volume.beta.kubernetes.io/storage-class: gluster-heketi-external
spec:
 accessModes:
  - ReadWriteOnce
 resources:
   requests:
     storage: 1Gi


[root@kubemaster kube-storage-gluster-heketi]# kubectl create -f ex1-gluster-pvc-example.yaml 

persistentvolumeclaim "gluster-dyn-pvc" created


[root@kubemaster kube-storage-gluster-heketi]# kubectl get pvc

NAME              STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE

gluster-dyn-pvc   Bound     pvc-801691d7-7f04-11e7-9f70-005056a79d0a   1Gi        RWO           31m


[root@kubemaster kube-storage-gluster-heketi]# kubectl get pv

NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                     REASON    AGE

pvc-801691d7-7f04-11e7-9f70-005056a79d0a   1Gi        RWO           Delete          Bound     default/gluster-dyn-pvc             27m

* Persistent Volume Claim 이 처리 되면, 그에 대응하는 Persistent Volume 이 할당된다



생성된 PV를 사용하는 Pod를 생성하고, Volume 이 정상 작동하는지 확인


[root@kubemaster kube-storage-gluster-heketi]# vi ex2-gluster-pod-pv-example.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
  labels:
    name: nginx-pv-pod
spec:
  containers:
  - name: nginx-pv-pod
    image: gcr.io/google_containers/nginx-slim:0.8
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: gluster-vol1
      mountPath: /usr/share/nginx/html
  volumes:
  - name: gluster-vol1
    persistentVolumeClaim:
      claimName: gluster-dyn-pvc


[root@kubemaster kube-storage-gluster-heketi]# kubectl create -f ex2-gluster-pod-pv-example.yaml 

pod "nginx-pv-pod" created 


[root@kubemaster kube-storage-gluster-heketi]# kubectl get pod -o wide

NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE

po/busybox-for-dnstest   1/1       Running   116        4d        172.30.59.4   192.168.60.162

po/nginx-pv-pod          1/1       Running   0          2h        172.30.59.5   192.168.60.162


[root@kubemaster kube-storage-gluster-heketi]# kubectl describe pod nginx-pv-pod 

Name: nginx-pv-pod

Namespace: default

Node: 192.168.60.162/192.168.60.162

Start Time: Mon, 14 Aug 2017 05:52:21 -0400

Labels: name=nginx-pv-pod

Status: Running

IP: 172.30.59.5

Controllers: <none>

Containers:

  nginx-pv-pod:

    Container ID: docker://29e40373a1999612ed7ac50d18e2a933aa2adbb7a31d403a7dc239d4b8fbaa6d

    Image: gcr.io/google_containers/nginx-slim:0.8

    Image ID: docker-pullable://gcr.io/google_containers/nginx-slim@sha256:8b4501fe0fe221df663c22e16539f399e89594552f400408303c42f3dd8d0e52

    Port: 80/TCP

    State: Running

      Started: Mon, 14 Aug 2017 05:53:23 -0400

    Ready: True

    Restart Count: 0

    Volume Mounts:

      /usr/share/nginx/html from gluster-vol1 (rw)

      /var/run/secrets/kubernetes.io/serviceaccount from default-token-10xkd (ro)

    Environment Variables: <none>

Conditions:

  Type Status

  Initialized True 

  Ready True 

  PodScheduled True 

Volumes:

  gluster-vol1:

    Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)

    ClaimName: gluster-dyn-pvc

    ReadOnly: false

  default-token-10xkd:

    Type: Secret (a volume populated by a Secret)

    SecretName: default-token-10xkd

QoS Class: BestEffort

Tolerations: <none>

No events.


[root@kubemaster kube-storage-gluster-heketi]# kubectl exec -it nginx-pv-pod -- bash

  root@nginx-pv-pod:/# cd /usr/share/nginx/html

  root@nginx-pv-pod:/# echo 'Hello World from GlusterFS!' > index.html

  root@nginx-pv-pod:/# exit


 [root@kubemaster kube-storage-gluster-heketi]# curl http://172.30.59.5

 Hello World from GlusterFS!



Kuberbetes 노드에서 mount 상태를, GlusterFS 서버에서 볼륨 내용을 확인해 보자


[root@kubenode02 ~]# mount -l

...

192.168.50.101:vol_f8a6a9f5ef82d805c25e5cd98a63e89d on /var/lib/kubelet/pods/43e560c9-80d6-11e7-9f70-005056a79d0a/volumes/kubernetes.io~glusterfs/pvc-801691d7-7f04-11e7-9f70-005056a79d0a type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

...


[root@gfs-node01 ~]# gluster volume info vol_f8a6a9f5ef82d805c25e5cd98a63e89d

 

Volume Name: vol_f8a6a9f5ef82d805c25e5cd98a63e89d

Type: Replicate

Volume ID: 46c88aae-2521-4d0e-b3e4-a4c2afef850b

Status: Started

Snapshot Count: 0

Number of Bricks: 1 x 3 = 3

Transport-type: tcp

Bricks:

Brick1: 192.168.50.103:/var/lib/heketi/mounts/vg_a040256530d028869b78f30a614efe3b/brick_0bd04d87fcb584d14a5b605ecad0eb9d/brick

Brick2: 192.168.50.102:/var/lib/heketi/mounts/vg_3a0181f175a826880a02d03d16e8e908/brick_c9ee2b0d42e30788005ec3b73228563e/brick

Brick3: 192.168.50.101:/var/lib/heketi/mounts/vg_3a7109f386e745ce9f990657e9388a19/brick_84f16f03a4aaa388d6ceacf607b24443/brick

Options Reconfigured:

transport.address-family: inet

performance.readdir-ahead: on

nfs.disable: on


[root@gfs-node01 ~]# ls -l /var/lib/heketi/mounts/vg_3a7109f386e745ce9f990657e9388a19/brick_84f16f03a4aaa388d6ceacf607b24443/brick

total 4

-rw-r--r--. 2 root 40000 30 Aug 14 05:59 index.html



점검용으로 만들어 본 임시 pod, pv 삭제하고 클러스터 자원 정리


[root@gkubemaster kube-storage-gluster-heketi]# kubectl delete -f ex2-gluster-pod-pv-example.yaml 

pod "nginx-pv-pod" deleted

[root@gkubemaster kube-storage-gluster-heketi]# kubectl delete -f ex1-gluster-pvc-example.yaml 

persistentvolumeclaim "gluster-dyn-pvc" deleted



- Barracuda -


[관련 글 목록]

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] CentOS 7.3 으로 Kubernetes Cluster 구성(with Flannel)-1/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] CentOS 7.3 으로 Kubernetes Cluster 구성(노드 추가하기)-2/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] 1.7.3/1.7.4, kubeadm 으로 L3 네트워크 기반 Cluster 구성(with Calico CNI)-3/4

[Technical/Cloud, 가상화, PaaS] - [Kubernetes] Hyper-converged GlusterFs integration with Heketi -4/4

[Technical/Cloud, 가상화, PaaS] - [GlusterFS & Kubernetes] External Gluster PV with Heketi CLI/Rest API



저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들