JUST WRITE

손쉽게 동적으로 Persistent Volume 생성하기 본문

MLOps/Kubernetes

손쉽게 동적으로 Persistent Volume 생성하기

천재보단범재 2023. 6. 15. 22:39

Dynamic Provisioning, OpenEBS Helm으로 설치

손쉽게 동적으로 Persistent Volume 생성하기

Docker container에서 데이터를 저장할 때 Volume을 사용합니다.

container는 독립적인 환경이라 container가 사라지면 데이터도 사라집니다.

하지만 Volume을 사용하면 Host Device에 mount 하여 container가 없어져도 Volume 데이터는 유지됩니다.

 

출처 : https://docs.docker.com/storage/volumes/

Kubernetes에서도 Pod내 Container에서 사용한 데이터를 Volume으로 지정해 유지할 수 있습니다.

Pod이 사라지더라도 Volume을 설정해서 데이터를 유지할 수 있습니다.

기본적으로 아래 2가지 Volume Type이 있습니다.

Kubernetes Volumes

EmptyDir

가장 기본적인 Volume Type으로 비어있는 상태로 시작하기 때문에 EmptyDir입니다.

Pod내의 모든 Container에서 접근이 가능합니다.

Pod내 Container들이 데이터를 공유해서 사용할 수 있습니다.

하지만 Pod이 제거되면 해당 Volume의 데이터도 사라집니다.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi

HostPath

HostPath는 Kubernetes Cluster내에서 Node의 파일시스템에 mount하는 방식입니다.

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

위 기본적인 2가지 Type 외에 여러가지 Volume Type이 존재합니다.

Kubernetes 공식 문서에서 자세한 내용을 확인할 수 있습니다.

PV 와 PVC

PV는 Persistent Volume으로 관리자나 StorageClass에 의해 자동으로 생성된 Volume입니다.

PVC는 Persistent Volume Claim으로 사용자가 Volume을 사용하기 위한 Request입니다.

PVC는 다양한 Size와 Mode로 요청할 수 있습니다.

  • ReadWriteOnce(RWO)
  • ReadOnlyMany(ROX)
  • ReadWriteMany(RWX)

OpenEBS 설치

OpenEBS를 설치하기 전에 iSCSI를 먼저 설치를 해줘야 합니다.

OpenEBS는 iSCSI Protocol를 통해 Block Volume를 생성합니다.

iSCSI 설치

아래 명령어로 Kubernetes Node에 iSCSI가 설치되었는지를 알 수 있습니다.

# 아래 파일 존재 유무로 설치 확인
ubuntu@k8sworker1:~$ sudo cat /etc/iscsi/initiatorname.iscsi
No file exists

package 형태로 설치를 진행합니다.

# centos
$ sudo yum install -y iscsi-initiator-utils
# ubuntu
$ sudo apt install open-iscsi

# 설치 후 생성 확인
$ cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:********

iSCSI 설치가 끝나면 서비스로 등록해 줍니다.

# Service 등록
$ sudo systemctl enable --now iscsid

# Service 상태 확인
$ systemctl status iscsid
● iscsid.service - iSCSI initiator daemon (iscsid)
     Loaded: loaded (/lib/systemd/system/iscsid.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-06-02 08:06:32 UTC; 1 week 5 days ago
TriggeredBy: ● iscsid.socket
       Docs: man:iscsid(8)
   Main PID: 485 (iscsid)
      Tasks: 2 (limit: 9399)
     Memory: 3.8M
        CPU: 21.198s
     CGroup: /system.slice/iscsid.service
             ├─484 /sbin/iscsid
             └─485 /sbin/iscsid

Notice: journal has been rotated since unit was started, output may be incomplete.

PV 생성경로 세팅

Kubernetes의 Worker Node마다 OpenEBS가 자동할 생성할 PV 경로를 세팅합니다.

# PV 세팅할 경로 folder 생성
$ mkdir -p /data/openebs

Helm으로 설치

OpenEBS는 Helm-chart를 제공해 주기 때문에 손쉽게 설치가 가능합니다.

# helm repo 추가
$ helm repo add openebs https://openebs.github.io/charts
"openebs" has been added to your repositories

# helm repository 확인
$ helm repo list
NAME    URL                             
openebs https://openebs.github.io/charts

# OpenEBS Releas 검색
$ helm search repo openebs
NAME            CHART VERSION   APP VERSION     DESCRIPTION                                  
openebs/openebs 3.7.0           3.7.0           Containerized Attached Storage for Kubernetes

$ helm pull openebs/openebs
$ ll
total 396
drwxrwxr-x 2 ubuntu ubuntu   4096 Jun 15 08:08 ./
drwxr-x--- 8 ubuntu ubuntu   4096 Jun 15 08:07 ../
-rw-r--r-- 1 ubuntu ubuntu 393578 Jun 15 08:08 openebs-3.7.0.tgz
$ tar xzf openebs-3.7.0.tgz

이번 포스팅에서는 기본값으로 세팅을 진행합니다.

위에서 설정한 PV 경로만 잡아줍니다.

# values-override 파일 생성
$ vi values-override.yaml

localprovisioner:
  basePath: "/data/openebs/local"

helm 명령어로 OpenEBS 설치를 진행합니다.

# helm 설치 (values.yaml 수정)
$ helm install openebs --create-namespace -n openebs ./

# helm 설치 (values-override.yaml 사용)
$ helm install openebs --create-namespace -n openebs -f values-override.yaml ./

# 설치 확인
$ helm list -n openebs
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
openebs openebs         1               2023-06-15 08:11:52.388642328 +0000 UTC deployed        openebs-3.7.0   3.7.0

$ kubectl get all -n openebs 
NAME                                               READY   STATUS    RESTARTS   AGE
pod/openebs-localpv-provisioner-65b8c79cdf-2m5h6   1/1     Running   0          36s
pod/openebs-ndm-4ptk7                              1/1     Running   0          37s
pod/openebs-ndm-c9mnb                              1/1     Running   0          36s
pod/openebs-ndm-mpwxh                              1/1     Running   0          36s
pod/openebs-ndm-operator-7dcb699b68-gg76k          1/1     Running   0          36s

NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/openebs-ndm   3         3         3       3            3           <none>          37s

NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/openebs-localpv-provisioner   1/1     1            1           37s
deployment.apps/openebs-ndm-operator          1/1     1            1           37s

NAME                                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/openebs-localpv-provisioner-65b8c79cdf   1         1         1       37s
replicaset.apps/openebs-ndm-operator-7dcb699b68          1         1         1       37s

$ kubectl get storageclass
NAME               PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-device     openebs.io/local   Delete          WaitForFirstConsumer   false                  98s
openebs-hostpath   openebs.io/local   Delete          WaitForFirstConsumer   false                  98s

마지막으로 OpenEBS hostpath Class를 StorageClass의 기본값으로 설정합니다.

기본값으로 설정해서 추후에 Volume 설정 시 StorageClass를 기본이 hostpath Class로 되게 합니다.

$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-hostpath patched

$ kubectl get storageclass
NAME                         PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-device               openebs.io/local   Delete          WaitForFirstConsumer   false                  2m41s
openebs-hostpath (default)   openebs.io/local   Delete          WaitForFirstConsumer   false                  2m41s

# 적용 확인
$ kubectl describe storageclass openebs-hostpath
Name:            openebs-hostpath
IsDefaultClass:  Yes
Annotations:     cas.openebs.io/config=- name: StorageType
  value: "hostpath" 
- name: BasePath
  value: "/data/openebs/local" 
,meta.helm.sh/release-name=openebs,meta.helm.sh/release-namespace=openebs,openebs.io/cas-type=local,storageclass.kubernetes.io/is-default-class=true
Provisioner:           openebs.io/local
Parameters:            <none>
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none
Events:                <none>

[참고사이트]

728x90
반응형
Comments