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가 동적으로 프로비저닝됩니다.

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이며, 필요에 따라 수정이 필요합니다.

정적 프로비저닝 예제 코드

  • 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 : 자동 초기화를 실패한 상태

참고