应用层 Secret 加密为 Google Kubernetes Engine (GKE) 中的敏感数据(例如凭据和密钥)添加了可配置的安全保护层。此配置出现问题可能会导致这一额外的安全保护层无法正常运行。
您可以使用本文档通过检查 GKE API 集群对象中提供的调试字段,来排查应用层 Secret 加密方面的问题。这些字段有助于您诊断常见错误(例如更新失败或 Cloud KMS 密钥相关问题)的根本原因。
对于负责保护 GKE 集群中存储的敏感信息的平台管理员、运维人员和安全工程师来说,这些信息非常重要。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
更新失败
更新应用层 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 密钥已被停用或销毁,请重新启用该密钥或密钥版本。
错误:无法使用为应用级加密配置的 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 因准入网络钩子而拒绝了更新请求,可能会出现以下错误:
error admission webhook WEBHOOK_NAME denied the request
如需解决此错误,请移除该网络钩子或对其进行修改,以便 GKE 能够在密钥更新期间更新所有命名空间中的 Secret。
错误:命名空间处于受管理状态
如果您尝试在 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 资源(包括 Secret)。
要解决此错误,请执行以下操作:
- 如果您使用
kubectl命令重新加密 Secret,请使用--namespace标志将命令范围限定为您管理的命名空间。 - 如果您使用 CronJob 重新加密 Secret,请仅在您管理的命名空间中部署该 CronJob。
后续步骤
如果您在文档中找不到问题的解决方案,请参阅获取支持以获取进一步的帮助,包括以下主题的建议:
- 请与 Cloud Customer Care 联系,以提交支持请求。
- 通过在 StackOverflow 上提问并使用
google-kubernetes-engine标记搜索类似问题,从社区获得支持。您还可以加入#kubernetes-engineSlack 频道,以获得更多社区支持。 - 使用公开问题跟踪器提交 bug 或功能请求。