Amazon web services 在保留EC2实例上运行的AWS ECS群集内存和CPU限制问题

Amazon web services 在保留EC2实例上运行的AWS ECS群集内存和CPU限制问题,amazon-web-services,amazon-ec2,amazon-ecs,Amazon Web Services,Amazon Ec2,Amazon Ecs,我正在运行ECS群集,目前有3个服务在T3中实例上运行。这些服务中的每一个都只运行一个软内存限制为1GB的任务,每个服务的硬内存限制都不同(但这不应该是问题所在)。我将始终有足够的内存来运行一个新部署的任务(新任务也需要1GB,T3介质将能够处理它,因为它总共有4GB)。新任务启动并运行后,旧任务将被停止,新部署的可用空间将再次达到1GB。我的做法与CPU类似(2048CPU,每个任务有512个,新部署有512个空闲) 所以现在一切正常,但我对未来的设置并不完全满意。如果我需要用另一个任务添加另

我正在运行ECS群集,目前有3个服务在T3中实例上运行。这些服务中的每一个都只运行一个软内存限制为1GB的任务,每个服务的硬内存限制都不同(但这不应该是问题所在)。我将始终有足够的内存来运行一个新部署的任务(新任务也需要1GB,T3介质将能够处理它,因为它总共有4GB)。新任务启动并运行后,旧任务将被停止,新部署的可用空间将再次达到1GB。我的做法与CPU类似(2048CPU,每个任务有512个,新部署有512个空闲)

所以现在一切正常,但我对未来的设置并不完全满意。如果我需要用另一个任务添加另一个服务,会发生什么?我需要部署所有现有任务,并修改其任务定义以使用更少的CPU和内存来运行此新任务(以及新部署)。我计划获得一个保留的EC2实例,因此用较大的实例交换当前的EC2实例并不容易

有没有办法为同一个ECS集群启动另一个EC2实例来处理任务中的突发事件?另外,在部署时,只部署一个任务,然后等待旧任务被终止,以便部署下一个任务,而不需要停机,这不是一个完美的场景。 最大的问题是,如果我需要新的服务和任务,我需要再次调整所有其他服务和任务,以便运行新服务和部署其他服务和任务,这不是很容易维护,如果我无法进一步降低CPU和内存,因为我已经达到了最低点,以便顺利运行任务,该怎么办

我在考虑为同一集群提供另一个EC2实例,它将处理突发事件、部署和新的服务/任务。但不确定这是否可能,这是否是最好的方法。我也在考虑Fargate,但这要贵得多,我现在负担不起。你怎么认为?任何想法、建议和提示都会很有帮助,因为我非常想找到避免上述问题的最佳方法


提前谢谢

不幸的是,没有现成的解决方案来确保所有任务都在最小可能(即一个)实例上运行。您可以使用名为(CP)的新功能,这将允许您确保运行所有任务所需的ec2实例的最少数量。CP与ASG之间的主要区别在于,CP赋予任务放置更多的权重(ASG将根据资源利用率进行伸缩,这在您的案例中并不理想)

然而,这不是一个理想的解决方案。正如您在评论中所说,当服务在部署期间需要扩展时,CP将启动另一个实例,新任务将放置在该实例上,一旦它进入运行状态,旧任务将停止

但现在您有了一个“额外”的EC2实例,因为无法替换正在运行的任务。我能想到的唯一方法是使用lambda函数new instance,它将所有服务任务移动到另一个实例。CP将在大约15分钟后终止此实例,因为它上没有正在运行的任务

有几点需要注意:

  • CP是新的,边缘有点粗糙,你不能 删除/修改它们。您只能创建或停用它们
  • CP需要一个基础ASG,他们必须有1-1关系
  • 确保在创建CP时启用托管扩展
  • 选择100%容量目标
  • 不要忘记为集群添加默认容量策略
最小化使用的EC2实例: 如果您使用的是容量提供程序,“binpack”放置策略将使用的EC2主机数量降至最低

但是,在一些场景中,您可以在自己的EC2实例上运行单个任务。正如阿里在回答中提到的;ECS不会替换此正在运行的任务,但根据您的设置,您可以通过将任务配置为自动“退出”来轻松替换它

就我而言;每个服务至少运行两个任务。因此,我只是在我的任务的健康检查中添加了一些逻辑,所以他们在6小时后报告为不健康。ECS将发现“不健康”任务,将其从负载平衡器中移除,并启动替换任务(根据binpack策略)

注意:如果您采用这种方法;在超时时间上添加一些变化,这样您就不太可能让所有任务同时过期。类似于:
expiry=now+timedelta(小时数=random.uniform(5.5,6.5))

使用软限制共享内存“顶部空间”: 如果同时设置软内存和硬内存限制;ECS将根据软限制放置您的任务如果任务的内存使用情况随使用情况而变化,则很容易让EC2实例开始交换。

例如:假设您有一个软限制为900mb、硬限制为1800mb的任务。您可以使用4个正在运行的实例启动一个服务。ECS在单个t3.medium上提供所有4个实例。请注意,每个实例都认为它可以安全地使用高达1800mb的内存,而实际上主机服务器上的可用内存非常少。当你用一些流量打你的服务时;每个任务都试图使用更多的内存,而您的t3.medium在开始将内存交换到磁盘时将无法使用ECS无法很好地从此类故障中恢复。它注意到任务实例不再可用,并将尝试提供替换,但容量提供程序在替换替换t3.medium时非常缓慢

我的建议是:

  • 根据内存使用情况(这将是软限制的百分比),将服务配置为自动缩放,例如:目标内存使用率为70%
  • 配置任务的运行状况检查,以便它们报告