本页面介绍如何解决与 Google Kubernetes Engine (GKE) 中的应用层 Secret 加密相关的问题。
更新失败
更新应用层 Secret 加密的加密配置时,GKE 必须重写 Kubernetes 集群中的所有 Secret 对象。GKE 这样做可确保所有 Secret 都由新的 Cloud KMS 密钥加密,或者在未加密的情况下写入(如果您配置)。
此更新操作可能会因以下任一条件而失败:
- 在更新过程中,Kubernetes 控制平面暂时不可用。
- 用户定义的
AdmissionWebhook
阻止 GKE 更新 Secret 对象。 - 在更新操作完成之前,已更新或之前的 Cloud KMS 密钥会被停用。
在更新操作成功之前,请勿与更新后的或旧的 Cloud KMS 密钥进行交互。
调试字段
运行 1.29 及更高版本的新 GKE 集群包含其他字段,可帮助您跟踪 Cluster.DatabaseEncryption
的更新并帮助您从故障中恢复。
以下步骤仅适用于 DatabaseEncryption.CurrentState
字段不为空的集群。如果 CurrentState
字段为空,则表示此集群版本尚未启用该功能。
以下限制适用于这些字段:
- 仅限输出,这意味着您无法在集群创建或更新请求期间设置这些字段。
CurrentState
字段
您可以通过检查 Cluster.DatabaseEncryption
中的 CurrentState
字段来检查 DatabaseEncryption
更新操作的当前状态。
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 密钥已停用或销毁,请重新启用该密钥或密钥版本。
无法更新 Secret
如果 Kubernetes API 因准入网络钩子而拒绝更新请求,则可能会发生以下错误:
error admission webhook WEBHOOK_NAME denied the request
如需解决此错误,请移除网络钩子或修改它,以便 GKE 可以在密钥更新期间更新所有命名空间中的 Secret。