一,简介

这么一个场景,当我们一个服务需要更新的时候,我们不希望在我们的更新期间,用户无法访问。我们期望的是用户无感知的更新。现实中比如Redis 版本升级 4.0.4 -> 4.0.5,假设一共有3个redis实例,我们希望的是,更新的时候先停止一个,在更新,更新完成这个之后,再停止另一个,以此类推,而不是一下子把所有的都停止。在服务特别多的时候,这么做无疑是痛苦的,正好Docker帮我们现实了。下面我们来演示一下。

二,更新演示

2.1,创建 redis 服务,版本 4.0.4

docker service create --name redis --replicas 3 redis:4.0.4

2.2,查看实例运行情况

docker service ps redis

2.3、升级 redis 服务到 4.0.5 版本

docker service update --image redis:4.0.5 redis

2.3、查看 redis 服务的任务列表

docker service ps redis

上图可以看出是以此更新

三,其他

1、任务或任务组之间更新延迟时间的设置

使用 --update-delay 来配置,单位 s、m、h,1小时20分30秒即 1h20m30s

2、任务调度器并行任务数量的配置

默认并行任务的数量为 1,如上案例所示,redis 服务有 3 个副本,在更新过程中,会有 3 个新的任务来执行 3 个副本的更新,由于最大并发任务执行量是 1,所以 3 个副本会依次更新。

可以通过 --update-parallelism 来配置最大任务并发执行数量。

3、任务更新失败的情况

默认情况下,当对单个任务的更新返回 RUNNING 状态时,调度程序开始更新另一个任务,直到所有任务都更新。如果在更新期间任务返回 FAILED 状态,则调度程序会暂停更新。

可以使用 docker service create 或 docker service update 的 --update-failure-action 来控制失败后的行为。

4、滚动升级的条件

服务平滑升级需要至少2个副本,单副本服务在更新过程中不可用。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐