일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OS
- aws s3
- zookeeper
- airflow
- Python
- Network
- java
- kubernetes
- EC2
- jvm
- kubeadm
- Operating System
- MAC address
- tcp
- JavaScript
- grafana
- PostgreSQL
- Spring
- Packet
- Trino
- CSV
- AWS
- ip
- log
- CVAT
- Vision
- kubectl
- helm
- docker
- Kafka
- Today
- Total
JUST WRITE
손쉽게 동적으로 Persistent Volume 생성하기 본문
손쉽게 동적으로 Persistent Volume 생성하기
Docker container에서 데이터를 저장할 때 Volume을 사용합니다.
container는 독립적인 환경이라 container가 사라지면 데이터도 사라집니다.
하지만 Volume을 사용하면 Host Device에 mount 하여 container가 없어져도 Volume 데이터는 유지됩니다.
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>
[참고사이트]
'MLOps > Kubernetes' 카테고리의 다른 글
PV 얼마나 남았나?!?! (3) | 2023.07.10 |
---|---|
[Error Reporting] Worker Node join 에러 - CNI 이슈 (0) | 2023.06.26 |
[Ingress] ArgoCD UI 헷갈리지 않고 쉽게 접근하기 (0) | 2023.06.04 |
명령어 한 번에 Kubernetes 설치하기 - Terraform으로 Kubernetes 설치 (4) | 2023.05.23 |
Kubernetes에 CVAT 설치하기 - Helm으로 CVAT 설치 (8) | 2023.05.05 |