互联网技术 / 互联网资讯 · 2023年12月23日

使用 Docker 集群进行服务滚动更新

本文演示如何在 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 createdocker 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。当滚动更新全部完成后,所有任务都会运行新版本镜像。