服务升级
通过UI进行升级
任何服务都可以通过UI来进行升级。和类似,您之前选择的全部Docker参数都会被保留,您可以修改这些参数的值。额外还有一些升级专用的选项:
- 批量大小:服务中的容器升级会被分成几批,批量大小代表每次您想要停掉的旧容器数量和启动的新容器数量。例如一共有10个容器要升级,当批量大小为2时,每次会升级2个容器,停掉2个旧的,启动2个新的,分5批完成升级。
- 批量间隔:每次批量升级间隔的时间,例如10个容器,每次升级5个,批量时间为5秒。在完成5个容器升级后,在等待5秒后,会升级剩下的5个容器。
当全部旧的容器被停掉,新的容器启动成功之后,服务将会变成 Upgraded 状态。在这个阶段,您应该去测试您的新服务来确保服务可以正常工作。然后,可以通过点击升级完成来完成升级。如果您的服务出现了异常,您可以点击回滚来回退到之前的服务。
通过Rancher Compose命令行进行服务升级
通过Rancher Compose命令行进行服务内升级时,现有服务会按照docker-compose.yml
中的内容进行升级,服务中旧的容器会被删除。升级相关的参数需要传递给rancher-compose up
命令。如果命令加上—upgrade
参数,docker-compose.yml
内定义的服务如果发生了改变,这个服务会被按照文件中的配置进行升级。和在UI上进行升级操作一样,服务内升级分为两个步骤,需要用户确认来完成升级或者执行回滚。
第一步: 进行升级
升级的时候,您可以通过docker-compose.yml
文件升级整个应用栈或者升级应用内指定的服务。
升级选项
拉取镜像
在升级时,您可能需要在部署容器之前执行docker pull
,因为主机上可能已经有了该镜像的缓存。您可以通过—pull
参数,在部署容器之前拉取最新的镜像。
- # 在升级时,强制每台主机在部署容器之前,执行docker pull更新镜像
- $ rancher-compose up --upgrade --pull
批量大小
在默认的情况下,每批升级服务的2个容器。您可以通过—batch-size
参数来设置每批所更新的镜像数量。
- # 升级服务时每次会启动3个新的容器
- # 直到新的容器达到设置的数量
- $ rancher-compose up --upgrade --batch-size 3
在默认的情况下,每次新的容器启动和旧的容器停止之间有2秒的时间间隔。您可以通过—interval
来覆盖这个时间间隔,参数后面跟着的时间间隔是以毫秒为单位的。
- # 将服务的升级间隔设置为30秒。
- # service1和service2的新容器启动和他们的旧容器停止之间为30s
- $ rancher-compose up --upgrade service1 service2 --interval "30000"
在停止旧的容器前启动新的容器
在默认的情况下,服务内升级会先停掉旧的容器,再启动新的容器。如果想要先启动新的容器,再停止旧的容器,您需要在文件中写入如下内容。
- version: '2'
- services:
- myservice:
- upgrade_strategy:
- start_first: true
- # 通过上面的rancher-compose.yml配置,会先启动myservice服务中的新容器,然后再停掉旧容器。
- $ rancher-compose up --upgrade myservice
第二步:确认升级
在您验证该服务升级成了并且可以正常工作了之后,您需要在Rancher里确认升级成功。这种设计是因为有时候您可能想要回滚您的服务。当您点击完成升级后,就不能再进行回滚操作了
回滚
在升级过程完成之后,您的服务可能发生了问题不能正常工作。Rancher支持回滚功能,可以把服务回滚到升级之前的状态。回滚操作只能在点击完成升级之前进行。
- # 回滚到之前的版本
- $ rancher-compose up --upgrade --rollback
替换式升级
替换式升级会通过创建一个新的服务来替换旧的服务,而不是在同一个服务内停止旧的容器并启动新的容器。只有Rancher Compose命令行才支持这种升级方式,UI上不可以。替换式升级操作非常简单:
- $ rancher-compose upgrade service1 service2
service2
是您想要在Rancher里启动的新服务的名字。service1
是您想要在Rancher里停止并替换的服务。当service2
被部署之后,service1
里面的容器会被删除,但是服务本身并不会从Rancher里删除,只是容器的数量会变为0。
这两个服务名都需要被定义在docker-compose.yml
里面。service1
只需要把服务名在yml文件中定义即可,Rancher Compose会用这个名字来找到相应的服务。service2
则需要在yml文件中定义全部需要的配置,Rancher Compose命令行会根据文件中的配置来部署service2
。
示例 docker-compose.yml
- version: '2'
- service1:
- # 这里不需要额外的参数,因为service1已经在运行中了。
- service2:
- image: wordpress
- links:
- - db:mysql
默认情况下,全部的指向service1
的负载均衡或者是服务连接都会被自动更新并指向service2
。如果您不想创建这些连接,您可以通过设置来。
升级过程中的容器数量
直到新的服务中的容器数量和旧的服务中的容器数量达到您设定的数量时,旧服务中的容器才会被删除。
示例:
- $ rancher-compose upgrade service1 service2 --scale 5
service1
中有两个容器,您想要把它升级为service2
,service2
中想要启动5个容器。
Upgrade命令的参数
命令,可以接受几个参数来自定义升级行为。
批量大小
在默认情况下,升级的时候每次启动2个新服务的容器。您可以通过—batch-size
参数来设置每批启动的容器个数。
- # 升级的过程中,每批将会启动3个service2的容器,直到service2的容器数量达到设定的值。
- $ rancher-compose upgrade service1 service2 --batch-size 3
最终数量
在默认情况下,新服务的容器数量和旧服务之前运行的容器数量相同。您可以通过传递—scale
参数,来设置新服务所运行容器的数量。
批量间隔
在默认的情况下,每次新的容器启动和旧的容器停止之间有2秒的时间间隔。您可以通过—interval
来覆盖这个时间间隔,参数后面跟着的时间间隔是以毫秒为单位的。
- # 将服务的升级间隔设置为30秒。
- # service1和service2的新容器启动和他们的旧容器停止之间为30s
- $ rancher-compose upgrade service1 service2 --interval "30000"
更新连接
在默认情况下,全部指向旧服务的连接会被设置到新服务上。如果您不想让那些服务连接到新的服务的话,您可以通过—update-links="false"
参数来禁止这些连接的创建。
- # 不把指向service1中的连接设置到service2上
- $ rancher-compose upgrade service1 service2 --update-links="false"
等待升级完毕
在默认情况下,Rancher Compose命令行在向Rancher发出升级命令后就会立刻退出。退出的时候升级可能还没执行完毕。通过传递—wait
或者-w
到upgrade
命令,Rancher Compose命令行将在旧的容器被停止且新容器启动后才退出。
- # 等待升级完成
- $ rancher-compose upgrade service1 service2 --wait
拉取新镜像
在升级时,您可能想在部署容器之前执行docker pull
,因为主机上可能已经有了该镜像的缓存。您可以通过—pull
或者-p
参数,在部署容器之前拉取最新的镜像。
- # 在启动容器时,先执行docker pull获取最新镜像
- $ rancher-compose upgrade service1 service2 --pull
清除旧的服务
- # 升级完成后删除service1