OpenEBS LocalPV 검증 내역 소개

Jerry(이정훈)
12 min readApr 19, 2021

--

Kube 환경에서 편리하게 사용 가능한 OpenEBS 스토리지 소개해 드립니다. 실 운영 서비스 대상 고객 환경에서 아래와 같이 검증을 하였고 현재는 실 운영 환경에서 잘 사용 중입니다.

kube 환경에서 스토리지를 사용하려면 상용 외장 스토리지 또는 사용이 쉽지 않은 오픈소스 Ceph, Gluster 등을 사용해야 하는데 OpenEBS는 무료 오픈소스로 사용이 편리하고 성능이 뛰어납니다.

TL; DR
. Kube PVC 스토리지로 오픈소스 OpenEBS 사용 가능
. Local Disk를 사용하여 latency 등 성능이 뛰어나며 사용이 아주 간편함
. Application 단 3 Copy 복제 지원되는 App(redis 등 대부분 DB) 주로 사용
. 데이터 백업은 Velero 추가 솔루션 필요

먼저, OpenEBS에서 지원하는 옵션 리스트 입니다.

저는 이 옵션 중 Local Disk를 사용하는 Local PV를 사용 하였습니다. 스토리지로 Local Disk를 사용한다고 하면 거부감이 많을 것 같습니다. (로컬 노드 죽으면 다 장애인데 Local Disk를 사용한다고??)

먼저 Kube 환경에서는 WEB, WAS 등의 Application은 Stateless 환경이라 Kube PV 스토리지를 사용하지 않습니다. Staefulset은 DB 등이 사용하는데, MariaDB, Redis, ElasticSearch 등 거의 모든 DB는 Application 단에서 3 Copy 구성이 가능합니다. 따라서 단일 Node가 Fail 되어도 다른 Node에서 실행이 가능하므로 서비스에 영향이 없습니다.

추가로 원격지 백업이 필요한 경우는 Velero + Minio 이용 가능합니다.

OpenEBS 옵션 중 Mayastor, Cstor 등은 iSCSI 기반이라 성능 및 관리가 쉽지 않을 것 같아 제외 하였습니다.

먼저, 설치는 아주 간단합니다.

[spkr@erdia22 ~ (dzbumin:default)]$ kubectl apply -f https://openebs.github.io/charts/openebs-operator-lite.yaml
namespace/openebs created
serviceaccount/openebs-maya-operator created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/openebs-maya-operator created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/openebs-maya-operator 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 ~ (dzbumin:default)]$ 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

설치가 완료되면 아래와 같이 POD 확인이 가능합니다.

[spkr@erdia22 ~ (spkn02:openebs)]$ k get pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
openebs-localpv-provisioner-85989cd58b-jl82w 1/1 Running 0 13d 10.233.90.46 node1 <none> <none>
openebs-ndm-kfgf2 1/1 Running 0 13d 172.17.29.161 node1 <none> <none>
openebs-ndm-m6nbd 1/1 Running 0 13d 172.17.29.162 node2 <none> <none>
openebs-ndm-operator-67876b4dc4-847rg 1/1 Running 0 13d 10.233.90.45 node1 <none> <none>
openebs-ndm-wlvvc 1/1 Running 0 13d 172.17.29.163 node3 <none> <none>

OpenEBS Storage Class가 생성되었습니다. 향후 편의를 위하여 openebs-hostpath 를 default storage class 로 변경 합니다.

[spkr@erdia22 ~ (dzbumin:openebs)]$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-hostpath patched
[spkr@erdia22 ~ (dzbumin:openebs)]$ k get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
openebs-device openebs.io/local Delete WaitForFirstConsumer false 76s
openebs-hostpath (default) openebs.io/local Delete WaitForFirstConsumer false 76s

생성된 storage class 를 이용하여 PVC를 만듭니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: default-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce ## block accessmode 지정
resources:
requests:
storage: 10Gi
storageClassName: "openebs-hostpath"

해당 PVC를 이용하여 POD를 생성하면, POD가 생성된 실제 물리 노드에서 디렉토리 확인이 가능합니다.

[admin@node1 local]$ pwd
/var/openebs/local
[admin@node1 local]$ ls
pvc-7f9e4be8-6cc1-4770-a100-f84eb39fcfba
[admin@node1 local]$ cd pvc-7f9e4be8-6cc1-4770-a100-f84eb39fcfba/
[admin@node1 pvc-7f9e4be8-6cc1-4770-a100-f84eb39fcfba]$ ls
pod-out.txt

위와 같이 PV 이름과 동일하게 디렉토리가 생성되었으며 실제 생성된 파일까지 확인이 가능합니다.

POD, PVC를 삭제하면 노드에서도 삭제 됩니다.

[spkr@erdia22 ~ (dzbumin:default)]$ k delete deployments.apps date-pod
deployment.apps "date-pod" deleted
[spkr@erdia22 ~ (dzbumin:default)]$ k get pvc -w
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
default-pvc Terminating pvc-7f9e4be8-6cc1-4770-a100-f84eb39fcfba 10Gi RWO openebs-hostpath 7m58s

dynamic 하게 pvc 생성, 삭제되므로 위와 같이 관리자는 추가 작업 없이 PVC 생성 삭제가 가능합니다.

유의할 사항으로 openebs가 사용하는 호스트 노드의 디렉토리는 Default로 /var/openebs/local를 사용 합니다. 당연히 POD 에서 용량을 많이 사용하면 OS 파일시스템 Full이 발생하여 장애가 발생 할 수 있습니다. 설치 전 혹은 설치 후 OpenEBS 설정을 변경하셔서 용량이 넉넉한 디렉토리를 지정해 주셔야 합니다.

그리고 OpenEBS가 hostpath 영역을 사용하니 PVC에서 지정하는 용량이 아닌 hostpath 전체 용량만큼 사용 가능합니다.

[spkr@erdia22 ~ (spkn02:default)]$ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
local-hostpath-pvc Bound pvc-dd040a8f-b401-49d3-b722-5d4c93c43fbf 5G RWO openebs-hostpath 3m30s

위와 같이 5G로 할당하였지만 실제 초과하여 할당 가능합니다.

[spkr@erdia22 ~ (spkn02:default)]$ k exec -it date-pvc-mirror-5cf6bf8f4b-6jljp -- sh/data # fallocate -l 20G test.file
/data # ls -lrth
total 20G
-rw-r--r-- 1 root root 493 Apr 21 02:21 pod-out.txt
-rw-r--r-- 1 root root 20.0G Apr 21 02:21 test.file

실제 pod에서 df로 확인해 보면 해당 PVC 디렉토리 용량이 PVC에 할당한 5G가 아니라 실제 노드 용량으로 할당됩니다.

[spkr@erdia22 ~ (spkn02:default)]$ k exec -it date-pvc-mirror-5cf6bf8f4b-6jljp -- sh
/ # df -h
Filesystem Size Used Available Use% Mounted on
overlay 490.9G 10.1G 480.7G 2% /
tmpfs 64.0M 0 64.0M 0% /dev
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root
490.9G 10.1G 480.7G 2% /data
/dev/mapper/centos-root
490.9G 10.1G 480.7G 2% /etc/hosts

다음으로, IOPS를 확인해 보겠습니다.

[spkr@erdia22 11.fio-examples (dzbumin:default)]$ kubestr fio -f fio-rand-read-Diamanti.fio -s openebs-hostpath
PVC created kubestr-fio-pvc-tz6kb
Pod created kubestr-fio-pod-frnvz
Running FIO test (fio-rand-read-Diamanti.fio) on StorageClass (openebs-hostpath) with a PVC of Size (100Gi)
Elapsed time- 2m5.3402554s
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=6976.702637 BW(KiB/s)=27906
iops: min=3589 max=10366 avg=6992.146484
bw(KiB/s): min=14361 max=41471 avg=27973.339844
Disk stats (read/write):
dm-0: ios=839695/3026 merge=0/0 ticks=17517517/222 in_queue=17561305, util=100.000000%
sda: ios=839695/1707 merge=0/1319 ticks=17410722/148 in_queue=17411958, util=100.000000%
- OK

약 7천 IOPS 이므로 HDD RAID 1 Mirror 환경에서 나쁘지 않은 성능 입니다.

이상으로 Kube 스토리지로 사용 할 수 있는 Openebs Local PV에 대하여 알아 보았습니다. Ceph 등과 같이 복잡하지 않아 별도 스토리지 관리자 없이도 사용 가능하고 성능도 뛰어납니다. 저희도 현재 운영 환경에서 별 이슈 없이 잘 사용하고 있습니다. 스토리지를 고려 하신다면 좋은 대안이 될 수 있을 것 같네요.

Diamanti & Managed Kubernetes Service 문의 : leejunghoon@spkr.co.kr

--

--

Jerry(이정훈)
Jerry(이정훈)

Written by Jerry(이정훈)

DevOps/Automation Engineer 60살까지 콘솔 잡는 엔지니어를 목표로 느리게 생각하고 있습니다.

No responses yet