受保護的應用程式策略

本頁面說明 Google Distributed Cloud (GDC) 實體隔離環境中可用的各種受保護應用程式策略。

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

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

策略定義可包含下列值:

類型 屬性 說明
BackupAllRestoreAll 備份及還原元件中的所有內容。
backupPreHooks 備份前要執行的掛鉤清單。
backupPostHooks 備份後要執行的 Hook 清單。
volumeSelector 標籤選取器,用於指定要備份的永久磁碟區。如果為空白,系統會選取所有 PV。
backupOneRestoreAll 備份所選 Pod 的副本,並用來還原所有 Pod。
backupTargetName 備份作業要使用的偏好 Deployment 或 StatefulSet 名稱。
backupPreHooks 備份前要執行的掛鉤清單。
backupPostHooks 備份後要執行的 Hook 清單。
volumeSelector 標籤選擇器,用於指定要備份的永久磁碟區。如果為空白,系統會選取所有 PV。
dumpAndLoad 使用專屬磁碟區進行備份和還原。
dumpTarget 指定用於傾印元件資料的偏好 Deployment 或 StatefulSet 名稱。系統會根據這個元件的組成方式選取目標 Pod:
  • 部署:挑選目標 Deployment 建立的唯一 Pod。
  • 單一 StatefulSet:如果副本數量大於 2,請挑選目標 StatefulSet 建立的第二個 Pod。否則,請選取唯一的 Pod。
  • Multi-StatefulSet:挑選目標建立的第一個 Pod StatefulSet
loadTarget 指定用於載入元件資料的偏好 Deployment 或 StatefulSet 名稱。系統會根據這個元件的組成方式選取目標 Pod:
  • 部署:挑選目標 Deployment 建立的唯一 Pod。
  • StatefulSet:一律選取目標建立的第一個 Pod StatefulSet。
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 時,這項策略適用於高可用性設定。

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

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

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

  • 所有 Deployment 或 StatefulSet 資源使用的 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 連接至儲存傾印資料的元件。如要採用傾印和載入策略,請在資源定義中加入下列資訊:

  • 傾印目標:指定要用來傾印資料的 Deployment 或 StatefulSet。系統會自動選取最適合備份的膠囊。在高可用性設定中,建議從次要 PersistentVolumeClaim 備份。
  • 載入目標:指定要使用哪個 Deployment 或 StatefulSet 載入資料。系統會自動選取最適合備份的 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

後續步驟