동적 볼륨 프로비저닝

동적 볼륨 프로비저닝 (Dynamic Volume Provisioning)

동적 볼륨 프로비저닝(dynamic volume provisioning)은 스토리지 볼륨을 필요에 따라(on-demand) 생성할 수 있게 해주는 기능이에요. 동적 프로비저닝이 없으면 클러스터 관리자가 새 스토리지 볼륨을 만들기 위해 클라우드 또는 스토리지 제공자에게 수동으로 요청을 보내야 하고, 그다음 Kubernetes에서 그 볼륨을 나타내는 PersistentVolume 객체를 직접 만들어야 했어요. 동적 프로비저닝 기능은 클러스터 관리자가 스토리지를 미리 프로비저닝할 필요를 없애줍니다. 대신 사용자가 PersistentVolumeClaim 객체를 생성하면 스토리지를 자동으로 프로비저닝해요.

출처: Kubernetes 공식 문서 — Dynamic Volume Provisioning

배경 (Background)

동적 볼륨 프로비저닝의 구현은 storage.k8s.io API 그룹의 API 객체인 StorageClass에 기반해요. 클러스터 관리자는 필요에 따라 여러 StorageClass 객체를 정의할 수 있는데, 각각은 볼륨을 프로비저닝하는 볼륨 플러그인(일명 프로비저너)과 프로비저닝 시 그 프로비저너에 전달할 파라미터 집합을 지정합니다.

클러스터 관리자는 클러스터 내에서 (같은 또는 다른 스토리지 시스템에서 온) 여러 종류의 스토리지를 각각 고유한 파라미터 집합으로 정의하고 노출할 수 있어요. 이 설계는 최종 사용자가 스토리지가 어떻게 프로비저닝되는지의 복잡성과 세부사항을 신경 쓸 필요가 없으면서도, 여전히 여러 스토리지 옵션 중에서 선택할 수 있게 보장합니다.

자세한 내용은 Storage Classes 개념 문서를 참고하세요.

동적 프로비저닝 활성화 (Enabling Dynamic Provisioning)

동적 프로비저닝을 활성화하려면 클러스터 관리자가 사용자들을 위해 하나 이상의 StorageClass 객체를 미리 만들어 두어야 해요.

StorageClass 객체는 어떤 프로비저너를 사용할지, 그리고 동적 프로비저닝이 호출될 때 그 프로비저너에 어떤 파라미터를 전달해야 하는지를 정의합니다. StorageClass 객체의 이름은 유효한 DNS 서브도메인 이름이어야 해요.

다음 매니페스트는 표준 디스크와 같은 영구 디스크를 프로비저닝하는 "slow"라는 스토리지 클래스를 만듭니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

다음 매니페스트는 SSD와 같은 영구 디스크를 프로비저닝하는 "fast"라는 스토리지 클래스를 만듭니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

동적 프로비저닝 사용하기 (Using Dynamic Provisioning)

사용자는 PersistentVolumeClaim에 스토리지 클래스를 포함시켜 동적으로 프로비저닝된 스토리지를 요청해요. Kubernetes v1.6 이전에는 volume.beta.kubernetes.io/storage-class 어노테이션으로 이 작업을 수행했어요. 하지만 이 어노테이션은 v1.9부터 더 이상 사용되지 않습니다(deprecated). 이제 사용자는 PersistentVolumeClaim 객체의 storageClassName 필드를 사용할 수 있고, 또 사용해야 해요. 이 필드의 값은 관리자가 구성한 StorageClass의 이름과 일치해야 합니다 (동적 프로비저닝 활성화 참고).

예를 들어 "fast" 스토리지 클래스를 선택하려면 사용자는 다음 PersistentVolumeClaim을 만들면 됩니다:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast
  resources:
    requests:
      storage: 30Gi

이 claim은 SSD와 같은 Persistent Disk가 자동으로 프로비저닝되도록 만들어요. claim이 삭제되면 볼륨도 파괴됩니다.

기본값(defaulting) 동작 (Defaulting Behavior)

스토리지 클래스가 지정되지 않은 모든 claim이 동적으로 프로비저닝되도록 동적 프로비저닝을 클러스터에서 활성화할 수 있어요. 클러스터 관리자는 다음 방법으로 이 동작을 활성화할 수 있습니다:

관리자는 특정 StorageClassstorageclass.kubernetes.io/is-default-class 어노테이션을 추가해 default로 표시할 수 있어요. 클러스터에 기본 StorageClass가 존재하고 사용자가 storageClassName을 지정하지 않은 PersistentVolumeClaim을 만들면, DefaultStorageClass admission controller가 기본 스토리지 클래스를 가리키는 storageClassName 필드를 자동으로 추가합니다.

참고로, 클러스터의 여러 StorageClass에 storageclass.kubernetes.io/is-default-class 어노테이션을 true로 설정한 상태에서 storageClassName이 없는 PersistentVolumeClaim을 만들면, Kubernetes는 가장 최근에 생성된 기본 StorageClass를 사용해요.

토폴로지 인식 (Topology Awareness)

Multi-Zone 클러스터에서는 Pod를 Region 내의 여러 Zone에 걸쳐 분산할 수 있어요. 단일 Zone 스토리지 백엔드는 Pod가 스케줄링되는 Zone에 프로비저닝되어야 합니다. 이는 볼륨 바인딩 모드 (Volume Binding Mode)를 설정해 달성할 수 있어요.

더 알아보기 (Learn more)