如何以简单的方式在不停机的情况下更换负载均衡器 Docker 容器

How to replace load balancer Docker container with no downtime in a simple way

我在同一主机上 运行 大约 30 个不同的站点,每个站点都使用 docker-compose 进行管理。其中一些使用 Nginx,一些使用 Apache。然后有一个反向代理容器暴露在运行 Nginx 的互联网上,有一堆虚拟主机并将流量重定向到正确的容器。那 30 个不同的网站只是我尝试各种想法,他们没有很多客户。

我知道使用 docker-compose 对于生产用途是不明智的,因为使用新版本关闭和重新打开容器仍然需要时间(<3 秒)。我也知道 docker swarm 和 K8S,如果这 30 个不同站点中的任何一个变得足够大,我就会使用它们。到那时,我可能会重组所有内容以实现零停机部署。但是我问的是不同的。

我仍然想使用 docker compose 管理普通容器,因为它非常方便,而且因为我只有 1 个节点,所以 运行 K8S 会有点矫枉过正,不会真的有零停机部署。但是,我想时不时地更换反向代理容器(可能每周 1-3 次)并且我不希望单个容器出现任何停机时间,因为所有这 30 个站点都会受到影响。我可以接受单个站点 <3 秒的停机时间,因为大多数站点根本不会更改,并且那些更改的站点是实验性的,但我开始对反向代理的 <3 秒停机时间感到不舒服。

那么有没有办法让我在不停机的情况下更换反向代理容器?真正简单轻便的东西?不必使用 docker 组合,但总体上仍应使用容器。我正在考虑这些:

还有其他选择吗?

使用 Kubernetes。即使在单个节点上,它也旨在为您管理大部分这些问题,当您确实想要移动到多个主机时,99% 的问题都已准备就绪。会有一个学习曲线,但这是值得的。

我建议使用托管服务 (DigitalOcean, EKS, GKE, AKS) but a single node cluster that includes the management can be quickly setup with microk8s

docker 组合配置可以很容易地与 kompose 一起使用。

一个Kubernetes ingress controller, usually nginx would replace the reverse proxy functionality and rarely needs to be replaced except for upgrades. Ingress configuration is automatic from ingress definitions。在极少数升级情况下,Kubernetes 能够以不停机的方式管理它(如果设置为的话)。入口控制器只是另一个部署。

我最后做的是在当前负载均衡器的 2 个副本(称为 B 和 C)之前放置另一个负载均衡器(称为 A)。假设 A 永远不会停机并且永远不需要更新,我可以更新 B(同时流量将流向 A,然后是 C,然后是应用程序),然后我可以更新 C(同时流量将流向 A,然后是 B,然后是应用程序)。我知道 K8S 中的 Deployments 和 ReplicaSets 正是这样做的,但是在我的情况下使用 K8S 仍然是不合理的,因为它很复杂而且很重。

对于阅读本文的任何人,我仍然建议使用 K8S,因为 K8S 是合法的,可以帮助您轻松管理您的网站。