在 AWS ECS 服务中管理 docker 个容器的最佳实践

Best practices to manage docker containers in AWS ECS service

技术堆栈

Python (Monolith API) - Flask 框架 PostgreSQL

我们已经部署了docker容器如下

由于 OOM(内存不足)问题,我们现在面临停机几天,然后给定 EC2 实例中的容器开始移动到另一个 EC2 实例,当由于某种原因第三个 EC2 实例不可用时,会发生这种情况,因此,在第二个实例启动并且 运行 之前,我们将面临给定容器集的停机时间。

所以想检查一下我们使用的策略是否正确?

我们现在还计划让小型 EC2 实例容纳较少数量的容器,因此如果发生问题,那么至少有少量站点出现故障,而不是所有 15 个站点都出现故障,我们的方向是否正确?

我们应该搬到 Fargate 吗?与使用 ECS 相比,成本影响如何?

如果有人能帮我找到解决此类问题的完美解决方案,那就太好了。

在不久的将来,我们将在 100 秒内拥有容器,并可能达到 500 秒,因此我们必须决定部署、故障转移、高可用性的最佳策略。

如果您收到 OOM 错误,这意味着您的 EC2 机器配置过多 - 您 运行在它们上面安装了太多容器。每个实例有 15 个容器,每个容器最多有 3072 个容器,您说的是在上限为 16GB 的机器上可能使用 46GB 的内存。一旦足够多的容器使用了分配给它们的内存,您的机器就会崩溃,并用它来完成所有其他任务。

因此,您现在可以做的第一件事是降低每台机器的任务数量或降低最大内存,以便任务总体上使用更少的内存。由于每台机器上只有 2 个 CPU,我建议您对其进行调整,以便每台机器 运行 总共有两个任务,内存在它们之间分配,确保相应地提高其他设置(最大连接数、工作人员等)。

您还询问了 Fargate。我的公司将 EC2 和 Fargate 用于我们的容器,并且我们有一项政策,如果没有特定原因 运行 EC2 上的东西(例如需要 GPU),我们会把它放在 Fargate 上。虽然钱多了一点(不像 Compute Savings Plans 多,但仍然更多),但好处非常好。这意味着每个任务都是 运行 分开的,减少了一个任务完成一堆其他任务的机会。这也意味着更快的扩展期,因为我们不必等待 EC2 实例扩展并加入集群——如果您使用应用程序自动扩展来响应突然涌入的流量,这非常重要。

Fargate 的最大好处是降低了复杂性,这反过来意味着我们的团队不必担心 - 为开发人员节省的时间和压力可能比额外花费的钱更有价值。一个简单的事实是,我们永远不必担心升级 ECS 代理、与补丁管理器集成以进行安全更新等事情,而且我们不需要定期循环机器以用新版本替换它们,这意味着我们可以将时间花在其他部分上取而代之的是我们的基础设施。

正如我上面提到的,尽管在某些情况下 Fargate 并不合适。对我们来说,运行ning 在 EC2 实例上的最大用例能够 select 我们用于 运行ning ML 的 GPU 类型。对于此 we built our own AWS Machine Image,可与 AWS 提供的各种 GPU 实例一起使用。这基本上是我唯一不使用 Fargate 的地方,因为这些模型需要 EC2 实例 GPU。

乔伊萨尔,

我们也遇到过同样的事情。所以在这里我可以提供一些关于我如何看待它的信息。

阅读您的规格后,我可以得出一些数字。 正如您所提到的,您正在使用 3 个 R5 Large 类型的 EC2(2 CPU,16 个内存)。这意味着你有,

总计 CPU = 6 GB 单位和 总内存 = 48 GB内存

配置中指定的最大内存 = 3072。 然后您提到了 25 个容器,它部署在这些 3 个实例 上。 [不确定如何,除非某些容器的内存较少]

首先,在 单个 EC2 中,具有这些规格的容器不能超过 5 个 。查找计算如下:

16GB = 1024*16 = 16384.

16384/3072 = 5.3 [表示单个 EC2 最多 5 个容器]

但请记住,您是在 ECS 的 EC2 中启动容器,EC2 需要在系统中有自己的空闲 space 和内存才能运行。但是,您没有为 EC2 提供 大量可用内存,因为您将所有内存分配给了您的容器。 [我假设最坏的情况是所有 5 个容器都使用 3072 MB 内存。]你的内存不足。您必须以 EC2 有一些空闲内存用于其自身操作的方式来决定最大内存数。

减少最大内存的优点是:

  1. EC2
  2. 还有更多space
  3. 您可以为 ECS 中的每个服务转到 2 个缩减大小的任务定义。通过这种方式,您实现了 High Availability.

尝试分析哪个容器使用更多内存,为那个容器和其他容器分配更多内存,指定更少。您必须平衡容器内存的数量。这也可能是许多人的痛点,而 Fargate 来了,它可以拯救我们。

并且您还提到您计划更改 EC2 大小。寻找内存优化实例。 是的,Fargate 可能是最好的,但它的成本很高。

然后针对 高可扩展性,定义自动缩放策略。 此外,策略应该采用这样一种方式,即在夜间我们通常有较少的流量,这样您就可以减少集群中 EC2 机器的数量。有了这些,您将节省成本并节省成本;您可以在高峰时段将其用于提高 EC2 机器的可用性。

最后,您必须得出您的数字并对其进行监控,是的,这不是一天的过程。这是一个不断发展的过程。