一、背景
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
按钮。如下截图。

点击Add another provider
,如下截图。

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

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

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

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

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

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

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

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

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

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

保持其他默认参数不变,将页面滚动到最下方,点击下一步继续。
在配置向导的第三步,选择不启用弹性扩展(本文实验重点是Spot,弹性扩展的使用方法前文实验已经有提到)。如下截图。

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

创建进行中,如下截图。

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

此时我们也可以通过负载均衡器的入口浏览网页,也可以验证服务正常启动。
3、查看Spot运行状态
通过ECS创建的Fargate Spot实例,在EC2的Spot Instance界面下不可见。查看Fargate Spot的回收信息的方法是,进入任务定义,进入运行中的任务,找到Events
标签页,在下方可以看到容器状态,如果被回收并创建新的,这里将会出现提示。如下截图。

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

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

四、小结
ECS Fargate Spot带来了更好的成本优势,在如下两个前提下可以使用:
- 应用程序本身是无状态非长链接,可接受Spot实例的中断;
- 不需要CodeDeploy,可通过版本发布和脚本自行管理发布。
在以上两种情况下,Fargate Spot将比Fargate实现成本优化。