简介
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。
目录
- 环境(配置)
- 实战步骤
- 创建ALB
- 创建ECS Fargate集群
- 创建task定义
- 创建service
- 检查结果
- 引申
- 资源下载
- 后记
环境(配置)
- 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
选择Application Load Balancer点击Create
添写ALB名称并选择internet-facing(实际业务中可能会选择internal)
选择ALB所在的VPC和subent,至少选择两项。因为要从internet访问所以要选择public subnet,点击Next
这里只开通了80端口,直接点击Next
选择Create a new security group,输入security group名称和描述,加一条允许任意来源访问80的规则
创建新的target group,注意在Target type中选择IP,点击Next。因为ECS Fargate中的task是随机分配IP。task会把端口和分配的IP注册到target group中,而ALB会和target group相关联,这样http请求通过ALB分配给target group再流到task中
选择ECS service所在的网络,这里直接点击Next即可
点击创建
ALB创建需要一点时间provisioning,过一会儿可以看到创建成功。DNS name就是我们之后用来访问的地址
回到EC2界面选择Target Groups,然后点击刚才新建的tstest
记下ARN信息,这个信息会添加到ECS的service中
2. 创建ECS Fargate集群
登录AWS中控台选择Elastic Container Service进去ECS界面,点击"Create Cluster"
console.amazonaws.cn/ecs/home?re…
选择第一项“Networking only”,然后点击“Next Step”
在Cluster Name中输入新建ECS集群的名称,比如“tstest”,然后点击“Create”
创建成功,点击“View Cluster”查看新建的cluster。
没有运行task的Fargate集群是一个空壳,AWS并没有为其分配CPU,内存,所以也不产生费用。
接下来创建task定义和service
3. 创建task定义
task定义中可以
- 指定拉取的镜像
- 设定使用CPU/内存
- 打开的端口
- 启动类型
- 外挂卷
创建task定义可以在中控台上通过图形界面操作,也可以写json文件利用aws cli创建。本文使用aws cli创建,更方便一些。
下面操作在windows terminal中操作,已经安装好了aws cli。先设置aws profile并用aws sts命令测试是否可以连接到aws,下图返回了用户信息说明连接成功。
在本地建一个tstest_task.json文件,内容如下
- "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定义
现在可以在ECS中控台的Task Definitions中查看新建的task定义
4. 创建service
建好task定义是第一步,叫定义是因为这时我们只是写了一个要运行的task的结构模板,之后我们通过创建service来把模板实例化,生成真正运行的task。task会实际占用cpu和内存,而aws也在这时按cpu和内存开始计算费用。
在本地建一个create-svc.json文件,内容如下
- "cluster" :上面建的cluster名称
- "serviceName" :新建的service名称
- "taskDefinition" : 是在service指定运行的task的某一版本,上面只建了一个task版本还没有更新过,所以是1
- "loadBalancers" :配指定容器注册到target group中的端口,这里把容器fargate-app1的的80端口注册到了"tstest"这个target group中
- "networkConfiguration" :task实例运行的subnet和security group
运行命令创建service定义
在ECS中控台的Cluster中查看新建的service
点击"tstest-svc"可以查看service中task的运行情况。先是provisioning经pending,最后是running
5. 检查结果
进入EC2 -> Target Groups -> 选择tstest -> 选择Targets 可以看到运行的task
在浏览器中输入建好的ALB的DNS可以看到httpd镜像已经正常运行
引申
这部分主要讲一下在生产中的扩展问题,主要是让有兴趣的读者有个方向,方便自己进一步研究使用
-
日志处理 可以在task定义把镜像日志发送到cloudwatch,或者elasticsearch,另外在镜像中挂载EFS把日志存到共存硬盘上,也是很方便的用法。实践中我们用的就是后者,方便开发使用。
-
自动部署 因为task中运行的是容器,所以自动部署主要涉及如何自动生成上传镜像。可以利用aws的auto deploy/build/pipeline来实现,另外也可以用自己搭建的Jenkins加aws cli实现。
-
自动扩容降级 配和aws autoscale功能可以实现通过监控CPU/内存的利用率自动扩容降级
-
安全合规性 把service放在private subnet,通过NAT访问外网,实现应用可以访问外网,而外网无法访问内网,通过security group/ALC lic控制访问目标/来源等。
-
SSO openid 可以利用ALB中的openid(目前中国区不可用),也可以自己在task中加前端httpd/niginx,然后利用openid插件实现SSO,后者更合适与现在的SSO服务集成。
资源下载
三个json文件可以在以下链接下载,注意要把ARN中的account改成你自己的。 github.com/tansong0091…
后记
累死了我,本以为写一个很熟的东西应该很快,结果光排版截图就花了好长时间,再加上边写边测试,搞的脖子痛都复发了。不过,如果有朋友认为看完这个能真的有些帮助,那就足够了。本想写再细一些,不过发现脖子受不了,而且之前也有人说上来讲太多,根本消化不了,慢慢来吧,看看能坚持多久。
喜欢请点赞
微信公众号“全是AWS干货”