使用 Trident Protect 保護 KubeVirt 虛擬機器
Trident Protect 可讓您備份與還原執行於 OpenShift Virtualization 上的 KubeVirt 虛擬機器(VM)。您可以同時保護一或多個命名空間中的所有 VM,或使用 includedVirtualMachines 欄位依名稱指定特定的 VM。Trident Protect 會在備份期間自動收集所有相依的 VM 資源,而在還原期間,您可以復原整個封存或選擇性地還原個別 VM。
KubeVirt 保護模式
Trident Protect 支援兩種定義要保護的 KubeVirt 虛擬機器的方式。定義應用程式時,請選擇其中一種模式:
| 模式 | 欄位 | 說明 |
|---|---|---|
基於命名空間 |
|
保護一個或多個命名空間中所有符合的資源。在命名空間條目上使用 `labelSelector`來動態控制包含哪些虛擬機器。 |
虛擬機器範圍 |
|
依命名空間和名稱保護特定 KubeVirt VM。當 VM 分佈在多個命名空間中,或您不想保護所有命名空間資源時,請使用此模式。 |
您必須在 ApplicationSpec 中指定恰好一個欄位 (includedNamespaces 或 includedVirtualMachines )。您無法在同一個應用程式中同時使用兩者。
兩種模式均支援額外的篩選功能:
-
使用 `resourceFilter`來包含或排除特定資源。
-
使用 `includedClusterScopedResources`以包含相容的叢集範圍資源,例如 `StorageClass`物件。
|
|
Trident Protect 可在資料保護作業期間凍結和解凍 KubeVirt 虛擬機器檔案系統,以確保資料一致性。如需組態詳細資料,請參閱 "使用 KubeVirt VM 保護資料"。 |
備份和快照期間收集的資源
當您為包含 KubeVirt VM 的應用程式建立備份或快照時,Trident Protect 會收集選定的 VM 資源並自動探索其相依資源。
收集行為適用於以下兩種情況:
-
使用 VM 範圍的應用程式
includedVirtualMachines。 -
基於命名空間且包含 KubeVirt
VirtualMachine資源的應用程式。
VM 範圍的收集
對於 VM 範圍的應用程式,Trident Protect 從 `VirtualMachine`中列出的每個 `includedVirtualMachines`開始,並探索還原該 VM 所需的相依資源。
| 資源類型 | 範圍 | 探索方式 |
|---|---|---|
|
命名空間 |
從 `includedVirtualMachines`清單中直接比對。 |
|
命名空間 |
如果虛擬機器正在執行,則使用與虛擬機器相同的命名空間和名稱。 |
|
命名空間 |
被引用 |
|
叢集 |
由 |
|
命名空間 |
被引用 |
|
叢集 |
由 |
|
命名空間 |
被 |
|
命名空間 |
從 DataVolume 支援的 PVC 中探索,這些 PVC 使用與 DataVolume 相同的名稱;直接 PVC 參照位於 |
|
叢集 |
透過使用 |
|
命名空間 |
從磁碟區金鑰 `secret.secretName`中探索到;containerDisk 映像提取金鑰;CloudInitNoCloud 和 CloudInitConfigDrive 使用者資料和網路資料金鑰參考;Sysprep 金鑰;KernelBoot 容器映像提取金鑰;以及 AccessCredentials SSH 或密碼金鑰。 |
|
命名空間 |
從磁碟區 ConfigMaps 中 `configMap.name`和 Sysprep ConfigMaps 中探索到。 |
|
命名空間 |
從 `serviceAccount.serviceAccountName`磁碟區參考中探索到。 |
|
命名空間 |
當網路名稱不包含 |
|
命名空間 |
透過標籤選擇器為 |
儲存類別、Trident 磁碟區和 Trident 後端 |
叢集 |
收集方式與基於命名空間的應用程式相同,以針對 VM 探索到的 PVC 為基礎。 |
|
|
在收集完所有虛擬機器範圍的命名空間資源後,Trident Protect 會套用標準 resourceFilter(如果已設定)。然後,叢集範圍的資源收集將照常進行。
|
基於命名空間的集合
對於基於命名空間的應用程式,Trident Protect 會掃描選定的命名空間並收集所有相符的資源。如果找到任何 KubeVirt VirtualMachine 物件,Trident Protect 會自動收集其相依資源,包括執行個體類型、偏好設定和 virt-launcher Pod,其方式與處理 VM 範圍應用程式的方式相同。
這意味著即使應用程式已使用 `includedNamespaces`定義,VM 特定資源也會包含在備份或快照中。
使用基於命名空間的應用程式定義保護虛擬機器
在建立基於命名空間的應用程式時,Trident Protect 會掃描選定的命名空間並收集所有資源,包括所有 KubeVirt 虛擬機器。對於找到的每個虛擬機器,Trident Protect 也會收集備份和還原該虛擬機器所需的相依資源。
基於命名空間的應用程式範例 CR:
apiVersion: protect.trident.netapp.io/v1
kind: Application
metadata:
name: <application_name>
namespace: <application_namespace>
spec:
includedNamespaces:
- namespace: <vm_namespace>
建立應用程式後,請使用標準的 Trident Protect 工作流程進行備份和快照:
恢復基於命名空間的虛擬機器應用程式的行為
由於基於命名空間的應用程式會從選定的命名空間收集資源,因此備份或快照可能包含 KubeVirt 執行時間物件和 KubeVirt 管理的中繼資料。其中某些物件不應直接還原,因為它們代表來源叢集的執行時間狀態。
在復原過程中,Trident Protect 會套用 KubeVirt 感知轉換來移除來源叢集元資料並跳過暫存 KubeVirt 資源。這有助於 KubeVirt 在復原的環境中乾淨地重新建立虛擬機器。
| 資源 | 轉換 |
|---|---|
VirtualMachine |
移除以 `kubevirt.io/`開頭的標籤和註釋。 |
VirtualMachineInstance |
移除以 `kubevirt.io/`開頭的標籤和註釋。 |
VirtualMachineInstanceMigration |
已忽略且未恢復。 |
VirtualMachineSnapshot |
已忽略且未恢復。 |
VirtualMachineSnapshotContent |
已忽略且未恢復。 |
Pod ( |
當 pod 具有 `kubevirt.io=virt-launcher`標籤時跳過。 |
|
|
Trident Protect 會依照預先定義的順序復原 KubeVirt 資源,以避免相依性問題。CDI DataVolumes (cdi.kubevirt.io) 會優先復原,以確保在建立虛擬機器物件之前,虛擬機器磁碟資料已可供使用。之後,VirtualMachines (kubevirt.io) 會在 VirtualMachineInstances 之前復原。
|
使用標籤選擇器進行動態虛擬機器保護
如果要動態保護 VM,但又不想列出每個 VM 名稱,請使用基於命名空間的應用程式定義和標籤選擇器。
只有 VirtualMachine CR 需要標籤。相依資源(例如 DataVolumes、PVC、Secrets 和 ConfigMaps)會自動收集。
-
使用共用標籤標記虛擬機器 CR:
kubectl label virtualmachine <vm_name 1> app=<label_value> -n <vm_namespace> kubectl label virtualmachine <vm_name_2> app=<label_value> -n <vm_namespace> -
建立含有
includedNamespaces和labelSelector的應用程式 CR:apiVersion: protect.trident.netapp.io/v1 kind: Application metadata: name: <application_name> namespace: <application_namespace> spec: includedNamespaces: - namespace: <vm_namespace> labelSelector: matchLabels: app: <label_value> -
使用標準 Trident Protect 工作流程建立備份和還原。
其他詳細資料:
-
您可以隨時透過變更標籤來新增或移除受保護的虛擬機器:
kubectl label virtualmachine <vm_name_to_add> app=<label_value> -n <vm_namespace>
kubectl label virtualmachine <vm_name_to_remove> app=<different_label_value> -n <vm_namespace>
-
您也可以跨多個命名空間使用標籤選擇器:
spec:
includedNamespaces:
- namespace: <vm_namespace_1>
labelSelector:
matchLabels:
<label_key>: <label_value>
- namespace: <vm_namespace_2>
labelSelector:
matchLabels:
<label_key>: <label_value>
使用 includedVirtualMachines 保護特定虛擬機器
當您想要保護一個或多個命名空間中的一組指定 VirtualMachines,並從歸檔中選擇性地還原特定虛擬機時,請使用 includedVirtualMachines。
應用程式和復原 CR 都使用相同的 `includedVirtualMachines`選擇器格式。
在不同的上下文中使用此選擇器:
-
在應用程式 CR 中,它定義了哪些虛擬機器受到保護。
-
在還原 CR 中,它定義了從備份或快照封存中還原哪些虛擬機器。
|
|
在還原 CR 時,此欄 `includedVirtualMachines`位為選填欄位。如果不包含此欄位,則會還原整個封存。如果指定此欄位,則僅還原列出的虛擬機器及其相依資源。 |
以下 YAML 程式碼展示了共用選擇器結構:
includedVirtualMachines:
- namespace: <vm_namespace_1>
names:
- <vm_name_1>
- <vm_name_2>
- namespace: <vm_namespace_2>
names:
- <vm_name_3>
|
|
多個條目位於 `includedVirtualMachines`中,可以參考不同的命名空間,從而實現多命名空間 VM 感知應用程式定義和還原。 |
| 欄位 | 類型 | 說明 |
|---|---|---|
命名空間 |
字串 |
包含目標虛擬機器物件的 Kubernetes 命名空間。 |
名稱 |
字串列表 |
此命名空間中的一個或多個虛擬機器名稱。 |
apiVersion: protect.trident.netapp.io/v1
kind: Application
metadata:
name: <application_name>
namespace: <application_namespace>
spec:
includedVirtualMachines:
- namespace: <vm_namespace_1>
names:
- <vm_name_1>
- <vm_name_2>
- namespace: <vm_namespace_2>
names:
- <vm_name_3>
includedClusterScopedResources:
- group: storage.k8s.io
kind: StorageClass
還原特定 KubeVirt VM
您可以使用 `includedVirtualMachines`還原 CR,僅從備份、快照或複製快照存檔中還原選定的 KubeVirt 虛擬機器。
當 includedVirtualMachines`在還原 CR 上指定時,Trident Protect 僅還原列出的 VirtualMachines 及其相依資源,例如 `VirtualMachineInstance、 DataVolume、 PersistentVolumeClaim、 PersistentVolume、 Secret、 ConfigMap、 ServiceAccount,以及其他 VM 相關物件。
如果您未在復原 CR 中指定 includedVirtualMachines,Trident Protect 將根據復原 CR 設定還原完整的歸檔。
支援的還原 CR 和 CLI 命令
下表列出了支援的還原 CR `includedVirtualMachines`及其對應的 CLI 命令。
| 恢復 CR | CLI 指令 | 說明 |
|---|---|---|
|
|
從備份還原到新的或不同的命名空間映射。支援 |
|
|
從備份還原到原始命名空間或多個命名空間。 |
|
|
從快照還原到新的或不同的命名空間映射。支援 |
|
|
從快照還原到原始命名空間或多個命名空間。 |
|
僅支援 YAML 格式,或如果您的環境中支援,也可以使用受支援的 CLI 命令。 |
從複製的快照還原。支援 |
|
|
tridentctl-protect CLI 在還原命令上沒有適用於 includedVirtualMachines 的旗標。若要還原特定的 VMs,您必須直接使用 kubectl apply 套用還原 CR YAML 檔案。您可以從頭撰寫 YAML,或是搭配 --dry-run --output yaml 使用 CLI 以產生初始檔案,在 spec 下方新增 includedVirtualMachines 欄位,然後套用它。
|
虛擬機器範圍的復原行為
The includedVirtualMachines 恢復 CR 中的欄位使用與應用程式 CR 相同的選擇器格式:
includedVirtualMachines:
- namespace: <source_vm_namespace>
names:
- <vm_name_1>
- <vm_name_2>
對於還原 CR, `includedVirtualMachines`中的命名空間值指的是備份、快照或複製快照封存中存在的來源命名空間。
如果使用 namespaceMapping,Trident Protect 會先從來源歸檔中選擇要求的虛擬機,然後在還原過程中套用命名空間對應。如果使用 storageClassMapping,Trident Protect 會在還原轉換階段套用儲存類別對應。
使用 CLI 產生還原 YAML 檔案
您可以使用 tridentctl-protect`來產生基本復原 CR,然後編輯 YAML 以新增 `includedVirtualMachines。
tridentctl-protect create <restore_command> <restore_name> \
<restore_options> \
--dry-run --output yaml > <restore_name>.yaml
編輯產生的 YAML ,並在 spec 下方新增 includedVirtualMachines 欄位,然後套用該檔案:
kubectl apply -f <restore_name>.yaml
範例:定義一個基於虛擬機器的應用程式
以下應用程式保護跨兩個命名空間的三個特定虛擬機器。
apiVersion: protect.trident.netapp.io/v1
kind: Application
metadata:
name: production-vms
namespace: prod
spec:
includedVirtualMachines:
- namespace: prod
names:
- app-server
- database-server
- namespace: monitoring
names:
- prometheus-vm
includedClusterScopedResources:
- group: storage.k8s.io
kind: StorageClass
範例:建立備份
為基於虛擬機器的應用程式建立備份時,請使用標準備份 CR。備份 CR 中不需要任何虛擬機器特定的欄位。
apiVersion: protect.trident.netapp.io/v1
kind: Backup
metadata:
name: daily-backup
namespace: prod
spec:
applicationRef: production-vms
appVaultRef: s3-vault
範例:從備份還原單一虛擬機
以下範例僅從備份存檔中還原 database-server。存檔中的其他虛擬機器(例如 app-server 和 prometheus-vm)將被跳過。
apiVersion: protect.trident.netapp.io/v1
kind: BackupRestore
metadata:
name: restore-db-only
namespace: prod-vms-restore
spec:
appVaultRef: s3-vault
appArchivePath: backups/production-vms/2026-03-10T00-00-00Z
namespaceMapping:
- source: prod
destination: prod-dr
includedVirtualMachines:
- namespace: prod
names:
- database-server
kubectl apply -f restore-db-only.yaml
僅 `database-server`及其相依資源(例如 DataVolumes、PVCs、PVs、Secrets、ConfigMaps及相關 KubeVirt 資源)會還原。
範例:從備份中就地還原單一虛擬機
以下範例僅將 `database-server`從備份存檔還原到其原始命名空間。
apiVersion: protect.trident.netapp.io/v1
kind: BackupInplaceRestore
metadata:
name: ipr-db-only
namespace: prod
spec:
appVaultRef: s3-vault
appArchivePath: backups/production-vms/2026-03-10T00-00-00Z
includedVirtualMachines:
- namespace: prod
names:
- database-server
kubectl apply -f ipr-db-only.yaml
範例:從快照還原單一虛擬機
以下範例僅從快照存檔還原 ubuntu-vm-blue-a627be38。
apiVersion: protect.trident.netapp.io/v1
kind: SnapshotRestore
metadata:
name: blue-vm-snap-restore
namespace: blue
spec:
appVaultRef: my-appvault
appArchivePath: snapshots/protectctl-blue-vm/snap-1
includedVirtualMachines:
- namespace: blue
names:
- ubuntu-vm-blue-a627be38
kubectl apply -f blue-vm-snap-restore.yaml
將虛擬機器還原與其他過濾器結合使用
您可以在同一個還原 CR 中同時使用 includedVirtualMachines、 resourceFilter、 `namespaceMapping`和 `storageClassMapping`來微調要還原的內容。
新增 `resourceFilter`時,Trident Protect 首先會選擇 `includedVirtualMachines`中列出的 VM 及其相依資源。然後套用資源篩選器,進一步縮小這些結果中包含或排除的項目範圍。
spec:
includedVirtualMachines:
- namespace: <vm_namespace>
names:
- <vm_name>
resourceFilter:
resourceSelectionCriteria: Include
resourceMatchers:
- kinds: ["PersistentVolumeClaim"]
names: ["<pvc_name>"]
對於 BackupRestore、 SnapshotRestore 和 ReplicateSnapshotRestore, namespaceMapping 和 storageClassMapping 協同工作 includedVirtualMachines。 includedVirtualMachines 中的命名空間參考對應於歸檔中出現的來源命名空間。命名空間和儲存類別映射在過濾完成後,於復原轉換階段套用。
有關還原行為的詳細資訊,請參閱 "使用Trident Protect 恢復應用程式"。
使用 CLI 建立虛擬機器範圍的應用程式
使用 `--virtual-machines`標誌可將應用程式的範圍限定於特定的 KubeVirt VM,而不是整個命名空間。 `--virtual-machines`標誌與 `--namespaces`互斥。
-
運行以下命令之一以建立應用程式,並將括號中的值替換為您的環境資訊。
--virtual-machines標誌的格式為<namespace>(<vm_name>)。對於多個 VM,請在括號內使用逗號分隔的名稱:-
命名空間中的單一虛擬機器:
tridentctl-protect create application <application_name> \ -n <application_namespace> \ --virtual-machines "<vm_namespace>(<vm_name>)" -
跨命名空間的多台虛擬機器:
tridentctl-protect create application <application_name> \ -n <application_namespace> \ --virtual-machines "<vm_namespace_1>(<vm_name_1>,<vm_name_2>),<vm_namespace_2>(<vm_name_3>)"
-