NetApp Tech Blog에 갔다가 Trident 관련해서 흥미로운 주제의 글이 보여서 AI 번역(+약간 수정)의 힘을 빌려 읽어보았습니다.
출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/Enhancing-Data-Consistency-Volume-Group-Snapshots-in-OpenShift-Virtualization/ba-p/462798
이제 여러분은 모든 인기 NetApp 스토리지 플랫폼에서 스토리지 리소스를 원활하게 사용하고 관리할 수 있도록 지원하는 강력한 도구인 Trident에 대해 잘 알고 계실 것입니다. 퍼블릭 클라우드든 온프레미스든 Trident는 모든 것을 지원합니다. ONTAP 클러스터(AFF, FAS, ASA), ONTAP Select, Cloud Volumes ONTAP, Element 소프트웨어(NetApp HCI, SolidFire), Azure NetApp Files, Amazon FSx for NetApp ONTAP, Google Cloud NetApp Volumes 등 다양한 NetApp 스토리지 솔루션을 지원합니다.
Trident는 NetApp에서 유지 관리하는 완벽한 지원을 받는 오픈 소스 프로젝트로, 컨테이너 스토리지 인터페이스(CSI)와 같은 업계 표준 인터페이스를 사용하여 컨테이너화된 애플리케이션의 지속성 요구 사항을 충족하도록 설계되었습니다.
CSI는 스토리지 공급업체가 쿠버네티스 및 쿠버네티스 기반 플랫폼에서 블록 및 파일 스토리지 시스템을 컨테이너화된 워크로드에 노출하는 드라이버를 제공할 수 있도록 하는 표준입니다. 쿠버네티스가 컨테이너화된 워크로드의 영구 스토리지를 관리하는 데 활용하는 다양한 스토리지 기능을 구현하는 데 필요한 표준을 제공합니다.
CSI를 준수하는 Trident는 Kubernetes와 기본적으로 통합되며 동적 스토리지 오케스트레이션을 지원합니다. Kubernetes의 볼륨 스냅샷 기능을 이미 사용해 보셨을 수도 있는데, 이 기능을 사용하면 단일 볼륨의 특정 시점 스냅샷을 생성할 수 있습니다. 이 기능은 CSI 드라이버를 사용하여 특정 스냅샷 기능을 구현하며, Trident는 효율적인 NetApp 스냅샷 기술을 활용합니다.
쿠버네티스가 볼륨 그룹 스냅샷을 v1.27에서 알파 기능으로 도입하고 v1.32에서 베타 버전으로 전환했다는 사실을 알고 계셨나요? 이 기능이 왜 중요하며, Trident는 어떻게 이 기능을 지원하는지 함께 살펴보겠습니다!
데이터가 한 볼륨에 저장되고 로그가 다른 볼륨에 저장되는 데이터베이스처럼 여러 영구 볼륨에 걸쳐 있는 워크로드를 상상해 보세요. 애플리케이션 일관성을 유지하는 스냅샷을 얻으려면 일반적으로 애플리케이션을 정지하고 각 볼륨의 개별 스냅샷을 생성한 다음, 애플리케이션 정지를 해제해야 합니다. 그러나 이러한 방식에는 몇 가지 단점이 있습니다.
- 때로는 신청을 중단하는 것이 불가능할 수도 있습니다.
- 정지 작업을 자주 수행하려면 비용이 너무 많이 들 수 있습니다.
- 주간 백업의 경우 애플리케이션을 중지하는 것이 좋지만 야간 백업의 경우 중지하는 것이 좋습니다.
- 개별 스냅샷을 찍는 것은 모든 볼륨의 스냅샷을 동시에 찍는 것보다 시간이 더 오래 걸릴 수 있습니다.
- 개별적으로 찍은 스냅샷에서 애플리케이션을 복원하는 것은 애플리케이션 간에 일관성이 없을 수 있습니다.
분명 이 방법에는 한계가 있습니다. 그렇다면 해결책은 무엇일까요?
쿠버네티스는 최신 컨테이너 워크로드와 컨테이너로 실행되는 VM을 위해 설계된 볼륨 그룹 스냅샷 기능을 통해 이 문제를 해결합니다. 이 기능을 사용하면 여러 PersistentVolumeClaims(PVC)의 충돌 발생 시에도 일관된 스냅샷을 동시에 생성할 수 있습니다. 이를 지원하기 위해 쿠버네티스는 세 가지 새로운 API 객체를 도입했습니다.
- VolumeGroupSnapshotClass : 클러스터 관리자가 볼륨 그룹 스냅샷을 생성하는 방법을 설명하기 위해 생성했습니다.
- VolumeGroupSnapshot : Kubernetes 사용자가 여러 PVC에 대한 볼륨 그룹 스냅샷을 생성하도록 요청했습니다.
- VolumeGroupSnapshotContent : 동적으로 생성된 VolumeGroupSnapshots에 대해 스냅샷 컨트롤러가 생성합니다.
Trident 25.06은 볼륨 그룹 스냅샷 기능에 지정된 새로운 CRD를 자동으로 감지하여 Trident CSI 사이드카에서 관련 기능 게이트를 활성화합니다. 그렇다면 이러한 CRD를 사용하여 볼륨 그룹 스냅샷에 필요한 Trident 객체를 어떻게 생성할 수 있을까요? 자세히 살펴보겠습니다!
VolumeGroupSnapshot 클래스를 사용하여 볼륨 그룹의 스냅샷을 생성한 다음 스냅샷에서 복원하는 방법을 보여주기 위해 따른 단계의 개요는 다음과 같습니다.
- OpenShift 클러스터 버전 4.19 설치
- OpenShift 버전 4.19는 볼륨 그룹 스냅샷 기능이 베타 상태로 승격된 Kubernetes v1.32를 사용합니다.
- VolumeGroupSnapshots에 대해 FeatureGate를 켭니다.
- Trident 버전 25.06.1 이상을 설치하세요.
- VolumeGroupSnapshots에 대해 Feature Gate를 켭니다.
- iSCSI 도구를 설치하려면 node-prep을 사용하세요.
- Trident iscsi 백엔드, iscsi 스토리지 클래스 및 볼륨 스냅샷 클래스를 만듭니다.
- 볼륨 그룹 스냅샷 기능은 현재 Trident에서 iSCSI 프로토콜에 대해서만 지원됩니다.
- 클러스터에서 스토리지 클래스와 볼륨 스냅샷 클래스를 기본값으로 설정합니다.
- VolumeGroupSnapshotClass 생성
- OpenShift Virtualization Operator를 설치합니다.
- 이 작업은 4단계 이후에 수행되어야 하며, Trident CSI를 사용하여 골든 이미지를 클러스터의 VolumeSnapshots로 사용할 수 있게 됩니다.
- 3개의 디스크로 VM을 만듭니다. (루트 디스크와 추가 디스크 2개)
- 각 디스크에 일부 데이터를 추가합니다.
- PVC에 라벨을 붙이세요.
- VolumeGroupSnapshots 생성
- 라벨 선택기를 사용하여 PVC에 설정된 라벨과 일치시킵니다.
- 백엔드 ONTAP 시스템 확인
- 3개의 PVC 모두에 대해 스냅샷이 생성되었는지 확인합니다.
- VM의 디스크를 복원합니다.
위의 각 단계에 대해 자세히 설명하겠습니다.
1. Kubernetes v1.32가 설치된 OpenShift Cluster v4.19입니다.
# oc get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane,master 17d v1.32.6 master2 Ready control-plane,master 17d v1.32.6 master3 Ready control-plane,master 17d v1.32.6 worker1 Ready worker 17d v1.32.6 worker2 Ready worker 17d v1.32.6 worker3 Ready worker 17d v1.32.6
다음을 수행하여 VolumeGroupSnapshot에 대한 FeatureGate를 켰습니다.
OpenShift 웹 콘솔에서 Administration -> Custom Resource Definitions 로 이동한 후 “FeatureGate”를 검색하여 클릭하세요. 그런 다음 “인스턴스” 탭을 클릭하고 “클러스터” 인스턴스를 선택하세요.
YAML 편집: YAML 탭에서 FeatureGate/cluster 객체를 편집하여 customNoUpgrade 아래의 활성화된 목록에 VolumeGroupSnapshot을 포함합니다.
apiVersion: config.openshift.io/v1
kind: FeatureGate
metadata:
name: cluster
spec:
featureSet: CustomNoUpgrade
customNoUpgrade:
enabled:
- VolumeGroupSnapshot
2. iSCSI 도구를 설치하기 위해 node-prep을 사용하여 Trident 25.06.1을 설치합니다.
# tridentctl install -n trident --node-prep iscsi
VolumeGroupSnapshots에 필요한 CRD가 설치되어 있는지 확인하세요.
[root@localhost trident-installer]# kubectl get crd | grep "volumegroupsnapshot" volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io 2025-08-12T16:12:46Z volumegroupsnapshotcontents.groupsnapshot.storage.k8s.io 2025-08-12T16:12:46Z volumegroupsnapshots.groupsnapshot.storage.k8s.io 2025-08-12T16:12:46Z
3. iSCSI 프로토콜에 대한 백엔드와 스토리지 클래스를 생성하고 다음 YAML 정의를 사용하여 VolumeSnapshotClass 객체를 생성합니다.
# cat tbc-iscsi.yaml
apiVersion: v1
kind: Secret
metadata:
name: tbc-iscsi-secret
type: Opaque
stringData:
username: admin
password: <passwd to log into ONTAP ClI>
---
apiVersion: trident.netapp.io/v1
kind: TridentBackendConfig
metadata:
name: tbc-iscsi
spec:
version: 1
storageDriverName: ontap-san
managementLIF: <mgmt-lif>
backendName: tbc-iscsi
svm: openshift
storagePrefix: openshift-iscsi
defaults:
formatOptions: "-E nodiscard"
nameTemplate: "{{ .config.StoragePrefix }}_{{ .volume.Namespace }}_{{ .volume.RequestName }}"
credentials:
name: tbc-iscsi-secret
# cat sc-iscsi.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: sc-iscsi provisioner: csi.trident.netapp.io parameters: backendType: "ontap-san" provisioningType: "thin" fsType: ext4 snapshots: "true" reclaimPolicy: "Delete" allowVolumeExpansion: true
#cat snapshotclass.yaml apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: trident-snapshotclass driver: csi.trident.netapp.io deletionPolicy: Retain
[root@localhost volumeGroups]# oc get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE sc-iscsi (default) csi.trident.netapp.io Delete Immediate true 2d22h thin-csi csi.vsphere.vmware.com Delete WaitForFirstConsumer true 18d [root@localhost volumeGroups]# oc get volumesnapshotclass NAME DRIVER DELETIONPOLICY AGE csi-vsphere-vsc csi.vsphere.vmware.com Delete 18d trident-snapshotclass csi.trident.netapp.io Delete 2d22h
4. 스토리지 클래스와 볼륨 스냅샷 클래스를 기본값으로 설정합니다.
kubectl patch storageclass <storage-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'kubectl patch volumesnapshotclass <volumesnapshotclass-name> --type=merge -p '{"metadata":{"annotations":{"snapshot.storage.kubernetes.io/is-default-class":"true"}}}'참고: 새로운 VM을 생성할 때 골든 이미지의 스냅샷에서 빠른 FlexCloning 메커니즘을 활용할 수 있도록 Trident 스토리지 클래스와 스냅샷 클래스를 둘 다 기본값으로 설정하는 것이 가장 좋습니다.
5. VolumeGroupSnapshot 클래스 생성
# cat volumegroupsnapshotclass.yaml
apiVersion: groupsnapshot.storage.k8s.io/v1beta1
kind: VolumeGroupSnapshotClass
metadata:
name: trident-groupsnapshotclass
annotations:
kubernetes.io/description: "Trident group snapshot class"
driver: csi.trident.netapp.io
deletionPolicy: Delete
# oc get volumegroupsnapshotclass
NAME DRIVER DELETIONPOLICY AGE
trident-groupsnapshotclass csi.trident.netapp.io Delete 2d22h
6. OpenShift Virtualization을 설치한 후 볼륨 스냅샷에서 골든 이미지를 사용할 수 있는지 확인할 수 있습니다.
7. 이제 기본 템플릿을 사용하여 VM을 생성합니다. 이 VM의 기본 스토리지 클래스를 사용하여 디스크 2개를 추가로 생성합니다.
# oc get vm NAME AGE STATUS READY fedora-vm1 62s Running True # oc get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS dv-fedora-vm1-disk1-ulsgg2 Bound pvc-6cfe08d6-6910-44ed-b671-1d23e9cf04d1 10Gi RWX sc-iscsi <unset> dv-fedora-vm1-disk2-86oq76 Bound pvc-619bb1b5-6e1a-4193-ab04-4e16361fe699 20Gi RWX sc-iscsi <unset> fedora-vm1 Bound pvc-5e278dc3-79b3-47be-85c1-1b84acb151ec 30Gi RWX sc-iscsi <unset>
ONTAP 백엔드에서 해당 볼륨을 확인할 수 있습니다.
루트 디스크 볼륨은 골든 이미지가 있는 스냅샷의 플렉스 클론 볼륨입니다.
VM의 2개 디스크에 대한 나머지 2개 볼륨은 FlexVol 볼륨입니다.
virtctl 도구를 사용하여 VM에 로그인 하고 아래와 같이 2개의 디스크를 포맷하고 마운트했습니다.
fedora-vm1 login: fedora
Password:
[fedora@fedora-vm1 ~]$ sudo mkfs.ext4 /dev/vdc
[fedora@fedora-vm1 ~]$ sudo mkfs.ext4 /dev/vdd
[fedora@fedora-vm1 ~]$ sudo mount /dev/vdc /mnt/data1
[fedora@fedora-vm1 ~]$ sudo mount /dev/vdd /mnt/data2
[fedora@fedora-vm1 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
zram0 251:0 0 1.8G 0 disk [SWAP]
vda 253:0 0 30G 0 disk
├─vda1 253:1 0 2M 0 part
├─vda2 253:2 0 100M 0 part /boot/efi
├─vda3 253:3 0 1000M 0 part /boot
└─vda4 253:4 0 28.9G 0 part /var
/home
/
vdb 253:16 0 1M 0 disk
vdc 253:32 0 10G 0 disk /mnt/data1
vdd 253:48 0 20G 0 disk /mnt/data2
I have created a file called sample.txt in each of the disks.
[fedora@fedora-vm1 data1]$ pwd
/mnt/data1
[fedora@fedora-vm1 data1]$ ls
lost+found sample.txt
[fedora@fedora-vm1 data2]$ pwd
/mnt/data2
[fedora@fedora-vm1 data2]$ ls
lost+found sample.txt
[fedora@fedora-vm1 data2]$
8. 이제 동일한 키/값을 사용하여 VM의 각 PVC에 레이블을 지정합니다.
#oc label pvc fedora-vm1 consistencygroup=group1 persistentvolumeclaim/fedora-vm1 labeled # oc label pvc dv-fedora-vm1-disk1-ulsgg2 consistencygroup=group1 persistentvolumeclaim/dv-fedora-vm1-disk1-ulsgg2 labeled # oc label pvc dv-fedora-vm1-disk2-86oq76 consistencygroup=group1 persistentvolumeclaim/dv-fedora-vm1-disk2-86oq76 labeled
PVC의 라벨을 확인하세요
[root@localhost volumeGroups]# oc get pvc fedora-vm1 -o jsonpath='{.metadata.labels.consistencygroup'}
group1
[root@localhost volumeGroups]# oc get pvc dv-fedora-vm1-disk1-ulsgg2 -o jsonpath='{.metadata.labels.consistencygroup'}
group1
[root@localhost volumeGroups]# oc get pvc dv-fedora-vm1-disk2-86oq76 -o jsonpath='{.metadata.labels.consistencygroup'}
group1
9. 이제 다음 yaml을 사용하여 volumeGroupSnapshot을 만들어 보겠습니다.
# cat vgs.yaml
apiVersion: groupsnapshot.storage.k8s.io/v1beta1
kind: VolumeGroupSnapshot
metadata:
name: vgs1
spec:
volumeGroupSnapshotClassName: trident-groupsnapshotclass
source:
selector:
matchLabels:
consistencygroup: group1
# oc create -f vgs1.yaml
volumegroupsnapshot.groupsnapshot.storage.k8s.io/vgs1 created
# oc get vgs/vgs1 NAME READYTOUSE VOLUMEGROUPSNAPSHOTCLASS VOLUMEGROUPSNAPSHOTCONTENT CREATIONTIME AGE vgs1 true trident-groupsnapshotclass groupsnapcontent-82e42f0f-d421-4743-bbaf-f56ee56241d1 2m9s 2m26s # oc get volumesnapshots NAME READYTOUSE SOURCEPVC RESTORESIZE snapshot-4d47c9f45423bfca625a0f1b6c5a5ec456ac59d3e583157be919bb7237317c65 true dv-fedora-vm1-disk1-ulsgg2 10Gi snapshot-61c1aada41e28c4fd68327ad10b5561657ed4c7d391d1547569a47204f5f92b9 true fedora-vm1 30Gi snapshot-afb4c4833460e233c4e86f1108c921b86a6f4d0eb182e99e579081ff6f743f56 true dv-fedora-vm1-disk2-86oq76 20Gi
레이블 키/값 쌍이 “consistencygroup:group1” 인 모든 PVC의 스냅샷이 생성됩니다. Trident VolumeGroupSnapshots는 ONTAP 백엔드에서 ONTAP Consistency Group을 사용합니다.
참고: Trident VolumeGroupSnapshots는 ONTAP 백엔드에서 ONTAP 일관성 그룹(CG)을 사용합니다. REST API를 사용하는 경우, VM에 속한 모든 볼륨(레이블별로 그룹화됨)을 사용하여 CG가 생성되고, 각 볼륨의 스냅샷이 일관된 방식으로 생성된 후 CG가 삭제됩니다. ONTAP에서 일관성 그룹이 생성되고 삭제되는 모습은 시점에 따라 확인할 수 있습니다. 여기에서는 ONTAP에서 생성되었다가 삭제되는 일관성 그룹을 캡처했습니다.
HCG-NetApp-C400-E9U9::> consistency-group show -vserver openshift
(vserver consistency-group show)
Parent
Consistency Consistency
Vserver Group Group State Size Available Used
---------- ------------- ------------- ------- ---------- ---------- ---------
openshift cg-snapshot-82e42f0f-d421-4743
- online 22GB 21.99GB 7.46MB
HCG-NetApp-C400-E9U9::> consistency-group show -vserver openshift
(vserver consistency-group show)
There are no entries matching your query.
Trident를 사용하여 개별 스냅샷에서 VM의 PVC 복원
이제 두 개의 데이터 디스크 각각에서 sample.txt 파일이 손실되었다고 가정해 보겠습니다.
[fedora@fedora-vm1 data1]$ pwd /mnt/data1 [fedora@fedora-vm1 data1]$ ls lost+found [fedora@fedora-vm1 data2]$ pwd /mnt/data2 [fedora@fedora-vm1 data2]$ ls lost+found
참고: 볼륨 그룹의 스냅샷을 단일 단위로 생성했지만 개별 스냅샷에서만 복원할 수 있습니다.
ONTAP CLI나 시스템 관리자를 사용하여 스냅샷에서 볼륨을 복원하는 방법은 모두 알고 있습니다. 하지만 Trident를 사용하여 스냅샷에서 볼륨을 복원할 수 있을까요? 네, 물론입니다. 어떻게 하는지 살펴보겠습니다.
Trident는 TridentActionSnapshotRestore(TASR) CR을 사용하여 스냅샷에서 신속한 자체 볼륨 복원을 제공합니다. 이 CR은 필수 쿠버네티스 작업으로 작동하며 작업 완료 후에는 유지되지 않습니다.
먼저 VM을 중지합니다.
이제 아래와 같이 yaml을 사용하여 첫 번째 디스크/PVC의 내용과 해당 스냅샷을 복원해 보겠습니다.
# cat tasr1.yaml apiVersion: trident.netapp.io/v1 kind: TridentActionSnapshotRestore metadata: name: trident-snap-disk1 namespace: default spec: pvcName: dv-fedora-vm1-disk1-ulsgg2 volumeSnapshotName: snapshot-4d47c9f45423bfca625a0f1b6c5a5ec456ac59d3e583157be919bb7237317c65 # oc create -f tasr1.yaml tridentactionsnapshotrestore.trident.netapp.io/trident-snap created
마찬가지로 PVC와 해당 스냅샷을 사용하여 두 번째 디스크에 대한 또 다른 TASR 객체를 만듭니다.
# cat tasr2.yaml apiVersion: trident.netapp.io/v1 kind: TridentActionSnapshotRestore metadata: name: trident-snap-disk2 namespace: default spec: pvcName: dv-fedora-vm1-disk2-86oq76 volumeSnapshotName: snapshot-afb4c4833460e233c4e86f1108c921b86a6f4d0eb182e99e579081ff6f743f56 # oc create -f tasr2.yaml Let us make sure that the restore operation is showing succeeded state. [root@localhost volumeGroups]# oc get tasr NAME NAMESPACE PVC SNAPSHOT STATE trident-snap-disk1 default dv-fedora-vm1-disk1-ulsgg2 snapshot-4d47c9f45423bfca625a0f1b6c5a5ec456ac59d3e583157be919bb7237317c65 Succeeded trident-snap-disk2 default dv-fedora-vm1-disk2-86oq76 snapshot-afb4c4833460e233c4e86f1108c921b86a6f4d0eb182e99e579081ff6f743f56 Succeeded
이제 VM을 시작하고 로그인한 다음 sample.txt 파일이 디스크에 다시 있는지 확인해 보겠습니다.
[fedora@fedora-vm1 ~]$ ls /mnt/data1 lost+found sample.txt [fedora@fedora-vm1 ~]$ ls /mnt/data2 lost+found sample.txt [fedora@fedora-vm1 ~]$
결론
이 블로그에서는 OpenShift Virtualization에서 VM의 모든 PVC에 대한 볼륨 그룹 스냅샷을 단일 단위로 생성하는 방법과 TridentActionSnapShotRestore CR을 사용하여 각 스냅샷을 개별적으로 복원하는 방법을 설명했습니다. 이 강력한 기능은 여러 볼륨에 걸쳐 애플리케이션 데이터가 일관되고 쉽게 관리될 수 있도록 보장합니다.
바닐라 쿠버네티스에서 컨테이너 워크로드에 볼륨 그룹 스냅샷 기능을 사용하는 방법을 알고 싶으시다면 Yves Weisser 가 작성한 랩 시나리오를 확인해 보시기 바랍니다 . 다양한 환경에서 이 기능을 어떻게 적용하는지 이해하는 데 유용한 자료입니다.
더 자세한 정보와 포괄적인 가이드를 보려면 볼륨 그룹 스냅샷 작업에 대한 Trident 설명서 페이지를 방문하세요 .