Persistent Volume 과 Persistent Volume Claim
PV는 쿠버네티스 클러스터의 외부 공간과 연결하여 저장공간을 제공하는 볼륨이며 pod에 영구적인 저장 방법을 제공한다.
Persistent Volume 을 사용하기 위해서는 Pod 과 직접적으로 연결되는 Persistent Volume Claim 이 필요하다. PV와 PVC로 분리한 이유는 클러스터에서 어플리케이션을 배포하고 싶어하는 개발자가 스토리지에 대한 지식이 없어도 쿠버네티스에서 저장공간을 필요한 만큼 가져다 쓸 수 있도록 하기 위해서이다.
PV 와 PVC의 life cycle
- Provisioning : PV가 생성되는 단계이다. PV의 종류에는 정적 프로비저닝과 동적 프로비저닝이 있다.
- Binding : PVC 를 만들고 PVC와 PV를 연결하는 단계이다. PV 와 PVC는 1:1로만 연결된다.
- Using : PVC에서 제공하는 볼륨을 Pod가 마운트해서 사용하는 단계이다.
- Reclaiming : 사용이 끝난 PVC가 종료 및 삭제되면 PVC에 연결된 PV 또한 회수한다.
회수하는 정책에는 두가지 종류가 있다.
1) Retain : PV를 삭제하더라도 외부 스토리지의 리소스는 유지한다.
2) Delete : PVC가 삭제되면 PV리소스도 같이 삭제된다. 보통 AWS, Azure 같은 클라우드 스토리지 서비스에서 사용하는 회수 정책이다.
PV와 PVC의 관계
PV와 PVC는 1:1로 연결 가능하다. 따라서 PV가 연결되었던 PVC가 삭제되었다면 연결 해제될 것이다. 삭제된 PVC를 다시 ManifestFile 로 생성하더라도 기존의 PV와는 연결되지 않는다. 다시 PV를 사용해서 쓰기 위해서는 PV를 삭제하고 다시 PV를 생성하여 새로운 PVC와 연결해주어야 한다.
PV 의 상태는 PVC와의 연결에 따라서 다음과 같이 나뉜다.
- Available : 연결된 PVC 가 없는 상태 (연결 가능 상태)
- Bound : PVC랑 연결되어 있는 상태
- Released : PVC와 현재 연결해제된 상태이며 리소스가 회수되지 않은 상태
- Failed : 리소스 회수 실패 상태
정적 볼륨 프로비저닝과 동적 볼륨 프로비저닝
정적 볼륨 프로비저닝은 사용자가 수동으로 PV와 PVC를 정의하여 사용하는 방식이며, 동적 볼륨 프로비저닝은 개발자가 PVC만 정의해두면 이에 따라 동적으로 PV가 프로비저닝 되는 것이다. 프로비저닝이란 사용할 리소스를 준비하는 과정을 말한다.
정적 볼륨 프로비저닝과 NFS 스토리지 서비스
정적 볼륨 프로비저닝에서 PV는 다음과 같이 정의할 수 있다. accessMode는 Pod들이 볼륨에 접근하는 것에 대한 정책 설정이다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
spec:
capacity: # PV가 얼마만큼의 용량을 제공할 수 있는지
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /srv/nfs-volume
server: 192.168.56.11
동적 볼륨 프로비저닝과 NFS 스토리지 서비스
정적 볼륨 프로비저닝과 달리, PVC만 정의해주면 된다.
동적 볼륨 프로비저닝은 클라우드 플랫폼에서 주로 사용하며, 온프레미스 환경에서 nfs 기반의 동적 볼륨 프로비저닝을 구성하기 위해서 쿠버네티스가 제공하는 nfs-subdir-external-provisioner을 사용할 수 있다. git 명령어로 쉽게 레포지토리에서 다운받을 수 있다.
$ git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
deployment.yaml 파일을 수정하여 환경에 맞게 설정한 후 , rback.yaml, class.yaml, deployment.yaml 로 오브젝트들을 생성한다.
PVC는 다음과 같이 정의한다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
동적 볼륨 프로비저닝에서는 스토리지 클래스에 의해서 PV가 자동으로 프로비져닝 된다. 위의 nfs-subdir-external-provisioner에서 class.yaml 파일이 스토리지클래스 오브젝트를 생성하는 파일이다.
따라서 PVC를 생성한 이후에 PV가 정말 프로비저닝 되었는지 확인해보면 다음과 같다. PVC에서 정의한대로 1Gi 크기의 PV가 생성되었다. storageclass 는 'nfs-client'로 관리되고 있다.
vagrant@kube-control1:~/work/20230220$ kubectl get persistentvolumes
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-de59f6ae-eab7-4f6c-935e-686df44f24b8 1Gi RWX Delete Bound default/myapp-pvc-dynamic nfs-client 16s
Default StorageClass 설정하기
스토리지 클래스를 기본값으로 설정하여 사용할 수 있다. 이는 annotation 부분을 수정하면 된다.
$ kubectl edit storageclass
명령어를 통해 storageclass의 설정파일을 확인할 수 있다. annotations 필드에
storageclass.kubernetes.io/is-default-class: "true"
를 추가해 주면 된다.
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] Secret 오브젝트 사용하기 (0) | 2023.02.21 |
---|---|
[Kubernetes] ConfigMap 오브젝트 생성하기 (0) | 2023.02.21 |
[Kubernetes] Ingress 컨트롤러 (0) | 2023.02.19 |
[Kubernetes] 쿠버네티스 Volume의 종류와 특징 (0) | 2023.02.17 |
[Kubernetes] Service 의 종류 (0) | 2023.02.16 |