Skip to main content
本繁體中文版使用機器翻譯,譯文僅供參考,若與英文版本牴觸,應以英文版本為準。

使用 Trident Protect 保護 KubeVirt 虛擬機器

貢獻者 netapp-shwetav

Trident Protect 可讓您備份與還原執行於 OpenShift Virtualization 上的 KubeVirt 虛擬機器(VM)。您可以同時保護一或多個命名空間中的所有 VM,或使用 includedVirtualMachines 欄位依名稱指定特定的 VM。Trident Protect 會在備份期間自動收集所有相依的 VM 資源,而在還原期間,您可以復原整個封存或選擇性地還原個別 VM。

KubeVirt 保護模式

Trident Protect 支援兩種定義要保護的 KubeVirt 虛擬機器的方式。定義應用程式時,請選擇其中一種模式:

模式 欄位 說明

基於命名空間

includedNamespaces

保護一個或多個命名空間中所有符合的資源。在命名空間條目上使用 `labelSelector`來動態控制包含哪些虛擬機器。

虛擬機器範圍

includedVirtualMachines

依命名空間和名稱保護特定 KubeVirt VM。當 VM 分佈在多個命名空間中,或您不想保護所有命名空間資源時,請使用此模式。

您必須在 ApplicationSpec 中指定恰好一個欄位 (includedNamespacesincludedVirtualMachines )。您無法在同一個應用程式中同時使用兩者。

兩種模式均支援額外的篩選功能:

  • 使用 `resourceFilter`來包含或排除特定資源。

  • 使用 `includedClusterScopedResources`以包含相容的叢集範圍資源,例如 `StorageClass`物件。

註 Trident Protect 可在資料保護作業期間凍結和解凍 KubeVirt 虛擬機器檔案系統,以確保資料一致性。如需組態詳細資料,請參閱 "使用 KubeVirt VM 保護資料"

備份和快照期間收集的資源

當您為包含 KubeVirt VM 的應用程式建立備份或快照時,Trident Protect 會收集選定的 VM 資源並自動探索其相依資源。

收集行為適用於以下兩種情況:

  • 使用 VM 範圍的應用程式 includedVirtualMachines

  • 基於命名空間且包含 KubeVirt VirtualMachine 資源的應用程式。

VM 範圍的收集

對於 VM 範圍的應用程式,Trident Protect 從 `VirtualMachine`中列出的每個 `includedVirtualMachines`開始,並探索還原該 VM 所需的相依資源。

資源類型 範圍 探索方式

VirtualMachine

命名空間

從 `includedVirtualMachines`清單中直接比對。

VirtualMachineInstance

命名空間

如果虛擬機器正在執行,則使用與虛擬機器相同的命名空間和名稱。

VirtualMachineInstancetype

命名空間

被引用 spec.instancetype`時 `kind: VirtualMachineInstancetype

VirtualMachineClusterInstancetype

叢集

spec.instancetype 參照,當 kind 未設定或 kind: VirtualMachineClusterInstancetype 時。

VirtualMachinePreference

命名空間

被引用 spec.preference`時 `kind: VirtualMachinePreference

VirtualMachineClusterPreference

叢集

spec.preference 參照,當 kind 未設定或 kind: VirtualMachineClusterPreference 時。

DataVolume

命名空間

spec.template.spec.volumes[].dataVolume.name 引用。

PersistentVolumeClaim

命名空間

從 DataVolume 支援的 PVC 中探索,這些 PVC 使用與 DataVolume 相同的名稱;直接 PVC 參照位於 persistentVolumeClaim.claimName;記憶體傾印 PVC 位於 memoryDump.claimName;以及暫時性 PVC 位於 ephemeral.persistentVolumeClaim.claimName

PersistentVolume

叢集

透過使用 spec.volumeName 從每個收集的 PVC 的備援 PV 中探索。

Secret

命名空間

從磁碟區金鑰 `secret.secretName`中探索到;containerDisk 映像提取金鑰;CloudInitNoCloud 和 CloudInitConfigDrive 使用者資料和網路資料金鑰參考;Sysprep 金鑰;KernelBoot 容器映像提取金鑰;以及 AccessCredentials SSH 或密碼金鑰。

ConfigMap

命名空間

從磁碟區 ConfigMaps 中 `configMap.name`和 Sysprep ConfigMaps 中探索到。

ServiceAccount

命名空間

從 `serviceAccount.serviceAccountName`磁碟區參考中探索到。

NetworkAttachmentDefinition

命名空間

當網路名稱不包含 / 時,從 spec.template.spec.networks[].multus.networkName 中的 Multus 網路探索。僅收集相同命名空間的 NetworkAttachmentDefinition 參照。會跳過跨命名空間參照。

Pod

命名空間

透過標籤選擇器為 virt-launcher Pods 探索 kubevirt.io=virt-launcher,vm.kubevirt.io/name=<vmName>

儲存類別、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 (virt-launcher

當 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)會自動收集。

步驟
  1. 使用共用標籤標記虛擬機器 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>
  2. 建立含有 includedNamespaceslabelSelector 的應用程式 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>
  3. 使用標準 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 及其相依資源,例如 `VirtualMachineInstanceDataVolumePersistentVolumeClaimPersistentVolumeSecretConfigMapServiceAccount,以及其他 VM 相關物件。

如果您未在復原 CR 中指定 includedVirtualMachines,Trident Protect 將根據復原 CR 設定還原完整的歸檔。

支援的還原 CR 和 CLI 命令

下表列出了支援的還原 CR `includedVirtualMachines`及其對應的 CLI 命令。

恢復 CR CLI 指令 說明

BackupRestore

tridentctl-protect create backuprestore

從備份還原到新的或不同的命名空間映射。支援 namespaceMapping`和 `storageClassMapping

BackupInplaceRestore

tridentctl-protect create backupinplacerestore

從備份還原到原始命名空間或多個命名空間。

SnapshotRestore

tridentctl-protect create snapshotrestore

從快照還原到新的或不同的命名空間映射。支援 namespaceMapping`和 `storageClassMapping

SnapshotInplaceRestore

tridentctl-protect create snapshotinplacerestore

從快照還原到原始命名空間或多個命名空間。

ReplicateSnapshotRestore

僅支援 YAML 格式,或如果您的環境中支援,也可以使用受支援的 CLI 命令。

從複製的快照還原。支援 namespaceMappingstorageClassMapping,以及使用 `inPlaceRestore`旗標進行原地還原。

註 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-serverprometheus-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 中同時使用 includedVirtualMachinesresourceFilter、 `namespaceMapping`和 `storageClassMapping`來微調要還原的內容。

新增 `resourceFilter`時,Trident Protect 首先會選擇 `includedVirtualMachines`中列出的 VM 及其相依資源。然後套用資源篩選器,進一步縮小這些結果中包含或排除的項目範圍。

spec:
  includedVirtualMachines:
    - namespace: <vm_namespace>
      names:
        - <vm_name>
  resourceFilter:
    resourceSelectionCriteria: Include
    resourceMatchers:
      - kinds: ["PersistentVolumeClaim"]
        names: ["<pvc_name>"]

對於 BackupRestoreSnapshotRestoreReplicateSnapshotRestorenamespaceMappingstorageClassMapping 協同工作 includedVirtualMachinesincludedVirtualMachines 中的命名空間參考對應於歸檔中出現的來源命名空間。命名空間和儲存類別映射在過濾完成後,於復原轉換階段套用。

有關還原行為的詳細資訊,請參閱 "使用Trident Protect 恢復應用程式"

使用 CLI 建立虛擬機器範圍的應用程式

使用 `--virtual-machines`標誌可將應用程式的範圍限定於特定的 KubeVirt VM,而不是整個命名空間。 `--virtual-machines`標誌與 `--namespaces`互斥。

步驟
  1. 運行以下命令之一以建立應用程式,並將括號中的值替換為您的環境資訊。 --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>)"