Overview
PV(PersistentVolume)와 PVC(PersistentVolumeClaim)를 통해서 Storage를 사용하는 방법을 소개합니다.
PV, PVC 소개
PersistentVolume(PV)은 관리자가 provisioning했거나 Storage Class를 사용하여 동적으로 provisioning 된 cluster의 storage입니다.
PersistentVolumeClaim(PVC)는 사용자가 storage를 요청한 것으로 PV를 resource로 사용합니다.
Storage 종류
Block Storage
Access Modes 에 "ReadWriteOne" 가능
Storage 공유 불가
File Storage
Access Modes 에 "ReadWriteMany" 가능
Pods이 여러개 뜰 경우 storage 공유 가능
persistentVolume Reclaim Policy
delete : PVC 삭제 시 PV에 정의된 실제 storage도 함께 삭제
retain : PVC를 삭제하더라도 PV에 정의된 실제 storage는 삭제되지 않음
PVC 생성 예시
Storage Class가 “ebs-gp3-retain”인 경우
apiVersion: v1 kind: PersistentVolumeClaim metadata: ... name: <pv_name> namespace: <namespace_name> ... spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: ebs-gp3-retain volumeMode: Filesystem volumeName: pvc-12345678-1234-1234-1234567890ab |
Storage Class가 “efs-zcp-retain”인 경우
apiVersion: v1 kind: PersistentVolumeClaim metadata: ... name: <pv_name> namespace: <namespace_name> ... spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: efs-zcp-retain volumeMode: Filesystem volumeName: pvc-12345678-1234-1234-1234567890ab |
생성된 PVC 를 Deployment에 mount
apiVersion: apps/v1 kind: Deployment metadata: name: <deployment_name> labels: app: <deployment_label> spec: selector: matchLabels: app: <app_name> template: metadata: labels: app: <app_name> spec: containers: - image: <image_name> name: <container_name> volumeMounts: - name: <volume_name> mountPath: /<file_path> volumes: - name: <volume_name> persistentVolumeClaim: claimName: <pvc_name> |
생성된 PVC 를 StatefulSet에 mount
apiVersion: apps/v1 kind: StatefulSet metadata: name: <deployment_name> spec: serviceName: <app_name> replicas: <replica_count> podManagementPolicy: "Parallel" selector: matchLabels: app: <app_name> template: metadata: labels: app: <app_name> spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: failure-domain.beta.kubernetes.io/zone containers: - image: <image_name> name: <container_name> volumeMounts: - name: <volume_name> mountPath: /<file_path> volumes: - name: <volume_name> persistentVolumeClaim: claimName: <pvc_name> |
AWS의 Storage 소개
AWS Cloud의 Storage Class 종류
Storage Class Name | Description |
---|---|
gp2 (default) | General Purpose SSD로 구성되었으며 99.8%~99.9%의 내구성(연간 장애율 0.1% ~ 0.2%)을 가집니다. 볼륨당 최대 처리량은 250MiB/s * 입니다. PersistentVolumeClaim을 사용하는 Pod가 생성될 때까지 PersistentVolume의 binding 및 provisioning을 지연하는 모드를 정의되어 있습니다. 회수 정책(Reclaim Policy)은 delete로 사용된 PV가 삭제될 때 EBS(Elastic Block Store)가 삭제되도록 합니다. |
ebs-gp3 | gp2와 동일한 spec이지만 차이점은 볼륨 당 최대 처리량이 1,000MiB/s 입니다. |
ebs-gp3-retain | ebs-gp3에서 회수정책(Reclaim Policy)이 delete가 아닌 retain으로 PV가 삭제될 때 EBS가 삭제되지 않습니다. |
efs-{PROJECT_NAME} | AWS region에서 하나 이상의 가용 영역(Availability Zone)을 사용할 수 없는 경우에도 데이터에 지속적인 가용성을 제공하도록 설계된 regional storage classe로 자주 access하는 file에 사용됩니다. 회수 정책(Reclaim Policy)은 delete로 사용된 PV가 삭제될 때 EFS(Elastic File System)가 삭제되도록 합니다. |
efs-{PROJECT_NAME}-retain | efs-[project name]에서 회수정책(Reclaim Policy)이 delete가 아닌 retain으로 PV가 삭제될 때 EFS가 삭제되지 않습니다. |
gp2의 * 처리량 제한은 볼륨 크기에 따라 128MiB/s ~ 250MiB/s입니다. 170GiB보다 작거나 같은 볼륨은 최대 128MiB/s의 처리량을 제공합니다. 170GiB보다 크고 334GiB보다 작은 볼륨은 버스트 크레딧을 사용할 수 있는 경우 최대 처리량 250MiB/s를 제공합니다. 334GiB 이상의 볼륨은 버스트 크레딧에 관계없이 250MiB/s를 제공합니다.gp2
2018년 12월 3일 이전에 생성되었으며 생성 이후 수정되지 않은 볼륨은 볼륨 을 수정 하지 않는 한 최대 성능에 도달하지 못할 수 있습니다 .
project에 사용할 EFS 생성 방법
1. EFS provisioner 설치
EFS Provisioner를 Helm을 이용하여 설치합니다.
FILE_SYSTEM_ID
: Create EFS 에서 생성한 FileSystem IDREGION
: 지역. 예) ap-northeast-2PROJECT_NAME
: 지역. 예) zcp
helm install stable/efs-provisioner \ --name zcp-efs-provisioner \ --namespace kube-system \ --set efsProvisioner.efsFileSystemId={FILE_SYSTEM_ID} \ --set efsProvisioner.awsRegion={REGION} \ --set efsProvisioner.path=/zcp \ --set efsProvisioner.provisionerName=cloudzcp.io/aws-efs \ --set efsProvisioner.storageClass.name=efs-{PROJECT_NAME} |
2. retain storage class 생성
kubectl patch sc efs-zcp -p'{"metadata":{"name":"efs-{PROJECT_NAME}-retain"},"reclaimPolicy": "Retain"}' --dry-run -o yaml | kubectl create -f - |
3. 생성된 StorageClass 확인
kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ebs-gp3 ebs.csi.aws.com Delete WaitForFirstConsumer true 162m ebs-gp3-retain ebs.csi.aws.com Retain WaitForFirstConsumer true 162m efs-zcp cloudzcp.io/aws-efs Delete Immediate false 3h10m efs-zcp-retain cloudzcp.io/aws-efs Retain Immediate false 3h7m gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 6h28m |
참고페이지
https://docs.aws.amazon.com/eks/latest/userguide/storage-classes.html
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html?icmpid=docs_ec2_console
https://docs.aws.amazon.com/efs/latest/ug/storage-classes.html
https://aws.amazon.com/efs/when-to-choose-efs/?nc1=h_ls
https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-persistent-storage/
Azure의 Storage 소개
Azure의 Storage Class 종류
Storage Class Name | Description |
---|---|
default | Azure StandardSSD 저장소를 사용하여 Managed Disk를 만듭니다. 회수 정책(Reclaim Policy)은 delete로 사용된 PV가 삭제될 때 기본 Azure 디스크가 삭제되도록 합니다. |
managed-premium | Azure Premium 저장소를 사용하여 Managed Disk를 만듭니다. 회수 정책(Reclaim Policy)은 delete로 기본 Azure 디스크를 사용한 PV가 삭제될 때 기본 Azure 디스크가 삭제되도록 다시 확인합니다. |
managed-premium-retain | managed-premium에서 회수정책(Reclaim Policy)을 delete가 아닌 retain으로 PV가 삭제될 때 기본 Azure 디스크가 삭제되지 않습니다. |
azurefile | Azure 표준 저장소를 사용하여 Azure 파일 공유를 만듭니다. 회수 정책(Reclaim Policy)은 delete로 사용된 PV가 삭제될 때 기본 Azure 파일 공유가 삭제되도록 합니다. |
azurefile-premium | Azure Premium 저장소를 사용하여 Azure 파일 공유를 만듭니다. 회수 정책(Reclaim Policy)은 delete로 사용된 PV가 삭제될 때 기본 Azure 파일 공유가 삭제되도록 합니다. |
azurefile-premium-retain | azurefile-premium에서 회수정책(Reclaim Policy)을 delete가 아닌 retain으로 PV가 삭제될 때 기본 Azure 파일 공유가 삭제되지 않습니다. |
참고페이지
https://docs.microsoft.com/en-us/azure/aks/concepts-storage#storage-classes
IBM의 Storage 소개
IBM의 Storage Class 종류
bronze ~ gold : 고정적인 IOPS로 Storage Size 선택
custom : Storage Size 및 Size에 맞는 IOPS선택
bronze | silver | gold | custom | |
---|---|---|---|---|
iopsPerGB | 2 | 4 | 10 | |
sizeRange | [20-12000]Gi | [20-12000]Gi | [20-4000]Gi | |
sizeIOPSRange | [20-39]Gi : [100-1000] |
Storage 과금 종류 (Billing type)
monthly : storage 사용비용이 매 월마다 과금되는 방식
한 달 단위로 과금되기에 중간에 삭제하더라도 남은 일수(Days)와 관계 없이 한 달 요금을 내야 함
장기간 사용하고자 할 때 유리
hourly : storage 사용비용이 매 시간마다 과금되는 방식
시간 단위로 과금되기에 중간에 삭제하더라도 남은 분(minutes)과 관계 없이 한 시간 요금을 내야 함
가격은 monthly보다 비싸지만 시간 단위기 때문에 임시 테스트 생성 시 사용 권장