啟用備份方案的寬容模式


本頁說明如何啟用備份方案的寬容模式。

執行備份時,如果 GKE 備份偵測到可能導致還原失敗的情況,備份作業本身就會失敗。備份的 state_reason 欄位會提供失敗原因。在 Google Cloud 控制台中,這個欄位稱為「狀態原因」

關於寬容模式

如果無法接受備份失敗,且無法解決根本問題,可以啟用寬容模式。寬鬆模式可確保備份作業順利完成,即使在備份過程中偵測到可能會導致還原失敗的 GKE 資源,也不會受到影響。備份的「狀態原因」欄位會提供問題詳細資料。

只有在瞭解問題,且能在還原過程中實作解決方法時,才建議使用這個選項。如需備份「狀態原因」欄位中可能顯示的錯誤訊息清單和建議做法,請參閱「排解備份失敗問題」。

啟用寬容模式

請按照下列操作說明啟用寬鬆模式:

gcloud

如要啟用寬鬆模式,請執行 gcloud beta container backup-restore backup-plans update 指令:

gcloud beta container backup-restore backup-plans update BACKUP_PLAN \
    --project=PROJECT_ID \
    --location=LOCATION
    --permissive-mode

更改下列內容:

控制台

請按照下列說明,在Google Cloud 控制台中啟用寬鬆模式:

  1. 在 Google Cloud 控制台中,前往「Google Kubernetes Engine」頁面。

    前往 Google Kubernetes Engine

  2. 在導覽選單中,按一下「Backup for GKE」

  3. 按一下「備份方案」分頁標籤。

  4. 展開叢集,然後按一下方案名稱。

  5. 按一下「詳細資料」分頁標籤,編輯方案詳細資料。

  6. 按一下「編輯」,以「備份模式」編輯該部分。

  7. 按一下「寬鬆模式」核取方塊,然後按一下「儲存變更」

Terraform

更新現有的 google_gke_backup_backup_plan 資源。

resource "google_gke_backup_backup_plan" "NAME" {
   ...
   backup_config {
     permissive_mode = true
     ...
   }
}

更改下列內容:

  • NAME:要更新的 google_gke_backup_backup_plan 名稱。

詳情請參閱 gke_backup_backup_plan

排解備份失敗問題

下表說明備份「狀態原因」欄位中顯示的各種備份失敗訊息,並提供建議的動作。

備份失敗訊息 訊息說明和失敗原因 建議做法

CustomResourceDefinitions "..." have invalid schemas

說明:叢集中的自訂資源定義 (CRD) 原先是以 apiextensions.k8s.io/v1beta1 形式套用,且缺少 apiextensions.k8s.io/v1 中所需的結構化結構定義。

原因:Backup for GKE 無法自動定義結構化結構定義。在 Kubernetes 1.22 以上版本的叢集中還原 CRD 時,如果 apiextensions.k8s.io/v1beta1 無法使用,還原作業就會失敗。還原 CRD 定義的自訂資源時,就會發生這項失敗情形。
建議您使用下列選項:
  • 如果是 GKE 管理的 CRD,如果 CRD 沒有提供任何現有資源,您可以呼叫 kubectl delete crd。如果 CRD 提供現有資源,您可以啟用寬鬆模式,瞭解還原行為。如需常見 CRD 的建議,請參閱說明文件
  • 如果是第三方 CRD,請參閱相關說明文件,瞭解如何遷移至 apiextensions.k8s.io/v1

啟用寬鬆模式後,沒有結構化結構定義的 CRD 不會備份到 Kubernetes v1.22 以上版本的叢集。如要順利還原這類備份,您必須從還原作業中排除 CRD 提供的資源,或在開始還原前,於目標叢集中建立 CRD。

Failed to query API resources ...

說明:叢集中的 API 服務設定錯誤。這會導致對 API 路徑的要求傳回「Failed to query API resources.」(無法查詢 API 資源)。基礎服務可能不存在或尚未準備就緒。

原因:GKE 備份無法備份任何由無法使用的 API 提供的資源。
檢查 API 服務中的基礎服務 spec.service,確認服務是否已準備就緒。

啟用寬鬆模式後,系統不會備份無法載入的 API 群組資源。

Secret ... is an auto-generated token from ServiceAccount ... referenced in Pod specs

說明:在 Kubernetes v1.23 和更早版本中,服務帳戶會自動產生以密鑰為後盾的權杖。不過,在後續版本中,Kubernetes 移除了這項自動產生權杖的功能。叢集中的 Pod 可能已將密鑰磁碟區掛接到容器的檔案系統。

原因:如果 Backup for GKE 嘗試還原服務帳戶及其自動產生的密碼,以及掛接密碼磁碟區的 Pod,還原作業會顯示成功。不過,Kubernetes 會移除密鑰,導致 Pod 卡在容器建立程序中,無法啟動。
在 Pod 中定義 spec.serviceAccountName 欄位。這項動作可確保權杖會自動掛接至容器中的 /var/run/secrets/kubernetes.io/serviceaccount。詳情請參閱「為 Pod 設定服務帳戶」說明文件。

啟用寬鬆模式後,系統會備份密鑰,但無法在 Kubernetes 1.24 以上版本的叢集 Pod 中掛接密鑰。

常見的自訂資源定義 (CRD) 問題和建議做法

以下列出幾個常見的 CRD 備份問題,以及建議採取的行動:

  • capacityrequests.internal.autoscaling.k8s.io: 這個 CRD 暫時用於 1.21 版叢集。執行 kubectl delete crd capacityrequests.internal.autoscaling.k8s.io 移除 CRD。
  • scalingpolicies.scalingpolicy.kope.io: 這個 CRD 用於控制 fluentd 資源,但 GKE 已改用 fluentbit。執行 kubectl delete crd scalingpolicies.scalingpolicy.kope.io 移除 CRD。
  • memberships.hub.gke.io: 如果沒有成員資格資源,請執行 kubectl delete crd memberships.hub.gke.io 移除 CRD。如有成員資格資源,請啟用寬鬆模式。
  • applications.app.k8s.io: 啟用寬鬆模式,並瞭解還原行為。