本页面介绍了如何解决与 Google Kubernetes Engine (GKE) 中的应用层 Secret 加密相关的问题。
更新失败
更新应用层 Secret 加密的加密配置时,GKE 必须重写 Kubernetes 集群中的所有 Secret 对象。GKE 这样做是为了确保所有 Secret 均由新的 Cloud KMS 密钥加密,或者在您配置为不加密的情况下以不加密形式写入。
此更新操作可能会因以下任一情况而失败:
- 在更新过程中,Kubernetes 控制平面暂时不可用。
- 用户定义的
AdmissionWebhook
会阻止 GKE 更新 Secret 对象。 - 在更新操作完成之前,已更新或之前的 Cloud KMS 密钥会被停用。
在更新操作成功之前,请勿与更新后的 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。