无需停机即可更新Docker容器
假设我有一个带有Web服务器的Docker容器(如Apache 2).现在我想更新它下的操作系统. This SF answer说最好的方法是重建基本映像和我的Apache映像.但是部署映像意味着停机,因为我必须在创建新容器之前删除旧容器,因此只有一个容器绑定到端口80/443.但是,如何在零停机时间内部署此更新?我应该使用负载均衡器并使用容器间通信吗?我如何更新负载均衡器?
理想的目标方案是的,您应该使用负载均衡器并一次更新一个实例.我不确定容器间通信的来源.
例如,假设您有一个为您的站点A提供服务的负载均衡器.用户只能连接到它,并且只知道它为“A”.负载均衡器知道有两个或更多后端(B,C等),以及它们是VM还是容器无关紧要.
然后,您要升级后端,在这种情况下是Apache实例.
>从负载均衡器的合格后端中取出B,使其不再接受任何流量.
>等待当前实时请求被提供并关闭现有连接.
>更新为B提供服务的容器或底层VM
>重新启动B,等待它加载并开始工作
>测试B以确保它正确地提供新请求
>将B添加回负载均衡器后端池以重新启用流量
然后,对C,D等进行相同的处理.
请注意,从2013年11月开始有一个open request for in-place upgrades of Docker containers,但它似乎没有太大进展,所以上面的解决方案是你应该做的同时.
如何处理现有的实时网站
大概是,你问这个是因为你已经在这个模型中运行了一个实时站点,你想在没有停机的情况下升级它.因此,我们需要达到上面的理想目标状态,但需要逐步增加.
我们假设:
>您有一个指向容器的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的priority and weight
>完全从DNS中删除A.
>等待DNS TTL过期; A不应再收到任何请求了
>拒绝A.
你已经完成了
细节,图表和工具
请参阅这些可以帮助您自动化流程的文章和工具,但总体思路是相同的:
> Quay: Zero Downtime deployments
> Zero Downtime Frontend Deploys with Vulcand on CoreOS
道德
“计算机科学中的所有问题都可以通过另一层次的间接解决,当然除了间接太多的问题.” – David Wheeler