无需停机即可更新Docker容器


17

假设我有一个带Web服务器的Docker容器(例如Apache 2)。现在,我想更新其下的操作系统。SF回答说,最好的方法是重建基础映像和我的Apache映像。但是部署映像意味着停机,因为必须先删除旧容器才能创建新容器,因此只有一个容器绑定到端口80/443。

但是如何在零停机时间内部署此更新?我应该使用负载均衡器并使用容器间通信吗?以及如何更新负载均衡器?

Answers:


18

理想的目标方案

是的,您应该使用负载平衡器并一次更新一个实例。我不确定容器间的通信来自何处。

举例来说,假设您有一个为站点A服务的负载平衡器。用户仅以站点A的身份连接,并且仅以站点A的身份知道。负载平衡器知道有两个或多个后端(B,C等),无论它们是VM还是容器都无关紧要。

然后,您要升级后端,在本例中为Apache实例。

  1. 将B从负载平衡器的合格后端中删除,使其不再接受任何流量。
  2. 等待当前活动的请求得到处理并关闭现有连接。
  3. 更新服务于B的容器或基础VM
  4. 重新启动B,等待其加载并开始工作
  5. 测试B以确保它正确地服务于新请求
  6. 将B添加回负载平衡器后端池以重新启用流量

然后,对C,D等执行相同的过程。

请注意,从2013年11月开始,就公开请求对Docker容器进行升级,但是似乎并没有太大进展,因此上述解决方案是您同时应该做的。

如何处理现有的直播网站

大概是在问这个问题,因为您已经在这种模式下运行一个实时站点,并且希望在不停机的情况下进行升级。因此,我们需要逐步达到上述理想目标状态。

假设:

  • 您有一个指向容器的DNS名称
  • 您的容器在某个IP地址上运行
  • 您的用户不知道容器的IP地址,并且没有在任何地方进行硬编码

如果这些假设是错误的,则应首先对其进行修复,以确保正确。

然后,请按照下列步骤操作:

  1. 在新IP上创建负载均衡器,并将其指向现有容器作为唯一的后端
  2. 更改DNS以指向负载均衡器,而不是直接指向容器IP
  3. 使用相同的VM +容器设置添加相同的Apache后端
  4. 现在您有一个具有两个后端B和C的负载均衡器,因此请按照“理想目标方案”部分中的说明进行一次升级

如何更新负载均衡器

简单(托管)方式

最简单的选择是不运行自己的平衡器。例如,如果您使用的云平台将负载均衡作为服务提供,请考虑使用它,然后维护和更新负载均衡器就不成问题了。

手动方式

如果您正在运行自己的负载均衡器,则添加另一层间接访问(即DNS)将有所帮助。让我们假设以下内容:

  • 我们有一个主机名解析为我们要更新的负载均衡器A的IP
  • 我们的负载均衡器的后端池为P1,P2等。

我们进行如下操作:

  • 使用新的软件版本创建新的负载均衡器B
  • 将所有后端池实例P1,P2等作为后端添加到我们的新负载均衡器B中
  • 将B的IP地址与A一起添加到DNS解析中

    • 现在我们有效地使用DNS作为负载均衡器
    • 如果A和B的条目未加权,则实际上是50-50
    • 现在观察B的性能,是否有任何错误等。
    • 如果B有任何问题,请按以下步骤撤消:

      1. 从DNS配置中删除B
      2. 等待DNS中的B条目消失(即,等待TTL过期)
      3. 调低B
  • 假设您已经为B完成了“老化”测试,一切都很好
  • 逐步更新DNS中B 的优先级和权重
  • 从DNS完全删除A
  • 等待DNS TTL过期;A应该不再收到任何请求
  • 调低A

到此为止。

细节,图表和工具

请参阅以下文章和工具,这些文章和工具可以帮助您使流程自动化,但是总体思路是相同的:

道德

“计算机科学中的所有问题都可以通过另一种级别的间接解决,当然,过多的间接问题除外。” 戴维·惠勒


但是,当负载均衡器也位于容器中时(使用CoreOS时),如何更新此容器?
das_j 2015年

@das_j我编辑了答案,添加了如何更新负载均衡器的方法。提示:这都是关于间接的另一层次。:-)
Misha Brukman

1
总而言之,这听起来像是如何更新物理服务器和物理负载平衡器。
Stefan Lasiewski 2015年

@StefanLasiewski,您说的很对,我已经删除了其中一个标题中的“容器”注释。对于外部用户来说,无论应用程序还是负载平衡器是在裸机,容器还是虚拟机上运行,​​在很大程度上都是不可见的。
Misha Brukman 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.