볼륨 팝퓰레이터와 데이터 소스
볼륨 팝퓰레이터와 데이터 소스 (Volume Populators and Data Sources)
이 문서는 Kubernetes의 볼륨 팝퓰레이터(volume populators) 와 데이터 소스(data sources) 를 설명해요. persistent volumes에 대한 이해가 권장돼요.
PersistentVolumeClaim을 생성하면 Kubernetes가 프로비저닝하는 볼륨은 보통 비어서 시작해요. 데이터 소스를 사용하면 새 볼륨이 기존 데이터로 미리 채워지도록 요청할 수 있어요. 볼륨 팝퓰레이터는 PersistentVolumeClaim이 참조하는 데이터 소스를 기반으로 그 채우기를 수행하는 컨트롤러예요.
Kubernetes는 기존 볼륨 복제나 볼륨 스냅샷 복원을 위한 데이터 소스의 내장 지원이 있어요. 커스텀 볼륨 팝퓰레이터는 이 메커니즘을 확장해요. 데이터 소스는 CustomResourceDefinition로 타입이 정의된 custom resource예요. 팝퓰레이터 컨트롤러는 그런 리소스를 참조하는 PersistentVolumeClaim을 관찰(watch)하고 그 리소스에서 새 볼륨을 채워요.
볼륨 팝퓰레이터와 데이터 소스
FEATURE STATE: Kubernetes v1.24 [beta]
Kubernetes는 커스텀 볼륨 팝퓰레이터를 지원해요. 사용하려면 kube-apiserver와 kube-controller-manager에서 AnyVolumeDataSource feature gate를 활성화해야 해요.
볼륨 팝퓰레이터는 dataSourceRef라는 PVC spec 필드를 활용해요. dataSource 필드는 다른 PersistentVolumeClaim이나 VolumeSnapshot에 대한 참조만 담을 수 있지만, dataSourceRef 필드는 같은 네임스페이스의 어떤 객체든(PVC가 아닌 핵심 객체 제외) 참조할 수 있어요. feature gate가 활성화된 클러스터에서는 dataSource보다 dataSourceRef를 사용하는 것이 권장돼요.
데이터 소스 참조
dataSourceRef 필드는 dataSource 필드와 거의 동일하게 동작해요. 하나를 지정하고 다른 하나를 지정하지 않으면 API server가 두 필드에 같은 값을 줍니다. 생성 후에는 어떤 필드도 변경할 수 없고, 두 필드에 서로 다른 값을 지정하려 하면 검증 오류가 나요. 따라서 두 필드는 항상 같은 내용을 가져요.
두 필드의 차이점:
dataSource필드는 잘못된 값(PVC가 아닌 핵심 객체)을 무시하지만,dataSourceRef는 값을 절대 무시하지 않고 잘못된 값을 쓰면 오류를 내요.dataSourceRef는 다른 유형의 객체를 참조할 수 있지만,dataSource는 PVC와 VolumeSnapshot만 허용해요.
CrossNamespaceVolumeDataSource 기능이 활성화되면 추가 차이점이 있어요.
dataSource는 로컬 객체만,dataSourceRef는 모든 네임스페이스의 객체를 허용해요.- 네임스페이스가 지정되면
dataSource와dataSourceRef는 동기화되지 않아요.
사용자는 feature gate가 활성화된 클러스터에서는 항상 dataSourceRef를, 그렇지 않은 클러스터에서는 dataSource를 사용해야 해요. 살짝 다른 의미의 중복 값은 하위 호환성을 위해서만 존재해요.
볼륨 팝퓰레이터 사용
볼륨 팝퓰레이터는 Custom Resource로 내용이 결정되는 비어 있지 않은 볼륨을 만들 수 있는 컨트롤러예요. 사용자는 dataSourceRef 필드로 Custom Resource를 참조해 채워진 볼륨을 만들어요.
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에 이벤트를 생성해 생성 상태에 대한 피드백(누락 컴포넌트로 인한 경고 포함)을 제공해야 해요.
alpha 단계의 volume data source validator 컨트롤러를 설치할 수 있어요. 이 컨트롤러는 그 종류의 데이터 소스를 처리할 팝퓰레이터가 등록되지 않은 경우 PVC에 경고 이벤트를 생성해요.
교차 네임스페이스 데이터 소스
FEATURE STATE: Kubernetes v1.26 [alpha]
교차 네임스페이스 볼륨 데이터 소스를 지원해요. 사용하려면 kube-apiserver와 kube-controller-manager에서 AnyVolumeDataSource와 CrossNamespaceVolumeDataSource feature gate를 활성화하고, csi-provisioner에서도 CrossNamespaceVolumeDataSource를 활성화해야 해요.
데이터 소스에 네임스페이스를 지정하면 참조를 수락하기 전에 Kubernetes가 다른 네임스페이스에서 ReferenceGrant를 확인해요. ReferenceGrant는 gateway.networking.k8s.io 확장 API의 일부이므로, 이 메커니즘을 쓰려면 최소한 Gateway API의 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