우노
[K8S] Persistent Volume, Persistent Volume Claim, StorageClass란? 본문
DevOps/Kubernetes
[K8S] Persistent Volume, Persistent Volume Claim, StorageClass란?
운호(Noah) 2023. 11. 5. 15:48들어가기 앞서,
- Kubernetes에서 Volume은, 3가지 구조로 사용됩니다.
- PersistentVolume(PV)
- PersistentVolumeClaim(PVC)
- StorageClass
- 해당 포스팅에선 PV와 PVC에 대해서 먼저 이해한 뒤, StorageClass에 대해서 이해해보겠습니다.
PV와 PVC 요약
- PV
- Volume 자체를 의미합니다.
- 클러스터 내에서 독립적으로 관리되며 별도의 생명 주기를 가집니다.
- 클라우드 서비스 또는 직접 구축한 Storage와 같은 다양한 소스에서 제공되는 스토리지를 사용할 수 있습니다.
- PVC
- 사용자가 PV에 요청한 정보를 의미합니다.
- 필요한 용량, 액세스 모드 등을 지정하여 PV를 요청합니다.
- Pod는 직접 PV에 연결되는 대신, PVC를 통해 스토리지에 액세스합니다.
- 특징
- PV는 Pod에 직접 연결되지 않고, PVC를 통해 연결됩니다.
- PV와 PVC는 클러스터 관리자가 수동으로 설정하거나 StorageClass를 사용하여 동적으로 프로비저닝할 수 있습니다.
PV와 PVC의 생명 주기
Provisioning
- PV를 생성하는 단계로, 두 가지 방법으로 이루어집니다.
- 정적(Static) 프로비저닝
- 미리 적정 용량의 PV를 생성해두는 방법입니다.
- 사용 가능한 스토리지 용량에 제한이 있을 때 유용합니다.
- 만약, 100GB의 용량을 가진 PV를 미리 생성해두었을 때, 150GB를 요청하는 요청은 실패하게 됩니다.
- 동적(Dynamic) 프로비저닝
- 사용자가 PVC를 통해 PV를 요청할 때, 사용자가 필요한 용량 만큼의 PV를 동적으로 생성하는 방법입니다.
- 필요에 따라 다양한 용량의 PV를 동적으로 생성하고 싶을 때 유용합니다.
- 동적 프로비저닝을 위해선 StorageClass라는 K8S 리소스가 사용되며,
- 어떤 종류의 Storage를 프로비저닝할지에 대한 규칙과 설정을 StorageClass에 정의한 뒤,
- PVC에서 해당 StorageClass를 지정하면,
- PVC가 생성될 때, 사용자가 필요한 용량 만큼의 PV가 동적으로 프로비저닝됩니다.
- 정적(Static) 프로비저닝
Binding
- 프로비저닝으로 만든 PV를 PVC와 연결하는 단계입니다.
- PVC에서 필요한 스토리지의 용량과 접근 방법을 명시하여 PV를 요청하면, 해당 요청에 맞는 PV가 바인딩됩니다.
- 만약 PVC에서 요청한 조건을 만족하는 PV가 없다면, PVC는 해당 PV가 생성될 때까지 대기 상태에 있습니다.
- PV와 PVC의 매핑은 1대1 관계이며, PVC는 여러 개의 PV에 할당될 수 없습니다.
Using
- Pod는 PVC를 볼륨으로 인식해서 사용합니다.
- Pod에 할당된 PVC는 Pod를 유지하는 동안 계속 사용되며, 시스템에서 임의로 삭제할 수 없습니다.
- 이 기능은 'Storage Object in Use Protection' (사용 중인 스토리지 오브젝트 보호)로 알려져 있습니다.
- 사용 중인 데이터 스토리지를 임의로 삭제하는 경우 치명적인 결과가 발생할 수 있으므로 이런 보호 기능을 사용하는 것입니다.
Reclaiming
- 사용이 끝난 PVC를 삭제하고, 해당 PVC를 사용하던 PV를 초기화(reclaim)하는 과정을 나타냅니다.
- 초기화 정책에는 Retain, Delete가 있습니다.
- Retain
- PV가 삭제되어도 PV의 데이터는 클러스터 내에 보존됩니다.
- 관리자가 PV를 수동으로 정리하고 데이터를 보존하거나 백업하는 데 활용됩니다.
- PV를 다시 사용하기 위해서는 수동으로 다시 바인딩해야 합니다.
- Delete
- PV가 삭제되면 PV와 관련된 데이터도 함께 삭제됩니다.
- 테스트 및 개발 환경에서 주로 사용되며 데이터 보존이 필요하지 않을 때 유용합니다.
- 동적으로 프로비저닝된 PV의 반환 정책은 기본적으로 Delete이며, 필요에 따라 수정이 필요합니다.
- Retain
정적 프로비저닝 예제 코드
Persistent Volume
apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: # Volume 용량 storage: 1Gi accessModes: # 접근 옵션 - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # PV가 삭제되었을 때의 초기화 옵션 hostPath: # 마운트시킬 로컬 서버의 경로 path: /data/example-pv
Persistent Volume Claim
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: # 접근 옵션 - ReadWriteOnce resources: # 자원을 얼마나 사용할 것인지 요청 (PV의 용량을 초과하면 안됨) requests: storage: 500Mi
동적 프로비저닝 예제 코드
StorageClass
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: example-storageclass # StorageClass의 이름을 지정합니다. provisioner: kubernetes.io/gce-pd # Google Compute Engine Persistent Disk 를 스토리지 플러그인으로 사용합니다. reclaimPolicy: Retain # PV가 삭제되어도 데이터를 보존합니다.
Persistent Volume Claim
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: # PV에 대한 액세스 모드를 나타냅니다. - ReadWriteOnce resources: requests: storage: 1Gi # PVC가 요청하는 스토리지의 크기를 나타냅니다. storageClassName: example-storageclass # PV가 동적으로 프로비저닝될 때 사용될 StorageClass를 나타냅니다.
Persistent Volume, Persistent Volume Claim 연결 확인 명령어
Persistent Volume Claim 연결 확인 명령어
$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE example-pvc Bound example-pv 2Gi RWO manual 2m
- “example-pv”라는 VOLUME에 Bound 된 것을 확인할 수 있습니다.
Persistent Volume 연결 확인 명령어
$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE example-pv 5Gi RWO Retain Bound default/example-pvc manual 3m
- STATUS 종류
- Available : PVC에서 사용할 수 있도록 준비된 상태
- Bound : 특정 PVC에 연결된 상태
- Released : PVC는 삭제되었고 PV는 아직 초기화 되지 않은 상태
- Failed : 자동 초기화를 실패한 상태
- STATUS 종류
참고
'DevOps > Kubernetes' 카테고리의 다른 글
[K8S] Replicaset Desired, Current, Ready란? (0) | 2023.11.15 |
---|---|
[K8S] Container Sleep 방법 (0) | 2023.11.15 |
[K8S] ExternalName이란? (0) | 2023.11.01 |
[K8S] Node, Pod, Container 리소스 사용량 확인 방법 (0) | 2023.10.20 |
[K8S] labels, selector, match_labels의 차이 (1) | 2023.10.18 |
Comments