1

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

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

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

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

  • 使用 KIND(Kubernetes IN Docker),它在单个主机上运行并创建容器,以便它们显示为节点。这需要 800MB-1GB 的 RAM,所以它是不可取的
  • 无限期保持反向代理容器,更改其中的配置,重新启动 Nginx(<1 秒停机时间),但这严重违背了容器的目的,我不能再不关心容器了,这是最初的我想将应用程序容器化的原因。

还有其他选择吗?

4

2 回答 2

3

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

我建议使用托管服务(DigitalOceanEKSGKEAKS ),但是可以使用microk8s快速设置包含管理的单节点集群。

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

一个Kubernetes 入口控制器,通常是nginx会替换反向代理功能,除了升级之外很少需要替换。入口配置是根据入口定义自动进行的。在极少数升级的情况下,Kubernetes 能够以不停机的方式进行管理(如果设置为)。入口控制器只是另一个部署。

于 2020-01-19T05:34:17.477 回答
1

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

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

于 2020-01-21T21:25:16.393 回答