마구잡

Kubernetes OpenEBS LVM 사용하기 본문

Kubernetes

Kubernetes OpenEBS LVM 사용하기

MAGUJOB 2024. 11. 8. 22:33
728x90

OpenEBS란?

OpenEBS는 쿠버네티스 환경에서 상태 저장 애플리케이션을 위한 오픈소스 스토리지 솔루션이다. 컨테이너에 스토리지를 직접 연결하는 ‘컨테이너 부착 스토리지(Container Attached Storage, CAS)’ 패턴을 채택하여, 각 애플리케이션이 독립적인 스토리지 리소스를 가질 수 있도록 한다. 이 접근 방식은 스토리지 관리의 유연성과 확장성을 높이며, 데이터의 복제 및 복구 기능을 제공한다.

 

OpenEBS는 다양한 스토리지 엔진을 지원하여 사용자의 요구에 맞는 스토리지 솔루션을 선택할 수 있게 한다. 주요 엔진으로는 Jiva, cStor, Mayastor 등이 있으며, 각각의 엔진은 성능, 복제, 스냅샷 등 다양한 기능을 제공한다. 또한, OpenEBS는 쿠버네티스와 긴밀하게 통합되어 동적 프로비저닝, 스냅샷, 백업 등 다양한 스토리지 기능을 지원한다.

 

기술적으로, OpenEBS는 사용자 공간에서 실행되며, 쿠버네티스의 네이티브 리소스와 연동된다. 이는 커널 모듈에 의존하지 않으므로 다양한 환경에서 높은 이식성을 제공한다. 또한, OpenEBS는 iSCSI, NVMe-oF 등 다양한 스토리지 프로토콜을 지원하여 다양한 스토리지 요구 사항을 충족시킨다.

 

( 공식 사이트에서 발췌한 내용을 기반으로 작성하였으나, 명확하지 않은 부분은 경험을 토대로 작성하였습니다.

이는 정확한 정보가 아닐 수 있음을 알려드립니다. )

공식 사이트

( 광고 클릭은 큰 힘이 됩니다! )

728x90

 

 

OpenEBS - Kubernetes Storage Simplified.

OpenEBS makes it easy to attach Dynamic Local PV or Replicated Volumes to any Kubernetes application by abstracting all of the complex commands involved in creating robust multi-zone storage in a simple one-line command.

openebs.io


사전 준비

LVM형태의 OpenEBS StroageClass를 사용하고싶다면 엑스트라 디스크가 필요하다.

작성자는 20기가짜리 디스크를 node-1,node-2 vm에 추가하여 진행하였다. 

loop디바이스 또는 덤프 파일을 이용해서도 진행이 가능하다.
OS ubuntu22.04 환경
lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
...
vdb    253:16   0    20G  0 disk

 

1. lvm2 Install

apt install lvm2

 

2. pvcreate, vgcreate 

디스크를 추가한 모든 노드에서 진행
 pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.
 pvdisplay
  --- Physical volume ---
  PV Name               /dev/vdb
  VG Name               vg_vdb
  PV Size               20.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               hS8Mq5-8MyZ-I95k-KpyD-dij7-Cx0S-qJ3G0B
vgcreate vg_vdb /dev/vdb
  Volume group "vg_vdb" successfully created
vgdisplay
  --- Volume group ---
  VG Name               vg_vdb
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <20.00 GiB
  PE Size               4.00 MiB
  Total PE              5119
  Alloc PE / Size       0 / 0
  Free  PE / Size       5119 / <20.00 GiB
  VG UUID               lLPpSZ-Ox0H-Hvv6-R7Dr-vSTk-kEbJ-QSw2lX

OpenEBS Install

이번 글에서는 HostPath 방식이 아닌 LVM 방식의 StorageClass를 사용해서 PV/PVC를 배포하는 방식을 채택한다.

특별한 이유가 있다기 보단 클러스터에 사용하고 있는 Path를 사용하지 않고 장치를 추가시키게 되면 독립성이 증가하고, 볼륨생성을 더 가시적으로 보기 편해서 해당 방식을 채택해서 진행했다.

 

기본적인 설치는 공식 Docs Quick Guide를 따라해서 진행한다.

 

1. helm repo add

helm repo add openebs https://openebs.github.io/openebs
helm repo update

 

레포 리스트 확인

helm repo list
NAME    URL
openebs https://openebs.github.io/openebs

 

2. helm install

helm install openebs --namespace openebs openebs/openebs --create-namespace

 

기본 helm으로 설치하게 되면 openebs 네임스페이스에 OpenEBS의 Local PV Hostpath, Local PV LVM, Local PV ZFS, Replicated Storage 구성 요소를 설치한다. Replicated Storage를 설치하지 않으려면 접은글의 명령어를 사용한다.
더보기
helm install openebs --namespace openebs openebs/openebs --set engines.replicated.mayastor.enabled=false --create-namespace

배포 상태 확인

kubectl get po -n openebs
NAME                                              READY   STATUS    RESTARTS   AGE
openebs-agent-core-7f97c46864-c66mc               2/2     Running   0          23m
openebs-agent-ha-node-8hbvp                       1/1     Running   0          23m
openebs-agent-ha-node-fvxdv                       1/1     Running   0          23m
openebs-agent-ha-node-m6m8d                       1/1     Running   0          23m
openebs-agent-ha-node-x5l8r                       1/1     Running   0          23m
openebs-api-rest-745bc49fb7-k4lnh                 1/1     Running   0          23m
openebs-csi-controller-6c878fb7bc-82j4z           6/6     Running   0          23m
openebs-csi-node-b8nvv                            2/2     Running   0          23m
openebs-csi-node-bfnd6                            2/2     Running   0          23m
openebs-csi-node-zt74d                            2/2     Running   0          23m
openebs-csi-node-zw5dc                            2/2     Running   0          23m
openebs-etcd-0                                    1/1     Running   0          23m
openebs-etcd-1                                    1/1     Running   0          23m
openebs-etcd-2                                    1/1     Running   0          23m
openebs-localpv-provisioner-65db9df479-4h856      1/1     Running   0          23m
openebs-loki-0                                    1/1     Running   0          23m
openebs-lvm-localpv-controller-84844f9c47-f67jw   5/5     Running   0          23m
openebs-lvm-localpv-node-4nv75                    2/2     Running   0          23m
openebs-lvm-localpv-node-578jj                    2/2     Running   0          23m
openebs-lvm-localpv-node-f7d4n                    2/2     Running   0          23m
openebs-lvm-localpv-node-xqhn8                    2/2     Running   0          23m
openebs-nats-0                                    3/3     Running   0          23m
openebs-nats-1                                    3/3     Running   0          23m
openebs-nats-2                                    3/3     Running   0          23m
openebs-obs-callhome-6ddffb4b7f-zzz2x             2/2     Running   0          23m
openebs-operator-diskpool-5f6795874d-6hr6h        1/1     Running   0          23m
openebs-promtail-bjncz                            1/1     Running   0          23m
openebs-promtail-nlhjl                            1/1     Running   0          23m
openebs-promtail-txrqt                            1/1     Running   0          23m
openebs-promtail-zjtb8                            1/1     Running   0          23m
openebs-zfs-localpv-controller-779bbf897-z6w4s    5/5     Running   0          23m
openebs-zfs-localpv-node-5hm8b                    2/2     Running   0          23m
openebs-zfs-localpv-node-cjmgh                    2/2     Running   0          23m
openebs-zfs-localpv-node-jsptq                    2/2     Running   0          23m
openebs-zfs-localpv-node-wch9f                    2/2     Running   0          23m

 

3. LVM StorageClass 생성

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: openebs-lvmpv-vdb
allowVolumeExpansion: true
parameters:
  blockDevices: "/dev/vdb" <- 사용할 장치
  fsType: "ext4"           <- 원하는 파일시스템 타입
  storage: "lvm"           <- 원하는 스토리지 타입
  volgroup: "vg_vdb"       <- 생성한 볼륨 그룹 명
provisioner: local.csi.openebs.io
allowedTopologies:
- matchLabelExpressions:
  - key: kubernetes.io/hostname
    values:
      - ubuntu-m1          <- 볼륨 그룹을 생성한 노드
      - ubuntu-w1          <- 볼륨 그룹을 생성한 노드
위에는 명시적으로 전부 작성했지만 필터링 형식처럼 작성 또한 가능하다.
/dev/vd* 같은 형식으로 vd로 시작하는 모든 장치를 사용할 수 있다.
위와 같은 필터링 방식은 공식 Docs에 나와있다.
kubectl apply -f openebs-lvm-sc.yaml
kubectl get sc -n openebs

NAME                     PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
mayastor-etcd-localpv    openebs.io/local          Delete          WaitForFirstConsumer   false                  7h1m
mayastor-loki-localpv    openebs.io/local          Delete          WaitForFirstConsumer   false                  7h1m
nfs-csi (default)        nfs.csi.k8s.io            Delete          Immediate              false                  7d11h
openebs-hostpath         openebs.io/local          Delete          WaitForFirstConsumer   false                  7h1m
openebs-lvmpv-vdb        local.csi.openebs.io      Delete          Immediate              true                   15s
openebs-single-replica   io.openebs.csi-mayastor   Delete          Immediate              true                   7h1m

 

4. pvc 배포시 동적 할당 확인

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: lvm-pvc
spec:
  storageClassName: openebs-lvmpv-vdb
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
kubectl apply -f lvm-pvc.yaml
kubectl get pvc
NAME                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS            VOLUMEATTRIBUTESCLASS   AGE
data-openebs-etcd-0      Bound    pvc-9ebfa4c0-4f3e-4467-b34a-58c40e90cd30   2Gi        RWO            mayastor-etcd-localpv   <unset>                 4d2h
data-openebs-etcd-1      Bound    pvc-6620c88f-edeb-4e24-a92a-7d8bf3b34716   2Gi        RWO            mayastor-etcd-localpv   <unset>                 4d2h
data-openebs-etcd-2      Bound    pvc-b7e6cd7f-2ac7-4eff-96ce-d30c867b8eb6   2Gi        RWO            mayastor-etcd-localpv   <unset>                 4d2h
lvm-pvc                  Bound    pvc-19003639-a8fb-4ffe-970b-ad2695b18530   1Gi        RWO            openebs-lvmpv-vdb       <unset>                 4s
storage-openebs-loki-0   Bound    pvc-857585af-f6ff-425c-87ae-7303172f95b8   10Gi       RWO            mayastor-loki-localpv   <unset>                 4d2h

 

LVM 배포 확인

lsblk
NAME                                                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                                                    7:0    0     4K  1 loop /snap/bare/5
loop1                                                    7:1    0 273.6M  1 loop /snap/firefox/5187
loop2                                                    7:2    0  74.2M  1 loop /snap/core22/1621
loop3                                                    7:3    0  73.9M  1 loop /snap/core22/1663
loop4                                                    7:4    0   497M  1 loop /snap/gnome-42-2204/141
loop5                                                    7:5    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop6                                                    7:6    0  12.2M  1 loop /snap/snap-store/1216
loop7                                                    7:7    0  12.3M  1 loop /snap/snap-store/959
loop8                                                    7:8    0  40.4M  1 loop /snap/snapd/20671
loop9                                                    7:9    0   452K  1 loop /snap/snapd-desktop-integration/83
loop10                                                   7:10   0   568K  1 loop /snap/snapd-desktop-integration/253
loop11                                                   7:11   0 273.6M  1 loop /snap/firefox/5239
loop12                                                   7:12   0  38.8M  1 loop /snap/snapd/21759
loop13                                                   7:13   0 505.1M  1 loop /snap/gnome-42-2204/176
vda                                                    253:0    0   100G  0 disk
├─vda1                                                 253:1    0     1M  0 part
├─vda2                                                 253:2    0   513M  0 part /boot/efi
└─vda3                                                 253:3    0  99.5G  0 part /var/lib/kubelet/pods/5ffde88c-b09e-421c-a32a-f85d1a780067/volume-subpaths/chroot-zfs/openebs-zfs-plugin/3
                                                                                 /var/snap/firefox/common/host-hunspell
                                                                                 /
vdb                                                    253:16   0    20G  0 disk
└─vg_vdb-pvc--19003639--a8fb--4ffe--970b--ad2695b18530 252:0    0     1G  0 lvm

발생 가능성 있는 에러

가끔 ETCD 파드가 RUNNING이지만 0/1 상태일때가 있다.

이때 로그를 확인하고 엔드포인트로 통신문제가 보여지면 dns lookup의 문제일 수 있으니 core-dns 재시작을 해보자


 

잘못된 정보나, 문의등은 댓글로 메일과 함께 적어주시면 감사하겠습니다.

728x90