理想的目标方案
是的,您应该使用负载平衡器并一次更新一个实例。我不确定容器间的通信来自何处。
举例来说,假设您有一个为站点A服务的负载平衡器。用户仅以站点A的身份连接,并且仅以站点A的身份知道。负载平衡器知道有两个或多个后端(B,C等),无论它们是VM还是容器都无关紧要。
然后,您要升级后端,在本例中为Apache实例。
- 将B从负载平衡器的合格后端中删除,使其不再接受任何流量。
- 等待当前活动的请求得到处理并关闭现有连接。
- 更新服务于B的容器或基础VM
- 重新启动B,等待其加载并开始工作
- 测试B以确保它正确地服务于新请求
- 将B添加回负载平衡器后端池以重新启用流量
然后,对C,D等执行相同的过程。
请注意,从2013年11月开始,就公开请求对Docker容器进行升级,但是似乎并没有太大进展,因此上述解决方案是您同时应该做的。
如何处理现有的直播网站
大概是在问这个问题,因为您已经在这种模式下运行一个实时站点,并且希望在不停机的情况下进行升级。因此,我们需要逐步达到上述理想目标状态。
假设:
- 您有一个指向容器的DNS名称
- 您的容器在某个IP地址上运行
- 您的用户不知道容器的IP地址,并且没有在任何地方进行硬编码
如果这些假设是错误的,则应首先对其进行修复,以确保正确。
然后,请按照下列步骤操作:
- 在新IP上创建负载均衡器,并将其指向现有容器作为唯一的后端
- 更改DNS以指向负载均衡器,而不是直接指向容器IP
- 使用相同的VM +容器设置添加相同的Apache后端
- 现在您有一个具有两个后端B和C的负载均衡器,因此请按照“理想目标方案”部分中的说明进行一次升级
如何更新负载均衡器
简单(托管)方式
最简单的选择是不运行自己的平衡器。例如,如果您使用的云平台将负载均衡作为服务提供,请考虑使用它,然后维护和更新负载均衡器就不成问题了。
手动方式
如果您正在运行自己的负载均衡器,则添加另一层间接访问(即DNS)将有所帮助。让我们假设以下内容:
- 我们有一个主机名解析为我们要更新的负载均衡器A的IP
- 我们的负载均衡器的后端池为P1,P2等。
我们进行如下操作:
- 使用新的软件版本创建新的负载均衡器B
- 将所有后端池实例P1,P2等作为后端添加到我们的新负载均衡器B中
将B的IP地址与A一起添加到DNS解析中
- 现在我们有效地使用DNS作为负载均衡器
- 如果A和B的条目未加权,则实际上是50-50
- 现在观察B的性能,是否有任何错误等。
如果B有任何问题,请按以下步骤撤消:
- 从DNS配置中删除B
- 等待DNS中的B条目消失(即,等待TTL过期)
- 调低B
- 假设您已经为B完成了“老化”测试,一切都很好
- 逐步更新DNS中B 的优先级和权重
- 从DNS完全删除A
- 等待DNS TTL过期;A应该不再收到任何请求
- 调低A
到此为止。
细节,图表和工具
请参阅以下文章和工具,这些文章和工具可以帮助您使流程自动化,但是总体思路是相同的:
道德
“计算机科学中的所有问题都可以通过另一种级别的间接解决,当然,过多的间接问题除外。” — 戴维·惠勒