排查应用层 Secret 加密问题


本页面介绍了如何解决与 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 的值 说明

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 密钥已被停用或销毁,请重新启用该密钥或密钥版本。

无法更新 Secret

如果 Kubernetes API 因准入网络钩子而拒绝了更新请求,可能会出现以下错误:

error admission webhook WEBHOOK_NAME denied the request

如需解决此错误,请移除该网络钩子或对其进行修改,以便 GKE 能够在密钥更新期间更新所有命名空间中的 Secret。