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

使用自訂資源還原資源時修改資源

貢獻者 netapp-shwetav

資源轉換功能可讓您在復原資源的過程中進行修改。當復原後的版本需要與原始版本有所不同時,此功能非常有用,例如,在將應用程式還原到不同的叢集時,更新 ConfigMap 中的主機名稱。

資源修改的運作方式

The transformations 欄位位於 SnapshotRestoreBackupRestoreAppMirrorRelationship 及其他復原資源中,可讓您在復原過程中修改 Kubernetes 資源。當復原後的應用程式需要與原始應用程式採用不同的組態時,例如變更主機名稱、登錄 URL、資源限制或環境變數,此功能非常實用。

資源轉換使用 "RFC 6902 JSON Patch"操作和 "RFC 6901 JSON Pointer"路徑來定位和修改 Kubernetes 資源中的特定欄位。

下面展示了包含資源轉換的還原物件的基本結構:

apiVersion: protect.trident.netapp.io/v1
kind: SnapshotRestore
metadata:
  name: my-restore
  namespace: target-namespace
spec:
  appVaultRef: my-vault
  appArchivePath: /path/to/snapshot
  namespaceMapping:
    - source: source-ns
      destination: target-ns
  transformations:
    - resource:
        kind: ConfigMap       # Required: resource kind
        group: ""             # Optional: API group (empty for core resources)
        version: ""           # Optional: API version
        name: ""              # Optional: specific resource name
      operations:
        - op: replace         # Operation type
          path: "/data/key"   # JSON Pointer path
          value: "new-value"  # New value (for add/replace/test)

支援的資源

您可以將資源轉換套用至符合下列條件的資源:

  • kind(必填):Kubernetes 資源類型(例如, ConfigMapDeploymentPod

  • group(可選):API 群組(例如, appsroute.openshift.io)— 對於核心資源,請省略

  • 版本(可選):API 版本(例如, v1v1beta1

  • 名稱(可選):僅套用於指定名稱的資源

註 目前不支援修改 PersistentVolumeClaims 和命名空間。

支援的作業

您可以使用以下操作來修改資源: addcopymoveremovereplace,以及 test

為資源新增值

使用 add 操作可在指定路徑新增欄位或值。您可以為物件或陣列新增資料。

使用 CR

以下範例向 Deployment 資源新增節點選擇器:

transformations:
  - resource:
      kind: Deployment
    operations:
      - op: add
        path: "/spec/template/spec/nodeSelector"
        value:
          "topology.kubernetes.io/zone": "us-east-1a"
          disktype: "ssd"
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation 'apps,v1,Deployment:add{"path":"/spec/template/spec/nodeSelector","value":{"topology.kubernetes.io/zone":"us-east-1a","disktype":"ssd"}}'

複製資源中的值

使用 copy 操作可將相同資源內的值從一個路徑複製到另一個路徑。來源值不會改變。

使用 CR

以下範例複製 ConfigMap 物件的資料鍵:

transformations:
  - resource:
      kind: ConfigMap
    operations:
      - op: copy
        from: "/data/source-key"
        path: "/data/backup-key"
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation ',v1,ConfigMap:copy{"from":"/data/source-key","path":"/data/backup-key"}'

在資源內移動值

使用 `move`操作可將相同資源中的值從一個路徑移至另一個路徑。來源路徑將被移除,值將被放置在目標路徑中。

使用 CR

以下範例重新命名 ConfigMap 物件的資料鍵:

transformations:
  - resource:
      kind: ConfigMap
    operations:
      - op: move
        from: "/data/OLD_KEY"
        path: "/data/NEW_KEY"
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation ',v1,ConfigMap:move{"from":"/data/OLD_KEY","path":"/data/NEW_KEY"}'

從資源中移除值

使用 remove 操作可刪除指定路徑中的欄位或值。

使用 CR

以下範例從 `ConfigMap`資源中刪除註解:

transformations:
  - resource:
      kind: ConfigMap
    operations:
      - op: remove
        path: "/metadata/annotations/kubectl.kubernetes.io~1last-applied-configuration"
註 在上述範例的路徑中、 ~1/ 的 JSON Pointer 轉義序列。
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation ',v1,ConfigMap:remove{"path":"/metadata/annotations/kubectl.kubernetes.io~1last-applied-configuration"}'

取代資源中的值

使用 replace 操作可取代指定路徑下資源中的現有值。JSON 路徑必須已存在。

使用 CR

以下範例變更 Route 物件的主機名稱:

transformations:
  - resource:
      kind: Route
      group: route.openshift.io
    operations:
      - op: replace
        path: "/spec/host"
        value: "prod.example.com"
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation 'route.openshift.io,v1,Route:replace{"path":"/spec/host","value":"prod.example.com"}'

測試資源修改

使用 test 操作,在執行其他操作之前驗證路徑處的值是否與預期值相符。如果測試失敗,整個修改將會回滾。

使用 CR

以下範例僅在 environment 設定為 staging 時,才會更新 database-host

transformations:
  - resource:
      kind: ConfigMap
    operations:
      - op: test
        path: "/data/environment"
        value: "staging"
      - op: replace
        path: "/data/database-host"
        value: "prod-db.example.com"
使用CLI

使用以下命令透過命令列執行此轉換:

tridentctl-protect create snapshotrestore <restore_name> \
  --snapshot <namespace/snapshot-name> \
  --namespace-mapping <source-ns>:<dest-ns> \
  --transformation ',v1,ConfigMap:test{"path":"/data/environment","value":"staging"},replace{"path":"/data/database-host","value":"prod-db.example.com"}'