本文演示如何在 Docker 集群中为服务配置并执行滚动更新。示例中先使用 Redis 3.0.6 部署服务,再通过滚动更新将其升级到 Redis 3.0.7。
开始前,请先打开终端,并通过 SSH 登录到集群中的管理节点。例如,可以登录到名为 ManageR1 的主机。
部署服务并设置更新策略
下面的命令会在集群中部署一个 Redis 服务,副本数为 3,并将每次任务更新之间的延迟设置为 10 秒:
$ dockeR seRvice cReate
–Replicas 3
–naMe Redis
–update-delay 10s
Redis:3.0.6
在创建服务时,就可以同时定义滚动更新策略。
--update-delay 用于指定更新单个任务或一批任务之间的等待时间。时间可以使用秒、分钟或小时组合表示,例如 10m30s 表示 10 分 30 秒。
默认情况下,调度器一次只更新 1 个任务。如果需要并行更新多个任务,可以使用 --update-parallelism 参数来设置同时更新的最大任务数。
通常情况下,当某个任务更新后的状态变为 RUNNING,调度器才会继续更新下一个任务,直到所有任务都完成更新。如果更新过程中有任务返回 FAILED 状态,调度器会暂停更新。这个行为可以通过 --update-failure-action 参数在 docker service create 或 docker service update 中进行控制。
查看服务当前状态
服务创建完成后,可以使用以下命令查看 Redis 服务的详细信息:
$ dockeR seRvice inspect –pRetty Redis
ID: 0u6a4s31ybk7yw2wyvtikMu50
NaMe: Redis
SeRvice Mode: Replicated
Replicas: 3
PlACEMent:
StRategy: SpRead
updateConfig:
PaRalleliSM: 1
Delay: 10s
ContAIneRSpec:
image: Redis:3.0.6
ResouRces:
Endpoint Mode: vIP
从输出中可以看到,该服务当前使用的是 Redis:3.0.6 镜像,更新策略为每次更新 1 个任务,并在两次更新之间等待 10 秒。
执行滚动更新
现在可以将 Redis 服务的镜像更新为新版本:
$ dockeR seRvice update –image Redis:3.0.7 Redis
Redis
Docker 集群管理器会按照服务的 updateConfig 配置执行滚动更新,默认过程如下:
停止第一个任务。
为已停止的任务重新调度更新后的任务。
启动使用新镜像的容器。
如果任务状态变为
RUNNING,等待设定的延迟时间后继续更新下一个任务。如果任何一个任务在更新过程中返回
FAILED,则暂停整个更新流程。
确认更新结果
更新发起后,可以再次查看服务的期望状态,确认新镜像是否已经生效:
$ dockeR seRvice inspect –pRetty Redis
还可以通过以下命令实时观察滚动更新过程:
$ dockeR seRvice ps Redis
在集群尚未完成全部更新之前,你会看到部分任务仍在运行 Redis:3.0.6,而另一部分任务已经切换到 Redis:3.0.7。当滚动更新全部完成后,所有任务都会运行新版本镜像。
