使用为ECS Fargate使用Spot实例

一、背景

ECS Fargate极大的简化了集群的管理,通过提供无服务器方式的容器,用户可专心关注在应用本身,而无需花费过多时间精力去管理容器运行所在的EC2。使用Fargate虽然简化运维但成本相对EC2的手工管理方式成本较高,因此针对互联网方式的无状态应用,可使用Spot实例来大幅降低成本。如果应用程序本身是传统的有状态方式,或者需要维护长链接的额,那么还应该继续使用普通Fargate方式而不是Spot实例。

此外,ECS Fargate Spot模式不支持与CodeDeploy集成,因此不能直接使用CodeDeploy做蓝绿发布,由此需要用户自行管理发布流水线来发布多版本,并自行做调度和切换。因此如果是计划直接采用CodeDeploy,那么Fargate Spot也是不适用的。

下面开始实验。

二、实验环境

本文在之前ECS实验的基础上展开,即具备以下条件:

  • 已经有Build好容器被上传到容器镜像
  • 有ECS Fargate集群存在
  • 已经定义好ECS任务
  • 已经有ALB配置好,且有一个Target Group目标组存在
  • 删除现有的Service,保持集群为空

如果您的环境不满足以上条件,那么请回到之前的实验完成这些过程。

三、使用Fargate Spot

1、调整集群配置

从ECS服务的集群界面,进入到前文实验创建的 myECS 的集群,点击最后一个标签页 Capacity Providers ,再点击右上角的 Update Cluster 按钮。如下截图。

image-20210227134403250

点击Add another provider,如下截图。

image-20210227134809134

从下拉框中选择 ProviderFARGATE_SPOT,然后点击右下角按钮继续。

image-20210227134843321

出现绿色的信息表示更新集群配置完成。如下截图。

image-20210227135217364

2、运行服务

进入ECS的任务定义界面,找到上一个实验定义好的任务,点击对应的版本,点击操作,选择 Create Service ,如下截图。

image-20210227135411643

在启动任务界面,从Capacity provider strategy选项中选择Cluster default strategy。如下截图。

image-20210227135531888

注意:如果在创建服务时候,看到的界面与上图不一样,不是Capacity Provider,而是类似如下的 Fargate/EC2 信息,那可以点击下图中的Switch to capacity provider strategy进行界面。如下截图。

image-20210227135716170

下面回到主题,继续。在确认Capacity provider strategy选项中选择了Cluster default strategy之后,在页面中间部分的Service name位置填写Spot(任意填写别的也可以),在Number of tasks位置填写2表示启动两个容器。正坐在部署类型位置选择Rolling update。这里无法选择蓝绿部署的原因是Fargate Spot不支持CodeDeploy蓝绿部署。因此只选择Rolling update。如下截图。

image-20210227135841715

其他选项保持默认,点击下一步继续。如下截图。

image-20210227140045574

在创建服务的向导的第二部配置网络,选择默认的VPC,选择子网,选择为容器分配Public IP为启用状态,编辑安全规则组。这一部分操作与之前的Fargate配置过程相同。如下截图。

image-20210227140118240

在负载均衡器类型中选择ALB。在负载均衡器名称位置,通过下拉框选择前文实验中已经存在的负载均衡器(确保负载均衡器下没有别的Service了,如果有的话在实验之前删除,只保留空的负载均衡器)。如下截图。然后在Container name:port位置,从下拉框中选择ECS任务定义中规定的发布端口phpdemo:80:80,并点击边上的Add to load balancer添加到负载均衡器。如下截图。

image-20210227141218525

在监听端口和目标组中,都通过下拉框选择负载均衡器前文实验用过的已经存在的配置。然后页面下方的URL规则讲自动变为灰色不可修改。如下截图。

image-20210227141242299

保持其他默认参数不变,将页面滚动到最下方,点击下一步继续。

在配置向导的第三步,选择不启用弹性扩展(本文实验重点是Spot,弹性扩展的使用方法前文实验已经有提到)。如下截图。

image-20210227141323914

在向导最后一步,点击页面下方按钮创建。如下截图。

image-20210227141339836

创建进行中,如下截图。

image-20210227141402907

创建服务完成后,进入任务界面,可以看到Running的状态,表示任务成功。

image-20210227142054377

此时我们也可以通过负载均衡器的入口浏览网页,也可以验证服务正常启动。

3、查看Spot运行状态

通过ECS创建的Fargate Spot实例,在EC2的Spot Instance界面下不可见。查看Fargate Spot的回收信息的方法是,进入任务定义,进入运行中的任务,找到Events标签页,在下方可以看到容器状态,如果被回收并创建新的,这里将会出现提示。如下截图。

image-20210227143049538

4、查看成本

Fargate Spot比Fargate成本更具优势。进入Billing界面,点击Billing Details按钮查看详细账单。如下截图。

image-20210227143308618

在费用信息中可以看到Fargate Spot的成本情况。

image-20210227143444132

四、小结

ECS Fargate Spot带来了更好的成本优势,在如下两个前提下可以使用:

  • 应用程序本身是无状态非长链接,可接受Spot实例的中断;
  • 不需要CodeDeploy,可通过版本发布和脚本自行管理发布。

在以上两种情况下,Fargate Spot将比Fargate实现成本优化。