Amazon Elastic Container Service (Amazon ECS) 是一项高度可扩展的快速容器管理服务,可轻松运行、停止和管理集群上的 Docker 容器。
- 利用 Amazon ECS,可以通过简单的 API 调用来启动和停止基于容器的应用程序,可以从集中式服务获取集群状态,并可以访问许多熟悉的 Amazon EC2 功能
- 可以根据资源需求、隔离策略和可用性要求来安排容器在集群中的位置。借助ECS,无需操作自己的集群管理和配置管理系统,也无需担心扩展管理基础设施。
- ECS 可用于创建一致的部署和构建体验,在微服务模型上构建先进的应用程序架构
- ECS集成了Elastic Container Registry、Elastic Load Balancing、Elastic Block Store、Elastic Network Interfaces、Virtual Private Cloud、IAM 和 CloudTrail,可为您提供运行各种容器化应用程序或服务的完整解决方案
Amazon Elastic Container Registry (Amazon ECR) 是一项AWS Docker 容器注册表服务,可让开发人员轻松存储、管理和部署 Docker 容器映像。
启动类型
ECS支持两种启动类型:Fargate和EC2。
Fargate 启动类型
Fargate 启动类型只需定义任务,无需预置和管理后台基础设施,即可运行容器化的应用程序。
EC2 启动类型
EC2 启动类型允许在您管理的 EC2 实例集群上运行容器化的应用程序。
您可以使用 Fargate 启动类型启动服务或任务,运行在ECS 管理的无服务器基础设施上,不必管理 Amazon EC2 实例服务器或集群。若要进行更多控制,可以使用 EC2 启动类型。
本文以部署Angular 9集成Spring Boot 2详解中的Spring Boot和Angular应用为例,利用Fargate 启动类型来启动ECS 容器。
创建Docker Image
下面分别是Spring Boot、Angular的Dockerfile文件:
Dockerfile.spring
FROM openjdk:8-jdk-slim
WORKDIR app
ARG APPJAR=target/heroes-api-1.0.0.jar
COPY ${APPJAR} app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Dockerfile.angular
FROM httpd:2.4
ARG DISTPATH=./dist/
ARG CONFFILE=./heroes-httpd.conf
COPY ${DISTPATH} /usr/local/apache2/htdocs/
COPY ${CONFFILE} /usr/local/apache2/conf/httpd.conf
运行以下命令获取httpd.conf:
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > heroes-httpd.conf
修改配置,启用proxy_module、proxy_http_module、rewrite_module,在配置中添加如下内容:
ProxyPreserveHost on
ProxyPass "/api" "http://127.0.0.1:8080/api"
ProxyPa***everse "/api" "http://127.0.0.1:8080/api"
RewriteEngine on
RewriteRule ^/$ /en/index.html
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^/zh /zh/index.html
RewriteRule ^/en /en/index.html
我们将在一个任务中包含这两个image,使用apache代理后台地址。
构建Image
执行如下命令构建Image:
docker build --build-arg APPJAR=heroes-api-1.0.0.jar -f Dockerfile.spring -t heroes-api .
docker build -f Dockerfile.angular -t heroes-web .
推送Image
- 创建ECR存储库
首先创建两个ECR存储库,可以从控制台创建,也可以使用如下AWS CLI命令:
aws ecr create-repository --repository-name heroes/heroes-api
aws ecr create-repository --repository-name heroes/heroes-web
- 登录ECR存储库
执行如下命令:
`aws ecr get-login --no-include-email`
或
aws ecr get-login-password | docker login --username AWS --password-stdin 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn
- 标记image
docker tag heroes-api:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker tag heroes-web:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest
- 推送Image
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest
创建集群
Amazon ECS 集群是任务或服务的逻辑分组。您可以在一个账户中创建多个集群以保持资源独立。
创建Fargate集群非常简单,进入ECS集群控制台,点击“创建集群”,选择“仅限联网”集群模板,点击“下一步”,然后输入集群名称"heroes",点击“创建”即可。
创建任务定义
任务定义类似于应用程序的蓝图,需要任务定义才能在Amazon ECS 中运行 Docker 容器。
可在Fargate任务定义中指定的一些参数:
- 用于任务的容器Docker 映像
- 用于任务的 CPU 和内存数量
- 任务的日志记录配置
- 任务使用的 IAM 角色
- 任务中用于容器的数据卷
- 容器在启动时应运行的命令
执行以下步骤创建任务定义:
- 进入ECS 任务定义控制台,点击创建任务定义
- 选择FARGATE启动类型,点击下一步
- 在配置任务和容器定义页面中,输入任务定义名称(heroes),选择任务角色,配置任务内存、CPU
内存、CPU的有效的组合
CPU 值 | 内存值 (MiB) |
---|---|
256 (.25 vCPU) | 512 MB、1 GB、2 GB |
512 (.5 vCPU) | 1 GB、2 GB、3 GB、4 GB |
1024 (1 vCPU) | 2 GB、3 GB、4 GB、5 GB、6 GB、7 GB、8 GB |
2048 (2 vCPU) | 4GB 到 16GB(以1GB为增量) |
4096 (4 vCPU) | 8GB 到 30GB(以1GB为增量) |
容器存储与共享卷
Fargate 启动类型的任务的最大容器存储为10GB,多个容器使用的共享卷的最大大小为4GB。若要添加共享卷,在卷配置部分点击“添加卷”,输入卷名称后点击“添加”即可。注意,任务存储是短暂存储。Fargate 任务停止后,该存储将被删除。
添加容器
接下来,在容器定义部分点击“添加容器”按钮,添加heroes-api和heroes-web容器:
在高级容器配置下部的“存储和日志记录”部分可以添加挂载点和配置日志:
Fargate任务默认记录日志到CloudWatch Log,可以指定每个容器的日志组名称。
最后,点击“创建”,完成任务定义。
创建Service
服务可在 Amazon ECS 集群中同时运行和管理指定数量的任务定义实例。如果任务出于任何原因失败或停止,服务计划程序将启动另一个任务定义实例来替换它并根据所用的计划策略在服务中保留预期数量的任务。
除了在服务中保留预期数量的任务之外,还可选择借助负载均衡器运行您的服务。负载均衡器将在与服务关联的各个任务间分配流量。
在ECS控制台,从集群和任务定义均可创建服务。以任务定义为例,步骤如下:
配置基本参数
选中heroes任务定义,然后点击操作 -> 创建服务,在配置服务页面填充以下参数:
- 启动类型:FARGATE
- 集群:heroes
- 服务名称:heroes
- 任务数:1
- 部署类型:滚动更新
点击下一步。
网络配置
在VPC 和安全组部分,选择集群 VPC、子网。默认会自动生成一个安全组名称,您可以点击编辑,修改安全组名称,或者选择一个现有安全组。若选择新建安全组,默认配置了80端口的入站规则。
自动分配公有 IP,选择DISABLED,我们将使用ELB,不需要公有IP。
负载均衡
我们新创建一个ALB,先不必创建目标群组。
- 负载均衡器类型: Application Load Balancer
- 负载均衡器名称:选择前面新建的ALB
- 选择一个容器: heroes-web:80:80,然后点击“添加到负载均衡器”,输入以下参数:
生产侦听器端口:新建 80
生产侦听器协议:HTTP
目标组名称:新建 ecs-heroes
目标组协议:HTTP
设置 Auto Scaling
服务 Auto Scaling:请勿调整服务的预期计数
审核
检查无误后点击创建服务。
返回到集群界面,可以看到heroes集群含有一个服务,一个正在运行的任务。
服务限制
在集群任务界面,我们若停止当前任务,稍后会自动重启新任务,同时会自动更新ELB的目标群组。
Amazon ECS 服务计划程序包含限制服务任务在反复启动失败后再启动的频率逻辑。
如果一个 ECS 服务的任务总是无法进入 RUNNING 状态(直接从 PENDING 跳到 STOPPED),则后续重启尝试间隔的时间会逐渐拉长,最多达到 15 分钟
访问服务
进入heroes集群 -> 任务,点击任务,进入任务详细信息页面,可以看到任务的私有 IP 地址。在内部网络中,可以使用私有IP访问每个任务部署的应用。公网则通过ELB访问我们的服务。
参考文档
Amazon Elastic Container Service 文档
来源:51CTO
作者:川川Jason
链接:https://blog.51cto.com/7308310/2478189