本頁面說明使用 GKE 備份 時可能遇到的系統相關錯誤、備份資源時應考量的事項,以及疑難排解問題的步驟。
錯誤 100010108:無法備份 PersistentVolumeClaim,因為缺少加密磁碟的備份方案 CMEK
建立區域範圍磁碟區備份時發生錯誤 100010108,且由於 GKE 叢集參照加密磁碟,因此必須使用備份方案 CMEK。
瞭解錯誤
建立區域範圍的磁碟區備份時,如果 GKE 叢集參照任何加密磁碟,就必須使用備份方案 CMEK。這是區域範圍磁碟區備份的嚴格要求;如果來源磁碟已加密,則必須提供備份方案 CMEK,才能建立該磁碟的快照。如果備份方案缺少這項 CMEK 設定,快照建立作業就會失敗,並顯示類似下列內容的錯誤訊息:
failed to create snapshot as disk "pvc-1" is encrypted with CMEK "projects/proj1/locations/us-east1/keyRings/keyring1/cryptoKeys/key1/cryptoKeyVersions/1", but no Backup Plan CMEK is provided. Please add CMEK to the Backup Plan.
疑難排解步驟
- 找出缺少的 CMEK 設定:錯誤訊息確認要備份的 PVC 已加密,但備份計畫設定缺少加密金鑰。
- 在備份方案中新增 CMEK:更新備份方案設定,加入客戶自行管理的加密金鑰 (CMEK)。這個金鑰會用來加密備份資料,包括區域範圍的磁碟區備份。
- 確認權限正確:確認 Backup for GKE 服務代理 (
service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com) 已獲派新加入 CMEK 的roles/cloudkms.cryptoKeyEncrypterDecrypter角色。 - 重新測試備份作業:更新備份方案並授予權限後,請重試備份作業。
錯誤 100020102:CustomResourceDefinition - 具有無效的結構定義 - 不支援 v1beta1 API 版本
如果嘗試備份原本以 apiextensions.k8s.io/v1beta1 版本套用的 CustomResourceDefinition 失敗,就會發生 100020102 錯誤,因為該版本缺少 apiextensions.k8s.io/v1 API 版本所需的結構化結構定義。這個錯誤會導致下列錯誤訊息:CustomResourceDefinition - has an invalid schema. The resource was
originally applied as v1beta1, which has been removed from Kubernetes 1.22+。
發生這項錯誤的原因是 apiextensions.k8s.io/v1beta1 API 版本已在 Google Kubernetes Engine 1.22 版中移除。如要進一步瞭解 GKE 1.22 版的 API 移除作業,請參閱「GKE v1.22 的 API 移除作業」。
非寬鬆模式下的備份作業行為
在非寬鬆模式或嚴格備份方案中,如果備份作業遇到無法備份的資源 (例如使用 v1beta1 API 建立的 CustomResourceDefinition),就會失敗。發生這個錯誤的原因是資源缺少 v1 API 所需的結構性結構定義。如果出現這個 CustomResourceDefinition,系統會視為重大錯誤,因為可能無法正確還原至較新的叢集。
如要解決這項錯誤,請按照下列指示操作:
執行
kubectl get crd指令,找出有問題的CustomResourceDefinition:kubectl get crd CRD_NAME將
CRD_NAME替換為錯誤訊息中的CustomResourceDefinition名稱。在 YAML 輸出內容中,找出下列條件,確認
CustomResourceDefinition是否已從vbeta1API 正確轉換為v1API:spec.versions:在「spec.versions」欄位下方列出的每個版本中,找出「spec.versions」條件。如果任何spec.versions缺少schema.openAIV3Schema欄位,則CustomResourceDefinition沒有為該版本定義結構化結構定義。status.conditions:找出type:NonStructuralSchema條件,即可找到status.conditions條件。如果status.conditions的status為true,則明確確認結構定義並非結構式。
請按照下列步驟,將
CustomResourceDefinition升級至v1API 版本:編輯現有
CustomResourceDefinition,加入結構化架構,定義自訂資源中的每個欄位及其類型,使其與v1標準相容。如要進一步瞭解如何新增結構定義,請參閱「指定結構定義」。將相容的
v1資訊清單套用至叢集。
升級成功後,請再次嘗試備份作業。否則請使用下列其中一種方法解決問題:
如果叢集未使用
CustomResourceDefinition,請執行kubectl delete crd指令刪除CustomResourceDefinition。kubectl delete crd CRD_NAME將
CRD_NAME替換為要刪除的CustomResourceDefinition名稱。在備份方案中啟用寬鬆模式,讓 GKE 備份略過資源 (包括
CustomResourceDefinitionsAPI 版本中的v1beta1),並繼續執行其餘備份作業。如要進一步瞭解如何啟用寬容模式,請參閱「啟用備份方案的寬容模式」。
重新嘗試備份作業。如果作業持續失敗,請與 Cloud Customer Care 團隊聯絡,尋求進一步協助。
錯誤 100020103:無法查詢 API 資源
如果 GKE 備份 無法在備份前探索自訂或匯總的 Kubernetes API 服務,就會發生 100020103 錯誤,並顯示 Failed to query API resources. Please check if any API service
is unavailable by using 'kubectl get apiservice' 錯誤訊息。如果匯總 API 服務設定錯誤,或其後端服務和 Pod 狀況不佳或無法連線,就會發生這種情況。在非寬鬆模式或嚴格備份方案中,如果 GKE 備份遇到無法使用的 APIService,就會停止備份作業,避免擷取不完整或不一致的叢集狀態。
如要解決這項錯誤,請按照下列指示操作:
執行下列指令,找出無法使用的 API 服務:
kubectl get apiservice在輸出內容中,找出
AVAILABLE欄為False的 API 服務。執行下列指令,檢查失敗的
APIService詳細資料:kubectl describe apiservice APISERVICE_NAME將
APISERVICE_NAME替換為失敗的 API 服務名稱,例如v1beta1.custom.metrics.k8s.io。在輸出內容中,查看
spec.service下方的Service欄位和Conditions部分,找出支援的服務、其命名空間,以及失敗原因 (例如缺少端點或無法連線的目標連接埠)。請使用下列其中一種方法解決錯誤:
還原支援服務:執行下列指令,確認支援服務是否已備妥端點:
kubectl get endpoints -n NAMESPACE SERVICE_NAME更改下列內容:
NAMESPACE:支援服務的命名空間。SERVICE_NAME:支援服務的名稱。
確認支援服務的 Pod 存在且處於
Running狀態。解決任何導致 Pod 損毀、映像檔提取失敗或網路政策設定錯誤的問題,以免流量無法抵達後端服務。刪除孤立的
APIService:如果APIService屬於已移除或不再使用的應用程式、運算子或監控工具,請刪除過時的APIService:kubectl delete apiservice APISERVICE_NAME將
APISERVICE_NAME替換為孤立 API 服務的名稱。啟用寬鬆模式:如果無法立即修正或移除無法使用的 API 服務,請在備份方案啟用寬鬆模式。啟用寬鬆模式後,GKE 備份功能會繼續執行備份作業。不過,系統不會備份屬於無法使用 API 群組的資源。如要進一步瞭解如何啟用寬容模式,請參閱「啟用備份方案的寬容模式」。
重新嘗試備份作業。如果作業持續失敗,請與 Cloud Customer Care 團隊聯絡,尋求進一步協助。
錯誤 100040102:找不到命名空間
如果備份範圍內指定的命名空間在叢集中找不到,導致備份作業失敗,就會發生錯誤 100040102。GKE 備份代理程式無法找到一或多個命名空間,這些命名空間已明確列在 BackupPlan 設定的 selectedNamespaces 欄位中。啟動備份作業時,GKE 備份功能需要叢集中存在所有指定的命名空間。如果找不到命名空間,系統會顯示下列錯誤訊息:
Namespace [NAMESPACE_NAME] is not found.
如要解決這個問題,請按照下列指示操作:
請檢查
BackupPlan設定中的selectedNamespaces清單,確認輸入的命名空間正確無誤。執行
kubectl get namespace指令,確認錯誤訊息中回報的命名空間是否存在:kubectl get namespace NAMESPACE_NAME將
NAMESPACE_NAME替換為錯誤訊息中回報的命名空間名稱。如果命名空間不存在,系統會顯示找不到命名空間的訊息,例如
Error from server (NotFound): namespaces "[NAMESPACE_NAME]" not found。修正
BackupPlan。如果命名空間拼字有誤,請更新BackupPlan,使用正確的命名空間名稱。如果命名空間確實已不存在,且不需要備份,請從BackupPlan設定的selectedNamespaces清單中移除。修正
BackupPlan後,請重新嘗試備份作業,並啟動新的備份。
如果作業持續失敗,請與 Cloud Customer Care 團隊聯絡,尋求進一步協助。