쿠버네티스 교육

11. Kube 교육 - OpenEBS LocalPV

Jerry_이정훈 2021. 6. 4. 16:44
728x90

실습

  • OpenEBS 설치, 호스트 노드 마운트 포인트 변경
  • POD Volume 할당 : OpenEBS LocalPV Storage Class 이용

Why OpenEBS?

kube 환경에서 PV 스토리지를 사용하려면 상용 외장 스토리지 또는 사용이 쉽지 않은 오픈소스 Ceph/Gluster 등을 이용해야 합니다. 이에 비하여 OpenEBS Local PV는 무료 오픈소스로 사용이 편리하고 성능이 뛰어난 것이 장점 입니다.

 

OpenEBS는 POD가 실행되는 노드의 Local Disk를 POD의 PV로 할당합니다.

단점은 Storage 용량 Quota가 지정되지 않고 Snapshot 기능을 지원하지 않는 것 입니다. 단순한 구성으로 (DAS) 장애 처리가 용이하고 성능이 뛰어나(NVMMe Disk를 사용하면 Read IOPS 575K까지 가능합니다.) 단점에도 불구하고 운영 서비스 대상으로 잘 사용하고 있습니다. 

 

참고로 K3S 환경은 OpenEBS Local Path와 유사한 local-path Storage가 기본 포함되어 있습니다.

 

OpenEBS Local PV 설치

아래는 OpenEBS에서 지원하는 사용 가능한 Storage 옵션입니다. 

다양한 옵션 선택이 가능합니다. 다른 옵션에 비하여 LocalPV는 Snapshot 등 안정성 측면의 부가 기능이 지원되지 않지만 MariaDB 등의 대부분의 Database는 Application 단에서 3 Copy 데이터 복제 기능을 지원하여 물리적인 디스크의 안정성 문제가 비교적 덜 치명적이므로 Local PV 옵션을 사용 하였습니다.  (OpenEBS Mayastor, Cstor 등의 다른 옵션은 iSCSI 기반이라 성능 저하 및 관리 포인트 증가가 예상되어 제외 하였습니다.)

 

설치 참조 : https://docs.openebs.io/docs/next/uglocalpv-hostpath.html

 

OpenEBS Local PV Hostpath User Guide ·

------

docs.openebs.io

[spkr@erdia22 ~ (kspray:metallb-system)]$ kubectl apply -f https://openebs.github.io/charts/openebs-operator-lite.yaml
ubectl apply -f https://openebs.github.io/charts/openebs-lite-sc.yaml

namespace/openebs created
serviceaccount/openebs-maya-operator created
clusterrole.rbac.authorization.k8s.io/openebs-maya-operator created
clusterrolebinding.rbac.authorization.k8s.io/openebs-maya-operator created
customresourcedefinition.apiextensions.k8s.io/blockdevices.openebs.io created
customresourcedefinition.apiextensions.k8s.io/blockdeviceclaims.openebs.io created
configmap/openebs-ndm-config created
daemonset.apps/openebs-ndm created
deployment.apps/openebs-ndm-operator created
deployment.apps/openebs-localpv-provisioner created

[spkr@erdia22 ~ (kspray:metallb-system)]$
[spkr@erdia22 ~ (kspray:metallb-system)]$ kubectl apply -f https://openebs.github.io/charts/openebs-lite-sc.yaml
storageclass.storage.k8s.io/openebs-hostpath created
storageclass.storage.k8s.io/openebs-device created

디폴트로 설치되는 호스트 노드의 Directory는 /var/openebs/local 입니다. 이 디렉토리가 POD의 PV로 사용됩니다. 이는 용량이 문제가 될 수 있으므로 디렉토리 선택 시 호스트 노드의 파일 시스템 가용 용량에 따라 적절한 디렉토리로 변경이 필요합니다. 아래는  NVMe Disk를 Logical Volume으로 묶어서 /data 디렉토리를 사용 중이라 /data를 지정하도록 설정 파일을 수정한 예입니다.

[root@nvme01 ~]# lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                         8:0    0 447.1G  0 disk
├─sda1                      8:1    0   200M  0 part /boot/efi
├─sda2                      8:2    0     1G  0 part /boot
└─sda3                      8:3    0   446G  0 part
  ├─centos-root           253:0    0    50G  0 lvm  /
  ├─centos-swap           253:1    0     4G  0 lvm  [SWAP]
  └─centos-home           253:2    0   392G  0 lvm  /home
sdb                         8:16   0 447.1G  0 disk
└─sdb1                      8:17   0 447.1G  0 part
  └─docker--vg-docker--lv 253:3    0 447.1G  0 lvm
nvme0n1                   259:0    0   2.9T  0 disk
└─nvme0n1p1               259:3    0     2T  0 part
  └─nvme_vg-nvme_lv       253:4    0     6T  0 lvm  /data
nvme1n1                   259:1    0   2.9T  0 disk
└─nvme1n1p1               259:4    0     2T  0 part
  └─nvme_vg-nvme_lv       253:4    0     6T  0 lvm  /data
nvme2n1                   259:2    0   2.9T  0 disk
└─nvme2n1p1               259:5    0     2T  0 part
  └─nvme_vg-nvme_lv       253:4    0     6T  0 lvm  /data

[root@nvme01 ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
devtmpfs                     189G     0  189G   0% /dev
tmpfs                        189G     0  189G   0% /dev/shm
tmpfs                        189G   25M  189G   1% /run
tmpfs                        189G     0  189G   0% /sys/fs/cgroup
/dev/mapper/centos-root       50G  2.9G   48G   6% /
/dev/sda2                   1014M  141M  873M  14% /boot
/dev/sda1                    200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home      392G   33M  392G   1% /home
tmpfs                         38G     0   38G   0% /run/user/0
/dev/mapper/nvme_vg-nvme_lv  6.0T   26G  6.0T   1% /data
(이하 생략)

Openebs-hostpath Storage Class YAML 파일에서 /data를 사용하도록 수정합니다. 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: openebs-hostpath
  annotations:
    openebs.io/cas-type: local
    cas.openebs.io/config: |
      #hostpath type will create a PV by 
      # creating a sub-directory under the
      # BASEPATH provided below.
      - name: StorageType
        value: "hostpath"
      #Specify the location (directory) where
      # where PV(volume) data will be saved. 
      # A sub-directory with pv-name will be 
      # created. When the volume is deleted, 
      # the PV sub-directory will be deleted.
      #Default value is /var/openebs/local
      - name: BasePath
        value: "/data"  # change to custom directory 
        # value: "/home/openebs/local/"  # change to custom directory 
provisioner: openebs.io/local
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
  • name: BasePath 의 value 부문을 수정 합니다.

변경된 directory 설정 /data로 StorageClass 생성되었습니다.

[spkr@erdia22 ~ (nvme:postgresql)]$ k apply -f openebs-sc.yml
[spkr@erdia22 ~ (nvme:postgresql)]$ k get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-device         openebs.io/local        Delete          WaitForFirstConsumer   false                  26h
openebs-hostpath       openebs.io/local        Delete          WaitForFirstConsumer   false                  26h

[spkr@erdia22 ~ (nvme:postgresql)]$ k describe sc openebs-hostpath
Name:            openebs-hostpath
IsDefaultClass:  No
(생략)
- name: BasePath
  value: "/data"  # change to custom directory
  # value: "/home/openebs/local/"  # change to custom directory

해당 StorageClass 이름 기준으로 PostgreSQL Helm 차트를 수정합니다. 

Helm 설치 후 PV, PVC 확인하면 아래와 같이 정상적으로 확인 가능합니다. 

(자세한 PostgreSQL 설치 내역은 생략 하겠습니다.)

(자세한 PostgreSQL Helm Chart 설치 과정은 생략 합니다.)
[spkr@erdia22 ~ (nvme:postgresql)]$ k get pvc,pv
NAME                                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
persistentvolumeclaim/data-postgresql-postgresql-0   Bound    pvc-68f68886-f0fa-4d07-a95f-46eae6375b30   500Gi      RWO            openebs-hostpath   26h

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM
    STORAGECLASS       REASON   AGE
persistentvolume/pvc-68f68886-f0fa-4d07-a95f-46eae6375b30   500Gi      RWO            Delete           Bound    postgresql/data-postgresql-postgresql-0   openebs-hostpath            26h

참고로 Kube 환경의 스토리지 IOPS 측정 툴 kubestr 사용하여 IOPS를 측정하면 NVMe Disk 기준 Read IOPS 575K까지 가능합니다. 일반 NAS 스토리지 측정 결과가 27K 이므로 21배 향상된 수치입니다.

[spkr@erdia22 11.fio-examples (dz-saas:default)]$ kubestr fio -f fio-rand-read-Diamanti.fio -s high
PVC created kubestr-fio-pvc-x6q76
Pod created kubestr-fio-pod-lnxz4
Running FIO test (fio-rand-read-Diamanti.fio) on StorageClass (high) with a PVC of Size (100Gi)
Elapsed time- 2m5.5459797s
FIO test results:
FIO version - fio-3.20
Global options - ioengine= verify= direct=1 gtod_reduce=
JobName:
  blocksize= filesize=1G iodepth=64 rw=
read:
  IOPS=575285.562500 BW(KiB/s)=2301142
  iops: min=422087 max=897495 avg=575298.437500
  bw(KiB/s): min=1688352 max=3590009 avg=2301199.500000
Disk stats (read/write):
  nvme5n1: ios=69006229/8 merge=0/10 ticks=8666783/0 in_queue=9915781, util=100.000000%
  -  OK

Backup이 필요한 경우에는 velero + minio 사용하시면 원격 스토리지로 backup이 가능합니다. 

 

이상 Kube 환경에서 사용 가능한 고성능과 단순한 관리가 장점인 OpenEBS LocalPV에 대하여 알아 보았습니다. 

반응형