创建AWS ECS Fargate

创建AWS ECS Fargate_第1张图片

简介

ECS-Elastic Container Service,一种完全托管的容器编排服务,功能与流行的kubernete(k8s)容器编排服务类似,在aws上使用k8s需要通过EKS或自己安装在EC2上,而利用ECS的Fargate模式可以实现无服务器(ec2)容器托管,并且成本只有使用ec2的60%。

k8s管理和使用比较复杂,部署应用时一般都借助helm来实现,不过helm用起来也没那简单。相对来说ECS Fargate的使用和管理要简单的多,学习成本更低。

k8s是开源软件,更新快免费,ECS Fargate也不收费但是绑定在aws服务上的,在迁移时会有一定问题。但是因为都是容器编排服务工具,所以考虑到运行的都是docker的容器,实际迁移起来还是比传统的非容器应用简单一些。

本文通过图形界面加命令行模式,实战创建Application Load Balancer,ECS fargate集群,创建镜像task,并在集群中通过service来实例化task。前端通过ALB把http/https请求转发至task实例。aws中国区和外国区的界面略有不同,需要注意的是ARN时,中国区是aws-cn,而外国区则是aws。

目录

  • 环境(配置)
  • 实战步骤
    1. 创建ALB
    2. 创建ECS Fargate集群
    3. 创建task定义
    4. 创建service
    5. 检查结果
  • 引申
  • 资源下载
  • 后记

环境(配置)

  • AWS中国或Global帐号,可在官网申请,一年内使用指定资源免费
  • AWS cli, 本文在win10 + terminal下使用aws cli

实战步骤

1. 创建ALB

ALB——Application Load Balancer,提供负载均衡,请求分配,SSO集成的aws服务。本文中ALB接受用户的http请求并转发到ECS中的Task中。

从中控台进入EC2界面,选择Load Balancer并点击Create Load Balancer
创建AWS ECS Fargate_第2张图片
选择Application Load Balancer点击Create
创建AWS ECS Fargate_第3张图片

添写ALB名称并选择internet-facing(实际业务中可能会选择internal)
创建AWS ECS Fargate_第4张图片

选择ALB所在的VPC和subent,至少选择两项。因为要从internet访问所以要选择public subnet,点击Next
创建AWS ECS Fargate_第5张图片

这里只开通了80端口,直接点击Next
在这里插入图片描述
选择Create a new security group,输入security group名称和描述,加一条允许任意来源访问80的规则
创建AWS ECS Fargate_第6张图片
创建新的target group,注意在Target type中选择IP,点击Next。因为ECS Fargate中的task是随机分配IP。task会把端口和分配的IP注册到target group中,而ALB会和target group相关联,这样http请求通过ALB分配给target group再流到task中
创建AWS ECS Fargate_第7张图片

选择ECS service所在的网络,这里直接点击Next即可
创建AWS ECS Fargate_第8张图片点击创建
创建AWS ECS Fargate_第9张图片
ALB创建需要一点时间provisioning,过一会儿可以看到创建成功。DNS name就是我们之后用来访问的地址
创建AWS ECS Fargate_第10张图片
回到EC2界面选择Target Groups,然后点击刚才新建的tstest
创建AWS ECS Fargate_第11张图片
记下ARN信息,这个信息会添加到ECS的service中
创建AWS ECS Fargate_第12张图片

2. 创建ECS Fargate集群

登录AWS中控台选择Elastic Container Service进去ECS界面,点击"Create Cluster"
创建AWS ECS Fargate_第13张图片
选择第一项“Networking only”,然后点击“Next Step”
创建AWS ECS Fargate_第14张图片
在Cluster Name中输入新建ECS集群的名称,比如“tstest”,然后点击“Create”
创建AWS ECS Fargate_第15张图片
创建成功,点击“View Cluster”查看新建的cluster。
创建AWS ECS Fargate_第16张图片
没有运行task的Fargate集群是一个空壳,AWS并没有为其分配CPU,内存,所以也不产生费用。
创建AWS ECS Fargate_第17张图片
接下来创建task定义和service

3. 创建task定义

task定义中可以

  • 指定拉取的镜像
  • 设定使用CPU/内存
  • 打开的端口
  • 启动类型
  • 外挂卷

创建task定义可以在中控台上通过图形界面操作,也可以写json文件利用aws cli创建。本文使用aws cli创建,更方便一些。

下面操作在windows terminal中操作,已经安装好了aws cli。先设置aws profile并用aws sts命令测试是否可以连接到aws,下图返回了用户信息说明连接成功。
创建AWS ECS Fargate_第18张图片
在本地建一个tstest_task.json文件,内容如下
坑:在中国区arn:aws-cn,而在外国区是arn:aws
创建AWS ECS Fargate_第19张图片

  • “family” :task定义的名称,以后更新的task定义会以版本号加1的形式存在同一个task定义中
  • “executionRoleArn” :任务执行角色的ARN,该角色授予 Amazon ECS 容器代理进行 AWS API 调用的权限
  • “networkMode” : Fargate 网络模式必需awsvpc
  • “containerDefinitions” :拉到到的image名称,生成容器名称,开放端口等信息
  • “requiresCompatibilities” :任务使用的启动类型
  • “cpu” :指定cpu大小, 256代表0.25个vCPU
  • “memory” :指定内存大小,256代表256M

官网TASK参数

运行命令创建task定义
在这里插入图片描述
现在可以在ECS中控台的Task Definitions中查看新建的task定义
创建AWS ECS Fargate_第20张图片

4. 创建service

建好task定义是第一步,叫定义是因为这时我们只是写了一个要运行的task的结构模板,之后我们通过创建service来把模板实例化,生成真正运行的task。task会实际占用cpu和内存,而aws也在这时按cpu和内存开始计算费用。

在本地建一个create-svc.json文件,内容如下
坑:在中国区arn:aws-cn,而在外国区是arn:aws
创建AWS ECS Fargate_第21张图片

  • “cluster” :上面建的cluster名称
  • “serviceName” :新建的service名称
  • “taskDefinition” : 是在service指定运行的task的某一版本,上面只建了一个task版本还没有更新过,所以是1
  • “loadBalancers” :配指定容器注册到target group中的端口,这里把容器fargate-app1的的80端口注册到了"tstest"这个target group中
  • “networkConfiguration” :task实例运行的subnet和security group

官网SERVICE参数

运行命令创建service定义
在这里插入图片描述
在ECS中控台的Cluster中查看新建的service
创建AWS ECS Fargate_第22张图片
点击"tstest-svc"可以查看service中task的运行情况。先是provisioning经pending,最后是running
创建AWS ECS Fargate_第23张图片

5. 检查结果

进入EC2 -> Target Groups -> 选择tstest -> 选择Targets 可以看到运行的task
创建AWS ECS Fargate_第24张图片
在浏览器中输入建好的ALB的DNS可以看到httpd镜像已经正常运行
在这里插入图片描述

引申

这部分主要讲一下在生产中的扩展问题,主要是让有兴趣的读者有个方向,方便自己进一步研究使用

  1. 日志处理:可以在task定义把镜像日志发送到cloudwatch,或者elasticsearch,另外在镜像中挂载EFS把日志存到共存硬盘上,也是很方便的用法。实践中我们用的就是后者,方便开发使用。

  2. 自动部署:因为task中运行的是容器,所以自动部署主要涉及如何自动生成上传镜像。可以利用aws的auto deploy/build/pipeline来实现,另外也可以用自己搭建的Jenkins加aws cli实现。

  3. 自动扩容降级:配和aws autoscale功能可以实现通过监控CPU/内存的利用率自动扩容降级

  4. 安全合规性:把service放在private subnet,通过NAT访问外网,实现应用可以访问外网,而外网无法访问内网,通过security group/ALC lic控制访问目标/来源等。

  5. SSO openid:可以利用ALB中的openid(目前中国区不可用),也可以自己在task中加前端httpd/niginx,然后利用openid插件实现SSO,后者更合适与现在的SSO服务集成。

资源下载

三个json文件可以在以下链接下载,注意要把ARN中的account改成你自己的。
https://github.com/tansong0091/realCrapForAWS/tree/main/ecs_fargate1

后记

累死了我,本以为写一个很熟的东西应该很快,结果光排版截图就花了好长时间,再加上边写边测试,搞的脖子痛都复发了。不过,如果有朋友认为看完这个能真的有些帮助,那就足够了。本想写再细一些,不过发现脖子受不了,而且之前也有人说上来讲太多,根本消化不了,慢慢来吧,看看能坚持多久。

喜欢请关注微信公众号”全是AWS干货“

你可能感兴趣的:(AWS,aws,云计算,云端)