使用 Container 进行 Auto Scaling Group 首部曲

使用 Container 进行 Auto Scaling Group 首部曲

先前介绍的使用 Auto Scaling Group 的基本单位为 EC2,也就是当我们侦测的目标增加或减少时,扩展或是缩减的单位都是 EC2 实例,但这对于实际布署而言,单位大了一点,这不只会影响布署的成本,也影响反应的时间,接下来我们试着以容器 (Container) 为我们扩缩的单位。下图为我们要实作的环境, ELB 是需要对外开放所以放在公有子网,考虑容错,所以跨两个可用区,而 ECS Cluster 因为需要与外界存取,所以也放在公有子网,如果考虑安全的话可以放在私有子网,但需要增加 NAT Instance 或是 NAT Gateway。因为这个操作有点复杂,所以将这篇文章分成三部份。

具有自动扩展功能的应用程序架构-以 Container 为基础
图 1. 具有自动扩展功能的应用程序架构-以 Container 为基础

基础环境建置

基础环境指的是网络环境、容器的内容以及负载均衡器。接下来的操作其实跟 ASG 步骤缩放政策 Step scaling policies - Day15 类似,可以参照该网址,但为方便起见我们还是操作一遍

  1. 建置 VPC 与相关的子网 - 请参阅 Amazon VPC 实操
  2. 新增 EC2 实例 - 请参阅 Amazon Elastic Compute Cloud (EC2) 笔记
  3. 建立 Docker Container Image - 请参阅 Amazon Elastic Container Service (Amazon ECS) 简介
  4. 将 Docker Container Image 上传至储存库 - 请参阅 Amazon Elastic Container Registry (ECR) 笔记
  5. 新增 Application Load Balancer (ALB) - 请参阅 Elastic Load Balancing (ELB) 笔记

ECS 相关建置

接下来我们要规画的是如何让一群容器来协助应用,所以先建立一个丛集,主要是说明需要多少实体来装容器 (ECS 丛集),接着指定容器要如何运作 (task definition) ,最后是把任务指定给丛集来执行 (Create Service)。在 task definition 中要特别注意两件事,首先是一个实例可以执行多个容器,但每个容器都是执行网页服务器的服务,也就是常驻在 port 80 的服务,所以我们就没办法像先前执行的方式用 docker run -t -i -p 80:80 ithome-container ,因为主机的端口号是变动的,这一个部分, AWS 是够过 ALB 来克服,因为ALB是应用层级的,所以它可以根据应用请求 (HTTP request)来做分配,帮开发者解决这个问题;第二个问题其实也是因为第一个问题所衍生的,正常来说,开发者会设定安全组 (Security Group)来进行安全管控,但从 ALB 到 EC2 之间的联机埠号是不确定的,那要如何做安全控管,这时候我们就可以运用安全组套迭的特性,也就是在安全组 2 (Security group 2) 中允许所有来自安全组 1 (Security group 1) 的联机,请参阅图 1。

  1. 建置 ECS 丛集
    进入 ECS 控制台,在左手选单下方选择 Clusters,并在右边按下 Create Cluster

新增丛集
图 2. 新增丛集

我们选择 EC2 Linux + Networking

选择丛集样板
图 3. 选择丛集样板

Instance configuration
Cluster name: ithomeCluster
EC2 instance type: t2.micro
EC2 Ami Id: Amazon Linux 2
Root EBS Volume Size (GiB): 30
Key pair: ithome

丛集实例组态
图 4. 丛集实例组态

Networking
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
Subnets :
subnet-06f56dccb2a9cfcf0
(172.16.0.64/26) | ithome public subnet 2 - ap-southeast-1b
subnet-0f1df807467b642f6
(172.16.0.0/26) | ithome public subnet 1 - ap-southeast-1a

Auto assign public IP: Enabled
Security group: ithomeClusterSG
CloudWatch Container Insights: Enable Container Insights

丛集网络组态
图 5. 丛集网络组态

要特别注意的是,目前为止,我们只是透过 ECS 来帮忙建立一个 EC2 的丛集系统,所以它自动帮我们产生了两个服务:启动组态 (Launch configuration) EC2ContainerService-ithomeCluster-EcsInstanceLc-xxxxxxxxxxxxx 跟自动扩缩群组 (Auto Scaling group) EC2ContainerService-ithomeCluster-EcsInstanceAsg-xxxxxxxxxxxxx ,可以透过下图发现。

ECS 丛集组态
图 6. ECS 丛集组态

而这两个服务是由 ECS 呼叫 Amazon CloudFormation 来生成的,可以进入 CloudFormation 控制台(点选左上方的服务,输入 CloudFormation 即可),可以看到由 ECS cluster 所生成的 EC2ContainerService-ithomeCluster,点选 Resources 就可以看到所建立的两个资源:EcsInstanceAsg、EcsInstanceLc

CloudFormation 资源
图 7. CloudFormation 资源

来到 EC2 控制台,按下左手边的 Auto Scaling Groups,就可以看到由 CloudFormation 所建立的自动扩缩群组 EC2ContainerService-ithomeCluster-EcsInstanceAsg-xxxxxxxxxxxxx,而点选这个扩缩群组后就可以发现它的组态就是刚刚 ECS Cluster 中所做的设定,并且已经自动连结启动组态 EC2ContainerService-ithomeCluster-EcsInstanceLc-xxxxxxxxxxxxx,

自动扩缩群组组态
图 8. 自动扩缩群组组态

检查完这些后,回到 Amazon ECS 控制台,点选左手边的 Clusters,选取刚刚建立的 ithomeCluster,请务必注意 Registered container instances 是否有值,如果为 0,就表示这个从丛集内没有对应的 EC2 实例,这样是没办法进行下一步的,所以务必要确认,这个丛集是否有可以提供服务的 EC2 实例。

确认丛集内的 EC2 实例是否执行
图 9. 确认丛集内的 EC2 实例是否执行

后续还有些步骤,请看二步曲继续。

References

  • What is Amazon Elastic Container Service?, https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html
  • AWS ECS Error when running task: No Container Instances were found in your cluster, https://stackoverflow.com/questions/36523282/aws-ecs-error-when-running-task-no-container-instances-were-found-in-your-clust
  • Deep Dive on Amazon ECS Cluster Auto Scaling, https://aws.amazon.com/tw/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/ /aws.amazon.com/tw/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/