Amazon Elastic Container Service (ECS)是一个有高度扩展性的容器管理服务。它可以轻松运行、停止和管理集群上的Docker容器,你可以将容器安装在EC2实例上,或者使用Fargate来启动你的服务和任务。
Amazon ECS可以在一个区域内的多个可用区中创建高可用的应用程序容器,你可以定义集群中运行的Docker镜像和服务。而且你可以充分利用AWS内部的Amazon ECR (Elastic Container Registry)或者外部的Registry(比如Docker Hub或自建的Registry)来存储和提取容器镜像。
使用Amazon ECS服务,你不需要再担心如何去运营集群管理、配置管理和基础架构的扩展性。
Amazon ECS还可以带来一致的部署和构建体验、管理和扩展批处理和提取-转换-加载(ETL)工作负载以及在微服务模型上构建先进的应用程序架构。
容器,镜像和注册表
要在Amazon ECS上部署应用程序,必须构建你的程序在容器中运行。如之前所说,Docker容器是一个集装箱,在集装箱里面有软件应用程序运行所需要的一切,包括了代码、运行环境、系统工具、系统函数库等等。
我们可以将标准化的代码、运行环境、系统工具等等打包成一个标准的集装箱,这个集装箱叫做Docker镜像(Docker Image)。这个Docker镜像的概念类似于EC2中的AMI (Amazon Machine Image)。
这些镜像文件通常会通过Dockerfile来构建,并且最终存放到注册表(Registry)内。这个Registry可以理解为摆放集装箱的码头,我们在需要某个类型的集装箱的时候就到码头去取。这类Registry可以是Amazon的ECR,也可以是公网上的Docker Hub,或者自己私有的Registry。
更多的容器知识,请参考Amazon ECS 的 Docker 基本知识。
ECS 任务定义(Task Definition)
要在Amazon ECS上运行应用程序,你需要创建任务定义。任务定义是一个JSON格式的文本文件,这个文件定义了构建应用程序的各种参数。这些参数包括了:要使用哪些容器镜像,使用哪种启动类型,打开什么端口,使用什么数据卷等等。
以下是一个简单的任务定义示例,这个示例可以用来创建一个运行NGINX服务器的单个容器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
ECS任务定义有点类似AWS的CloudFormation,只是ECS任务定义是用来创建Docker容器的。
ECS调度( Scheduling)
ECS任务调度负责将任务放置到集群中,你可以定义一个服务(Service)来运行和管理一定数量的任务。
服务调度(Service Scheduler)
- 保证了一定数量的任务持续地运行,如果任务失败了会自动进行重新调度
- 保证了任务内会注册一个ELB给所有容器
自定义调度(Custom Scheduler)
- 你可以根据自己的业务需求来创建自己的调度
- 利用第三方的调度
ECS集群(Cluster)
当你使用Amazon ECS运行任务时,你的任务会放在到一个逻辑的资源池上,这个池叫做集群(Cluster)。
如果你使用Fargate启动类型,那么ECS将会管理你的集群资源,你不需要管理容器的底层基础架构。
如果你使用EC2的启动类型,那么你的集群会是一组容器实例。
在Amazon ECS上运行的容器实例实际上是运行了ECS容器代理(Container Agent)的EC2实例。
特点:
- 集群包含了多种不同类型的容器实例
- 集群只能在同一个区域内
- 一个容器实例只能存在于一个集群中
- 可以创建IAM策略来限制用户访问某个集群
ECS容器代理(Container Agent)
容器代理会在Amazon ECS集群内的每个基础设施资源上运行。使用容器代理可以让容器实例和集群进行通信,它可以向ECS发送有关资源当前运行的任务和资源使用率的信息。
容器代理可以接受ECS的请求进行启动和停止任务。
- 在某些ECS AMI上已经预安装好了
- 可以在Amazon Linux,Ubuntu,Redhat等系统上运行
- 不能在Windows上运行
ECS安全性
- IAM角色
- EC2实例可以使用IAM角色访问ECS
- ECS任务使用IAM角色来访问服务和资源
- 实例上需要关联一个安全组(Security Groups)
- 可以在ECS集群上访问和配置EC2实例的操作系统层面
扩展阅读
ECS入门指南: