1. 简介

Amazon Elastic Container Service (Amazon ECS) 是一种完全托管的容器编排服务。

1.1 优势

a. 可选择的无服务器计算服务

ECS 支持 Fargate 为容器提供无服务器计算功能。使用 Fargate,无需预置和管理服务器,而且可以为每个应用程序指定资源并为其付费,并通过设计隔离应用程序来提高安全性。

b. 专注于应用程序

ECS 容量提供商帮助您将重点放在构建和管理应用程序上,而不是基础设施上。通过使用容量提供商,应用程序的需求决定了分配给它的计算容量,您可以灵活地使用 EC2 和 Fargat 的混合,以及应用程序的现货和按需定价选项。

c. 高度可扩展性来提高性能

可以使用 ECS 快速启动数千个容器,不会增加任何复杂性。

d. 安全性

ECS 允许在自己的 VPC 中启动容器,让您可以使用自己的 VPC 安全组和网络 ACL。不与其他客户共享计算资源。您还可以使用 IAM 为每个容器分配细粒度的访问权限,以便限制对各项服务的访问,控制某个容器可以访问哪些资源。这种高度隔离可以帮助您使用 ECS 构建高度安全的应用程序。

e. 可靠性

ECS 在全球最好的基础设施上运行,在 22 个区域设有 69 个可用区 (AZ)。

f. 针对成本进行了优化

使用 ECS,您可以使用 Fargate Spot 任务或 EC2 Spot 实例来实现与按需计费相比高达90%的折扣,以运行无状态和容错的应用程序。您可以使用节省计划,并为持久工作负载实现高达50%的折扣。通过混合 Spot 实例、按需实例和保留实例,可以轻松地大规模运行 ECS 集群。

1.2 定价

1.2.1 Fargate 启动模式(没有免费套餐)

使用 Fargate 后,需要为容器化应用程序请求的 vCPU 和内存资源量付费。vCPU 和内容资源量从拉取您的容器镜像时开始计算,到 Amazon ECS 任务终止时停止计算,向上舍入到秒。最低收费标准为 1 分钟。

1.2.2 EC2 启动模式(EC2免费套餐)

EC2 启动模式没有额外的费用。您只需为您创建的用于存储和运行应用程序的 AWS 资源(例如 EC2 实例或 EBS 卷)付费。您只需按您的实际用量付费;既没有最低费用,也无需预付费。

1.2.3 AWS Outposts 上的 Amazon ECS

AWS Outposts 就是购买 Amazon 服务器,搭建本地机房,并运行着和 Cloud 上一样的 Amazon Web Service,没有额外费用,容器就是运行在本地机房中;

2. ECS 特性

Amazon ECS 是一种区域服务,它以高可用性的方式简化在一个区域内跨多个可用区来运行容器。

可以在新的或现有的VPC中创建 Amazon ECS 集群。集群启动并运行后,可以创建任务定义,定义哪些容器 Image 在集群中运行。任务定义用于运行任务或创建服务。Image 存储在 ECR 中,并从 ECR 中提取。

下图显示了运行在 AWS Fargate 上的 Amazon ECS 环境的体系结构。
Amazon Elastic Container Service - 图1

2.1 Container and Image

要在 Amazon ECS 上部署应用程序,应用程序组件的架构必须能在容器中运行。容器是软件开发的标准化单元,它包含软件应用程序运行所需的一切,包括相关代码、运行时、系统工具和系统库。容器是从名为 Image 的只读模板创建的。

Image 通常由 Dockerfile 构建,Dockerfile 指定容器中包含的所有组件。构建完成后,这些 Image 将存储在一个镜像仓库中,然后可以下载它们并在集群上运行。
Amazon Elastic Container Service - 图2

2.2 Task Definitions

要让应用程序在 Amazon ECS 上运行,必须创建任务定义。

任务定义是一个 JSON 文件,描述应用程序中的一个或多个容器(最多10个)。任务定义可以看作是应用程序的蓝图。它为应用程序指定各种参数。例如,这些参数可用于指示应该使用哪些容器,应该为应用程序打开哪些端口,以及任务中的容器应该使用哪些数据卷。任务定义可用的特定参数取决于特定应用程序的需要。

下面是一个任务定义的例子,它指定使用 Fargate 来启动运行 NGINX web 服务器的单个容器。(Example task definitions)

  1. {
  2. "family": "webserver",
  3. "containerDefinitions": [
  4. {
  5. "name": "web",
  6. "image": "nginx",
  7. "memory": "100",
  8. "cpu": "99"
  9. },
  10. ],
  11. "requiresCompatibilities": [
  12. "FARGATE"
  13. ],
  14. "networkMode": "awsvpc",
  15. "memory": "512",
  16. "cpu": "256",
  17. }

2.3 Tasks and Scheduling

任务是集群中任务定义的实例化。在 Amazon ECS 中为应用程序创建了任务定义之后,可以指定要在集群上运行的任务数量。

Amazon ECS task scheduler 负责在集群中调度任务。有几个不同的调度选项可用。例如,您可以定义同时运行和维护指定数量的任务的服务。有关可用的不同调度选项的详细信息,请参阅 Scheduling Amazon ECS tasks
Amazon Elastic Container Service - 图3

2.4 Clusters

Amazon ECS 集群是任务或服务的逻辑分组。您可以向集群注册一个或多个 Amazon EC2 实例(也称为容器实例),以便在这些实例上运行任务。或者,您可以使用 Fargate 提供的无服务器基础设施来运行任务。当您的任务在 Fargate 上运行时,您的集群资源也由 Fargate 管理。

当您第一次使用 Amazon ECS 时,将为您创建一个默认集群。您可以在帐户中创建其他集群,以保持资源独立。

有关创建集群的更多信息,请参见 Amazon ECS clusters。有关启动容器实例并在集群中注册它们的更多信息,请参见 Amazon ECS container instances

2.5 Container Agent

容器代理运行在 Amazon ECS 集群中的每个容器实例上。代理向 Amazon ECS 发送关于资源当前运行任务和资源利用率的信息。每当收到来自 Amazon ECS 的请求时,它就启动和停止任务。有关更多信息,请参见 Amazon ECS Container Agent
Amazon Elastic Container Service - 图4

3. 使用前设置

3.1 创建 IAM 用户

创建一个管理员用户,并将该用户添加管理员组

  • 通过 根用户 登录 AWS 账户,进入 IAM 控制台;
  • 创建用户 Administrator 及密码;
  • 设置权限:将用户添加到组;
  • 创建组:Aministrators;
  • 选择筛选策略:AWS managed-job function(AWS 托管的工作职能)以筛选表内容;
  • 选择 AdministratorAccess 策略,然后创建组;

    3.2 创建密钥对

    对于Amazon ECS,只有当您打算使用 EC2 启动类型时才需要密钥对。

AWS 使用公钥加密来保护实例的登录信息。Linux实例 (例如 Amazon ECS 容器实例) 没有用于 SSH 访问的密码。需要使用密钥对安全地登录到实例。您可以在启动容器实例时指定密钥对的名称,然后在使用 SSH 登录时提供私钥。

如果还没有创建密钥对,可以使用 Amazon EC2 控制台创建一个密钥对。如果计划在多个区域启动实例,则需要在每个区域创建一个密钥对。有关区域的更多信息,请参见 Regions and Availability Zones 中的 Amazon EC2 Linux 实例用户指南。

  1. 登录 EC2 控制台;
  2. 从导航栏中为密钥对选择一个区域。您可以选择任何可用的区域,而不考虑您的位置。但是,密钥对是特定于某个区域的。例如,如果您计划在美国东部(俄亥俄州)地区启动一个容器实例,那么您必须为该实例在美国东部(俄亥俄州)地区创建一个密钥对。

Amazon Elastic Container Service - 图5

  1. 在导航窗格的“NETWORK & SECURITY”下,选择密钥对;

Amazon Elastic Container Service - 图6

  1. 在创建密钥对对话框中输入新密钥对的名称,然后选择 Create。使用易于记忆的名称,例如 IAM 用户名,后跟-键对,再加上区域名。例如,me-key-pair-useast2;
  2. 浏览器会自动下载私钥文件,这是您保存私钥文件的唯一机会。
  3. 在启动实例时提供密钥对的名称,并在每次连接到实例时提供对应的私钥。
  4. 如果您在 macOS 或 Linux 计算机上使用 SSH 客户机连接到您的 Linux 实例,请使用以下命令设置您的私钥文件的权限,以便只有您可以读取它。
    1. chmod 400 your_user_name-key-pair-region_name.pem

使用 PuTTY 从 Windows 连接到 Linux 实例:

  1. 下载安装 PuTTy, http://www.chiark.greenend.org.uk/~sgtatham/putty/
  2. Start PuTTYgen (for example, from the Start menu, choose All Programs > PuTTY > PuTTYgen);
  3. Under Type of key to generate, choose RSA;

Amazon Elastic Container Service - 图7

  1. 选择 Load。默认情况下,PuTTYgen 只显示扩展名为 .ppk 的文件。要定位 .pem 文件,请选择显示所有类型文件的选项。

Amazon Elastic Container Service - 图8

  1. 选择在之前创建的私钥文件,并选择 Open。
  2. 选择保存私钥。
  3. 为密钥指定相同的名称。PuTTY 自动添加 .ppk 文件扩展名。

3.3 创建 VPC

强烈建议您在自己的 VPC 中启动容器实例。

创建一个非默认的 VPC:

  1. 登录 VPC 控制台;
  2. 从导航栏中,为 VPC 选择一个区域。VPC 是特定于某个区域的,因此应该选择创建密钥对的同一区域。
  3. 在 VPC 仪表板上,选择启动 VPC 向导。
    1. 选择一个 VPC 配置页面,确保选择了具有单个公共子网的 VPC,并选择 Select。
    2. 具有单个公共子网页面的 VPC 中,在 VPC 名称字段中为您的 VPC 输入一个名称。保留其他默认配置设置,并选择 Create VPC。在确认页面上,选择 OK。

3.4 创建安全组

安全组充当关联容器实例的防火墙,在容器实例级别控制入站和出站流量。

如果计划在多个区域启动容器实例,则需要在每个区域创建一个安全组。

创建具有最少权限的安全组:

  1. 登录 EC2 控制台;
  2. 从导航栏中,为安全组选择一个区域。安全组是特定于某个区域的,因此应该选择创建密钥对的同一区域;
  3. 在导航窗格中,选择安全组,创建安全组。
  4. 为新的安全组输入名称和描述。选择一个容易记住的名称,比如 ecs-instances-default-cluster。
  5. 在 VPC 列表中,确保选择了默认的 VPC,它用星号 (*) 标记。如果使用非默认的 VPC,就选择之前自己创建的 VPC;
  6. 您可能需要添加一个 SSH 规则,这样您就可以登录到容器实例并使用 Docker 命令检查任务。如果您希望容器实例承载运行 web 服务器的任务,还可以为 HTTP 和 HTTPS 添加规则。
  7. 在 Inbound 选项卡上,创建以下规则(为每个新规则选择 Add Rule),然后选择 create:
    1. 从类型列表中选择 HTTP,并确保将源设置为任意位置(0.0.0.0/0)。
    2. 从类型列表中选择 HTTPS,并确保将源设置为任意位置(0.0.0.0/0)。
    3. 从类型列表中选择 SSH。在 Source 字段中,确保选择了自定义 IP,并以 CIDR 表示法指定计算机或网络的公共 IP 地址。要在 CIDR 符号中指定一个单独的 IP 地址,添加路由前缀/32。例如,如果您的 IP 地址是203.0.113.25,那么指定203.0.113.25/32。如果您的公司从一个范围分配地址,那么指定整个范围,比如203.0.113.0/24。 :::info 出于安全原因,我们不建议您允许 SSH 从所有 IP 地址(0.0.0.0/0)访问您的实例,除非是为了测试目的,而且只允许短暂访问。 :::

3.5 Install the AWS CLI

AWS 管理控制台可用于使用 Amazon ECS 手动管理所有操作。但是,在本地桌面或开发人员机器上安装 AWS CLI,使您能够构建可以在 Amazon ECS 中自动化常见管理任务的脚本。