正如@Rico 提到的那样,在 Vault 和 Kubernetes 中暴露这些秘密首先违背了使用 Vault 的目的。
使用 Vault,数据被加密(传输/休息),您可以提供对谁可以访问哪些数据的访问粒度控制。将 Vault 中的数据暴露给基本上仅限于 base64 编码的 Kubernetes Secret 对象,将在很大程度上破坏 Vault 的最大好处,即保护您的基础设施并成为负责管理您的秘密的单一实体。
Vault 是一个很棒的工具,但在我看来,它对于非开发配置可能会变得相当复杂,因为您将不得不附加 Consul 之类的工具,这样您就可以拥有持久的后端存储,因此使用架构分布式模式,例如因为sidecar 模式也可能过于矫枉过正,根本不推荐。
- 但是有了它,您可以在与您的“主”容器相同的 Pod 中“生活”一个 Vault 实例,因此可以利用 Vault 提供的加密服务,但我们会将 Vault 的生命周期与 Pod 的生命周期联系起来。
- 使用这种方法,我们需要在每个 Pod 上都有一个 Vault 实例,以防我们计划必须访问秘密信息,这只会使系统变得极其复杂。通过这种方法,我们可以将每个对象所需的秘密信息分离到多个保管库实例上,从而将我们基础设施的秘密信息传播到多个地方,但我们不断增加管理基础设施的挑战。
因此,我完全理解,试图找到一种方法将 Pod 所需的秘密信息放在它旁边似乎很诱人,特别是以一种简单的方式,但如果它完全不加密,肯定会达不到目的。
既然这样,为什么不简单地创建一个 Vault 控制器,该控制器将是负责与 Vault 交互的实体,其将负责查询 Vault 的 Wrapped Tokens,它可以在被 Pod 内的初始化容器解包?这是因为启动 Pod 需要额外的时间,因为我们需要执行一些早期调用来检索 Wrapped Token?或者是因为在需要从 Vault 查询秘密数据时必须执行额外调用的额外延迟?
每当我想到集成 Kubernetes 和 Vault 的想法时,我通常倾向于考虑以下由 Kelsey Hightower 解释的原型。