跳转到内容

无停机变更部署

Goal

新镜像无缝接管流量,如果新镜像未通过健康检查,系统会自动回滚到旧版本。

Before you start

  • 一个具有 exec 类型健康检查且实际运行的部署。没有健康检查,就无法知晓就绪状态,且前置条件会被检查。
  • 没有读写命名卷、没有可写绑定挂载、也没有发布节点端口:两个版本无法共享这些资源。
  • 您自己证明两个版本可以短暂同时运行。这永远不会被推断出来。

Steps

  1. 打开部署并选择更新策略。
  2. 选择滚动策略,确认允许并发版本,并设置激增和不可用数量。
  3. 设置健康超时、驻留时间和整个滚动更新的截止时间。
  4. 选择如果未完成时的操作:暂停或回滚。
  5. 更改镜像并部署。
Odysseus 仪表板中打开的单个部署,其中显示了在步骤 1 到 4 中设置的更新策略、激增和不可用计数以及滚动更新时间,旁边是部署的当前镜像和副本状态。

Verify

在变更期间,副本计数永远不会低于您设定的最小值,并且部署最终会使用新镜像,且每个副本都处于健康状态。

仅更改副本数不属于滚动更新,也无需执行滚动更新。扩大或缩小集群会增加或移除容器,而保持现有运行容器不变,因此唯一需要检查的是新的副本数。平台通过将现有容器与其构建时的规格进行比较来决定是否需要替换它,而副本数不属于该规格的一部分——它决定数量,而非内容。

Evidence this worked

GET /api/v1/deployments/{name}/history 列出了创建的修订版本,且部署的当前镜像已是新版本。若触发了回滚操作,则之前的修订版本将保持为当前状态——历史记录是区分“操作成功”与“已为您回滚”的依据。

When it fails

  • 滚动更新在应用时被拒绝。 渐进式策略有四个前置条件,拒绝信息会指明是哪个条件失败了。最常见的是缺少两个版本可以共存的证明。
  • 健康检查存在但未产生探针。 这现在会被拒绝,这也是该前置条件变得有意义的原因——参见 健康检查与进程回收。
  • 滚动更新中途停止。 它达到了你设定的截止时间并执行了你选择的失败操作。
  • 所有代码:拒绝与变更。