Kubernetes StatefulSet 中的 Hashicorp Vault 自定义插件升级

问题描述 投票:0回答:1

我写信是为了寻求帮助,以改进运行 Vault 的 Kubernetes StatefulSet 的自定义插件升级流程。

我们当前的设置如下:

  • 我们为 Vault 开发了自己的插件。
  • 我们在 StatefulSet 中有 3 个采用“RollingUpdate”策略的 Vault Pod 副本。
  • 当 pod 开始运行时,它会检查其 init 容器是否有新的插件版本,如果有,它会通过注册其校验和来升级插件。
  • 主 pod 容器仅运行 Vault 服务器。

可能的升级场景之一如下:

  1. StatefulSet 中更新了新的 Vault 映像。
  2. Vault-2 Pod 重新启动。这是领导舱。现在 Vault-1 被选为领导 Pod。
  3. Vault-2 发现它正在使用与当前注册版本不同的新插件版本运行。
  4. Vault-2 注册新的插件版本。
  5. Vault-2 开始使用新的 Vault 版本运行主容器并进入待机模式。
  6. Vault-1 重新启动。 Vault-0 成为活动 Pod 和领导者。
  7. Vault-0 无法开始运行插件,因为它的旧二进制文件与新注册的校验和不匹配。
  8. Vault-1 开始运行新的 Vault 版本并进入待机模式。
  9. Vault-0 重新启动。 Vault-2 被选为领导 Pod。
  10. Vault-2 开始运行新的插件版本。

在这种情况下,从步骤 4(甚至步骤 2)到步骤 10 会出现停机,因为 Leader Pod 无法向插件提供请求(校验和不匹配)。最长可达 2 分钟。这是最坏的情况。有时,Vault-2 会立即被选为领导者,在这种情况下几乎没有停机时间。

我想知道我们如何改善最坏的情况以减少停机时间。 先谢谢你了

PS 我发现有时向运行旧插件版本的领导者 Pod 发出的请求可以成功,有时相同的请求会失败,并显示错误消息 failed to run Existence check (checksums did not match) 什么决定请求成功或失败?

kubernetes hashicorp-vault vault
1个回答
0
投票

您拥有在当前版本的 Vault 中使用此功能所需的一切。但你必须遵守规则。它们在这里,带有我为实现它们而编写的 Makefile 的链接:

  1. 插件的每个版本都必须在文件名中包含其版本
  2. 将包含两个版本插件的 Vault 映像部署到每个节点。可能是一个容器,一个使用 Ansible 部署的 Linux 服务,这并不重要。使其成为一个包含所有内容的单一单元。
  3. 等待(如果需要,重试)部署完成
  4. 注册并激活新插件
  5. 让 Vault 就新版本的使用达成共识。

到达步骤 3 后,您就处于稳定状态,可以发生领导者更改,而不必担心注册的实际插件版本。注册新插件将是原子的,并通过共识进行复制,因此要么每个节点都会获得它,要么没有一个节点会获得它。

© www.soinside.com 2019 - 2024. All rights reserved.