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——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中
登录AWS中控台选择Elastic Container Service进去ECS界面,点击"Create Cluster"
选择第一项“Networking only”,然后点击“Next Step”
在Cluster Name中输入新建ECS集群的名称,比如“tstest”,然后点击“Create”
创建成功,点击“View Cluster”查看新建的cluster。
没有运行task的Fargate集群是一个空壳,AWS并没有为其分配CPU,内存,所以也不产生费用。
接下来创建task定义和service
task定义中可以
创建task定义可以在中控台上通过图形界面操作,也可以写json文件利用aws cli创建。本文使用aws cli创建,更方便一些。
下面操作在windows terminal中操作,已经安装好了aws cli。先设置aws profile并用aws sts命令测试是否可以连接到aws,下图返回了用户信息说明连接成功。
在本地建一个tstest_task.json文件,内容如下
坑:在中国区arn:aws-cn,而在外国区是arn:aws
官网TASK参数
运行命令创建task定义
现在可以在ECS中控台的Task Definitions中查看新建的task定义
建好task定义是第一步,叫定义是因为这时我们只是写了一个要运行的task的结构模板,之后我们通过创建service来把模板实例化,生成真正运行的task。task会实际占用cpu和内存,而aws也在这时按cpu和内存开始计算费用。
在本地建一个create-svc.json文件,内容如下
坑:在中国区arn:aws-cn,而在外国区是arn:aws
官网SERVICE参数
运行命令创建service定义
在ECS中控台的Cluster中查看新建的service
点击"tstest-svc"可以查看service中task的运行情况。先是provisioning经pending,最后是running
进入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改成你自己的。
https://github.com/tansong0091/realCrapForAWS/tree/main/ecs_fargate1
累死了我,本以为写一个很熟的东西应该很快,结果光排版截图就花了好长时间,再加上边写边测试,搞的脖子痛都复发了。不过,如果有朋友认为看完这个能真的有些帮助,那就足够了。本想写再细一些,不过发现脖子受不了,而且之前也有人说上来讲太多,根本消化不了,慢慢来吧,看看能坚持多久。
喜欢请关注微信公众号”全是AWS干货“