排查应用层 Secret 加密问题


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

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。