我希望通过让它们启动 spot 实例而不是按需实例来优化我们的自动扩展 EC2 组的成本。
我真正想要的是能够将组中的一些服务器保留为按需实例,而不管现货实例定价市场发生什么变化。然后,我希望该组中的任何其他服务器(超过我配置的最小值)成为 spot 实例。我通常可以接受通过现场请求添加服务器的延迟。
我似乎找不到任何方法来执行此操作,并且我已尝试搜索 AWS 文档。ASG 似乎可以是按需的或现货的,但不是混合的。
我可能会手动将一个按需实例添加到分配给自动缩放组的弹性负载均衡器,但是该服务器的负载不会被计入自动缩放测量和触发器中。
我想我可以输入一个高得离谱的出价,以确保我总能得到我需要的服务器,但后来我查看了定价历史,发现偶尔会出现大幅上涨。
AWS 文档自相矛盾,因为在一个地方它说如果您输入服务器最小值,则“确保”该数字在那里。但是当你读到 spot 实例时,没有任何保证。现货的价格差异非常引人注目,所以我想尽可能多地利用它,同时仍然保持始终在线的基线。这可能吗?
上面讨论的方法会有点混乱,而且不那么灵活。更规范的方法是只创建 2 个 ASG(一个用于 spot,一个用于按需),然后将它们都注册到同一个 ELB(在此处讨论)。这使您能够独立控制每个,而不是试图在单个 ASG 中处理 LC 交换。
不幸的是,这种混合 Auto Scaling方法似乎并不是开箱即用的。
但是,您也许可以按如下方式解决此限制(未经测试,只是我已经研究了一段时间的系统设计):
潜在的解决方法
如使用 Auto Scaling 启动 Spot 实例中所述,现货出价是所用启动配置的一个参数。正如您所指出的,没有可用的混合启动配置,它必须是按需的或现场的,这意味着用例需要两种不同的启动配置。
这似乎没有立即帮助,因为您一次只能将一个启动配置附加到 Auto Scaling 组,具有以下(部分过时的)约束(请参阅启动配置):
不过,强调的部分是关键,前者涵盖了在从相应的初始按需启动配置更改为额外的现场启动配置后保持按需实例运行的要求,而后者不一定是这种情况,因为最近引入的Auto Scaling 终止策略(对于更改,通常没有通过随附的 AWS 博客文章大张旗鼓),记录在您的 Auto Scaling 组的实例终止策略中:
如您的终止政策如何运作中所述,如果您希望终止最后启动的实例,您现在可以指定NewestInstance,这将是最近启动的 spot 实例之一:
显然,这可能还有更多内容,例如,您可以将任何一个策略指定为独立策略,或者您可以在有序列表中列出多个策略,但这种方法应该确保所有实例的负载都被考虑到自动缩放测量和触发器;但仍有一个警告:
警告
如果负载均衡器出于任何其他原因终止了其中一个按需实例(例如,因为它本身变得不健康),它不会自动被一个按需实例替换。因此,您需要单独监视和说明此事件,例如,通过再次临时激活按需启动配置。
祝你好运!
我从这里的答案中得到灵感,提出了https://github.com/ashwanthkumar/matsya
它可以帮助您执行以下操作
如果您只需要 1 个具有静态数量的按需实例的 ASG,则以下内容应该有效:
根据 Spot 实例启动配置创建 Auto Scaling 组。
在 ASG 上暂停 Auto Scaling
手动将按需实例(静态基本负载)添加到 ASG 并为这些实例开启实例保护。
在 ASG 上恢复自动缩放
默认的自动缩放策略现在将忽略按需实例(由于保护)并终止与按需实例相同数量的 spot 实例以达到所需的组数量。任何缩减活动只会启动或终止 spot 实例。
目前,您可以跨单个 ASG混合按需实例和 Spot 实例
Amazon EC2 Auto Scaling 现在允许您在单个 Auto Scaling 组 (ASG) 中跨购买选项、可用区 (AZ) 和实例系列预置和自动扩展实例,以优化规模、性能和成本。现在,您可以在单个 ASG 中包含具有按需实例和 RI 的 Spot 实例,以节省高达 90% 的计算成本。