CSP 별 스토리지(PV, PVC) 사용 방법

Print

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 ID

  • REGION : 지역. 예) ap-northeast-2

  • PROJECT_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]
[40-79]Gi : [100-2000]
[80-99]Gi : [100-4000]
[100-499]Gi : [100-6000]
[500-999]Gi : [100-10000]
[1000-1999]Gi : [100-20000]
[2000-2999]Gi : [200-40000]
[3000-3999]Gi : [200-48000]
[4000-7999]Gi : [300-48000]
[8000-9999]Gi : [500-48000]
[10000-12000]Gi : [1000-48000]

Storage 과금 종류 (Billing type)

  • monthly : storage 사용비용이 매 마다 과금되는 방식

    • 한 달 단위로 과금되기에 중간에 삭제하더라도 남은 일수(Days)와 관계 없이 한 달 요금을 내야 함

    • 장기간 사용하고자 할 때 유리

  • hourly : storage 사용비용이 매 시간마다 과금되는 방식

    • 시간 단위로 과금되기에 중간에 삭제하더라도 남은 분(minutes)과 관계 없이 한 시간 요금을 내야 함

    • 가격은 monthly보다 비싸지만 시간 단위기 때문에 임시 테스트 생성 시 사용 권장

참고페이지

이 답변이 유용합니까? 아니오

Send feedback
도움이 되어드리지 못해 죄송합니다. 아티클 개선을 위해 의견을 제공해 주시기 바랍니다.