排解應用程式層 Secret 加密問題


本頁面說明如何解決 Google Kubernetes Engine (GKE) 中應用程式層密鑰加密相關問題。

更新失敗

更新應用程式層 Secret 加密功能的加密設定時,GKE 必須重新編寫 Kubernetes 叢集中的所有 Secret 物件。GKE 會執行這項操作,確保所有密鑰都以新的 Cloud KMS 金鑰加密,或在您設定的情況下以未加密形式寫入。

如果發生下列任一情況,更新作業可能會失敗:

  • 更新期間,Kubernetes 控制層會暫時無法使用。
  • 使用者定義的 AdmissionWebhook 會導致 GKE 無法更新 Secret 物件。
  • 更新作業完成前,更新或先前的 Cloud KMS 金鑰已停用。

在更新作業成功前,請勿與更新後或先前的 Cloud KMS 金鑰互動。

偵錯欄位

執行 1.29 以上版本的 GKE 叢集包含其他欄位,可協助您追蹤 Cluster.DatabaseEncryption 的更新,以及從失敗中復原。

下列步驟僅適用於 DatabaseEncryption.CurrentState 欄位不為空白的叢集。如果 CurrentState 欄位空白,表示這個叢集版本尚未啟用這項功能。

這些欄位有下列限制:

  • 僅供輸出,也就是說,您無法在叢集建立或更新要求期間設定這些欄位。

CurrentState 欄位

如要檢查 DatabaseEncryption 更新作業的目前狀態,請檢查 Cluster.DatabaseEncryption 中的 CurrentState 欄位。

CurrentState 的值 說明

CURRENT_STATE_ENCRYPTED

CURRENT_STATE_DECRYPTED

最近一次的更新作業已成功執行。因此無需採取進一步行動。您可以處置先前使用的任何金鑰。

CURRENT_STATE_ENCRYPTION_PENDING

CURRENT_STATE_DECRYPTION_PENDING

更新正在進行中。

CURRENT_STATE_ENCRYPTION_ERROR

CURRENT_STATE_DECRYPTION_ERROR

最新更新發生錯誤,請勿停用或銷毀任何先前使用的 Cloud KMS 金鑰,因為 GKE 可能仍在用這些金鑰。

詳情請參閱 LastOperationErrors 欄位。

LastOperationErrors 欄位

如果更新作業失敗,gcloud container clusters update 的輸出內容會顯示 GKE 控制平面的基礎錯誤。

您也可以在 Cluster.DatabaseEncryption.LastOperationErrors 中查看最近兩次更新作業失敗的錯誤訊息。

DecryptionKeys 欄位

用於新加密作業的 Cloud KMS 金鑰會顯示在 DatabaseEncryption.KeyName 中。通常這是叢集使用的唯一金鑰。

不過,如果更新正在進行中或失敗,叢集也會使用 DatabaseEncryption.DecryptionKeys 中的其他金鑰。

從更新失敗中復原

如要從更新失敗的狀態復原,請按照下列步驟操作:

  1. 查看錯誤訊息,並解決當中指出的問題。
  2. 執行失敗的指令 (例如 gcloud container clusters update ... --database-encryption-key),重試更新要求。建議您使用原先發出的相同更新要求重試,或將叢集更新回先前的狀態。如果 GKE 無法讀取一或多個 Secret,可能就無法轉換為其他金鑰或加密狀態。

以下各節列出常見的錯誤原因。

Cloud KMS 金鑰錯誤

如果錯誤訊息提及一或多個 Cloud KMS 金鑰,請檢查 Cloud KMS 金鑰設定,確保相關金鑰版本可用。

如果錯誤訊息指出 Cloud KMS 金鑰已停用或銷毀,請重新啟用金鑰或金鑰版本。

錯誤:無法使用為應用程式層級加密設定的 CloudKMS 金鑰

如果 GKE 的預設服務帳戶無法存取 Cloud KMS 金鑰,就會顯示下列錯誤訊息:

Cluster problem detected (Kubernetes Engine Service Agent account unable to use CloudKMS key configured for Application Level encryption).

如要解決這個問題,請重新啟用已停用的金鑰

無法更新 Secret

如果 Kubernetes API 因准入 Webhook 而拒絕更新要求,可能會發生下列錯誤:

error admission webhook WEBHOOK_NAME denied the request

如要解決這個錯誤,請移除或修改 Webhook,讓 GKE 可以在金鑰更新期間更新所有命名空間中的密鑰。

錯誤:命名空間受管理

如果您嘗試在 Autopilot 叢集中,重新加密 GKE 管理的命名空間 (例如 kube-system) 中的 Secret,系統會發生下列錯誤。錯誤訊息類似於下列內容:

Error from server (Forbidden): secrets "alertmanager" is
forbidden: User cannot patch resource "secrets" in API group "" in the namespace "gke-gmp-system":
GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "gke-gmp-system"
is managed and the request's verb "patch" is denied'

在 GKE Autopilot 叢集中,您無法修改代管命名空間中的 Kubernetes 資源,包括密鑰。

如要解決這項錯誤,請按照下列步驟操作:

  • 如果您使用 kubectl 指令重新加密 Secret,請使用 --namespace 旗標,將指令範圍限定在您管理的命名空間。
  • 如果您使用 CronJob 重新加密密鑰,請只在您管理的命名空間中部署。

後續步驟