继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

AWS Fargate – 无服务器化容器解决方案

亚马逊AWS
关注TA
已关注
手记 14
粉丝 800
获赞 46

AWS Fargate 是可以与 Amazon ECS结合使用的技术,让您在运行容器时不需要管理服务器或集群。使用 AWS Fargate,你不需要搭建控制平面,只需选择合适的实例类型,或配置应用程序堆栈的所有其它部分,比如网络、扩展、服务发现、负载均衡,安全组、权限或密钥管理。你只需要构建容器镜像,定义希望它如何运行、在何处运行,并为实际需要的资源付费。Fargate天生与Amazon VPC、自动扩展(Auto Scaling)、弹性负载均衡(ELB)、身份及访问管理(IAM)角色和密钥管理集成起来。AWS花了很多时间让Fargete随时可用于生产环境,制定了确保正常运行时间达到99.99%的服务级别协议(SLA),符合支付卡行业数据安全标准(PCI)、服务组织控制(SOC)、ISO和《健康保险可携性及责任性法案》(HIPAA)等法规或标准。

目前,Amazon ECS 具有两种模式:Fargate 启动类型和 EC2 启动类型。如果使用 Fargate 启动类型,您只需将应用程序打包到容器中,指定 CPU 和内存需求,选择awsvpc网络模型和 IAM 策略,然后直接启动应用程序。如果使用EC2 启动类型,您可以对运行容器应用程序的基础设施进行更精细的服务器级控制。Amazon ECS负责跟踪集群中的所有 CPU、内存及其他资源,并根据您指定的资源要求查找最适合运行容器的服务器。无论你使用Kubernetes、Mesos、Rancher、Nomad、ECS还是其他任何系统,有了Fargate,唯一要管理的是仅仅是应用程序本身的逻辑。AWS Fargate终于让容器在云计算的环境里发挥地淋漓尽致。

本文所涉及到的内容主要是围绕着AWS Fargate 启动类型,我们将演示如何使用AWS Cloud9进行代码编辑和提交,配合CodeCommit、CodeBuild、CodePipeline、Amazon ECS,基于Fargate进行容器应用的持续集成和持续部署,对外暴露ALB负载均衡,Fargate与DynamoDB进行增删改查等数据库操作。

https://img1.mukewang.com/5b519a700001a45c10180627.jpg

一、使用Fargate运行容器

Fargate可以自定义CPU和内存大小的计算资源,但不需要维护和管理底层的计算实例资源。接下来我们将使用Amazon ECS集群,并用AWS Fargate启动类型来运行容器。 点击: https://console.aws.amazon.com/ecs/home?region=us-east-1#/firstRun ,如下图所示,一个ECS集群可以启动多个Service,一个Service可以定义多个Task Definition,一个Task里面可以跑一个或者多个Container。

https://img4.mukewang.com/5b519aaa00014b4110240401.jpg

选择现有的sample-app的模板,网络模型选择awsvpc模式,在Task Definition中,你可以指定Task资源CPU和内存的大小。

https://img2.mukewang.com/5b519ad20001ef7d10240904.jpg

在这里,我们先不使用ALB负载均衡,后面的实验中我们会加上这部分内容。

https://img3.mukewang.com/5b519b040001e38310240495.jpg

输入集群的名字,取名为workshop。审核所有信息之后启动集群。

https://img3.mukewang.com/5b519b610001e05710240476.jpg

https://img4.mukewang.com/5b519b8b0001a8ea10240490.jpg

https://img.mukewang.com/5b519bd00001abe510240486.jpg

查看Task状态,从一开始的PROVISIONING,到PENDING,最后变成RUNNING状态。

https://img4.mukewang.com/5b519bf000011bd810240296.jpg

点击Task ID号: b956092f-4962-4342-bada-8e20802a6c44,在网络部分中可以看到网卡信息、私有IP、公有IP,以及Mac地址。

https://img4.mukewang.com/5b519c190001defd10240226.jpg

在浏览器输入公有IP地址,可以查看到httpd所在的应用已经部署成功。

https://img3.mukewang.com/5b519c540001c14b10240215.jpg

二、启动Cloud9编码和提交代码

https://img.mukewang.com/5b519cd20001cae610240415.jpg

Cloud9背后运行的环境是在一台EC2上面的,VPC选择之前启动ECS集群自动创建的VPC。

https://img4.mukewang.com/5b51a66600019dd717800566.jpg

https://img3.mukewang.com/5b51a69b00011cbc10240243.jpg

三、 创建容器镜像仓库(Docker Image Repository)

(1)创建容器仓库Amazon ECR

https://img4.mukewang.com/5b51a6c70001e6fd25580672.jpg

输入容器仓库Amazon ECR的名字

https://img.mukewang.com/5b51a6f8000172df10240447.jpg

https://img4.mukewang.com/5b51a7ac0001c64910240349.jpg

(2)构建Docker镜像,首先打开Cloud9客户端,下载代码

git clone https://github.com/TerrificMao/fargate-workshop-app.git

https://img2.mukewang.com/5b51a7e6000115e410240189.jpg

cd fargate-workshop-app/

https://img.mukewang.com/5b51a83f0001355510240185.jpg

https://img4.mukewang.com/5b51a8720001fdeb10240275.jpg

(3)根据下载的Dockerfile构建成docker image

docker build — tag 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop .

https://img4.mukewang.com/5b51a8ac0001ab3010240287.jpg

(4)确认构建的image是否成功

docker images 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

https://img4.mukewang.com/5b51a90e000154f410240094.jpg

(5)创建DynamoDB表,Table name取名为quotes,Primary partition key取名为ID。

https://img4.mukewang.com/5b51a9460001fff108420590.jpg

(6)测试生成的docker image

首先安装 jq,jq 是一款命令行下处理 JSON 数据的开软软件,我们将用它查看返回结果。

sudo yum install -y jq

–detach代表容器将会运行在后台模式,–publish指定容器暴露80端口,–volume将AWS配置挂载到容器,使得应用可以访问AWS credentials,最后是docker镜像的地址,在前面创建Amazon ECR时生成。

docker run –detach –publish 80:80 –volume $HOME/.aws:/root/.aws \

556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

https://img2.mukewang.com/5b51b07900010c2110240099.jpg

(7)测试应用

curl -Ss http://127.0.0.1/ | jq

https://img4.mukewang.com/5b51b1c000017af410240114.jpg

(8)列出所有DynamoDB数据库里面的内容,此时显示是空的,因为里面还没有数据。

curl -Ss http://127.0.0.1/quotes | jq

https://img3.mukewang.com/5b51b1cf000170d910240082.jpg

(9)往DynamoDB里面增加一条数据

curl -Ss http://127.0.0.1/quotes -X PUT -H “Content-Type: application/json” -d ‘{“Text”:”AWS Fargate workshop demo on AWS Global Virginia region,”,”AttributedTo”:”AWS China”}’

https://img.mukewang.com/5b51b258000163b210240095.jpg

(10)再次列出所有数据库里面的内容,可以显示内容了

curl -Ss http://127.0.0.1/quotes | jq

https://img1.mukewang.com/5b51b2e50001e01510240159.jpg

四. 将docker image推送至AWS ECR

首先登录到ecr

aws ecr get-login –no-include-email –region us-east-1

使用docker push推送

docker push 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

https://img3.mukewang.com/5b51b31100010c7810240294.jpg

五、创建Task Definition

(1)首先创建所需的AWS Role,选择Elastic Container Service,再选择Elastic Container Service Task,

https://img.mukewang.com/5b51b37b00016efe19300788.jpg

(2)选择“创建策略”

https://img2.mukewang.com/5b51b3c50001c64410240209.jpg

(3)配置Fargate访问DynamoDB时所需的策略。

https://img1.mukewang.com/5b51b3f20001fc9c10240400.jpg

(4)输入名字“WorkshopAppPolicy”,Policy创建成功

https://img1.mukewang.com/5b51b4280001845810240581.jpg

https://img2.mukewang.com/5b51b45000016b8b10240252.jpg

(5)创建Task Definitions

https://img2.mukewang.com/5b51b47900016a2b10240241.jpg

(6)选择Fargate启动类型

https://img.mukewang.com/5b51b4c800019b5b22320972.jpg

https://img4.mukewang.com/5b51b4ec000147a010240418.jpg

(7)选择Task memory (GB),比如0.5GB;选择Task CPU (vCPU),比如0.25vCPU。然后选择“Add container”。

https://img1.mukewang.com/5b51b52d0001ce5410240430.jpg

(8)点击“Add Container”,增加一个自定义容器,输入具体信息

https://img2.mukewang.com/5b51b56600016d2510240679.jpg

点击“Create”

https://img4.mukewang.com/5b53df1c0001e29410240586.jpg

(9)使用自定义的docker image,增加container成功。

https://img2.mukewang.com/5b53df650001997510240342.jpg

六、创建应用层负载均衡ALB

(1)选择应用层负载均衡ALB

https://img4.mukewang.com/5b53df9e0001b33c10240386.jpg

(2)输入Load Balancer的名字“workshop”,选择对应的VPC。

https://img.mukewang.com/5b53dfd80001b6a510240229.jpg

(3)创建ALB的安全组

https://img4.mukewang.com/5b53e087000116b110240283.jpg

(4)由于Fargate底层不需要考虑计算资源,所以Target Type不需要选择instance,而是选择ip。

https://img.mukewang.com/5b53e0c40001f2a910240320.jpg

(5)注册Targets这块先不选择,可以利用ECS为我们去管理Target Group。

https://img1.mukewang.com/5b53e10f0001f8d710240310.jpg

(6)ALB创建成功,记录DNS Name,比如: workshop-1435838475.us-east-1.elb.amazonaws.com

https://img3.mukewang.com/5b53e1510001abbd10240175.jpg

七、创建services选择Fargate启动类型

https://img.mukewang.com/5b53e1820001b21410240199.jpg

https://img3.mukewang.com/5b53e1f90001233d10240460.jpg

现在之前创建的VPC和对应的子网,并启动自动分配IP。

https://img1.mukewang.com/5b53e2380001f11a10240450.jpg

配置ALB负载均衡,配置侦听端口和Target Group。

https://img3.mukewang.com/5b53e275000182ca10240464.jpg

暂时不选Auto Scaling

https://img3.mukewang.com/5b53e2a70001b1ad10240290.jpg

启动成功

https://img2.mukewang.com/5b53e3800001264410240198.jpg

使用命令行检查负载均衡器是否生效

curl -Ss http://workshop-1435838475.us-east-1.elb.amazonaws.com/quotes | jq

https://img4.mukewang.com/5b53e3e50001a12710240142.jpg

在浏览器输入ALB公网域名地址,可以通过Container查询到DynamoDB里面的内容。

https://img3.mukewang.com/5b53e40f0001bf5c10240163.jpg

或者可以选择常用的Postman进行调试

https://img2.mukewang.com/5b53e43e000178ba10240378.jpg

使用HTTP PUT方式,新增一条信息,插入到DynamoDB

https://img2.mukewang.com/5b53e46b0001a76710240230.jpg

查看HTTP PUT的执行结果

https://img2.mukewang.com/5b53e49c0001dea910240170.jpg

再次查看结果

https://img.mukewang.com/5b53e4f20001274f10240530.jpg

从控制台检查DynamoDB中的内容

https://img.mukewang.com/5b53e51e0001d57910240445.jpg

至此,Amazon ECS采用Fargate启动类型,已经在VPC内部部署了Container应用,Container对外暴露了ALB负载均衡地址,应用和DynaomDB数据库完成了交互,应用可以通过负载均衡直接对外访问。接下去,我们将介绍如何利用AWS开发运维相关的服务,基于Container进行持续集成和持续部署的方案。

八、基于容器的持续集成/持续部署方案

接下来我们将采用CodeCommmit托管代码,CodeBuild进行容器应用的构建,利用Amazon ECS进行容器编排调度和部署。整个流程如下所示

https://img2.mukewang.com/5b53e54b00016be710240532.jpg

首先创建CodeCommit代码仓库,取名workshop

https://img3.mukewang.com/5b53e5720001c62410240302.jpg

Event type可以先不填写。

https://img.mukewang.com/5b53e59b0001c1b710240359.jpg

利用命令行将代码推送到CodeCommit

git config –global credential.helper ‘!aws codecommit credential-helper $@’

git config –global credential.UseHttpPath true

git remote set-url origin https://git-codecommit.us-east-1.amazonaws.com/v1/repos/workshop

git push origin master

https://img4.mukewang.com/5b53e5d30001611e10240189.jpg

刷新AWS CodeCommit的控制台,发现代码已经上传。

https://img3.mukewang.com/5b53e6020001ab2810240360.jpg

接下去创建CodePipeline。在创建CodePipeline之前,先创建所需要的Role,选择CodeBuild。

https://img4.mukewang.com/5b53e63a00018bcf10240218.jpg

复制如下Policy的内容,注意将resource内容替换成自己Account ID。

https://img3.mukewang.com/5b53e6680001858910240356.jpg

{

Json

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage"
            ],
            "Resource": "arn:aws:ecr:us-east-1:556776719183:repository/workshop"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]}输入policy的名字WorkshopBuildPolicy

https://img2.mukewang.com/5b53e6bb0001244510240371.jpg

https://img2.mukewang.com/5b53e6df000170d910240122.jpg

当然,在测试阶段,可以赋予一个Admin的权限。(选做)

https://img3.mukewang.com/5b53e7210001c57b10240247.jpg

https://img2.mukewang.com/5b53e7310001dd1a10240240.jpg

接着创建CodePipeline

https://img1.mukewang.com/5b53e79a0001dc7c10240239.jpg

https://img4.mukewang.com/5b53e79a0001405410240262.jpg

https://img.mukewang.com/5b53e79b0001cd1310240308.jpg

配置CodeBuild

https://img3.mukewang.com/5b53e834000142aa10240483.jpg

https://img1.mukewang.com/5b53e8350001e80810240276.jpg

配置CodeBuild的环境变量,Name: REPOSITORY_URI,Value: 556776719183.dkr.ecr.us-east-1.amazonaws.com/workshop

https://img4.mukewang.com/5b53e8690001331f10240169.jpg

看到保持成功信息,接着点击“下一步”。Build provider选择AWS CodeBuild进行构建。

https://img4.mukewang.com/5b53e8c50001f00510240470.jpg

部署方式选择Amazon ECS,输入之前创建的集群名字workshop以及Service名字。

https://img1.mukewang.com/5b53eae9000155c310240482.jpg

https://img3.mukewang.com/5b53e9e50001961410240490.jpg

https://img3.mukewang.com/5b53e9e60001f36110240209.jpg

https://img4.mukewang.com/5b53e9e60001b8c810240306.jpg

至此,CodePipeline创建完毕。

https://img2.mukewang.com/5b53ebd20001f36110240209.jpg

客户端更改代码

https://img2.mukewang.com/5b53ec0d0001bfc510240379.jpg

推送至AWS CodeCommit仓库

https://img4.mukewang.com/5b53ec3e0001e20810240413.jpg

CodePipeline自动检测到代码更新

https://img.mukewang.com/5b53ec6d00016b0510240339.jpg

自动进入到代码构建阶段

https://img.mukewang.com/5b53ed4b00018a7d10240187.jpg

自动使用Amazon ECS部署Fargate

https://img1.mukewang.com/5b53ed5e00016bed10240187.jpg

不到一杯咖啡的时间,通过CodePipeline自动完成整个过程。

https://img.mukewang.com/5b53ed8c0001c8fa10240453.jpg

通过Postman测试新增加的delete方法,首先使用HTTP PUT新增一条记录到DynamoDB。

https://img4.mukewang.com/5b53edc80001446710240206.jpg

查看HTTP GET刚刚插入的里面的数据,记录返回的ID号: 46311760-3ac9-11e8-82b5-9ba0642ae25e。ID是DynamoDB数据库的主键,根据主键进行HTTP DELETE测试。

https://img.mukewang.com/5b53ee040001a40a10240438.jpg

执行HTTP DELETE接口

https://img4.mukewang.com/5b53ee750001e9ec10240257.jpg

刷新DynamoDB控制台

https://img4.mukewang.com/5b53eeb800019ab610240438.jpg

此时记录被成功删除。

https://img1.mukewang.com/5b53eef500017d5d10240394.jpg

至此,通过CodeCommit, CodeBuild, CodePipeline, Amazon ECS在Fargate中部署的代码已经生效,对外暴露负载均衡AWS ALB,并成功与DynamoDB数据库完成了增删改查等基本操作。整个流程大致如下。

https://img1.mukewang.com/5b53ef240001a45c10180627.jpg

附: 解决微服务系统的服务发现,可以基于ECS + Route53方案,请参考:

https://aws.amazon.com/cn/blogs/china/ecsroute-53solve-micro-sevice-problem/

AWS技术峰会 2018将于8月9日在北京国家会议中心隆重拉开帷幕。在13:00 – 17:30于一层多功能厅C将会有物联网分论坛,在本论坛中,您将了解 AWS 的 IoT 服务,及聆听 AWS 用户分享基于 AWS 的智能家居、全球智能化物联网及工业互联方面的经验和实践。

想和我们一起#所建不凡#?快来注册#AWS技术峰会2018,前20名注册的小伙伴将可获得 $50亚马逊优惠券,抓住机会,赶快注册吧!https://awssummit.cn?tc=1s016B2uQi




打开App,阅读手记
3人推荐
发表评论
随时随地看视频慕课网APP