亚马逊 Fargate 快速启动指南(一)

原文:annas-archive.org/md5/dea5b437fa3f0656b1be6f1919ee655e

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

在 AWS re:Invent 2017 上,宣布了一种名为 Fargate 的新容器启动类型。本书内容就是关于 Amazon Fargate,这个针对 Docker 容器的 Amazon 弹性容器服务ECS)的新启动类型。

Docker 是事实上的标准容器化框架,彻底改变了软件的打包和部署。Amazon Fargate 使 ECS 平台实现了无服务器化;无需配置、运行或管理 EC2 实例。Amazon Fargate 在 Docker 容器上运行 ECS 服务,并将服务任务直接暴露给用户。Fargate 通过实现无服务器化,大大简化了 ECS 平台。

Amazon Fargate 提供以下好处:

  • 它在 AWS ECS 上得到支持,AWS EKS 也将在未来添加支持

  • 它与其他 AWS 服务完全集成,包括 IAM、CloudWatch 日志和 EC2 负载均衡

  • Amazon Fargate 是无服务器的,减少了 ECS 集群的管理;无需配置、创建或管理 EC2 实例

  • ECS 服务任务直接暴露给用户

  • 每个任务都会创建一个弹性网络接口

  • 支持 ECS 任务的自动扩展

  • 提供了一个 ECS CLI,用于创建 ECS 集群并使用 Docker Compose 部署任务

Amazon Fargate 通过 Fargate 平台启动集群,而不是在 EC2 实例上启动 ECS 集群。

本书适合谁阅读

主要的读者群体是 Docker 用户和开发者。如果你从事以下角色,本书对你会很有帮助:

  • DevOps 架构师

  • Docker 专家

  • DevOps 工程师(Docker)

本书内容

第一章,开始使用 Amazon ECS 和 Amazon Fargate,是本书的引言部分,讨论了使用 Fargate 启动类型的好处,如何使用 Fargate 启动类型分配和配置计算资源,Fargate 中的 ECS 对象与 EC2 启动类型相同,以及 Fargate 中的新特性。

第二章,网络配置,介绍了 Fargate 启动类型在 ECS 集群中的使用方式。我们将使用 Hello World Docker 镜像创建一个包含容器、任务和服务定义的集群。随后,我们将使用与任务相关联的弹性网络接口的 IPv4 公共 IP 调用 Hello World 应用程序。

第三章,使用 CloudWatch 日志,讨论了配置 ECS 容器进行日志记录。我们通过 ECS 服务为 MySQL 数据库演示了 CloudWatch 日志。Fargate 启动类型唯一支持的日志驱动程序是 awslogs 驱动程序。

第四章,使用自动扩展,介绍了与 Fargate 启动类型一起使用的 ECS 服务自动扩展。配置自动扩展需要设置任务数量的范围(最小值和最大值),在该范围内应用自动扩展。

第五章,使用 IAM,讨论了为 ECS 配置 IAM 用户。根用户不需要进行权限配置,并且可以访问 ECS 资源、ECS 控制台、ECS API 及所有必需的 AWS 服务。如果要使用 IAM 用户进行 ECS 操作,必须为该 IAM 用户添加所需的 IAM 策略。

第六章,使用应用程序负载均衡器,讨论了如何配置使用 Fargate 启动类型的 ECS 服务,并通过应用程序负载均衡器平衡 Hello World 服务的 HTTP 请求。

第七章,使用 Amazon ECS CLI,讨论了如何使用 ECS CLI 创建一个 Fargate 启动类型的集群。接着,我们将在集群上部署一个 Docker Compose 文件,运行一个 WordPress Docker 镜像的任务。

为了充分利用本书

你应该具有一定的 Docker 基础知识,因为 Fargate 平台是 Amazon ECS 的一种启动模式,ECS 是一个用于 Docker 容器的托管服务。你还应该具备一些 AWS 和 ECS 的基本知识。

如果你还没有 AWS 账户,你需要在aws.amazon.com/resources/create-account/创建一个。

下载示例代码文件

你可以从你的账户在www.packtpub.com下载本书的示例代码文件。如果你是在其他地方购买的这本书,你可以访问www.packtpub.com/support并注册,代码文件会直接通过邮件发送给你。

你可以按照以下步骤下载代码文件:

  1. www.packtpub.com登录或注册。

  2. 选择“SUPPORT”标签。

  3. 点击“代码下载与勘误”

  4. 在搜索框中输入书名并按照屏幕上的指示操作。

文件下载后,请确保使用最新版本的解压缩工具解压或提取文件夹:

  • WinRAR/7-Zip for Windows

  • Zipeg/iZip/UnRarX for Mac

  • 7-Zip/PeaZip for Linux

本书的代码包也托管在 GitHub 上,地址为github.com/PacktPublishing/Amazon-Fargate-Quick-Start-Guide。如果代码有更新,它会在现有的 GitHub 仓库中进行更新。

我们还提供了其他代码包,来自我们丰富的书籍和视频目录,可以在**github.com/PacktPublishing/**找到。快去看看吧!

下载彩色图片

我们还提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图片。你可以在此下载:www.packtpub.com/sites/default/files/downloads/AmazonFargateQuickStartGuide_ColorImages.pdf

使用的约定

本书中使用了一些文本约定。

CodeInText:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 账户。示例:“验证版本为 3.0,使用get-host命令。”

一段代码如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

任何命令行输入或输出如下所示:

 Set-ExecutionPolicy RemoteSigned

粗体:表示新术语、重要词汇或您在屏幕上看到的单词。例如,菜单或对话框中的单词在文本中通常这样显示。示例:“编辑容器对话框会显示出来。”

警告或重要提示如下所示。

提示和技巧如下所示。

联系我们

我们始终欢迎读者的反馈。

一般反馈:请通过电子邮件 feedback@packtpub.com 联系我们,并在邮件主题中注明书名。如果您对本书的任何内容有疑问,请通过电子邮件 questions@packtpub.com 与我们联系。

勘误:尽管我们已尽力确保内容的准确性,但错误仍然会发生。如果您在本书中发现了错误,我们将不胜感激您能向我们报告。请访问 www.packtpub.com/submit-errata,选择您的书籍,点击“勘误提交表单”链接,并输入详细信息。

盗版:如果您在互联网上发现我们的作品的任何非法复制版本,我们将不胜感激您能提供该材料的地址或网站名称。请通过 copyright@packtpub.com 联系我们,并附上该材料的链接。

如果您有兴趣成为作者:如果您在某个主题领域具有专长,并且有兴趣撰写或参与书籍编写,请访问 authors.packtpub.com

评论

请留下评论。阅读并使用本书后,为什么不在购买该书的网站上留下评论呢?潜在的读者可以看到并利用您的公正意见做出购买决策,我们在 Packt 可以了解您对我们产品的看法,我们的作者也能看到您对他们书籍的反馈。谢谢!

欲了解更多关于 Packt 的信息,请访问 packtpub.com

第一章:入门 Amazon ECS 和 Amazon Fargate

Docker 可以安装在最常用的操作系统平台上。CoreOS 预安装 Docker,并且专为运行 Docker 容器而设计。Docker for AWS 提供了一个开箱即用的 Docker swarm 模式,在这个模式中,一个节点集群(称为 swarm)提供分布式平台以运行 Docker 容器应用程序。

问题: 所有上述 Docker 平台仅是不同类型的 Docker 安装,并且需要在命令行中运行并管理 Docker 容器。

解决方案: Amazon ECS弹性容器服务)是一个为 Docker 容器提供的托管服务,内置支持扩展、负载均衡、网络、存储、日志记录和其他 Docker 容器管理任务。Amazon ECS 支持两种启动类型:EC2 和 Fargate。

在 EC2 启动类型下,会启动 EC2 实例来运行 Docker 容器。Fargate 启动类型(于 2017 年 11 月推出)则托管封装 Docker 容器的任务。任务通过 弹性网络接口ENI)直接向用户提供。Fargate 提供的 EC2 实例不会暴露给用户,也无法直接访问。

本章内容包括以下内容:

  • 什么是 Amazon Fargate

  • Fargate 的好处

  • Amazon ECS 对象

  • Amazon ECS Fargate 中的计算资源

  • Amazon Fargate 启动类型模式中的新变化是什么?

什么是 Amazon Fargate

Amazon Fargate 是 Amazon ECS 和 Amazon EKS弹性 Kubernetes 服务)管理的用于 AWS 上 Docker 容器编排服务的全新启动类型。在 Fargate 启动类型下,基础设施完全由 Fargate 提供。它是无服务器的,且没有 EC2 实例暴露给用户。Docker 容器在任务定义中作为容器定义进行定义。服务实现任务定义来运行一个或多个任务。每个任务与一个 ENI 关联。如果启用了任务级别的公共 IP 自动分配,则会自动将外部客户端可访问任务的公共 IP 分配给任务。任务之间通过私有 IP 进行通信。

Fargate 的好处

ECS 的好处如下:

  • 一个为容器化应用程序提供的托管服务,无需用户过多操作即可运行 Docker 应用程序

  • 由多个应用程序组成的微服务在隔离的容器中运行

  • 根据应用程序负载自动扩展任务

  • 与其他 AWS 服务集成,包括 IAM、CloudWatch 日志、弹性负载均衡、CloudFormation 模板、EBS 卷、批处理、ECR 和 CloudTrail 日志

  • 一个 虚拟私有云VPC),没有与其他用户共享的资源

  • 提供对使用 ECS 作为部署平台的 CodePipeline 的支持

  • 支持最新的 Docker 版本 17.0

Fargate 提供以下额外的好处:

  • 使用 Fargate 启动类型时,用户无需创建或管理任何 EC2 实例,因为集群中不会暴露任何实例。

  • 任务通过 ENI 直接暴露给用户。

  • 基础设施由 Fargate 提供,不需要使用 Fargate 启动类型来管理 EC2 实例。

  • CodePipeline 支持将 Fargate 作为部署平台。

  • 基于任务定义中封装的容器定义的微服务是显式链接的,不需要与任何额外的选项(如链接)进行关联。

  • CloudWatch Logs 可能会自动配置。

Amazon ECS 对象

使用 Fargate 的 Amazon ECS 对象与 EC2 启动类型相同。ECS 集群是最外层的封装,它由一个或多个服务组成。一个集群可以分布在多个可用区。服务是任务定义的实现,并运行一个或多个任务。任务定义可能有一个或多个任务版本。任务版本是一个独特的任务定义,包含一组任务,并与一个服务关联。一个 Fargate 实例与服务中的一组任务关联。任务定义由零个或多个容器定义组成。通常,一个任务定义会与一个或多个容器定义关联,且没有容器定义的任务定义将不会运行任何任务容器。ECS 对象的示意图如下:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d19da398-819a-4a30-8926-7b851be6f251.jpg

任务定义是一个应用程序模板,描述了一个或多个容器。虽然某些属性或设置在任务级别配置,但大多数属性在容器级别配置。任务定义可能关联多个版本。

服务实现了一个任务定义,并为任务定义定义了期望的任务运行数量。服务中配置了如自动扩展和负载均衡等可选功能。

ECS 服务中的集群是一个或多个容器服务的组合。集群名称在一个账户内必须唯一。默认会提供一个名为 default 的集群。

Amazon ECS Fargate 的计算资源

任务大小由任务内存(GB)和任务 CPU(vCPU)组成。在 EC2 启动类型中,任务大小是可选的,但在 Fargate 启动类型中,任务大小是必需的。可以选择性地定义 Docker 容器级别的内存和 CPU 设置,但这些设置会被任务定义级别的设置覆盖。只有特定的任务内存和任务 CPU 组合是受支持的,ECS 向导会通过消息指示所选值的支持值(或值范围)。例如,1GB 内存的有效 CPU 范围是 0.25 vCPU 到 0.5 vCPU。在容器级别配置的总资源(内存或 CPU)不得超过任务级别的资源设置。例如,如果一个任务定义包含两个容器(MySQL 和 WordPress),每个容器的内存限制为 128MB,则任务级别的内存必须至少为 256MB。同时,容器级别的内存总和不得超过 256MB。CPU 的配置同理。容器级别可以定义两个内存限制:软限制和硬限制。软限制对应于任务级别的memoryReservation属性,硬限制对应于任务级别的memory属性。容器的内存保留总和(软限制)不得超过任务内存。每个容器的硬限制不得超过任务级别配置的内存。容器默认必须指定最小 4GB 的内存。

以下截图展示了一个示例任务大小,其中任务内存(memory属性)设置为 0.5GB(512MB),任务 CPU 设置为 0.25 vCPU。在容器级别,根据两个容器定义,内存保留为每个容器 128MB,这使得任务级别分配的 512MB 内存足以容纳总共 256MB 的内存保留。无论是否使用,任务大小都会分配给任务。同样,每个容器配置的 CPU 单元数为 10,这使得容器内的 CPU 单元总数为 20,而任务级别分配的 CPU 单元数为 25。参考以下截图:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/090df530-6159-4804-8bd6-b851d8cc3084.jpg

容器的任务大小配置和分配

亚马逊 Fargate 启动类型模式有什么新变化?

除了前面讨论的 Fargate 的优势外,Fargate 还支持以下新功能:

  • 网络模式awsvpc是唯一受支持的模式

  • Fargate 启动类型的网络模式(awsvpc)不支持主机端口映射,应用程序暴露的主机端口与容器端口相同

  • 为 Fargate 启动类型新增了ecsTaskExecutionRole,以允许拉取 Docker 镜像并将日志发送到 CloudWatch Logs

  • 仅支持awslogs日志配置和awslogs日志驱动程序与 CloudWatch Logs。

  • 不支持任务放置,因为没有 ECS 实例来定义放置约束

  • 仅支持来自 Docker Hub 和 Amazon ECR 的 Docker 镜像。

  • Fargate 启动类型不支持特权 Windows 容器

  • 主机设备不能暴露给容器

  • Fargate 启动类型不支持 hostsourcePath 参数用于卷

总结

在本章简介中,我们讨论了使用 Fargate 启动类型的好处,计算资源如何在 Fargate 启动类型下分配和配置,使用 Fargate 的 ECS 对象与 EC2 启动类型的相同之处,以及 Fargate 中的新特性。在下一章,我们将讨论与 Fargate 配合使用的网络配置。

第二章:网络配置

Amazon ECS 是一种用于容器化应用程序的托管服务,基于 Docker 容器。托管服务意味着 ECS 管理所有容器编排方面的工作,包括启动虚拟机集群(EC2 实例)、在虚拟机上创建和调度容器以及扩展虚拟机集群。

问题: Amazon ECS 在虚拟机(EC2 实例)上运行 Docker 容器。EC2 启动类型会增加启动和管理虚拟机集群(EC2 实例)的开销。作为 ECS 的入门,任务定义定义了一组容器(容器定义)。容器定义包括名称、Docker 镜像、端口映射、入口点和命令。资源(CPU 和内存)在任务和容器级别进行定义。服务定义定义了一个服务,并由任务定义、启动类型、负载均衡器、网络配置、部署配置和部署组成。使用 EC2 启动类型的 ECS 集群如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/03493ca7-76e6-497e-bb3a-1b2121bc3cc7.png

使用 EC2 启动类型的 ECS 集群

解决方案: Amazon Fargate 引入了无服务器 ECS,并且不运行虚拟机(VM)。Fargate 的基础架构是 Fargate 平台。用户不需要管理底层实例,这使得 Fargate 成为一种基础设施即服务IaaS)。Fargate 的主要好处是用户不需要管理任何服务器。用户无需配置、管理和扩展虚拟机集群。使用 Fargate,用户不需要创建或管理任何 EC2 实例,也不需要管理集群的容量和调度。用户只需要定义容器和任务的 CPU 和内存资源需求,Fargate 会在需求波动时进行自动扩展。使用 Fargate 启动类型时,ECS 仍然可以与所有相同的 AWS 服务集成,包括 IAM、VPC 和 CloudWatch,就像 EC2 启动类型一样。EC2 启动类型选项仍然可用。下图展示了使用 Fargate 启动类型的 ECS 集群。Fargate 启动类型唯一支持的网络模式是 awsvpc,并且为任务在 VPC 中创建弹性网络接口以提供任务访问。ECS 集群可以由多个可用区中的 Fargate 管理任务组成,以实现高可用性:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/11872c88-fbf8-4faf-bd0d-a3005c2201d1.png

使用 Fargate 启动类型的 ECS 集群

随着 Fargate 启动类型的引入,任务定义、容器定义和服务定义中的一些设置与 EC2 启动类型有所不同。Fargate 相关的配置参数将在后续章节中讨论。

在本章中,我们将学习以下内容:

  • 创建 ECS 集群

  • 配置容器定义

  • 配置任务定义

  • 配置服务

  • 配置和创建集群

  • 运行额外的任务

  • 访问服务

  • 删除集群

唯一的前提条件是一个 AWS 账户,可以在aws.amazon.com/resources/create-account/创建。

创建 ECS 集群和服务

选择 Amazon ECS 并点击“开始使用”以开始创建 ECS 集群和服务。首先,配置容器定义和任务定义,然后配置服务和集群,创建 ECS 对象——集群、服务、任务定义和容器定义。我们将在以下小节中讨论如何配置这些。

配置容器定义

亚马逊 ECS 向导开始启动。ECS 对象的示意图将显示,如第一章所示,开始使用 Amazon ECS 和 Amazon Fargate。默认情况下,使用 Fargate 启动类型。首先,需要定义容器定义,然后是任务定义。

任务定义由一个或多个容器定义组成。大多数属性在容器定义中定义,但有一些在任务级别定义。首先,选择一个容器定义模板,包括图像,从列出的模板中选择,包括 sample-app 和 nginx,或创建自定义容器定义。

  • 单击“配置”以创建自定义容器定义,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f66ab87b-ec9b-4155-8a3e-6547e22c9357.png

  • 编辑容器对话框显示。容器的标准配置包括以下表格中讨论的字段:
字段描述
容器名称要创建的 Docker 容器的名称。
镜像Docker 镜像。
端口映射容器端口映射。Fargate 不支持主机端口映射,默认与容器端口映射值相同。
  • 指定容器名称(hello-world)。单击 i 图标以显示容器名称的提示框。容器名称最多可以包含 255 个字符(大小写字母、数字、连字符和下划线)。

  • 接下来,指定一个 Docker 镜像(tutum/hello-world)。镜像名称最多可以包含 255 个字符(大小写字母、数字、连字符、下划线、冒号、句点、/和井号)。Fargate 启动类型仅支持 Amazon ECR 或 Docker Hub 公共仓库中的镜像。

  • 接下来,指定内存限制(以 MiB 为单位)。可以指定两个内存限制:软限制和硬限制。可以指定其中一个或两个。指定一个或两个的效果在以下表格中讨论:

配置的内存类型描述
软限制ECS 为容器保留指定的内存量(memoryReservation)。容器可以请求超过软限制的更多内存,最多可达到容器实例上所有可用内存。
仅硬限制容器请求的内存不能超过硬限制。
软限制和硬限制ECS 为容器保留了指定的内存量(memoryReservation)。如果指定了软限制,容器可以请求超出软限制的更多内存,直到达到硬限制,或者容器实例上可用的所有内存,以先到为准。如果两者都指定了,硬限制必须大于或等于软限制。
  • 内存限制的下拉框列出了硬限制和软限制。软限制的默认值是 128 MiB。要在软限制之外添加硬限制,请点击添加硬限制链接。硬限制被添加。内存限制如下所示。软限制(128 MiB)小于硬限制(256 MiB):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ca80a7d7-5ffc-4703-91da-c247bc2d1ac4.png

  • 接下来,指定端口映射。使用 Fargate 启动类型时,暴露的端口必须指定为容器端口。容器端口80如下所示指定。主机端口默认与容器端口相同,且不能使用 Fargate 启动类型所使用的awsvpc网络模式设置为不同的值:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/480304dd-69e8-4590-b90c-a296627c2bb5.png

  • 可选地,指定高级容器配置,包括环境、网络设置、存储和日志、资源限制以及 Docker 标签的配置。虽然在任务定义级别内存和 CPU 配置是必需的,但在容器级别是可选的。唯一的要求是,任务中所有容器的总内存不得超过任务为其配置的内存,所有容器的总 CPU 不得超过任务为其配置的 CPU。容器实例为每个 CPU 核心提供 1,024 个 CPU 单元。如果容器的 Essential 复选框被选中,则容器失败会导致整个任务失败。任务中至少有一个容器必须设置为必需容器,这意味着如果任务只有一个容器,它必须是必需的,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/a911c74b-ca0f-4a58-bf12-4b17beaca24b.png

  • Fargate 启动类型仅支持awsvpc网络模式。Fargate 启动类型仅支持 awslogs 作为日志配置和日志驱动程序。配置完自定义容器后,点击更新,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6255986d-5aed-425e-83c0-d70f5dd8b281.png

  • hello-world 自定义容器的容器定义被添加如下:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/591a9f03-0bbd-4a68-8069-2e1bcd3ab2cc.png

配置任务定义

任务定义有一个默认名称,可以进行修改。网络模式为 awsvpc,无法修改。任务执行角色为“Create new”。任务执行角色是 ECS 所假定的 IAM 角色,用于访问任务所需的资源,并包括拉取私有 Docker 镜像和发布任务日志的权限。兼容性(启动类型)为 FARGATE。任务内存默认是 0.5 GB,任务 CPU 默认是 0.25 vCPU。默认的任务定义如下所示:

  • 点击“Edit”修改任务设置(如有需要):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6cf32b6b-a54a-4171-94f5-44a906823e05.png

  • 将显示配置任务定义窗口,如下图所示。指定任务定义名称(hello-world-task-definition),并选择任务执行角色(或保持默认角色):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f8a79b47-53db-4e37-8a3e-11f97fa871eb.png

  • 任务大小是任务使用的总 CPU 和内存。任务内存和任务 CPU 值构成一个内存范围,必须指定该 CPU 支持的内存值。有关某个 CPU 支持的内存范围,请参考docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html中的任务大小表格。如果任务内存不在所选任务 CPU 的支持范围内,将会产生错误。将任务内存设置为 1 GB,任务 CPU 设置为 0.5 vCPU。点击“Save”以保存任务配置,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/468447d8-f5d2-42cb-9897-3f4a9347d9cd.png

  • 配置完容器定义和任务定义后,任务定义摘要将显示在下图中。点击“Next”完成容器和任务定义:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/27f2a4e3-63e7-40de-bcba-83a95eb0a9d2.png

配置服务

接下来,配置服务。服务的默认设置会创建一个任务,数量由“Number of desired tasks”指定。创建服务后,可以根据后续章节讨论的方法添加更多任务。系统会自动创建一个新的安全组,安全组字段/标签会显示该信息,并且不会提供创建自定义安全组的选项。创建的安全组允许所有公共流量访问容器端口。网络访问和安全组可以在向导之外进一步配置。默认情况下,负载均衡器类型为“None”,可以选择“Application Load Balancer”。有关使用应用程序负载均衡器的内容,请参阅第六章,《使用应用程序负载均衡器》。

如果要添加应用程序负载均衡器,必须在创建 ECS 集群之前创建它。

  • 点击“Next”完成服务配置:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/79e09c3f-afd5-465c-98b3-1cc79e615546.png

配置和创建集群

接下来,配置集群:

  • 指定集群名称(hello-world),默认集群名称为 default。

  • VPC ID 设置指定容器将使用的 VPC 的 ID。默认情况下,会自动创建一个新的 VPC。子网设置指定容器将使用的子网的 ID。子网是 VPC 中的一个 IP 地址范围。默认情况下,新的子网会自动创建。点击“下一步”完成集群配置:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/7902788f-feb0-42bc-8c55-599b8e167626.png

  • 审核要创建的 ECS。要修改任务定义、服务或集群,点击相关的“编辑”。要以 Fargate 启动类型创建 Amazon ECS,点击“创建”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1bf20e31-a3d0-4a65-8e3e-874da6f6f3be.png

  • 使用 Fargate 启动类型的 Amazon Elastic Service 开始创建。显示的启动状态指示资源状态为“已完成”或“待处理”。“已完成”状态表示资源已创建,而“待处理”状态表示资源正在创建过程中。当所有服务资源创建完成后,点击查看服务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/40cf3b35-f545-494c-b8a6-4a9da4684304.png

显示服务摘要。除了服务名称,服务摘要还包括集群、状态、任务定义、启动类型、平台版本、服务角色、期望数量、待处理数量和运行数量。默认选中“详细信息”选项卡。由于我们没有添加负载均衡,负载均衡头显示为“没有负载均衡器”。网络访问头列出了“自动分配公共 IP”为“启用”,所有信息如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/de2971ae-c88f-4869-a8c4-3f707bad0c81.png

若要列出服务中的任务,请选择“任务”选项卡。列出了一个任务,因为我们只配置了一个任务。任务状态为“正在运行”或“已停止”。任务表的列包括任务(名称)、任务定义、最后状态、期望状态、组、启动类型和平台版本:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/da390a11-0feb-4b8c-b025-ed3251ccf7ad.png

“事件”选项卡列出了事件。每个事件都关联有事件 ID、事件时间和消息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f654371a-e33f-4a99-8a4d-3cd93a5a3240.png

“部署”选项卡列出了任务放置策略和约束条件。Fargate 启动类型不支持任务放置约束:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c30499ce-29d6-4df0-9f9b-bad37c46c4d7.png

若要显示度量标准,包括 CPU 使用率和内存使用率,请选择“度量标准”选项卡。最小值、最大值和平均值有颜色编码,详见截图中的图例:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/9d303fc3-eee2-44c8-b7b6-14b2171a1aae.png

若要显示日志,请选择“日志”选项卡:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6b96b176-1ea2-4b6c-8f02-a117524d99f2.png

集群列表中列出了一个 Fargate 启动类型的 hello-world 集群,没有显示 EC2 集群:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0e4df81b-1c80-429e-a08a-cda3a8f631a2.png

为 ECS 集群创建一个 CloudFormation 堆栈,如下图所示的 CloudFormation 仪表板。可以通过 us-east-2.console.aws.amazon.com/cloudformation 访问 AWS CloudFormation 仪表板。表格列出了堆栈,包括堆栈名称、创建时间、状态和描述等列。提供了概览、输出、资源、事件、模板、参数、标签、堆栈策略和更改集等标签。事件标签显示已创建资源的 CREATE_COMPLETE 状态:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f6704a67-3455-479c-b086-6dd3fa80b894.png

运行附加任务

默认情况下,创建一个任务。在本节中,我们将讨论添加附加任务的过程。集群中的任务选项卡显示与集群相关的任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/b6ad7cbd-0880-41d0-a5ba-e8ff2332763f.png

与服务关联的任务列在服务页面上。要显示任务定义的详细信息,请单击服务页面或集群页面中任务定义的链接。任务定义如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/857564e8-4eb3-4742-8325-6993b318eb10.png

  • 要运行新任务,请选择操作 | 运行任务。新任务将在“运行任务”下创建:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6023915b-e090-4f26-ba5c-f01d2bb1d07e.png

  • 提供了两种任务启动类型来运行新任务:Fargate 和 EC2。选择 Fargate 启动类型,如下图所示。

  • 任务定义名称已预先指定。默认情况下,平台版本为 LATEST。

  • 也可以选择集群,如果有多个集群可用,则可以从下拉列表中选择集群。

  • 指定要创建的任务数量。

  • 可选地,指定一个任务组。任务组是一组相关任务,所有在同一任务组中的任务在执行扩展部署时被视为一个集合。必填字段以星号(*)标记:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d1dfbfec-7345-4e92-8e7b-05a59181feb8.png

  • 从下拉菜单中选择一个集群 VPC,如下图所示。

  • 在子网下拉菜单中选择子网。选择任务调度器应考虑用于部署的选定 VPC 中的子网。目前仅支持私有子网。

  • 选择自动分配公共 IP 为 ENABLED。默认情况下,会创建一个安全组,并将端口 80 对外开放:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fc88e515-6846-498e-9736-c774c7f26c96.png

  • 高级选项包括任务覆盖和容器覆盖,如下图所示。我们没有设置任何高级选项:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/36f7c572-64ad-4375-a15a-6218860462f9.png

  • 点击“运行任务”以运行新任务,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/bc5804e9-c9ce-4c12-9d8a-676e3066f27a.png

创建一个任务。消息“成功创建任务”将显示。尽管只有一个新任务被创建,消息中仍会包括“任务”一词,因为该消息是标准的任务创建消息,适用于创建一个或多个新任务。新任务将列在任务标签页中,如下截图所示。最后状态列显示任务状态为运行中。最初,最后状态是“正在配置”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/4f7e6a64-75f2-4d8e-974d-e65946e01e5a.png

该 hello-world 集群列出了两个正在运行的任务,如下截图所示。待处理任务数列为 0:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d68fc660-0251-479b-970a-0cd8d6e2b00e.png

访问服务

为了能够访问服务,网络访问应配置为启用自动分配公共 IP,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/93cefa12-c179-49d6-b5e7-3bc549c55433.png

为了提供网络访问,每个任务都会创建一个 ENI。该 ENI 会关联一个公共 IP,可用于访问运行在任务容器中的应用程序:

  • 点击服务 | 任务中的任务链接,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/91b6aa08-e1e7-4629-84b4-293b89fe8e97.png

  • 在任务详细页面中,点击 ENI Id 的链接,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/03a84940-4bd9-4844-93bd-1d1d9f07e69d.png

  • 从 ENI 控制台复制 IPv4 公共 IP,如下截图所示的 18.219.111.138,不同用户会有不同的 IP:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/328fb163-74f9-4b1c-95d7-61a2c0f6879e.png

  • 在浏览器中指定 IPv4 公共 IP 来调用 Hello World 应用程序,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ad3f7fbc-d613-43a4-974d-4f52ab47c621.png

删除集群

要删除集群,该集群不能有正在运行的任务:

  • 选择所有正在运行的任务,然后点击停止,如下截图所示。或者,选择停止所有,而不选择任何任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/47a32a2e-fd4c-40f8-baa9-b82ac137510a.png

  • 在停止任务确认对话框中,点击停止。任务将停止,屏幕上会显示“任务已成功停止”的信息。

  • 点击删除集群以删除该集群:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d73df405-48f6-4dc8-92d3-3a99a4b9bf4e.png

  • 在删除集群确认对话框中,点击删除。hello-world 集群将被删除。如果与集群关联的 CloudFormation 堆栈在集群删除之前超时,则会显示错误消息,如下截图所示,并且集群不会被删除。如果选择删除 ECS 集群时,CloudFormation 堆栈没有自动删除,请点击错误消息中的查看 CloudFormation 堆栈链接:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/77b5964d-a95c-437a-95fc-d2ff314f2c24.png

  • 在 CloudFormation | 堆栈仪表盘中,选择 CloudFormation,并点击操作 | 删除堆栈,如下截图所示。在堆栈状态变为 DELETE FAILED 后,可能需要启动删除堆栈操作:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5f264ac5-8de1-4576-adc9-06d10f6ee0fc.png

  • 在删除堆栈确认对话框中,选择所有要删除的资源,以及 CloudFormation 堆栈,然后点击“是,删除”。CloudFormation 将被删除。在 CloudFormation 堆栈删除后,删除 ECS 集群,ECS 集群也将被删除。

总结

在本章中,我们介绍了与 ECS 集群一起使用的 Fargate 启动类型。我们创建了一个集群,包括容器、任务和服务定义,使用了 Hello World Docker 镜像。随后,我们通过与任务关联的弹性网络接口(ENI)的 IPv4 公共 IP 调用了 Hello World 应用程序。与 EC2 启动类型相比,某些容器定义和任务定义参数在 Fargate 启动类型中有所不同,而 EC2 启动类型仍然作为 ECS 的一个可选项存在。在下一章中,我们将讨论将 CloudWatch Logs 服务与 Fargate 集成。

第三章:使用 CloudWatch Logs

Docker 容器生成日志,Docker 支持docker logsdocker service logs命令来列出日志。Docker 还支持日志驱动,这是获取正在运行的容器和服务生成的日志的机制。

问题:没有像 Amazon ECS 这样的托管服务时,必须配置日志驱动才能添加日志机制。

解决方案:使用 Fargate 启动类型,日志记录大大简化,唯一支持的日志驱动是awslogsawslogs日志驱动将 ECS 任务生成的日志流式传输到 CloudWatch Logs。通过使用aws-logs-prefix,可以为awslogs驱动程序关联一个标签,以区分由不同任务容器生成的日志流。

本章我们将学习以下内容:

  • CloudWatch Logs 和 aws 日志驱动概述

  • 为 MySQL 数据库创建 ECS 服务

  • 配置容器定义

  • 配置日志记录

  • 配置任务定义

  • 配置服务

  • 配置集群

  • 创建 ECS 服务

  • 浏览任务日志

  • 浏览 CloudWatch 日志

  • 浏览 CloudWatch 指标

唯一的前提条件是拥有一个 AWS 账户。

CloudWatch Logs 和 aws 日志驱动概述

Amazon CloudWatch 是 AWS 的一个服务,用于监控 AWS 资源的日志,包括 Amazon ECS、EC2、EBS 卷、弹性负载均衡器和 RDS。CPU 利用率、内存利用率、延迟和请求计数的指标从这些资源流式传输到 CloudWatch,接近实时。一些 CloudWatch 的术语和概念在下表中讨论:

CloudWatch 概念描述
日志事件一个日志事件,包括日志消息和时间戳,是记录某个资源或应用程序上的某个事件/活动的记录。
日志流一个日志流是来自同一资源或应用程序的连续日志事件序列。
日志组一个日志组是一个共享相同保留、监控和访问控制设置的日志流的集合。每个日志流都与一个日志组关联,日志组中的日志流不必来自相同的资源或应用程序。通常,日志流来自不同的资源或应用程序,而日志组则聚合类似的监控数据。
指标过滤器指标过滤器从事件中过滤出指标观察数据,以生成 CloudWatch 指标的数据点。
保留设置保留设置指示日志事件应保持的时间长度。

awslogs日志驱动是 Fargate 启动类型支持的唯一日志驱动。awslogs日志驱动支持下表讨论的选项。除了下表讨论的选项,awslogs日志驱动还支持其他选项,但 ECS 仅支持这些选项:

选项描述是否必需
awslogs-region指定 CloudWatch 日志发送的 Amazon 区域。
awslogs-group指定日志流发送日志的日志组。
awslogs-stream-prefix指定要与日志流关联的前缀。使用 Fargate 启动类型生成的日志流具有以下格式:prefix-name/container-name/ecs-task-Id是,适用于 Fargate 启动类型

为 MySQL 数据库创建 ECS 服务

在本节中,我们将创建一个用于 MySQL 数据库的 ECS 定义来演示日志记录。可以使用任何 Docker 镜像;选择 MySQL 数据库镜像是因为在初始化、安装和配置 MySQL 数据库时会生成多个日志事件。另一种 Docker 镜像,如tutum/hello-world,不会生成很多日志事件。

  1. 在浏览器中打开URL,点击“开始使用 Amazon ECS”。ECS 控制台将启动。

  2. 点击“开始”以启动向导来创建新的容器和任务定义,以及新的服务。默认情况下,ECS 向导基于 Fargate 启动类型。将显示 ECS 对象的图示。

ECS 对象在第一章中讨论,《Amazon ECS 和 Amazon Fargate 入门》

配置容器定义

在本节中,我们将讨论如何为 MySQL 数据库创建容器定义:

  1. 点击“配置自定义容器定义”,如以下截图所示。其他一些容器定义可以作为示例:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d7f7fc78-e1a1-4fbd-96dc-ce7e7e5a26bc.png

  1. 在编辑容器对话框中,指定容器名称(mysql),并将镜像指定为mysql,如以下截图所示。

  2. 为内存指定软限制(512)和硬限制(1024)。内存的硬限制不得小于软限制:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/817966e3-c42a-40fd-acb2-4d7e9ddc500e.png

  1. 在端口映射中将容器端口指定为3306,协议选择 tcp,如以下截图所示。在 Fargate 启动类型下,仅容器端口映射可以配置,主机端口映射无效,并且被设置为与容器端口映射相同的值:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/50866010-10d0-454a-a7fe-0492403afaca.png

  1. 在“高级容器配置”|“环境”部分,指定 mysql Docker 镜像的必需环境变量。必需的环境变量是MYSQL_ROOT_PASSWORD,用于设置root用户的密码,如以下截图所示。可选地,指定其他环境变量,如MYSQL_DATABASE,用于创建数据库。

  2. “必需”复选框表示容器是否对任务的运行至关重要。如果选择了“必需”复选框,则表示容器是必需的,如果容器失败,任务也会失败。任务定义中必须至少有一个容器被设置为必需。由于 mysql 容器是唯一的容器,它必须设置为必需:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fd20d1bd-e54e-470c-80ff-44b1dd1b0712.png

配置日志记录

向下滚动到“存储和日志”部分,在编辑容器对话框中,如下所示:

  1. 若要自动配置日志记录,勾选“自动配置 CloudWatch Logs”复选框。Fargate 启动类型仅支持awslogs日志驱动程序:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c9088591-3d05-401e-971b-5854fabf872b.png

  1. 如前表所述的所有日志选项对 Fargate 启动类型是强制性的,每个选项的默认值都会被设置。awslogs-group选项设置为/ecs/<task definition name>。如果在配置日志记录后修改了任务定义名称,awslogs-group也会更新。点击“更新”以完成容器配置:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/9c541c20-a98d-40e2-9e69-645e20826df2.png

添加的logConfiguration参数用于日志配置,如下所示:

{
            "containerDefinitions": [{
                        ...
                        "logConfiguration": {
                                    "logDriver": "awslogs",
                                    "options": {
                                                "awslogs-group": "/ecs/mysql-task-definition",
                                                "awslogs-region": "us-east-1",
                                                "awslogs-stream-prefix": "ecs"
                                    }
                        }
                        ...
            }]
}

为 MySQL 数据库创建了名为 mysql 的容器定义,如下图所示。

配置任务定义

列出了默认的任务定义设置。某些任务定义设置可以修改,某些则不可修改。网络模式不可修改,必须为 awsvpc。兼容性也不可修改,必须设置为 FARGATE。修改任务定义是可选的:

  1. 要修改任务定义,请点击任务定义 | 编辑,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/577d1f66-2093-4655-89a3-cadf730c7cce.png

  1. 在“配置任务定义”对话框中,设置任务定义名称(mysql-task-definition),如下所示:

  2. 对于 Fargate 启动类型,网络模式不可修改,必须为 awsvpc。

  3. 选择任务执行角色为 ecsTaskExecutionRole。ecsTaskExecutionRole 授予权限以调用 CloudWatch 发送容器日志。

  4. 兼容性已预设为 FARGATE,且不可修改。

  5. 设置任务大小,它将分配选定的任务内存和 CPU 给任务。只能选择特定的任务内存和任务 CPU 组合。

  6. 点击“保存”以完成任务定义配置:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fc4711da-5ea9-436d-9569-170e69572452.png

  1. 任务配置已保存。awslogs-group已更新为/ecs/mysql-task-definition。如以下截图所示,点击“下一步”进入开始向导:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c8e175d5-f134-4217-9cd4-4d7694169a4b.png

配置服务

在配置了容器定义和任务定义之后,接下来配置服务。服务名称(mysql-service)、所需任务数量(默认为 1)、安全组(自动创建新安全组)和负载均衡器类型(无)可以根据需要通过“编辑”进行修改。我们将使用服务的默认设置来演示 Fargate 日志记录。点击“下一步”,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5260c23e-459f-4e17-8519-d67f78aad3d0.png

配置集群

接下来,配置集群。默认情况下,在“集群名称”中指定了默认集群:

  • 指定不同的集群名称(mysql)。

  • VPC ID 和子网的默认设置为创建新的。点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/37fccb93-1d0f-4af8-9986-e669b9d92ee3.png

创建 ECS 服务

查看容器定义、任务定义和服务的设置。提供了编辑按钮,可以编辑这些 ECS 对象:

  1. 要使用 Fargate 启动类型创建 ECS,点击“在审核中创建”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c02f12fa-d318-4de4-8923-c87d221ede45.png

  1. ECS 资源开始创建,如下图中的启动状态所示。部分资源显示为待处理状态,而其他资源显示为已完成状态。当所有 ECS 资源都已创建完毕,状态显示为“完成”时,点击“查看服务”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f0ef1b5f-ebda-4bea-b7ee-b444892d1a73.png

mysql集群中创建了一个 ECS mysql-service,如以下截图中的 mysql 集群的服务选项卡所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1108b988-4660-4714-a025-681c2e2d5506.png

任务选项卡列出了服务中的任务,如下图所示。点击任务链接以列出任务的详细信息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/23647ff1-af90-4990-b339-ef2bf6e6f0a0.png

显示任务详细信息,包括截图中显示的 ENI Id 链接,以便获取 ENI 的详细信息。任务定义的公共 IP 和私有 IP 也会列出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0860704c-8750-4a5f-a802-415907de12d4.png

点击边栏导航中的任务定义,列出任务定义,包括修订版本,以任务定义名称:修订格式显示,如下图所示。其他任务定义也可能被列出。任务定义的状态显示为“活动”,表示该任务定义是活动的,可以在服务中用于运行任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6576fc59-21d6-4ff3-8f0e-49c3bccfe339.png

点击任务定义链接,列出任务定义的修订版本,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/149d1026-c046-426d-a331-0f4f5a23131d.png

点击任务定义修订链接,显示构建器和 JSON 格式选项卡,如下图所示。要创建任务定义的新修订,点击“创建新修订”。我们没有使用新的修订,但新修订会基于修订后的任务定义创建一组新的任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/e99674f5-7e06-491a-b26a-481e240d75b9.png

mysql 容器列在容器定义部分。容器定义表列出了容器名称、Docker 镜像、CPU 单元、硬/软内存限制以及容器是否是必需的。点击 mysql 容器以显示其详细信息,包括日志配置,如下图所示。详细配置包括端口映射和环境变量:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/db689b3a-0fd5-437e-a2b9-75054235b3a9.png

mysql 集群列出了集群,如下图所示。还列出了服务数量、正在运行的任务数量和待处理任务数量。仅 FARGATE 启动类型列出服务和任务,而 EC2 启动类型则不列出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/93a0a387-d5dd-4f05-820c-5a91d2d67701.png

探索任务日志

任务日志事件通常用于调试任务或服务,以及查明任务是否无错误启动。任务生成的日志事件通过在任务详情中选择“日志”标签进行显示,如下图所示。每个日志条目包括时间戳和日志消息。调试任务的一个示例是 MySQL 初始化进程失败消息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/4bed299f-15ea-4e55-8158-72ca8de93b7b.png

任务可能由于多种原因失败,常见的一些原因包括:

  • 任务内存不足

  • 强制环境变量尚未设置

  • 分配给容器或任务的 CPU 不足

一个示例日志条目,其中显示 MySQL 数据库正在运行并接受连接的消息是 mysqld: ready for connections,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/61e75d0b-d833-4df4-9d1d-45e9a71ca75b.png

探索 CloudWatch 日志

在本节中,我们将查找生成的 CloudWatch 日志的详细信息,并展示生成的日志流:

  1. 点击 CloudWatch 控制台中的“日志”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/2008b2a3-61dc-4b9c-acc1-c49764498906.png

  1. 在筛选器中,指定 /ecs/mysql 或仅 /ecs,这是 awslogs 日志驱动程序中 awslogs-stream-prefix 选项的值,如在 配置日志记录 部分的容器定义中配置。日志组 /ecs/mysql-task-definition 会显示,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1e2c6933-fcb2-415b-b924-509f0691b78b.png

  1. 点击日志组以显示日志流,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/7322c545-0464-4885-8d91-4ae554b83583.png

日志流中的日志事件会显示。每个日志事件都与时间戳和日志消息关联。一个示例日志消息是 Initializing database,如下图所示。一些消息带有 [Warning] 标记:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8d9cd791-977b-4309-8d23-03cf71408ac4.png

一个 CloudWatch 日志消息,表示 MySQL 数据库正在运行并接受连接的消息是 mysqld: ready for connections,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/7742ebb7-3115-4cda-9ee0-ee49aaa8d963.png

探索 CloudWatch 指标

在本节中,我们将展示指标:

  1. 点击导航中的“指标”,如以下截图所示。筛选 mysql 服务的指标,选择 All | ECS ClusterName | ServiceName,以显示所有指标,包括 MemoryUtilization 和 CPUUtilization 指标:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/16fd8abf-add9-4386-b72a-eb15a16f800d.png

  1. 并非所有的度量标准都可以被绘制,尽管任务生成的 MemoryUtilization 和 CPUUtilization 度量标准会被绘制。选择“已绘制的度量标准”选项卡,仅显示已绘制的度量标准:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/89c6c8a8-632f-4ece-95c8-5a7707d1ca99.png

摘要

在本章中,我们讨论了为 ECS 容器配置日志记录。我们展示了如何使用 ECS 服务为 MySQL 数据库配置 CloudWatch 日志。Fargate 启动类型唯一支持的日志驱动程序是 awslogs 驱动程序。Fargate 启动类型必须配置三个日志驱动选项:awslogs-regionawslogs-stream-prefixawslogs-group。在下一章中,我们将讨论使用 Fargate 的自动伸缩。

第四章:使用自动扩展

Amazon ECS 提供内置的内部负载均衡功能,用于在 ECS 服务中的任务之间分配客户端流量。如果所有客户端负载都发送到一个任务上,ECS 服务中的内部负载均衡器将把部分流量引导到其他任务上,以便均匀分配客户端负载。

问题: 服务中最初配置的任务数量是固定的。如果预期客户端负载是固定的,则 ECS 服务中的固定任务数量应该足够。但如果客户端负载波动,ECS 服务任务不会自动扩展。如果客户端负载增加,预配置的任务数量可能无法处理客户端流量。

解决方案: Amazon ECS 支持使用自动扩展策略,该策略由基于 ECS 服务度量的 CloudWatch 警报组成:CPUUtilizationMemoryUtilization。必须在执行任何扩展操作之前设置警报阈值;例如,MemoryUtilization不能超过指定的特定值,并且该阈值必须在一定数量的连续时段内保持不变,每个时段为 1 分钟、5 分钟、15 分钟或 1 小时。如果超过了警报阈值,则可能执行扩展操作,如增加、设置或移除指定数量或百分比的任务。客户端负载的衡量标准是CPUUtilizationMemoryUtilization

任务数量随着负载变化,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/7ae1a2b0-d114-40ee-99a7-acd5bb683de8.png

在本章中,我们将演示配置和使用自动扩展,并学习以下内容:

  1. 为“Hello World”应用程序创建一个 ECS 服务

  2. 自动扩展的类型

  3. 配置自动扩展策略

  4. 演示自动扩展的使用

  5. 探索 CloudWatch 指标和日志

  6. 更新服务以修改任务数量

为“Hello World”应用程序创建一个 ECS 服务

使用tutum/hello-world Docker 镜像为“Hello World”应用程序创建 ECS 服务的详细过程,请参见第二章,网络配置。在本节中,我们将创建一个hello-world集群,其中包含一个hello-world-service服务,服务中有三个任务,使用的是tutum/hello-world Docker 镜像。创建集群、服务和任务定义的过程与第二章网络配置中的过程相同,具体如下:

  1. tutum/hello-world Docker 镜像创建容器定义,hello-world

  2. 创建任务定义,hello-world-task-definition

  3. 创建一个服务,hello-world-service

  4. 创建一个集群,hello-world

该过程与第二章中的网络配置相同,唯一不同的是定义服务时使用三个任务,而不是默认的一个任务:

  • 在“定义你的服务”部分点击编辑,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0632223f-0df3-4bfe-9257-7af26cd7d479.png

  • 在“设置服务:hello-world-service”对话框中,将期望任务数设置为3,如图所示。点击保存:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fe536390-6712-4ac7-ad6b-104706056a58.png

  • 将期望任务数设置为 3 后,点击“下一步”以定义服务,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/e77a0848-4904-4da0-a462-95845dfd044c.png

  • 在配置集群中,将集群名称指定为 hello-world,如图所示。其他设置(包括 VPC ID 和子网)是不可修改的。点击下一步:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5b487776-339d-4f56-b1b3-f51b9283afe4.png

  • 在审核中查看容器定义、任务定义、服务和集群,如图所示。每项内容旁边都提供了“编辑”按钮以进行修改。点击创建以创建 ECS 对象,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/227b2760-8f0a-4c19-b89f-97dac776f057.png

  • 启动状态应指示所有 ECS 资源已创建,并显示“完成”状态,如图所示。点击查看服务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ed796956-e07d-4762-a9f8-d26f89c5c399.png

  • 如图所示,服务已创建。服务摘要中列出了服务名称、集群、状态、任务定义、启动类型、平台版本、服务角色、期望任务数、待处理任务数和运行任务数。详细信息标签列出了负载均衡和网络访问:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fab3c55d-40b2-4013-80ce-643df5861c57.png

  • 选择“任务”标签以列出任务。“最后状态”列显示任务状态,初始状态可能是 PENDING。定期点击刷新按钮以更新任务状态。当所有任务开始运行时,“最后状态”将变为 RUNNING,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/b0225031-8f2c-48b7-8425-77ae59445742.png

自动扩展的类型

定义了两种自动扩展策略:

  • 目标跟踪扩展策略

  • 步骤扩展策略

接下来我们将讨论这两种自动扩展策略,然后再演示如何使用自动扩展。

目标跟踪扩展策略

所提到的目标是 CloudWatch 指标监控的特定度量的目标值。CloudWatch 监控的两个 ECS 指标是 CPU 利用率和内存利用率。使用目标跟踪缩放策略时,任务的数量会增加或减少,以便保持指标的目标值。可能无法精确保持某个指标的目标值,因为任务的数量是按 1 的增量/减少来变化的。该指标会保持在配置的目标值或接近目标值。目标跟踪缩放策略本身会根据指标值的波动进行调整,以避免任务数量的快速波动。为了保证应用程序的高可用性,服务扩展速度要快于收缩速度,因为较少的任务会影响应用程序的可用性,而额外的任务则不会。可以同时设置多个目标跟踪缩放策略,服务会根据影响任务容量增量最大的缩放策略进行扩展。如果 CPU 或内存利用率增加,表明应用程序需要更多的任务,如果超过了目标指标,服务会进行扩展。足够的指标数据是缩放策略能生效的前提。如果数据不足,缩放策略不会调整任务数量。如果数据不足时需要进行缩放,应该使用步骤缩放策略,接下来会讨论这一点。

步骤缩放策略

目标跟踪缩放策略部分中提到,如果数据不足,可以使用步骤缩放策略。为了详细说明这一点,可以设置 CloudWatch 警报,当某个指标状态为INSUFFICIENT_DATA时触发。这样的策略被称为步骤缩放策略。所有的步骤缩放策略都利用了 CloudWatch 警报。CloudWatch 警报可以在特定的 CloudWatch 指标(CPU 利用率或内存利用率)超过或低于设定阈值时触发。例如,在应用程序使用量较高时,这些指标可能会增加,可以设置 CloudWatch 警报以增加任务数。同样,在应用程序负载较低时,这些指标值下降,可以设置 CloudWatch 警报以减少任务数。

服务自动缩放、目标跟踪自动缩放或步骤自动缩放,可以修改服务的期望任务数量。

配置自动缩放策略

默认情况下未配置自动缩放:

  • 要配置自动缩放,请点击前面截图中显示的更新按钮,选择要进行自动缩放的服务。更新服务向导将启动,如下图所示。

  • 在配置服务页面中,除非需要更新所需任务数量(3),否则不应修改设置。点击“下一步”。

  • 在配置网络中,我们无需进行任何修改。点击“下一步”。

  • 在服务自动扩展页面,选择“服务自动扩展”选项,配置服务的所需任务数,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/131da8f2-9d2b-42c4-8f6b-065d815d8c36.png

接下来,我们将讨论如何配置步进自动扩展策略。配置步进自动扩展涉及以下步骤:

  1. 定义集群扩展的任务数范围

  2. 添加自动扩展策略

  3. 将 CloudWatch 警报定义为触发扩展策略的阈值

  4. 如果警报阈值被超过,定义要采取的扩展操作

接下来,我们将讨论如何配置每一项内容。

定义任务范围

指定最小任务数(1)和最大任务数(5),如以下截图所示。示例配置中指定的任务数是任意的,但最大任务数必须等于或大于所需的任务数,最小任务数必须等于或小于所需的任务数:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/2d2595f7-89dd-4fdc-8a02-1f9c286fe360.png

设置任务数量(最小、所需和最大)本身并不会配置自动扩展;它仅指定任务数在负载波动时可以波动的范围。还需要添加一个自动扩展策略。

添加自动扩展策略

要添加扩展策略,请点击“添加扩展策略”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/bf748b50-bc20-422e-89bb-3cea99488726.png

会弹出一个“添加策略”对话框,如前面的截图所示。

接下来,我们将讨论如何配置步进自动扩展策略。

添加步进扩展策略

  • 在添加策略中,选择扩展策略类型为步进扩展,如以下截图所示。

  • 指定一个策略名称(AutoScaler):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ededc98e-0f04-40df-beb0-185f74c0db8b.png

  • 在“执行策略时”中,选择“创建新警报”,如图所示。如果可以使用现有警报,也提供了“使用现有警报”选项:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/90dbb3ea-ac49-40ea-9043-c31328517fae.png

创建 CloudWatch 警报

在本节中,我们将讨论如何创建一个 CloudWatch 警报:

  • 指定一个警报名称,如以下截图所示。

  • 对于新警报,使用 ECS 度量指标来创建 CloudWatch 警报。要使用其他度量指标进行自动扩展,请在 CloudWatch 控制台中创建一个警报,并在“添加策略”中选择“使用现有警报”。在“添加策略”中配置新警报时,只能使用两个 ECS 度量指标:CPUUtilization 和 MemoryUtilization。选择 CPUUtilization。

  • 警报阈值指定何时应用自动扩展策略。自动扩展的一个示例是在 MemoryUtilization 超过 256 MB 时扩展任务。定义警报阈值的措施有多种,分别为:平均值、最小值、最大值、总和和数据样本。作为示例,选择最大值。

  • 因为选择了 ECS 服务度量标准为 CPUUtilization,所以比较操作符(<, <=, >, >=)已应用于 CPUUtilization。以 >= 为例。

  • 为比较指定一个值(0.1)。

  • 指定在超过警报阈值后应用自动扩展策略的连续期数为 1。一个周期的定义不是固定的,不同的定义周期选项包括 1 分钟、5 分钟、15 分钟和 1 小时。频率值越低,对资源利用波动的响应越快。以 1 分钟为例。点击“保存”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/2b80198b-33c2-429b-90cf-486960e08a4e.png

已为自动扩展策略定义了 CloudWatch 警报。

配置扩展操作

接下来,为扩展操作配置一个可用的选项,其中包括三种选择:添加、设置为 和 删除:

  • 选择“添加”以在超过警报阈值时添加指定数量的任务。超过警报阈值并不总是意味着某个度量值已超出,而是意味着在警报阈值中使用的比较已被超越。比较本身可能是小于(<)的比较。

  • 指定要添加的任务数量为 1。或者,通过选择百分比,可以按任务的百分比进行添加。完整的扩展如下所示:

  • 可以通过“添加”定义多个扩展操作。

  • 指定扩展操作之间的冷却期(默认值为 300)。冷却期在使用多个扩展操作时相关,如果我们没有使用多个扩展操作,则不需要冷却期。点击“保存”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1b33c500-825c-4612-9191-34ea00607d7e.png

  • 如此处所示,定义了一个自动扩展策略(自动扩展器),包括任务范围。点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/e5fd50ad-58bc-43db-89e0-6d7d2434138e.png

  • 在“审核”中,点击“更新服务”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1735c41a-a6ff-4700-bc2a-f9b97c6e7eff.png

启动状态表示服务已更新,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/cd1fd3b9-4eae-4485-ad68-744cb0a929f3.png

以下配置将应用:

  • 可扩展目标已注册

  • 自动扩展策略 AutoScaler 被创建

  • 为扩展策略创建/更新了 CloudWatch 警报

点击“查看服务”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/dccd384c-2492-4ce9-be2b-45672cb65adf.png

更新后的服务在此显示。选择自动扩展选项卡以显示已添加的自动扩展策略。自动扩展选项卡列出了最小任务数、最大任务数、自动扩展器、策略类型、CloudWatch 警报和扩展操作:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3813ae75-8673-48a6-bbfd-e39f279a8c69.png

“事件”选项卡列出了服务的事件,如此处所示。根据事件条目,服务已启动三个任务并达到稳定状态:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c6cfc979-e52a-47f3-91ba-6a2ec6e51371.png

已配置了自动扩展策略。选择任务选项卡,三个任务仍在运行,如下所示。任务数量仍然是三个,与添加自动扩展策略之前相同,因为该服务无需进行自动扩展,且三个任务能够处理客户端负载:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6eb06818-75f8-4f63-ac17-3366045f7bde.png

演示自动扩展的使用

本节中,我们将通过向 Hello world 服务添加额外负载来演示自动扩展的使用。

  • 使用其中一个任务的公共 IP 来调用服务;可以从任务详情中获取公共 IP,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8cda5241-19fa-4cd7-81bb-4c8ab56377a1.png

  • 首先,只在一个浏览器中调用该服务。Hello world 应用程序被调用,服务响应显示在浏览器中,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/adc96582-e5f2-4d0f-a0dc-e329fe3edbad.png

  • 为了增加负载,可以使用 curl 工具多次调用同一个 Hello world 应用程序。在 Windows 命令行中运行以下命令:
 curl http://18.191.95.171/?[1-20]
  • 内部负载均衡器会自动将客户端负载分配到服务中的各个任务,无论哪个任务被客户端调用。外部负载均衡器也可以进行配置,具体内容将在后续章节中讨论。随着 Hello world 服务上客户端负载的增加,如果现有的任务数量无法处理该负载,任务数量也会增加。如图所示,正在运行的任务数量已经增加到四个:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/766aed96-932a-48ff-b541-693536054a22.png

  • 使用以下 curl 命令进一步增加服务负载:
 curl http://18.191.95.171/?[1-1000]
  • 如图所示,任务数量已经增加到五个,这是自动扩展器能够扩展到的最大任务数量,具体数量在服务的自动扩展配置中进行了指定:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/90c79219-8933-4fe0-b73a-a0b431d1cca9.png

  • 运行的五个任务在服务的任务选项卡中列出,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/77c7f1c3-dd96-45c7-bda6-8b222c89d43f.png

探索 CloudWatch 指标和日志

在本节中,我们将探索由 ECS 服务生成的 CloudWatch 指标和日志,并找到 CloudWatch 报警阈值被超出时的日志事件:

  • 打开 CloudWatch 控制台,如下所示。AutoScaleCPUUtilization的报警摘要将在图表中显示。

  • 单击浏览指标以浏览指标:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/744a88c6-a18c-4326-918a-a4ca7b66f06b.png

  • 选择边栏中的报警。用作自动扩展阈值的 AutoScaleBasedOnCPUUtilization 报警将列出,如下图所示。当报警阈值被超过时,报警状态为 ALARM。

显示了 AutoScaleBasedOnCPUUtilization 告警的详细信息和图表。图表中 CPU 利用率的两个尖峰表示告警阈值已被超过,这会触发自动扩展,每次超过告警阈值时增加一个任务。图表中的第一个尖峰是负载轻微增加时的情况,第二个尖峰是负载大幅增加时的情况:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ee1ce06a-b45b-42d4-8bdd-41ccc6f9165e.png

  • 当 ECS 服务的负载减少时,告警状态变为“正常”。减少客户端负载本身并不会减少运行中的任务数量。作为示例使用的扩展操作仅在客户端负载增加时扩展任务。还需要添加另一个扩展操作来在客户端负载减少时缩减任务。在“历史”标签中,列出了两个自动扩展操作的实例,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f5622ac9-16ac-4c03-9236-7a2f6cbfa4e9.png

  • 服务的所需数量已更新为 5,并且自动扩展运行数量也增加到五个任务。还可以从自动扩展标签中访问 AutoScaleBasedOnCPUUtilization 告警:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/e95a6b47-efcd-4f1c-a3ef-298447545643.png

更新自动扩展策略

自动扩展策略仅扩展运行中的(所需的)任务数量,并不会修改自动扩展策略,策略仍然设置为 1-5 个任务的范围。服务可能会更新以修改任何或所有的最小任务数量、所需数量、最大任务数量以及自动扩展的扩展操作。在这一部分,我们将讨论更新自动扩展配置:

  • 点击与之前相同的“更新”按钮来更新服务。自动扩展执行时,所需的任务数量设置为5,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/27910814-88b9-41e8-beff-ff38a12b4737.png

  • 将所需任务数量减少到3,如下所示。

  • 要修改扩展策略,请点击 AutoScaler 链接,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/07a9e93a-a5c5-4aac-a45c-b7640385e392.png

  • 在“编辑策略”中,选择“使用现有策略”并选择 AutoScaleBasedOnCPUUtilization 策略。当告警阈值被突破时不必执行扩展操作。将扩展操作修改为当0.9<=CPUUtilization时增加 1 个任务,如下所示。告警阈值为CPUUtilization> 0.1持续 60 秒,而扩展操作仅在CPUUtilization>=0.9时执行。AutoScaler策略每次突破 CloudWatch 告警阈值时运行,但只有在CPUUtilization>=0.9时才会执行扩展操作。点击保存:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/42b209c8-7bf3-4f84-a698-098d0ffc5774.png

  • 最小和最大任务数量没有修改,仍然是 1 和 5。点击“下一步”,然后点击“更新服务”,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/06549da3-c47b-49b3-94da-6ce27a11012a.png

  • 旧的自动扩展策略被删除,创建了新的自动扩展策略,如下所示。可扩展目标与之前相同:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/08bb7b77-28e4-4dbb-baff-e078df9e737b.png

  • CloudWatch 警报已更新。点击查看服务。服务的运行任务数和目标任务数都为 3,如图所示。扩展操作已更新为当 0.9 <= CPUUtilization 时添加 1 个任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/e01c8498-b2b4-4e4a-b175-682d7af7f84f.png

  • 事件选项卡列出了由 ECS 服务生成的日志事件,如图所示。当客户端负载增加时,运行的任务数增加到五。但是,当客户端负载移除且扩展策略更新时,运行的任务数又变回三。如事件中所列,服务已停止了两个正在运行的任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0b55de94-3b24-49aa-82d5-36e162963cc0.png

最初,开始了一个任务。当警报阈值首次被突破时,执行扩展操作,将最大任务数的目标数量设置为四,如其中一条日志消息所示。运行的任务数增加到四。当负载进一步增加时,警报阈值第二次被突破,执行扩展操作,将最大任务数的目标数量设置为五。运行的任务数增加到五。当客户端负载移除且服务更新为将目标数修改为三时,两个正在运行的任务被停止,如另一条事件消息所示。

总结

本章介绍了 ECS 自动扩展服务,适用于 Fargate 启动类型。配置自动扩展涉及设置任务数范围(最小值和最大值),在该范围内应用自动扩展。配置自动扩展还需要一个自动扩展策略,包括用于运行自动扩展策略的 CloudWatch 警报阈值,以及每次自动扩展策略运行时执行的一个或多个扩展操作。在下一章中,我们将讨论如何使用 IAM 用户与 Fargate 配合使用。

第五章:使用 IAM

Amazon ECS 集成并使用了多个其他 AWS 服务,包括弹性负载均衡和 EC2。ECS 使用服务关联角色,这是与某个服务关联的特殊类型角色,用于提供访问所需 AWS 服务的权限,无需额外配置。ECS 使用 AWSServiceRoleForECS 角色来访问其他 AWS 服务,以管理 EC2 网络接口、将实例注册/注销到负载均衡器,并注册目标。根用户在使用 Fargate 时无需额外配置即可使用 ECS。

问题: 默认情况下,IAM 用户没有权限创建或修改 ECS 资源,也无法调用 ECS API。IAM 用户也没有权限使用 ECS 控制台或 AWS CLI。

解决方案: 必须为 IAM 用户授予创建 AWSServiceRoleForECS 角色的权限。可以创建一个 IAM 策略并将其与 IAM 用户关联,从而授予使用其他 AWS 服务所需的权限。运行 Amazon ECS 可能需要的一些 AWS 服务包括:

  • 调用 Amazon ECR 拉取 Docker 镜像

  • 调用 CloudWatch Logs 来存储容器日志

AmazonECSTaskExecutionRolePolicy 策略用于授予使用上述 ECS 服务的权限。

AWSServiceRoleForECS 角色中不包含部分弹性负载均衡权限,可能需要添加一个 IAM 策略来使用弹性负载均衡。AmazonEC2ContainerServiceRole 策略可以用于将容器实例注册/注销到负载均衡器。服务自动扩展 IAM 角色(ecsAutoscaleRole)是配置自动扩展所必需的。IAM 用户必须添加 ecsAutoscaleRole,其中必须包含 AmazonEC2ContainerServiceAutoscaleRole 策略。为了能够为任务使用 IAM 角色,必须添加 Amazon EC2 容器服务任务角色策略。

AmazonEC2ContainerServiceforEC2Role 策略在使用 Fargate 启动类型时不是必需的,因为它仅为 EC2 启动类型提供。

本章中,我们将学习以下内容:

  • 创建 IAM 用户

  • 添加自定义策略以用于弹性负载均衡

  • 以 IAM 用户身份登录

唯一的先决条件是拥有一个 AWS 账户。

创建 IAM 用户

要创建 IAM 用户,请以根用户身份登录并访问 IAM 控制台:console.aws.amazon.com/iam

  • 在左侧菜单中选择用户,然后点击“添加用户”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/726b80e5-8c50-43ba-9b6c-bfce325ec8a5.png

  • 添加用户向导将会启动,如下所示。首先,指定用户名(dvohra)。

  • 选择 AWS 管理控制台访问选项,这将启用一个密码,使得 IAM 用户可以登录到控制台:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5f298732-c3c1-42f8-aa1e-1ea6c0c20ec8.png

  • 对于控制台密码,选择“自定义密码”选项,并在提供的字段中指定一个密码。选择“要求重置密码”选项,这要求用户在下次登录时创建新密码。用户会自动获得IAMUserChangePassword策略,允许用户更改密码。点击“下一步”。

  • 接下来,配置权限。点击“直接附加现有策略”,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1f932f31-598c-40c1-9c0a-5844dbe829e5.png

  • 在策略类型过滤器中,搜索 ECS 并选择以下列出的两个策略。AmazonECS_FullAccess提供对 Amazon ECS 资源的管理员访问权限。AmazonECSTaskExecutionRole提供对 ECS 所需的其他 AWS 资源的访问权限:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/43ac42fa-a6b4-4e05-bf82-12ee8a13e130.png

  • 在策略类型过滤器中搜索“Config”,并选择以下显示的 AWS Config 策略。点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ff1018ab-a1aa-4842-84a0-2cc50875516f.png

在“审核”中,检查“权限摘要”,并且IAMUserChangePassword策略也应该列出。点击“创建用户”。一个 IAM 用户被添加,如“成功”消息所示。此 IAM 用户在用户表中列出,如下所示。我们将在后续章节中使用该 IAM 用户与 Amazon Fargate 一起使用:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/aa0d4a34-2c35-4988-bfb4-34aaaff5f62b.png

添加用于弹性负载均衡的自定义策略

可用且已选择的 ECS 策略不包括在为 ECS 服务创建弹性负载均衡器时所需的一些权限。我们需要为 IAM 用户添加自定义策略,以便该用户能够配置弹性负载均衡器。以下自定义策略添加了所有elasticloadbalancing权限:

{
  "Version": "2012-10-17",
  "Statement":[{
    "Effect": "Allow",
    "Action": ""elasticloadbalancing:*",
    "Resource": "*"
  }]
}

可以通过以下选项之一添加自定义策略:

  • 在创建用户之前创建自定义策略

  • 在用户创建后添加内联策略

我们将讨论第二个选项:

  • 要将自定义策略作为内联策略添加,点击“用户表”中 IAM 用户 dvohra(或其他用户)的链接。将显示 IAM 用户的详细信息。

  • 选择权限选项卡后,点击“添加内联策略”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/84494607-09cd-4d91-9a06-00bd7e04eeb2.png

  • 创建策略向导开始。选择 JSON 选项卡,并复制粘贴之前列出的自定义策略,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5c17d330-01ea-40ac-bd39-46a2da756aed.png

  • 点击“审核策略”。指定一个策略名称,如下所示。

  • 点击“创建策略”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/815e76a1-3c50-446a-8a1a-320490b470bc.png

  • 自定义策略已添加到 IAM 用户权限中,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/a0c8d8a7-6ab4-4764-bc28-5faef52eda2f.png

以 IAM 用户身份登录

接下来,创建 IAM 用户后,作为 IAM 用户登录以使用 Amazon Fargate:

  • 为了能够以刚创建的 IAM 用户身份登录,首先作为根用户退出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/66f7b9e2-44c3-4fac-a3ed-560615cb96ab.png

  • 要登录到控制台,请复制控制台登录链接 https://123456789.signin.aws.amazon.com/console,该链接对于不同的用户是不同的,如此处所示。列出的链接只是一个示例链接,不能用于登录:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/a0a0dbce-e019-443a-89af-2d88dc32f20e.png

  • 使用控制台登录链接打开网页浏览器。账户 ID 会预先在登录表单中指定(下图未显示)。输入 IAM 用户名和密码,然后点击“登录”(Sign In),如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0067302d-2627-4aaa-9274-90e80965b1ad.png

  • 接下来,会提供更改密码的表单。由于选择了首次登录时更改密码的选项,IAM 用户必须配置新密码。点击“确认密码更改”。IAM 用户成功登录,如下图所示。

  • 选择弹性容器服务以创建 ECS 服务,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/75db2f4a-5057-4621-b6dd-19278cc31969.png

总结

在本章中,我们讨论了如何为 ECS 配置 IAM 用户。根用户不需要任何权限配置,且可以访问 ECS 资源、ECS 控制台、ECS API 和所有必要的 AWS 服务。如果要使用 IAM 用户访问 ECS,则必须为该 IAM 用户添加所需的 IAM 策略。要将 ECS 与弹性负载均衡一起使用,还需要添加自定义策略。在下一章中,我们将讨论如何将应用负载均衡器与 Fargate 一起使用。

第六章:使用应用负载均衡器

虽然一些 Docker 容器接受 TCP 客户端请求,但其他 Docker 容器则通过 HTTP 路径接受客户端请求。如 第二章 网络 中所示,可以通过 Hello World 任务公开的公共 IP 地址向 Hello World 应用程序任务发起 HTTP 请求。ECS 服务包括内置的内部负载均衡,能够将客户端流量分配到服务中的各个任务。

问题: 每个 ECS 服务中的任务(使用 Fargate 启动时)都会关联一个 ENI 和一个公共 IP 地址。当应用程序扩展以运行多个任务时,会创建多个 ENI,每个任务必须通过其公共 IP 地址进行访问。

尽管提供了内部负载均衡,但没有提供外部负载均衡功能,无法在不同任务的 IP 地址之间平衡客户端流量。单个任务可能会接收到大量客户端请求,而另一个任务可能会接收到相对较少的请求,甚至没有请求,这将导致外部客户端负载的路由不平衡,如下图所示。如果客户端负载被定向到的任务(或任务)失败,应用程序将无法响应任何客户端请求。ECS 托管应用程序的高可用性未得到提供。直接将容器暴露给公众不是最佳的安全做法。

始终建议将它们放置在 ELB 后面,以便在安全性方面进行网络流量控制。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d390093f-da0e-47f4-b1be-69b68b5641a9.png

解决方案: 对于像 Hello World 应用程序这样的 HTTP 协议应用,可以使用 EC2 应用负载均衡器将 HTTP 客户端请求路由到 ECS 服务中的不同任务。应用负载均衡器是一个外部负载均衡器,它暴露一个公共 DNS,所有客户端请求都会定向到该公共 DNS。应用负载均衡器将客户端负载在应用程序的任务之间进行平衡,从而提供 ECS 托管应用程序的高可用性,如下图所示。即使其中一个任务失败,应用负载均衡器也会将客户端流量定向到仍可用的任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/44b40f99-41d3-4b35-ac05-a4fca0aa5c55.png

在本章中,我们将学习以下内容:

  • 创建应用负载均衡器

  • 创建任务定义

  • 创建服务

  • 配置应用负载均衡器

  • 调用 Hello World 应用程序

  • 停止任务并删除负载均衡器

唯一的前提条件是拥有一个 AWS 账户。

创建应用负载均衡器

以下程序用于配置带有应用负载均衡器的 Fargate ECS 服务:

  1. 创建应用负载均衡器

  2. 创建任务定义

  3. 创建服务

  4. 配置应用负载均衡器与服务

  5. 调用服务

首先,我们将创建一个应用负载均衡器:

  1. 在浏览器中打开 EC2 控制台,访问console.aws.amazon.com/ec2,并选择负载均衡 | 负载均衡器

  2. 点击“创建负载均衡器”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/973a9144-42bb-40de-a7e6-90c0ab1fa7f2.png

  1. 在选择负载均衡器类型时,点击“创建”以创建应用负载均衡器,如以下截图所示。应用负载均衡器用于 HTTP/HTTPS 请求协议。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/dff068e8-3c1a-4a32-9d07-ff5f59408871.png

  1. 在配置负载均衡器时,在基本配置中指定负载均衡器名称(hello-world-lb),如以下截图所示,并选择面向互联网作为方案。负载均衡器名称只能使用 a-z、A-Z、0-9 和连字符。

  2. 选择 ipv4 作为IP 地址类型

  3. 在监听器部分,配置了一个监听器,使用 HTTP 作为负载均衡协议,并将80设置为负载均衡端口

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/16cc7e74-e9c7-4bb8-ad43-35eb69fc2f5b.png

  1. 向下滚动并选择一个 VPC。选择负载均衡器将要路由流量的可用区。点击“下一步”。

  2. 然后将显示配置安全设置页面(适用于 HTTPS 监听器)。如果负载均衡器需要使用 HTTPS 协议监听器,应在上一个屏幕的监听器部分进行配置,并且应在配置安全设置页面进行安全设置。由于我们只使用 HTTP 监听器,因此无需配置任何安全设置。点击“下一步”。

  3. 配置负载均衡器的安全组。选择创建一个新安全组并选择默认的安全组名称,如以下截图所示。

  4. 选择全部流量作为类型,协议选择全部,端口范围为 0-65535,来源选择自定义,CIDR 作为 IPv4 和 IPv6 的默认路由(0.0.0.0/0, ::/0)。点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0c0ee9c3-2793-4c63-b7ba-deea06c3c1f3.png

  1. 在配置路由部分,配置一个目标组,负载均衡器将向该目标组路由请求。负载均衡器只会将请求路由到配置的目标组中的目标。选择目标组中的新建目标组选项,并指定名称(hello-world-tg),如以下截图所示。

  2. 选择 HTTP 作为协议,80 作为端口。

  3. 选择ip作为目标类型并点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f886e62e-f72b-41f3-89a5-45965be7951b.png

  1. 选择ip作为目标类型,可以添加以下 CIDR 块中的目标:10.0.0.0/8,100.64.0.0/10,172.16.0.0/12 和 192.168.0.0/16。

  2. 在注册目标屏幕(如以下截图所示)上,我们不需要注册目标,因为当使用应用负载均衡器创建 ECS 服务时,Fargate 会自动执行此操作。点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/46bd842b-c8eb-4662-b17e-0656e85e449f.png

  1. 审核应用负载均衡器的配置。点击“创建”,如以下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/0a5d5b6c-e3f4-40cf-a1cb-cbb25a9d54c7.png

  1. 应用程序负载均衡器已创建,创建状态在“负载均衡器创建状态”对话框中显示。点击“关闭”。

  2. hello-world-lb 负载均衡器已列在负载均衡器表中,如下图所示。最初,状态(状态)为“正在配置”。点击“刷新”来刷新状态:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c9c94960-3f2c-4fe4-bb3a-331f2e0585f7.png

  1. 当负载均衡器变为可用时,其状态变为激活,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d2507718-ee31-4573-94a0-6274ae68a60f.png

  1. 创建了一个目标组,hello-world-tg,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/62374b77-d17a-47bd-8840-b781e61dbbde.png

  1. 选择“目标”标签,此时应没有任何目标列出,因为还未配置目标。

创建任务定义

在本节中,我们将为 hello-world 应用程序创建一个任务定义,使用 tutum/hello-world Docker 镜像。也可以使用其他暴露 HTTP 端口的 Docker 镜像,但并非所有 Docker 镜像都可以使用。以不适用的例子为例,MySQL 数据库 Docker 镜像 mysql 不能与应用程序负载均衡器一起使用,因为它暴露的是 TCP 端口 3306。对于暴露 TCP 端口的 ECS 任务,应使用网络负载均衡器。

  1. 要创建新的任务定义,请在 ECS 控制台中选择任务定义,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d52a3938-dd14-4ff1-bc16-15b9b0bb775e.png

  1. 在任务定义中,点击“创建新的任务定义”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/5e717e88-aab8-4fd7-9a5d-3e88c7ae3378.png

  1. 在创建新的任务定义中,选择 Fargate 作为启动类型兼容性,如下图所示。向下滚动并点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/552c212a-a053-401f-80c8-8854e51ef641.png

  1. 在配置任务和容器定义中,指定任务定义名称(hello-world-task-definition),并选择 ecsTaskExecutionRole 作为任务角色,如下图所示。

  2. 对于 Fargate,网络模式是 awsvpc,且无法修改,因为它是唯一受支持的模式,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/73812fd6-33b0-4a51-ba43-6f4ddf1cce7b.png

  1. 选择 excsTaskExecutionRole 作为任务执行 IAM 角色,如下图所示。此角色用于将容器日志发送到 CloudWatch:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c26ff6df-44b3-4674-ba80-d86b030fe13d.png

  1. 在任务大小中,选择 0.5GB 作为任务内存,如下图所示。选择 0.25 vCPU 作为任务 CPU:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/71b18a7c-9d9d-4c98-9cd1-44f49bf8bd21.png

  1. 要添加容器定义,请在容器定义中点击“添加容器”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/52412e0f-de6c-4c84-8fd6-c0a455247cb1.png

  1. 在添加容器时,指定容器名称(hello-world)、镜像(tutum/hello-world)和内存限制,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/45081d75-9012-4b03-8811-aa761cd2ed71.png

  1. 在端口映射中,将容器端口设置为 80,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/6a32f944-dbae-4a11-ae59-9e7152e5d223.png

  1. 在“高级容器配置” | “环境”中,将 CPU 单元设置为10,并勾选“必需”复选框,如下图所示。由于任务中的一个容器必须是必需的,而hello-world容器是唯一的容器,因此它必须配置为“必需”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f298811a-e618-42aa-a37d-eefe1fb65ba9.png

  1. 配置完所有容器定义设置后,点击“添加容器”中的“添加”。容器定义将被添加,如下图所示。

  2. 点击“创建”以创建任务定义,其中包括容器定义:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/dff11224-b81b-433d-8379-5c1f21071fd1.png

  1. 任务定义创建成功,如“启动状态”对话框所示。点击“查看任务定义”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d944c2b3-20ed-4dd3-808a-a267f8c0d301.png

  1. 显示新的任务定义构建器和详细的 JSON 信息,如下图所示。要求的兼容性必须设置为“FARGATE”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/2d5dbc04-8860-47b6-9496-6a7ba6e5c127.png

  1. 从边栏导航中选择“任务定义”。任务定义将列在“任务定义”表格中,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1d533462-0edd-428a-9e08-71aa2d2f37fb.png

创建服务

服务是任务定义的实现,并运行任务。要创建服务,必须先选择一个集群。

  1. 点击默认集群链接,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3dba1ff5-bba8-414c-aaf1-40db8dd0eaf2.png

  1. 选择“服务”标签,然后点击“创建”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/12e091a2-7447-4cb2-b94e-147b3779afc6.png

  1. 在“配置服务”中,选择“FARGATE”作为启动类型,并选择之前创建的任务定义。

  2. 选择“LATEST”作为平台版本。默认集群应显示为已选择,因为我们最初选择的是默认集群。

  3. 指定服务名称(hello-world-service),并将任务数量设置为 3,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/25179249-5a50-4793-ba3a-7bf607cfffc7.png

  1. 保留其他设置为默认值,点击“下一步”。

配置应用程序负载均衡器

在此部分,我们将配置应用程序负载均衡器。

  1. 首先,选择一个集群 VPC 和两个子网,如下图所示。VPC 应与应用程序负载均衡器所在的 VPC 相同。所创建的安全组列出显示。必须将自动分配公网 IP 设置为“启用”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/811daffa-1ddc-4e1a-b1c7-154c0ba5ed69.png

  1. 在“负载均衡”部分,选择“应用程序负载均衡器”作为负载均衡器类型,如下图所示。选择之前创建的负载均衡器名称(hello-world-lb):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/d6ecf0f3-c4e7-46e7-96a2-19dd509ad2e2.png

  1. 在容器负载均衡中,点击“添加到负载均衡器”,将容器名称:端口设置为hello-world:80:80,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/40ee216a-07c6-4b6d-9d17-ea1f8ee876a4.png

  1. 显示额外的字段来配置容器负载均衡。选择 80:HTTP 作为侦听端口,如下图所示。

  2. 选择目标组名称为 hello-world-tg,这是在创建负载均衡器时创建的目标组,如下图所示。

  3. 在服务发现中,取消选中“启用服务发现集成”复选框。

  4. 保持其他字段的默认设置,然后点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/321d4522-4250-4d88-ae9e-72ba2519cf62.png

  1. 在设置自动扩展(如下图所示)时,可以选择配置自动扩展,但不是必须的。使用默认设置“不要调整服务的期望数量”后,点击“下一步”:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/445ec4f2-f2d3-47fe-9ad3-a50d89acf62a.png

  1. 在审查中,点击“创建服务”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fb4c2981-6cf0-4e5c-8619-b1b16e199cad.png

  1. 如下图所示,启动状态对话框表明服务已创建:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3f53d116-bebe-4180-abbc-96bc48507991.png

  1. 最初,一些任务可能会有“待处理”的状态。点击刷新按钮以刷新状态。一段时间后,所有任务的状态应为“运行中”,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/064dd117-41b4-42eb-9a6f-a5a4a4b17ed0.png

  1. 服务详细信息选项卡列出了负载均衡的配置,包括目标组名称、容器名称和容器端口,如下图所示。服务摘要列出了一个部署,其“运行中的任务数量”是 3,目标任务数为 3:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1daf227c-4164-4489-81aa-113900bd12e6.png

  1. 事件显示服务在目标组中注册了 1 个目标,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/09290fb4-f838-4917-9000-41aee8b0d41a.png

调用 Hello World 应用

要在浏览器中调用hello-world服务,我们将使用已注册到服务的应用负载均衡器的公共 DNS。在 EC2 仪表板中,选择目标组 | hello-world-tg 目标组,然后选择“目标”。最初,当目标组创建时,目标选项卡没有列出任何目标。但是,在创建并配置负载均衡器后,目标选项卡列出了 hello-world-tg 服务中三个任务的三个 IP 地址,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8996a1da-84b3-4df5-ba54-cac1f364ec6f.png

其中两个任务位于同一个可用区,第三个任务位于另一个可用区,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/a01b1195-e374-4f23-b59d-36570c27e267.png

  1. 从负载均衡器控制台获取应用负载均衡器的 DNS 名称,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8684514b-088e-462a-a726-c1af151e71a3.png

  1. 在浏览器中打开 DNS 名称以调用 Hello World 应用程序,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8e07a3f8-62b5-4c0f-bf10-8e5444b22577.png

调用负载均衡器的 DNS 名称会将请求转发到目标组 hello-world-tg,正如负载均衡器的监听器选项卡中所示,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/da5ac189-530d-4bf6-8d11-f2d199b86d70.png

停止任务并删除负载均衡器

停止任务和删除 ECS 资源的过程如下:

  1. 更新服务,将任务的期望数量设置为 0

  2. 停止任务

  3. 删除服务

  4. 注销任务定义修订版

要删除应用负载均衡器,请在负载均衡器表中选择应用负载均衡器,然后选择操作 | 删除,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/06028074-4b78-45a3-9b23-f2abcdef9f37.png

在“删除负载均衡器”确认对话框中,点击“是,删除”。应用负载均衡器被删除,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/de3fd298-450b-4d67-8602-7c7bf9b45272.png

总结

在本章中,我们讨论了如何配置带有应用负载均衡器的 Fargate 启动类型 ECS 服务,以平衡 Hello World 服务的 HTTP 请求。应用负载均衡器专为 HTTP/HTTPS 协议设计,不能与 TCP 协议一起使用。在下一章,我们将讨论如何使用 Amazon ECS 命令行界面(CLI)。

第七章:使用亚马逊 ECS CLI

亚马逊 ECS 命令行界面CLI)是一个命令行工具,用于创建、更新和监控 ECS 集群和任务。亚马逊 ECS CLI 支持 Fargate 启动类型。要使用 ECS CLI 创建容器应用程序,需要 Docker Compose(v1 或 v2)。在本章中,我们将使用 ECS CLI 在 Windows PowerShell 中启动 Fargate 启动类型的 ECS 集群。

在本章中,我们将学习以下内容:

  • 设置环境

  • 安装 ECS CLI

  • 安装 AWS 工具 for Windows PowerShell

  • 配置 ECS CLI

  • 设置 Fargate 的前置条件

  • 注册任务执行策略

  • 创建 ECS 集群

  • 创建安全组

  • 授予安全组入站权限

  • 创建 Compose 文件

  • 配置 ECS 特定参数

  • 部署 Compose 文件到集群

  • 列出集群中正在运行的容器

  • 列出容器日志

  • 扩展集群中的任务

  • 访问 WordPress 服务

  • 删除服务和集群

设置环境

如果尚未安装 PowerShell,请下载并安装 PowerShell 3.0 或更高版本。Windows 管理框架 3.0 包含 PowerShell 3.0:

  1. 以管理员身份登录 PowerShell,右键单击 PowerShell 应用程序,选择“以管理员身份运行”

  2. 使用 get-host 命令验证版本是否为 3.0

  3. 使用以下命令启用脚本执行,它允许所有用户创建的脚本运行,且所有从互联网上下载的脚本都需要签名:

 Set-ExecutionPolicy RemoteSigned

我们还需要获取 AWS 安全凭证,表示为访问密钥,由访问密钥 ID 和秘密访问密钥组成:

  1. 要获取安全凭证,请从帐户下拉菜单中选择“我的安全凭证”。

  2. 在确认对话框中,单击“继续到安全凭证”。

  3. 显示“您的安全凭证”页面;选择“访问密钥”。安全凭证只显示访问密钥 ID,而不显示秘密访问密钥。除非之前已记录访问密钥 ID 和秘密访问密钥,否则请通过“创建新访问密钥”创建一个新的访问密钥。

  4. “创建访问密钥”对话框指示访问密钥已创建。

  5. 单击“显示访问密钥”链接。

  6. 复制访问密钥 ID 和秘密访问密钥。设置环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_KEY

安装 ECS CLI

要在 PowerShell 上安装 ECS CLI,首先以管理员身份运行 PowerShell,方法是右键单击 Windows PowerShell,选择“以管理员身份运行”:

  1. 随后,运行以下命令以在指定路径创建一个新的目录类型项:
New-Item -ItemType "directory" -Path "C:\Program Files\Amazon\ECSCLI"
  1. 下载并安装 ecs-cli ecs-cli-windows-amd64-latest.exe 到目录 C:\Program Files\Amazon\ECSCLI\ 下的应用程序 ecs-cli.exe
Invoke-WebRequest -OutFile ‘C:\Program Files\Amazon\ECSCLI\ecs-cli.exe’ https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-windows-amd64-latest.exe
  1. C:\Program Files\Amazon\ECSCLI 添加到 PATH 环境变量中。输出 ecs-cli 版本:
ecs-cli --version

上述命令在 PowerShell 中运行,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c56eaf03-de53-4f44-8bb4-67a778b0f6c8.png

安装 AWS Tools for Windows PowerShell

接下来,安装 AWS Tools for Windows PowerShell,用于管理 AWS 服务,包括通过 PowerShell 管理 ECS:

  1. aws.amazon.com/powershell/ 下载 AWS Tools for Windows PowerShell 的 MSI 安装文件(AWSToolsAndSDKForNet_sdk-3.3.231.0_ps-3.3.225.1_tk-1.14.0.1)。

  2. 双击 MSI 安装程序启动 AWS Tools for Windows 安装向导。在欢迎屏幕中点击“下一步”。

  3. 在最终用户许可协议中,接受协议并点击“下一步”。

  4. 在“自定义设置”中,选择默认安装位置并点击“下一步”。

  5. 在“准备安装 AWS Tools for Windows”中,点击“安装”。AWS Tools for Windows 开始安装。

  6. 当 AWS Tools for Windows 安装完成后,点击“完成”。

配置 ECS CLI

配置 ECS CLI 包括以下两个配置:

  • 配置具有 Fargate 启动类型的 ECS 集群

  • 配置 ECS CLI 配置文件

接下来,我们将讨论这些配置中的每一个。配置集群的语法如下:

ecs-cli configure --cluster cluster_name --default-launch-type launch_type --region region_name --config-name configuration_name

ecs-cli 配置命令中的不同命令参数在下表中讨论:

命令参数描述设置的值
--cluster现有 ECS 集群的名称或要创建的新集群名称hello-world
--regionAWS 区域us-east-1
--default-launch-type启动类型FARGATE
--config-name配置名称hello-world
  1. 在 PowerShell 中运行以下命令以配置 ECS 集群:
 ecs-cli configure --cluster hello-world --region us-east-1 --default-
      launch-type FARGATE --config-name hello-world
  1. 创建一个目录,C:\PowerShell,用于 PowerShell,并从该目录运行前面的命令。正如命令输出所示,ECS CLI 集群配置 hello-world 被保存:
 PS C:\PowerShell>
 PS C:\PowerShell> ecs-cli configure --cluster hello-world --region
      us-east-1 --default-launch-type FARGATE --config-name hello-world
      time="2018-01-09T15:26:52-08:00" level=info msg="Saved ECS CLI 
      cluster configuration hello-world."
 PS C:\PowerShell>

设置 CLI 配置文件

配置 ECS CLI 配置文件的命令语法如下:

ecs-cli configure profile --profile-name profile_name --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY

ecs-cli 配置文件命令中的不同命令参数在下表中讨论:

命令参数描述设置的值
--profile现有 ECS 集群的名称或要创建的新集群名称hello-world
--access-keyAWS 访问密钥 ID不同用户的值不同
--secret-key密钥访问密钥不同用户的值不同
  1. 创建 ECS CLI 配置文件 hello-world,其中需要用 AWS 访问密钥 ID密钥访问密钥 替换变量,这些密钥对于不同用户是不同的:
 ecs-cli configure profile --access-key $AWS_ACCESS_KEY_ID --
      secret-key $AWS_SECRET_ACCESS_KEY --profile-name hello-world
  1. 正如命令输出所示,ECS CLI 配置文件被保存:
 PS C:\PowerShell> ecs-cli configure profile --access-key Abcdef --
      secret-key D+d+KidQel/myUXJi/hJjtk --profile-name hello-world 
      time="2018-01-09T15:46:15-08:00" level=info msg="Saved ECS CLI 
      profile configuration hello-world."
  1. 作为创建 hello-world 配置文件(或其他配置文件名)的替代,可以使用 -StoreAs 默认参数创建一个默认的 ECS 配置文件:
 PS C:\PowerShell> Set-AWSCredential -AccessKey AKIAJ4DECNW6BFYN5PNA -
      SecretKey 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 -StoreAs default

设置 Fargate 的前置条件

除了配置 ECS CLI 配置文件外,我们还需要设置以下前置条件,以便使用 FARGATE 启动类型创建 ECS 集群:

  • 创建任务执行角色

  • 注册任务执行策略

  • 创建任务执行角色

为了让 Fargate 任务能够下载 Docker 镜像并在 CloudWatch 中发送和保存容器日志,需要创建一个任务执行角色。请在 C:\PowerShell\ 目录中创建一个 IAM 策略文件 execution-assume-role.json,并将以下 JSON 内容复制并保存到策略文件中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

使用以下命令在 PowerShell 中创建任务执行角色:

New-IAMRole -RoleName ecsExecutionRole -AssumeRolePolicyDocument (Get-Content -Raw C:\PowerShell\execution-assume-role.json)

如命令输出所示,创建了一个任务执行角色:

PS C:\PowerShell> New-IAMRole -RoleName ecsExecutionRole -AssumeRolePolicyDocument (Get-Content -Raw C:\PowerShell\execution-assume-role.json) Path    RoleName         RoleId                 CreateDate   Description ----    --------         ------                 ----------   ----------- /      ecsExecutionRole  AROAIRRZ5LMXLR6QPZQJC  1/9/2018 3:07:16 PM

注册任务执行策略

接下来,使用以下命令在 PowerShell 中注册任务执行策略:

Register-IAMRolePolicy -RoleName ecsExecutionRole -PolicyArn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

前面的命令不会产生任何输出,任务执行策略会被注册。

创建 ECS 集群

配置好前提条件后,接下来我们将创建一个 ECS Fargate 集群。在 PowerShell 中运行以下命令以创建集群:

esc-cli up

如命令输出所示,使用先前设置的集群配置创建了集群,并创建了一个 VPC 和两个子网:

PS C:\PowerShell> ecs-cli up
←[36mINFO←[0m[0002] Created cluster ←[36mcluster←[0m=hello-world ←[36mregion←[0m=us-east-1 ←[36mINFO←[0m[0003] Waiting for your cluster resources to be created...
←[36mINFO←[0m[0004] Cloudformation stack status ←[36mstackStatus←[0m=CREATE_IN_PROGRESS
←[36mINFO←[0m[0065] Cloudformation stack status ←36mstackStatus←[0m=CREATE_IN_PROGRESS
 VPC created: vpc-6e021915
 Subnet created: subnet-2c02dd4b
 Subnet created: subnet-f2d50bdc
 Cluster creation succeeded.
 PS C:\PowerShell>

在网页浏览器中访问 ECS 控制台,hello-world 集群会列出,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/15a18143-b901-4d47-ad26-8b38ae6bce87.png

如有需要,可以使用以下命令删除 EC2 安全组:

Remove-EC2SecurityGroup -Region "us-east-1" $groupid

授予安全组 Ingress 权限

接下来,使用 Grant-EC2SecurityGroupIngress cmdlet 添加一个安全组规则,允许端口 80 上的入站访问,按照列出的顺序运行以下命令:

$ip1 = new-object Amazon.EC2.Model.IpPermission
$ip1.IpProtocol = "tcp"
$ip1.FromPort = 80
$ip1.ToPort = 80
$ip1.IpRanges.Add("0.0.0.0/0") Grant-EC2SecurityGroupIngress -GroupId $groupid -Region "us-east-1" -IpPermissions @($ip1)

随后,再次运行 Get-EC2SecurityGroup cmdlet,如此处的输出所示,Ingress 权限已设置到 EC2 安全组:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/497f57e0-9984-419c-a153-97895e1aef83.png

我们将仅为 WordPress 创建一个 ECS 任务,但如果同一任务中还需要配置 MySQL 数据库,则还需要为 MySQL 数据库暴露的端口 3306 添加一个 Ingress 规则。按以下顺序运行命令,以为端口 3306 添加 Ingress:

$ip2 = new-object Amazon.EC2.Model.IpPermission
$ip2.IpProtocol = "tcp"
$ip2.FromPort = 3306
$ip2.ToPort = 3306
$ip2.IpRanges.Add("0.0.0.0/0")
Grant-EC2SecurityGroupIngress -GroupId $groupid -Region "us-east-1" -IpPermissions @($ip2)

随后,再次运行 Get-EC2SecurityGroup 命令。如输出所示,端口 3306 的 Ingress 也已添加:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/4369591a-a470-4e9a-9bd0-9376ba10c7ce.png

创建 Compose 文件

ECS CLI 支持 Docker Compose 版本 1 和 2,在这个 WordPress 示例 Compose 文件中我们使用的是版本 2。在 C:/PowerShell 目录中创建一个 docker-compose.yml 文件,并将以下内容复制到该文件中:

version: '2'
services:wordpress:
    image: wordpress
    ports:
      - "80:80"
    logging:
      driver: awslogs
      options:
        awslogs-group: hello-world
        awslogs-region: us-east-1
        awslogs-stream-prefix: wordpress

Docker Compose 文件指定了一个基于 wordpress Docker 镜像的 wordpress 服务,并暴露端口 80。CloudWatch 日志使用 awslogs 驱动程序进行配置,这是 Fargate 启动类型唯一支持的驱动程序。

配置 ECS 特定参数

我们还需要创建一个 ECS 特定参数 文件 ecs-params.yml,它定义了任务创建所需的资源(CPU 和内存)设置,并设置网络模式为 awsvpc,这是 Fargate 启动类型唯一支持的网络模式。运行参数包括子网、安全组的网络配置,并将任务的 Assign public IP 选项设置为 ENABLED。子网从 ecs-cli up 命令的输出中获取。安全组从 Get-EC2SecurityGroup -Region "us-east-1" -GroupId $groupid 命令的输出中获取,如前所述:

version: 1
task_definition:
  task_execution_role: ecsExecutionRole
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "subnet-2c02dd4b"
        - "subnet-f2d50bdc"
      security_groups:
        - "sg-8c7dafc7"
      assign_public_ip: ENABLED

将 Compose 文件部署到集群

ecs-cli compose service up 命令将 Docker Compose 文件部署到集群。该命令可以通过本表中讨论的命令选项进行参数化:

参数描述默认值
--project-name项目名称当前目录
--ecs-params使用的 ECS 参数文件当前目录中的 ecs-params.yml 文件
--create-log-groups为容器日志创建 CloudWatch 日志组
--fileDocker Compose 文件当前目录中的 docker-compose.yml 文件

运行以下命令,其中使用了 --project-name--create-log-groups 选项。我们不需要使用其他选项,因为所需的文件都在当前目录中:

ecs-cli compose --project-name hello-world service up --create-log-groups

Docker Compose 文件已部署到 hello-world 集群。命令的输出如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/b6142489-39f8-4469-b257-0c1d7c2bb37d.png

hello-world 集群列出了一个正在运行的任务,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/aaac7d42-ef41-4d3c-bec3-9a5f8e52e863.png

点击 hello-world 集群链接以显示其详细信息。创建的服务会列在“服务”选项卡中。点击服务链接,如下所示,以列出其详细信息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ea9cdc91-87ff-4676-82ce-7ea9e107cffc.png

服务详情包括集群名称、状态、任务定义、启动类型、平台版本、期望数量、待处理数量和运行数量,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3ad86abb-a2f9-429b-9d48-23faa595e7c9.png

要查找任务的详细信息,选择“任务”选项卡并点击任务链接,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3bb4f32d-30a1-4b46-aac2-eb383fc490a9.png

任务的详细信息会显示,如下图所示。还列出了任务可访问的公共 IP:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/b41d6f20-e96c-4347-9e62-0bd36b9c7b69.png

向下滚动以查看容器。wordpress 容器会列出,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/fe723d13-e502-4e92-9a03-31f0609c7c65.png

由于我们配置了日志,容器详情中显示了日志配置,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/bad4a640-9e11-4f1f-be41-dea8bcd09db0.png

点击查看 CloudWatch 日志的链接,以显示 CloudWatch 日志,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/4b585343-785d-431b-b66d-257ebf0a51ae.png

列出集群中正在运行的容器

要列出集群中正在运行的容器,请运行以下命令:

ecs-cli compose --project-name hello-world service ps

如下截图所示,列出了一个 Docker 容器。容器的状态、端口和任务定义也被列出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/ce4c5985-0408-426b-9a13-0f78997e057a.png

列出容器日志

要列出容器日志,请从容器名称中复制任务 ID(任务 ID 是容器名称中 / 前的子字符串),然后运行以下命令:

ecs-cli logs --task-id 0c23d765-88c5-46cd-a317-9db243590c89 –follow

容器日志将显示,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/a8a7e459-fc38-4ccf-aaf1-c2cbdb472190.png

扩展集群中的任务

要将集群扩展到两个任务,例如,运行以下命令:

ecs-cli compose --project-name hello-world service scale 2

如输出所示,desiredCountrunningCount 被设置为 2

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/1f876b9b-f14c-4466-9394-b4f9842bf202.png

随后,列出正在运行的任务:

ecs-cli compose --project-name hello-world service ps

如下所示,列出了两个任务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c87aaa2e-d6c8-4468-8315-a5d0874bf336.png

如下截图所示,hello-world 集群中的运行任务也列出了 2 个。点击 hello-world 集群链接:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/425c71b8-0787-4812-8a79-33e591f5aec8.png

选择任务标签,列出了两个任务,如下截图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f0940f4a-a263-464b-bf74-3d66958b76e6.png

访问 WordPress 服务

要访问 WordPress 服务,请在浏览器中打开其中一个任务的公共 IP。选择语言并点击继续。WordPress 应用的欢迎页面将如截图所示显示。点击“Let’s go!”按钮:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/9946534d-7ee8-4480-b98d-526478eae154.png

指定数据库连接详情并点击提交,访问 WordPress 仪表盘。下面显示的连接详情可能需要从默认设置进行修改。

删除服务和集群

要删除服务和相关任务,请运行以下命令:

ecs-cli compose --project-name hello-world service down

如输出所示,任务的运行数量和期望数量被设置为 0,hello-world 服务被删除。服务必须先缩减至 0,然后才能删除服务:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/f0ae1964-d83d-4ec7-977d-ed11bcd95371.png

使用以下命令删除集群:

ecs-cli down –force

在命令提示符下选择 y 确认是否删除集群。hello-world 集群及所有相关资源将被删除。如果由于超时或某些资源未被删除,导致集群未能成功删除,请再次运行前述命令:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/c36c429e-3a31-466f-adef-ac604a1973bf.png

或者,可以通过在 AWS CloudFormation 控制台中选择“操作”|“删除堆栈”来直接删除与集群关联的 CloudFormation 堆栈,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/8e6777d6-0dc1-484f-bae7-6d0a2fab2c97.png

在删除堆栈确认对话框中,选择尚未删除的堆栈资源,然后点击“是,删除”,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/3782e02a-e3e1-4ba9-8a30-c8cb7a2fef1b.png

在直接删除 CloudFormation 堆栈后,重新运行ecs-cli down -force命令,集群应当会被删除,如图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/amz-fargate-qkstgd/img/49983bd6-8709-4165-aad0-a251b9561884.png

概述

本章中,我们讨论了如何使用 ECS CLI 创建 Fargate 启动类型的集群。随后,我们在集群上部署了一个 Docker Compose 文件,运行了一个用于 Docker wordpress镜像的任务。我们讨论了日志列出和容器运行,并演示了如何扩展服务。

本章总结了 Amazon Fargate 快速入门指南。Amazon Fargate 是 Amazon 弹性容器服务ECS)的一种启动类型。在写作时,Amazon 弹性 Kubernetes 服务EKS)和 AWS Fargate 之间没有原生的 AWS 集成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值