볼륨 팝퓰레이터와 데이터 소스

볼륨 팝퓰레이터와 데이터 소스 (Volume Populators and Data Sources)

이 문서는 Kubernetes의 볼륨 팝퓰레이터(volume populator)와 데이터 소스(data source)를 설명합니다. 영구 볼륨(persistent volumes)에 대한 이해가 권장됩니다.

PersistentVolumeClaim을 만들면 Kubernetes가 프로비저닝하는 볼륨은 보통 빈 상태로 시작합니다. **데이터 소스(data source)**를 사용하면 새 볼륨이 기존 데이터로 미리 채워지도록(사전-팝퓰레이션) 요청할 수 있어요. **볼륨 팝퓰레이터(volume populator)**는 PersistentVolumeClaim이 참조하는 데이터 소스를 기반으로 그 팝퓰레이션을 수행하는 컨트롤러입니다.

Kubernetes는 기존 볼륨을 복제하거나 볼륨 스냅샷을 복원하는 데이터 소스에 대한 내장 지원이 있어요. 사용자 정의 볼륨 팝퓰레이터는 이 메커니즘을 확장합니다. 데이터 소스는 사용자 정의 리소스, 즉 그 유형이 CustomResourceDefinition으로 정의된 객체입니다. 팝퓰레이터 컨트롤러는 그런 리소스를 참조하는 PersistentVolumeClaim을 감시하고, 그 리소스에서 새 볼륨을 채웁니다.

출처: 문서

볼륨 팝퓰레이터와 데이터 소스 (Volume populators and data sources)

Kubernetes는 사용자 정의 볼륨 팝퓰레이터를 지원합니다. 사용자 정의 볼륨 팝퓰레이터를 사용하려면 kube-apiserver와 kube-controller-manager에서 AnyVolumeDataSource 기능 게이트를 활성화해야 해요.

볼륨 팝퓰레이터는 dataSourceRef라는 PVC 스펙 필드를 활용합니다. 다른 PersistentVolumeClaim 또는 VolumeSnapshot에 대한 참조만 포함할 수 있는 dataSource 필드와 달리, dataSourceRef 필드는 같은 네임스페이스의 어떤 객체에 대한 참조도 포함할 수 있습니다(PVC 외의 코어 객체는 제외). 기능 게이트가 활성화된 클러스터에서는 dataSourceRef 사용이 dataSource보다 권장됩니다.

데이터 소스 참조 (Data source references)

dataSourceRef 필드는 dataSource 필드와 거의 동일하게 동작합니다. 하나를 지정하고 다른 하나를 지정하지 않으면 API 서버는 두 필드에 같은 값을 부여합니다. 두 필드 모두 생성 후에는 변경할 수 없으며, 두 필드에 서로 다른 값을 지정하려고 하면 검증 오류가 발생합니다. 따라서 두 필드는 항상 같은 내용을 가집니다.

사용자가 알아야 할 dataSourceRef 필드와 dataSource 필드 사이에는 두 가지 차이점이 있습니다.

  • dataSource 필드는 잘못된 값을 무시합니다(필드가 비어 있는 것처럼). 반면 dataSourceRef 필드는 값을 절대 무시하지 않으며 잘못된 값을 사용하면 오류가 발생합니다. 잘못된 값은 PVC를 제외한 모든 코어 객체(apiGroup이 없는 객체)입니다.
  • dataSourceRef 필드는 다양한 유형의 객체를 포함할 수 있는 반면, dataSource 필드는 PVC와 VolumeSnapshots만 허용합니다.

CrossNamespaceVolumeDataSource 기능이 활성화되면 추가 차이점이 있습니다.

  • dataSource 필드는 로컬 객체만 허용하는 반면, dataSourceRef 필드는 어떤 네임스페이스의 객체든 허용합니다.
  • namespace가 지정되면 dataSourcedataSourceRef는 동기화되지 않습니다.

사용자는 기능 게이트가 활성화된 클러스터에서는 항상 dataSourceRef를 사용하고, 그렇지 않은 클러스터에서는 dataSource로 대체해야 해요. 어떤 상황에서도 두 필드를 모두 볼 필요는 없습니다. 약간 다른 의미를 가진 중복 값은 하위 호환성을 위해서만 존재합니다. 특히 필드가 같기 때문에 이전/이후 컨트롤러가 혼합되어도 상호 운용할 수 있습니다.

볼륨 팝퓰레이터 사용 (Using volume populators)

볼륨 팝퓰레이터는 비어 있지 않은 볼륨을 만들 수 있는 컨트롤러로, 볼륨의 내용은 사용자 정의 리소스(Custom Resource)에 의해 결정됩니다. 사용자는 dataSourceRef 필드로 사용자 정의 리소스를 참조해 채워진 볼륨을 만듭니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: populated-pvc
spec:
  dataSourceRef:
    name: example-name
    kind: ExampleDataSource
    apiGroup: example.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

볼륨 팝퓰레이터는 외부 컴포넌트이므로, 올바른 컴포넌트가 모두 설치되지 않은 상태에서 이를 사용하는 PVC를 만들려고 하면 실패할 수 있어요. 외부 컨트롤러는 생성 상태에 대한 피드백을 제공하기 위해 PVC에 이벤트를 생성해야 합니다. 일부 컴포넌트가 없어 PVC를 만들 수 없으면 경고를 포함해서요.

클러스터에 알파(alpha) 볼륨 데이터 소스 검증기 컨트롤러를 설치할 수 있어요. 그 컨트롤러는 그런 종류의 데이터 소스를 처리하도록 등록된 팝퓰레이터가 없는 경우 PVC에 경고 이벤트를 생성합니다. PVC에 적합한 팝퓰레이터가 설치되면 볼륨 생성과 그 과정 중의 문제와 관련된 이벤트를 보고하는 것은 그 팝퓰레이터 컨트롤러의 책임입니다.

크로스 네임스페이스 데이터 소스 (Cross namespace data sources)

Kubernetes는 크로스 네임스페이스 볼륨 데이터 소스를 지원합니다. 크로스 네임스페이스 볼륨 데이터 소스를 사용하려면 kube-apiserver와 kube-controller-manager에서 AnyVolumeDataSourceCrossNamespaceVolumeDataSource 기능 게이트를 활성화해야 해요. 또한 csi-provisioner에서도 CrossNamespaceVolumeDataSource 기능 게이트를 활성화해야 합니다.

CrossNamespaceVolumeDataSource 기능 게이트를 활성화하면 dataSourceRef 필드에 네임스페이스를 지정할 수 있어요.

참고: 볼륨 데이터 소스에 네임스페이스를 지정하면 Kubernetes는 참조를 수락하기 전에 다른 네임스페이스의 ReferenceGrant를 확인합니다. ReferenceGrant는 gateway.networking.k8s.io 확장 API의 일부입니다. 자세한 내용은 Gateway API 문서의 ReferenceGrant를 참고하세요. 즉 이 메커니즘을 사용하려면 먼저 Kubernetes 클러스터를 Gateway API의 ReferenceGrant 이상으로 확장해야 합니다.

크로스-네임스페이스 볼륨 데이터 소스 사용 (Using a cross-namespace volume data source)

네임스페이스 소유자가 참조를 수락하도록 허용하는 ReferenceGrant를 만드세요. dataSourceRef 필드로 크로스 네임스페이스 볼륨 데이터 소스를 지정해 채워진 볼륨을 정의합니다. 소스 네임스페이스에 유효한 ReferenceGrant가 이미 있어야 합니다.

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-ns1-pvc
  namespace: default
spec:
  from:
  - group: ""
    kind: PersistentVolumeClaim
    namespace: ns1
  to:
  - group: snapshot.storage.k8s.io
    kind: VolumeSnapshot
    name: new-snapshot-demo
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: foo-pvc
  namespace: ns1
spec:
  storageClassName: example
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  dataSourceRef:
    apiGroup: snapshot.storage.k8s.io
    kind: VolumeSnapshot
    name: new-snapshot-demo
    namespace: default
  volumeMode: Filesystem

다음 단계 (What's next)

더 알아보기 (Learn more)