이 문서에서는 Kubernetes 볼륨 클론을 사용하여 Google Kubernetes Engine(GKE) 클러스터에서 영구 볼륨을 클론하는 방법을 보여줍니다.
개요
클론은 기존 Kubernetes 볼륨 중복인 새로운 독립 볼륨입니다. 클론은 특정 시점의 볼륨 사본이라는 점에서 볼륨 스냅샷과 유사합니다. 하지만 볼륨 클론은 소스 볼륨에서 스냅샷 객체를 만드는 대신 소스 볼륨의 모든 데이터로 클론을 프로비저닝합니다.
요구사항
GKE에서 볼륨 클론을 사용하려면 다음 요구사항을 충족해야 합니다.
- 소스 PersistentVolumeClaim은 대상 PersistentVolumeClaim과 동일한 네임스페이스에 있어야 합니다.
- 볼륨 클론을 지원하는 CSI 드라이버를 사용합니다. 트리 내 영구 디스크 드라이버에서는 볼륨 클론을 지원하지 않습니다.
- Compute Engine 영구 디스크 CSI 드라이버 버전 1.4.0 이상에서는 볼륨 클론을 지원하며 GKE 버전 1.22 이상을 실행하는 새 Linux 클러스터에 기본적으로 설치됩니다. 기존 클러스터에서 Compute Engine 영구 디스크 CSI 드라이버를 사용 설정할 수도 있습니다.
Compute Engine 영구 디스크 CSI 드라이버 버전을 확인하려면 gcloud CLI에서 다음 명령어를 실행합니다.
kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"
출력에 1.4.0
이전 버전이 표시되면 수동으로 제어 영역을 업그레이드하여 최신 버전을 가져옵니다.
제한사항
- 두 볼륨 모두 같은 볼륨 모드를 사용해야 합니다. 기본적으로 GKE는 VolumeMode를
ext4
로 설정합니다. - Compute Engine의 모든 기존 디스크에서 디스크 클론을 만드는 제한사항도 GKE에 적용됩니다.
- 영역 디스크에서 리전 디스크 클론을 만들 수 있지만 이 방법의 제한사항을 알고 있어야 합니다.
- 클론은 호환되는 영역에서 수행되어야 합니다. allowedTopologies를 사용하여 프로비저닝된 볼륨의 토폴로지를 특정 영역으로 제한합니다. 또는 nodeSelectors 또는 어피니티 및 안티-어피니티를 사용하여 포드를 제한하여 호환 영역에서 실행되는 특정 노드에서 실행되도록 할 수 있습니다.
- 영역 간 클론의 경우 클론 영역이 소스 디스크 영역과 일치해야 합니다.
- 영역과 리전 간 클론의 경우 클론의 복제본 영역 중 하나가 소스 디스크의 영역과 일치해야 합니다.
볼륨 클론 사용
볼륨 클론을 프로비저닝하려면 동일한 네임스페이스의 기존 PersistentVolumeClaim에 대한 참조를 새 PersistentVolumeClaim의 dataSource
필드에 추가합니다. 다음 연습에서는 데이터로 소스 볼륨을 프로비저닝하고 볼륨 클론을 만들며 클론을 사용하는 방법을 보여줍니다.
소스 볼륨 만들기
소스 볼륨을 만들려면 Linux 클러스터용 Compute Engine 영구 디스크 CSI 드라이버 사용의 안내를 따라 새 볼륨을 사용할 StorageClass, PersistentVolumeClaim, 포드를 만듭니다. 만든 PersistentVolumeClaim을 볼륨 클론의 소스로 사용합니다.
소스 볼륨에 테스트 파일 추가
소스 볼륨에 테스트 파일을 추가합니다. 볼륨 클론에서 이 테스트 파일을 찾아 클론이 성공했는지 확인할 수 있습니다.
포드에서 테스트 파일을 만듭니다.
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
POD_NAME
을 소스 볼륨을 사용하는 포드의 이름으로 바꿉니다. 예를 들어 Linux 클러스터용 Compute Engine 영구 디스크 CSI 드라이버 사용의 안내를 따랐으면POD_NAME
을web-server
로 바꿉니다.파일이 있는지 확인합니다.
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
출력은 다음과 비슷합니다.
Hello World!
소스 볼륨 클론
다음 매니페스트를
podpvc-clone.yaml
로 저장합니다.kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc-clone spec: dataSource: name: PVC_NAME kind: PersistentVolumeClaim accessModes: - ReadWriteOnce storageClassName: STORAGE_CLASS_NAME resources: requests: storage: STORAGE
다음을 바꿉니다.
PVC_NAME
: 소스 볼륨 만들기에서 만든 소스 PersistentVolumeClaim 이름입니다.STORAGE_CLASS_NAME
: 사용할 StorageClass의 이름으로, 소스 PersistentVolumeClaim의 StorageClass와 동일해야 합니다.STORAGE
: 요청할 스토리지 용량이며 최소한 소스 PersistentVolumeClaim 크기 이상이어야 합니다.
매니페스트를 적용합니다.
kubectl apply -f podpvc-clone.yaml
클론된 볼륨을 사용하는 포드 만들기
다음 예시에서는 생성된 볼륨 클론을 사용하는 포드를 만듭니다.
다음 매니페스트를
web-server-clone.yaml
로 저장합니다.apiVersion: v1 kind: Pod metadata: name: web-server-clone spec: containers: - name: web-server-clone image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc-clone readOnly: false
매니페스트를 적용합니다.
kubectl apply -f web-server-clone.yaml
테스트 파일이 있는지 확인합니다.
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
출력은 다음과 비슷합니다.
Hello World!
삭제
이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.
Pod
객체를 삭제합니다.kubectl delete pod POD_NAME web-server-clone
PersistentVolumeClaim
객체를 삭제합니다.kubectl delete pvc podpvc podpvc-clone