受保護的應用程式策略

本頁說明 Google Distributed Cloud (GDC) Air-gapped 中可用的不同受保護應用程式策略。

受保護的應用程式策略可讓您執行特定的前置和後置執行掛鉤,並定義自訂行為,以暫止、備份或還原有狀態的工作負載。

定義 ProtectedApplication 資源時,您可以使用三種備份和還原策略:

策略定義可包含下列值:

類型 屬性 說明
BackupAllRestoreAll 備份及還原元件中的所有內容。
backupPreHooks 備份前要執行的掛鉤清單。
backupPostHooks 備份後要執行的 Hook 清單。
volumeSelector 標籤選擇器,用於指定要備份的永久磁碟區。如果為空白,系統會選取所有 PV。
backupOneRestoreAll 備份所選 Pod 的副本,並用來還原所有 Pod。
backupTargetName 備份時要使用的偏好 Deployment StatefulSet 名稱。
backupPreHooks 備份前要執行的掛鉤清單。
backupPostHooks 備份後要執行的 Hook 清單。
volumeSelector 標籤選擇器,用於指定要備份的永久磁碟區。如果為空白,系統會選取所有 PV。
dumpAndLoad 使用專屬磁碟區進行備份和還原。
dumpTarget 指定用於傾印元件資料的偏好 DeploymentStatefulSet 名稱。系統會根據這個元件的組成方式選取目標 Pod:
  • 部署:挑選目標 Deployment 建立的唯一 Pod。
  • 單一 StatefulSet:如果副本數量大於 2,請挑選目標 StatefulSet 建立的第二個 Pod。否則,請選取唯一的 Pod。
  • 多個 StatefulSet:挑選目標建立的第一個 Pod StatefulSet
loadTarget 指定用於載入元件資料的偏好 DeploymentStatefulSet 名稱。系統會根據這個元件的組成方式選取目標 Pod:
  • 部署:挑選目標 Deployment 建立的唯一 Pod。
  • StatefulSet:一律選取目標 StatefulSet 建立的第一個 Pod。
dumpHooks 用於傾印資料的掛鉤清單。
backupPostHooks 備份後要執行的 Hook 清單。
loadHooks 用於從專用磁碟區載入這個元件資料的 Hook 清單。也可能包含載入完成後的清除步驟。執行目標 Pod 是從 LoadTarget 選取的 Pod 之一。
volumeSelector 標籤選擇器,用於指定要備份的永久磁碟區。如果為空白,系統會選取所有 PV。

備份所有資料並還原所有資料

這項策略會在備份期間備份所有應用程式資源,並在還原期間還原所有這些資源。這項策略最適合獨立應用程式,也就是 Pod 之間沒有應用程式複寫的情況。

如要採用「全部備份並全部還原」策略,請在資源定義中加入下列資訊:

  • 掛鉤:定義要在備份磁碟區前後執行的指令,例如應用程式暫停和取消暫停步驟。這些指令會在元件內的所有 Pod 上執行。

  • 磁碟區選取:可更精細地控制要備份及還原元件中的哪些磁碟區。未選取的磁碟區不會備份。 還原期間,系統會將備份時略過的磁碟區還原為空白磁碟區。

這個範例會建立 ProtectedApplication 資源,在備份記錄檔磁碟區前先停止檔案系統,備份完成後再解除停止狀態:

kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
  name: nginx
  namespace: sales
spec:
  resourceSelection:
    type: Selector
    selector:
      matchLabels:
        app: nginx
  components:
  - name: nginx-app
    resourceKind: Deployment
    resourceNames: ["nginx"]
    strategy:
      type: BackupAllRestoreAll
      backupAllRestoreAll:
        backupPreHooks:
        - name: fsfreeze
          container: nginx
          Commands: [ /sbin/fsfreeze, -f, /var/log/nginx ]
        backupPostHooks:
        - name: fsunfreeze
          container: nginx
          commands: [ /sbin/fsfreeze, -u, /var/log/nginx ]

備份一項資料,還原所有資料

這項策略會備份所選 Pod 的副本。這個單一副本是還原期間所有 Pod 的還原來源。這個方法有助於降低儲存成本和備份時間。當元件部署一個主要 PersistentVolumeClaim 和多個次要 PersistentVolumeClaims 時,這項策略適用於高可用性設定。

如要採用備份一項資源並還原所有資源的策略,您必須在資源定義中加入下列資訊:

  • 備份目標:指定要使用哪個 DeploymentStatefulSet 備份資料。系統會自動選取最適合備份的 Pod。在高可用性設定中,Google 建議從次要 PersistentVolumeClaim 備份。
  • 掛鉤:定義在備份磁碟區前後執行的指令,例如應用程式靜止和取消靜止步驟。這些指令只會在選取的備份 Pod 上執行。
  • 磁碟區選取:可更精細地控制要備份及還原元件中的哪些磁碟區。

如果元件設定了多個 DeploymentStatefulSet 資源,所有資源都必須具有相同的 PersistentVolume 結構,並遵守下列規則:

  • 所有 DeploymentStatefulSet 資源使用的 PersistentVolumeClaim 資源數量必須相同。
  • 同一索引中的 PersistentVolumeClaim 資源用途必須相同。如果是 StatefulSet 資源,索引是在 volumeClaimTemplate 中定義。如果是 Deployment 資源,索引會在 Volume 資源中定義,且系統會略過所有非持續性磁碟區。

考量上述因素,備份時可以選取多個磁碟區集,但每個磁碟區集只能選取一個磁碟區。

這個範例假設架構為一個主要 StatefulSet 和一個次要 StatefulSet,顯示次要 StatefulSet 中單一 Pod 內磁碟區的備份,然後還原至所有其他磁碟區:

kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
  name: mariadb
  namespace: mariadb
spec:
  resourceSelection:
    type: Selector
    selector:
      matchLabels:
        app: mariadb
  components:
  - name: mariadb
    resourceKind: StatefulSet
    resourceNames: ["mariadb-primary", "mariadb-secondary"]
    strategy:
      type: BackupOneRestoreAll
      backupOneRestoreAll:
        backupTargetName: mariadb-secondary
        backupPreHooks:
        - name: quiesce
          container: mariadb
          command: [...]
        backupPostHooks:
        - name: unquiesce
          container: mariadb
          command: [...]

傾印及載入

這項策略會使用專屬磁碟區進行備份和還原程序,且需要專屬 PersistentVolumeClaim 連接至儲存傾印資料的元件。如要採用傾印和載入策略,請在資源定義中加入下列資訊:

  • 傾印目標:指定要使用哪個 DeploymentStatefulSet 傾印資料。系統會自動選取最適合備份的 Pod。在高可用性設定中,建議從次要 PersistentVolumeClaim 備份。
  • 載入目標:指定要使用哪個 DeploymentStatefulSet 載入資料。系統會自動選取最適合備份的 Pod。 載入目標不必與傾印目標相同。
  • 掛鉤:定義在建立磁碟區備份前後執行的指令。您必須為傾印和載入策略定義特定掛鉤:
    • 傾印掛鉤:定義將資料傾印至專屬磁碟區的掛鉤,然後再備份。這個掛鉤只會在所選傾印 Pod 上執行。
    • 載入 Hook:定義應用程式啟動後載入資料的 Hook。這個 Hook 只會在所選的載入 Pod 上執行。
    • 選用 - 備份後勾點:定義在備份專用磁碟區後執行的勾點,例如清理步驟。這個 Hook 只會在所選傾印 Pod 上執行。
  • 磁碟區選取:指定儲存傾印資料的所有專屬磁碟區。每個傾印和載入 Pod 只能選取一個磁碟區。

如果應用程式包含 Deployments,則每個 Deployment 都必須只有一個副本。

假設架構為一個主要 StatefulSet 和一個次要 StatefulSet,且主要和次要 StatefulSets 都有專屬的 PersistentVolumeClaims,以下範例說明傾印和載入策略:

kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
  name: mariadb
  namespace: mariadb
spec:
  resourceSelection:
    type: Selector
    selector:
      matchLabels:
        app: mariadb
  components:
  - name: mariadb-dump
    resourceKind: StatefulSet
    resourceNames: ["mariadb-primary", "mariadb-secondary"]
    backupStrategy:
      type: DumpAndLoad
      DumpAndLoad:
        loadTarget: mariadb-primary
        dumpTarget: mariadb-secondary
        dumpHooks:
        - name: db_dump
          container: mariadb
          commands:
          - bash
          - "-c"
          - |
            mysqldump -u root --all-databases > /backup/mysql_backup.dump
        loadHooks:
        - name: db_load
          container: mariadb
          commands:
          - bash
          - "-c"
          - |
            mysql -u root < /backup/mysql_backup.sql
    volumeSelector:
      matchLabels:
        gkebackup.gke.io/backup: dedicated-volume

後續步驟