Swarm mode 与滚动升级
现实环境中,当我们一个服务需要更新的时候,我们不希望在我们的更新期间,用户无法访问。我们期望的是用户无感知的更新。
什么是滚动更新
比如升级redis,从6.0.2--> 6.0.5.假设一共有3个redis实例,我们希望的是,更新的时候先停止一个,在更新,更新完成这个之后,再停止另一个,以此类推,而不是一下子把所有的都停止。
更新演示
在manager 上创建redis ,并设置10s 的更新延迟
$ docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:6.0.2-alpine
在部署service时可以配置滚动更新策略。
--update-delay
定义滚动更新的时间间隔单位 s、m、h,1小时20分30秒即 1h20m30s
--update-parallelism
定义并行更新的副本数量默认情况下,调度程序一次更新1个任务。
--update-failure-action 定义容器启动失败之后所执行的动作
默认情况下,当对单个任务的更新返回状态为时 RUNNING
,调度程序将调度另一个任务进行更新,直到所有任务都被 更新为止。如果在更新期间的任何时候有任务返回FAILED
,则调度程序将暂停更新。
查看redis 服务详情
$ docker service inspect --pretty redis
ID: le65nwbn0ve1e6es35v3c1mw9
Name: redis
Service Mode: Replicated
Replicas: 3
Placement:
UpdateConfig:
Parallelism: 1
Delay: 10s
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: redis:6.0.2-alpine@sha256:b7e093c1a1cd040698fc28e4be453d8df1a46323fa4178d6d2d5fcb3bff88c10
Init: false
Resources:
Endpoint Mode: vip
更新redis
$ docker service update --image redis:6.0.3-alpine redis
服务回退
现在假设我们发现 redis升级出现了一些问题,我们可以使用命令一键回退。
$ docker service rollback redis
默认只能回滚到上一次操作的状态,并不能连续回滚到指定操作
查看更新
docker service ps
命令查看 redis
服务详情。
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lvn2qtaf74if redis.1 redis:6.0.2-alpine node2 Running Running 26 minutes ago
sw5zvvzj27vq redis.2 redis:6.0.3-alpine node3 Running Preparing 16 seconds ago
wsbl9ppdg1at \_ redis.2 redis:6.0.2-alpine node3 Shutdown Shutdown 14 seconds ago
b9q04utfzl0m redis.3 redis:6.0.2-alpine node1 Running Running 26 minutes ago
结果的输出详细记录了服务的部署、滚动升级、回退的过程。
官方文档
URL https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/