本頁面說明如何解決 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 的值 |
說明 |
---|---|
|
最近一次的更新作業已成功執行。因此無需採取進一步行動。您可以處置先前使用的任何金鑰。 |
|
更新正在進行中。 |
|
最新更新發生錯誤,請勿停用或銷毀任何先前使用的 Cloud KMS 金鑰,因為 GKE 可能仍在用這些金鑰。
詳情請參閱 |
LastOperationErrors
欄位
如果更新作業失敗,gcloud container clusters update
的輸出內容會顯示 GKE 控制平面的基礎錯誤。
您也可以在 Cluster.DatabaseEncryption.LastOperationErrors
中查看最近兩次更新作業失敗的錯誤訊息。
DecryptionKeys
欄位
用於新加密作業的 Cloud KMS 金鑰會顯示在 DatabaseEncryption.KeyName
中。通常這是叢集使用的唯一金鑰。
不過,如果更新正在進行中或失敗,叢集也會使用 DatabaseEncryption.DecryptionKeys
中的其他金鑰。
從更新失敗中復原
如要從更新失敗的狀態復原,請按照下列步驟操作:
- 查看錯誤訊息,並解決當中指出的問題。
- 執行失敗的指令 (例如
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 重新加密密鑰,請只在您管理的命名空間中部署。
後續步驟
如果無法在說明文件中找到問題的解決方法,請參閱「取得支援」一文,尋求進一步的協助, 包括下列主題的建議:
- 與 Cloud 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine
標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engine
Slack 頻道,取得更多社群支援。 - 使用公開問題追蹤工具回報錯誤或提出功能要求。