升级Deis

就地(in-place)升级

本地升级在相同的主机上用新版本来替换平台容器,然后保持你的应用和平台数据如初。这是最简单和中断性最少的升级策略。通常的方法是使用deisctl来卸载所有平台的组件,然后升级平台的版本然后重新安装平台的组件。

重要提示:
始终使用跟Deis版本符合的deisctl的版本。可以用deisctl —version来进行验证。

使用如下的步骤来进行一次就地升级。

  1. $ deisctl stop platform && deisctl uninstall platform
  2. $ deisctl config platform set version=v1.0.2
  3. $ deisctl install platform
  4. $ deisctl start platform

注意:

就地升级大概会让部署的应用,网格路由组件和平台的控制面板组件停机10到30分钟。请据此来安排你的维护时间。

迁移(migration)升级

这种升级方法会生成一个新的集群与老的集群并行运行。应用然后会一个一个的迁移到新的集群上,并且DNS的记录基于单个应用的会被更新来截断访问。这样的结果是没有停机时间,但是缺点是老的集群的数据会丢失(如用户,发布版本等)。将来的deisctl工具将会有用来导出导入这种平台数据的工具。

提示:
迁移升级对于将Deis转移到新的机器上很有用,但是对于其他情形应该避免因为需要耗费较大的人力工作。

重要提示:
要迁移应用,你的新的集群必须要能网络访问到老集群中的注册组件。

枚举现有的应用

每一个应用都需要手动的部署到新的集群上。以admin的用户登进老的集群上然后使用deis客户端收集你部署的应用的信息:

用如下命令列出所有的应用:

  1. $ deis apps:list

用下面的命令来收集每一个应用的信息:

  1. $ deis apps:info -a <app-name>

准备服务器

跟着Deis的文档来准备一个使用你想要的版本的新的集群。确保使用新的etcd的发现URL以避免新的集群不会干扰运行中的集群。

升级Deis客户端

如果改变了版本,确保你同时升级你的deis和deisctl客户端,确保版本与集群版本一致。

注册并登陆进新的控制器组件

在新的控制器组件注册一个账户然后登陆:

  1. $ deis register http://deis.newcluster.example.org
  2. $ deis login http://deis.newcluster.example.org

迁移应用

deis pull命令可以让迁移已有的应用从一个集群上到另一个集群上变得容易。然而,你必须要能网络访问到老的集群中的注册表组件。

用如下命令来迁移一个单一的应用:

  1. $ deis create <app-name>
  2. $ deis pull registry.oldcluster.example.org:5000/<app-name>:<version>

这会在集群之间移动应用的docker镜像,保证应用是一个比特一个比特的迁移,保证build和配置都完全一样。

现在每一个应用都运行在了新的集群上了,但是他们都还仍运行(并且在服务访问)在老的集群上。使用deis domains:add 来告诉deis这个应用可以通过其老的名字访问:

  1. $ deis domains:add oldappname.oldcluster.example.org

然后将这个命令为每一个应用重复一遍。

测试应用

进行测试确保应用在新的Deis集群上仍然正常运行。

更新DNS记录

对于每一个应用,创建一个CNAME记录来将老的应用名字指向新的应用名字。注意一旦这些记录向上传送,新的集群就会开始服务请求。你可以基于单个应用的的截断流量,慢慢的取代老的集群。

如果一个应用在旧的集群上的名字叫”happy-bandit”,然后在新的集群名字变成了”jumping-cuddlefish“,你需要创建一个DNS记录如下:

  1. happy-bandit.oldcluster.example.org. CNAME jumping-cuddlefish.newcluster.example.org

废掉老的集群

一旦所有的应用都确认正常运行,老的集群就可以退休了。

升级CoreOS

Deis默认禁止CoreOS自动的升级。这一部分的原因是我们之前遇到过etcd/fleet的版本在集群中的主机一个一个的升级的情况下会出现不兼容的情况。另外一部分的原因是,Deis自定义了CoreOS的云配置文件,单纯的升级CoreOS而不考虑cloud-config的改变会导致deis运转不正常。

重要提示:

启用CoreOS的升级的结果是,升级到最新的CoreOS的版本在特定的渠道里面可用。有时,新的CoreOS的版本的改变会让Deis无法正常运行。我们建议总是准备一个Deis的版本的时候使用该发行版本中的脚本和文档中指定的CoreOS版本。

尽管通常我们不推荐,有时有可能会触发CoreOS机器的升级。有的Deis的发行版本会推进行CoreOS的升级,在这些情况下,发行的提示会指向此文档。

要升级CoreOS,运行如下的命令:

  1. $ ssh core@<server ip>
  2. $ sudo su
  3. $ systemctl unmask update-engine.service
  4. $ systemctl start update-engine.service
  5. $ update_engine_client -update
  6. $ systemctl stop update-engine.service
  7. $ systemctl mask update-engine.service
  8. $ reboot

警告:

你应该一次只升级一个主机。同时移除多个主机可能导致etcd集群的不正常。在开始升级另外一个主机之前用fleetctl list -machines来保证最近重启过的机器已经回到了集群中。

你可以运行如下的命令来检查CoreOS的版本:

  1. $ cat /etc/os-release

或者在本地机器上:

  1. $ ssh core@<server ip> 'cat /etc/os-release'