-
Kubernetes PersistentVolumeClaims (PVC) 알아보기Kubernetes 2024. 1. 8. 06:49728x90반응형
- 목차
함께 보면 좋은 글.
https://westlife0615.tistory.com/221
들어가며.
쿠버네티스는 Pod 가 데이터를 저장하는 방식을 크게 두 부류로 나누었습니다.
하나는 Ephemeral Volume 이고, 나머지 하나는 Persistent Volume 입니다.
Ephemeral Volume 은 Pod 와 라이프사이크을 함께하는 볼륨인데요.
Pod 가 Node 의 파일시스템 일부를 임시적으로 사용하는 형태입니다.
Pod 가 종료되면 Ephemeral Volume 또한 제거됩니다.
하지만 수많은 어플리케이션들은 프로그램만을 위한 영구적인 볼륨이 필요한 경우가 많습니다.
이번 글에서는 영구적으로 데이터를 저장할 수 있는 방식인 Persistent Volume Claims 에 대해서 알아보려고 합니다.
Provisioning (프로비저닝).
프로비저닝은 Persistent Volume 을 생성하는 단계입니다.
프로비저닝 또한 동적 프로비저닝과 정적 프로비저닝으로 나뉘는데요.
정적 프로비저닝의 관점에서 먼저 설명하도록 하겠습니다.
Persistent Volume 은 실질적인 Storege Volume 을 관리하는 쿠버네티스의 리소스입니다.
Persistent Volume 은 Node 의 파일시스템이나 EBS 와 같은 스토리지와 연결됩니다.
정적 프로비저닝은 아래와 같은 형식으로 구현되는데요.
관리자에 의해서 Persistent Volume 이 미리 생성됩니다.
요구사항에 맞게 스토리지의 크기별로 PV1, PV2, PV3 이 미리 생성되어 있습니다.
이러한 케이스에서 2GB 스토리지가 필요한 Pod 와 PVC 가 생성되면 PVC 는 적절한 PV 와 바인딩됩니다.
동적 프로비저닝은 미리 생성되어있는 PV 를 활용하는 방식이 아닙니다.
PVC 의 요청에 의해서 동적으로 PV 와 Storage 가 프로비저닝됩니다.
바인딩.
쿠버네티스는 Controller Pattern 을 사용합니다.
Controller Pattern 은 리소스의 Desired State 와 Current State 를 비교하여 Current State 를 Desired State 로 변경합니다.
Controller 의 예시로 ReplicaSet Controller 가 대표적입니다.
ReplicaSet Controller 는 ReplicaSet 의 Pod 의 복제본의 수를 유지시키는 역할을 수행합니다.
Pod 복제본의 수가 줄어든다면 복제본을 추가하여 Desired State 를 유지하죠.
PVC 또한 PVC Controller 에 의해서 PVC 의 라이프사이클이 관리됩니다.
바인딩 또한 PVC 의 라이프사이클 중의 하나입니다.
PVC 가 적절한 PV 에 연결되는 것이 Bound 상태입니다.
PVC Controller 는 주기적으로 PVC 의 상태를 체크하게 됩니다.
정적 바인딩 예시.
먼저 1Gi, 2Gi, 3Gi 크기를 가지는 Persistent Volume 3개를 생성합니다.
cat <<EOF> /tmp/nginx-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: generateName: nginx-pv- spec: capacity: storage : 1Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: standard persistentVolumeReclaimPolicy: Delete hostPath: path: /tmp/nginx --- apiVersion: v1 kind: PersistentVolume metadata: generateName: nginx-pv- spec: capacity: storage : 2Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: standard persistentVolumeReclaimPolicy: Delete hostPath: path: /tmp/nginx --- apiVersion: v1 kind: PersistentVolume metadata: generateName: nginx-pv- spec: capacity: storage : 3Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: standard persistentVolumeReclaimPolicy: Delete hostPath: path: /tmp/nginx EOF kubectl create -f /tmp/nginx-pv.yaml
kubectl get persistentvolume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nginx-pv-jhpms 1Gi RWO Delete Available standard 11s nginx-pv-jmmb8 2Gi RWO Delete Available standard 11s nginx-pv-ttxds 3Gi RWO Delete Available standard 11s
PV 가 생성된 이후에 Pod 와 PVC 를 생성해보도록 하겠습니다.
cat <<EOF> /tmp/nginx-pod.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc-3g spec: accessModes: - ReadWriteOnce resources: requests: storage: 3Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc-1g spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Pod metadata: generateName: nginx-pod- spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: nginx-storage volumes: - name: nginx-storage persistentVolumeClaim: claimName: nginx-pvc-3g --- apiVersion: v1 kind: Pod metadata: generateName: nginx-pod- spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: nginx-storage volumes: - name: nginx-storage persistentVolumeClaim: claimName: nginx-pvc-1g EOF kubectl create -f /tmp/nginx-pod.yaml
< 생성된 Pod >
< 생성된 PVC >
< 정적 바인딩된 PV >
위 이미지처럼 PVC 가 요청하는 Storage Volume 인 1Gi, 3Gi 에 해당하는 PV 가 바인딩됨을 확인할 수 있습니다.
동적 바인딩 예시.
Pod 와 PVC 를 생성하여 PVC 의 라이프사이클을 관찰해보도록 하겠습니다.
cat <<EOF> /tmp/nginx-pod.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80 volumes: - name: nginx-storage persistentVolumeClaim: claimName: nginx-pvc EOF kubectl create -f /tmp/nginx-pod.yaml
위 명령어를 실행하게 되면 Pod, PVC, PV 가 생성됩니다.
PV 는 동적 프로비저닝에 의해서 자동으로 생성됩니다.
kubectl get pod NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 6m31s
kubectl get persistentvolumeclaims NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginx-pvc Bound pvc-68f70e1b-f3f7-48a1-b8de-01396567a8b9 1Gi RWO standard 7m2s
kubectl get persistentvolume NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-68f70e1b-f3f7-48a1-b8de-01396567a8b9 1Gi RWO Delete Bound default/nginx-pvc standard 7m11s
< Persistent Volume Claims 이미지 >
반응형'Kubernetes' 카테고리의 다른 글
[KinD] KinD Cluster 로 Docker Image 업로드하기 (kind load docker-image) (0) 2024.02.03 Kubernetes Deployment 알아보기 (4) 2024.01.09 [Kubernetes] PodDisruptionBudget 알아보기 (PDB) (0) 2024.01.06 ArgoWorkflow Parallel Nested Dag 구현하기 ( with Kubernetes ) (0) 2024.01.03 [Kubernetes] Argo Workflows 시작하기 (0) 2023.12.28