本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.25:KMS V2 改进

在 Kubernetes v1.25 中,SIG Auth 正在引入密钥管理服务 (KMS) API 的新 v2alpha1 版本。 正在进行许多改进,我们很高兴能够开始改进 KMS 的新路径!

什么是 KMS?

在保护 Kubernetes 集群时,首先要考虑的事项之一是对静态存储的 API 数据进行加密。KMS 为提供程序提供了一个接口,可以利用存储在外部密钥服务中的密钥执行此加密。

自 v1.10 版本以来,使用 KMS v1 进行静态加密一直是 Kubernetes 的一项功能,并且在 v1.12 版本中目前处于 beta 阶段。

v2alpha1 中有哪些新功能?

虽然原始的 v1 实现成功地帮助 Kubernetes 用户加密了 etcd 数据,但它在一些关键方面存在不足

  1. 性能: 启动集群时,所有资源都会被串行获取和解密以填充 kube-apiserver 缓存。当使用 KMS 插件时,由于向远程保险库发出大量请求,这可能会导致启动时间变慢。此外,根据集群中存在的加密资源数量,可能会达到外部密钥服务上的 API 速率限制。
  2. 密钥轮换: 使用 KMS v1,密钥加密密钥的轮换是一个手动且容易出错的过程。很难确定集群中正在使用哪些加密密钥。
  3. 健康检查和状态: 在 KMS v2 API 之前,kube-apiserver 被迫进行加密和解密调用作为代理,以确定 KMS 插件是否健康。对于云服务,这些操作通常会花费实际的云服务费用。无论成本如何,这些操作本身都无法提供对服务健康状况的全面了解。
  4. 可观察性: 如果没有某种跟踪 ID,就很难关联在 kube-apiserver、KMS 和 KMS 插件的各种日志中找到的事件。

KMS v2 增强功能尝试解决所有这些缺点,尽管并非所有计划的功能都在初始 alpha 版本中实现。以下是在 Kubernetes v1.25 中进行的改进

  1. 支持使用密钥层次结构的 KMS 插件,以减少向远程保险库发出的网络请求。要了解更多信息,请查看 KMS 插件如何利用密钥层次结构的设计细节
  2. 现在跟踪额外的元数据,允许 KMS 插件与 kube-apiserver 通信其当前正在使用的密钥,从而允许在不重启 API 服务器的情况下进行轮换。存储在 etcd 中的数据遵循更标准的 proto 格式,允许外部工具观察其状态。要了解更多信息,请查看 有关元数据的详细信息
  3. 使用专用的状态 API 将 KMS 插件的健康状况与 API 服务器通信。要了解更多信息,请查看 有关状态 API 的详细信息
  4. 为了提高可观察性,v2 API 的 EncryptRequestDecryptRequest 中包含了一个新的 UID 字段。为每个信封操作生成 UID。要了解更多信息,请查看 有关可观察性的详细信息

时序图

加密请求

Sequence diagram for KMSv2 Encrypt

解密请求

Sequence diagram for KMSv2 Decrypt

接下来是什么?

对于 Kubernetes v1.26,我们预计会发布另一个 alpha 版本。到目前为止,alpha API 将准备好供 KMS 插件作者使用。我们希望在下一个版本中包含一个参考插件实现,届时您将可以试用该功能。

您可以通过阅读使用 KMS 提供程序进行数据加密来了解有关 KMS v2 的更多信息。您还可以关注 KEP 来跟踪后续 Kubernetes 版本的进展。

如何参与

如果您有兴趣参与此功能的开发或想分享反馈,请在 Kubernetes Slack 上的 #sig-auth-kms-dev 频道上联系我们。

您还可以参加每隔一周举行的 SIG Auth 会议,会议时间为每隔一周的星期三。

致谢

此功能是来自多家不同公司的贡献者共同努力的成果。我们要衷心感谢为实现这一目标付出时间和努力的每个人。