應用程式層 Secret 加密可為 Google Kubernetes Engine (GKE) 中的機密資料 (例如憑證和金鑰) 新增可設定的安全防護層。如果這項設定有問題,額外的安全層可能就無法正常運作。
請參閱本文,檢查 GKE API 叢集物件中提供的偵錯欄位,排解應用程式層 Secret 加密問題。這些欄位可協助您診斷常見錯誤的根本原因,例如更新失敗或 Cloud KMS 金鑰發生問題。
平台管理員和營運人員,以及負責保護 GKE 叢集中儲存敏感資訊的安全工程師,都必須瞭解這些資訊。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見 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 因 Admission 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-engineSlack 頻道,取得更多社群支援。 - 使用公開版 Issue Tracker 開啟錯誤或功能要求。