ECS 201 Workshop(三)弹性扩展


ECS是AWS自行研发的容器管理平台,相对于流行的K8S架构,ECS更加简单易用,学习门槛相对很低。此外,Fargate无服务器技术的支持,将ECS完全从管理底层架构中解放出来,用户不需要再去关心Node节点的EC2配置,而是只在乎启动的任务,非常便于高效、快速的将既有容器投入使用。

ECS 201 Workshop分成:

共四个部分。此外,在ECS实验之前,还有一个基础篇是如何Build容器镜像,请参考

下面开始第三篇。

实验4、使用Auto Scaling进行弹性扩展

本实验基于前文创建的ECS任务定义和服务进行。请在上一步实验环境上继续操作。

一、设置IAM角色

进入IAM界面,点击左侧的角色,点击右侧创建角色。如下截图。

image-20210206194559430

在创建角色界面,选择服务是Elastic Container Service,然后选择场景是Elastic Container Service Autoscale。然后点击下一步继续。如下截图。

image-20210206194721636

在添加策略页面,系统会自动带出ECS弹性扩展所需要的策略,这里无需在额外选择其他策略。点击下一步继续。

image-20210206194919687

在标签设置界面,无需设置,点击下一步跳过。

在创建角色最后一步,输入角色的名称是 ecsAutoscaleRole,请记住这个名字,后续配置会使用。如果是多人在同一个AWS账号内做实验,则只需要配置一次即可,否则会出现重名的提示。如下截图。

image-20210206195102666

至此IAM角色配置完成。

二、修改任务定义

进入ECS集群界面,在右侧可以看到之前创建的集群,点击集群名称。如下截图。

image-20210206193738390

在集群界面下,找到上一步创建的服务,选中服务,点击 Update 更新按钮。如下截图。

image-20210206193820192

在向导第一步,无需修改任何配置,点击右下角的下一步按钮跳过。

image-20210206193921195

在向导第二步,无需配置,点击下一步跳过。

image-20210206193950258

在向导第三步,无需配置,点击下一步跳过。如下截图。

image-20210206194038292

在向导第四步,选择配置服务缩放,设置最小任务数是1,Desired任务数是2,最大任务数是6。选择IAM角色是前文创建的 ecsAutoscaleRole。最后点击添加缩放策略按钮。如下截图。

image-20210206194132142

在弹出的配置策略的界面上,选择缩放策略方式是目标跟踪,输入自定义的策略名称是 byrequest,缩放基于的ECS指标是ALBRequestCountPerTarget,也就是每个容器接收到的来自ALB的请求数。在数值位置输入300,即以300为阈值,超过300将会触发扩展。在Scale-out cooldown period 选项输入60,也就是两次向上扩展的间隔是60秒。注意:这里设置为60秒是为了在实验中快速看到效果,在生产环境上建议配置为300秒,即5分钟缩放一次。如下截图。

image-20210206195506491

将页面向下滚动,继续完成配置。在 Scale-in cooldown period 界面输入60秒,表示两次向下缩进之间的时间间隔是60秒。注意:这里设置为60秒是为了在实验中快速看到效果,在生产环境上建议配置为300秒,即5分钟缩放一次。配置完成后点击保存按钮。如下截图。

image-20210206195759161

缩放规则配置完成后,点击下方的保存按钮。如下截图。

image-20210206200002990

页面来到服务配置向导的最后一步,点击更新服务完成配置。如下截图。

image-20210206200051618

服务配置完成。点击查看服务按钮可看到状态。如下截图。

image-20210206200127055

至此ECS服务更新完成。

三、准备压力测试工具

压力测试工具选择线上的一台EC2,也就是前文实验中执行 docker build 构建容器镜像的那台。接下来在这台EC2上安装Apache Benchmark,使用ab作为压力客户端,对ECS之前的ALB负载均衡器的入口发起压力测试。

登录到EC2后,执行如下命令安装ab2工具。

yum install httpd -y

安装完成。

四、发起测试并观察扩展效果

通过EC2控制台,查看ABL负载均衡器的入口的访问地址,然后构建如下命令,从EC2上运行如下命令,发起压力。

ab -n 10000 -c 1000 http://ecs-582284481.cn-north-1.elb.amazonaws.com.cn/

其中 -c 表示并发线程数,-n 表示发起的请求总数。最后ELB地址最后必须带有 / 表示根目录。注意此命令一次执行在数秒内即可完成,为了生成持续的压力,可间隔几秒后反复执行此命令后。由于目前使用的ALB未经过预热,因此还不能承受过大的流量,在压力测试中,使用 -n 10000或者20000的参数即可。参数调整过大,会导致出现访问失败503的情况;且会导致ECS的Autoscaling修改预期任务数达到最大值,这样后续实验会发生空闲半小时都不缩进的情况。因此本实验使用参数10000即可,然后反复多次执行此命令,每次执行之间可间隔数秒。

任务启动后,可以通过负载均衡器的监控界面,看到大量请求。

image-20210206201418664

进入ECS控制台,点击集群名称,查看集群。如下截图。

image-20210206201917214

点击服务名称,查看服务状态。如下截图。

image-20210206201959145

在服务状态界面中,点击第二个标签页,查看任务,可以看到已经有6个任务在运行。如下截图。

image-20210206202045173

点击第三个标签页事件,可以看到每一次向外扩展被触发的时候,都会留下事件信息。如下截图。

image-20210206202125652

至此ECS向上扩展资源完成。

五、观察收缩效果

本实验最后一个步骤,暂停EC2上ab程序发起的压力。静置一段时间,然后观察ECS是否执行了缩进。

等待大概3-5分钟后,再次进入上一步查看缩放的服务界面,可以看到运行中的容器任务数字已经减少。如下截图。

image-20210206204216875

再次进入事件界面,可以看到系统向下缩进时候,留下的资源关闭的日志。

image-20210206204238533

需要注意的是,如果是连续数分钟施加了大压力,AutoScaling会自动修改Desired Number,也就是预期的任务数,会将前边定义任务时候预期数字从2改到和最大Max值一样的6,以避免出现反复来回缩放的场景。在这个场景下,可能会出现压力已经撤销30分钟但是并未缩进。此时日志里会看到如下一条信息。

Message: Successfully set desired count to 6. Change successfully fulfilled by ecs. Cause: monitor alarm TargetTracking-service/myecs/phpdocker-AlarmHigh-fd9f0b5f-c58f-467b-ae0f-9dc0f7bdbc4b in state ALARM triggered policy byrequest

如果等待的时间足够长,比如等一个晚上,系统会自动修改Desired Number减小到1或者2,这时候就会出现向下缩放了。如果不想等待这么长时间,可以再次编辑更新下服务,在缩放配置中,将Desired预期数字从最大6改到为2,然后即可看到系统缩放。在观察一段时间,还可以看到系统缩放到Min的任务数。

至此本实验完成。