1. 简介
AWS Fargate 是一项可以与 Amazon ECS 一起使用的技术,可以运行容器,而不必管理服务器或 Amazon EC2 实例的集群。使用 Fargate,您不再需要提供、配置或扩展虚拟机集群来运行容器。这样就不需要选择服务器类型、决定何时扩展集群或优化集群。
当您使用 Fargate 启动类型运行 Amazon ECS 任务和服务时,需要将应用程序打包到容器中,指定 CPU 和内存需求,定义网络和 IAM 策略,并启动应用程序。每个 Fargate 任务都有自己的隔离边界,并且不与其他任务共享底层内核、CPU 资源、内存资源或弹性网络接口。
AWS Fargate 目前只在部分地区可用,使用前需要检查。
1.2 定价
使用 AWS Fargate,无需预付款,只需要为装入的应用程序所消耗的 vCPU 和内存资源付费。
AWS Fargate 的价格是根据从你开始下载容器 Image 到 Amazon ECS 任务或 Amazon EKS Pod 终止所使用的 vCPU 和内存资源计算的,取整到最近的秒。
2. 首次运行向导
2.1 创建 IAM 用户
创建一个 IAM 用户,附加到 Administrator 组,下载保存这个 IAM 用户的访问密钥,这样当你在访问如 Amazon EC2 和 Amazon ECS 时,通过提供的凭证,服务就可以确定你是否有权限访问其资源。
2.2 创建虚拟私有云
:::info Amazon ECS 控制台首次运行体验会为您的集群创建默认 VPC,下面的步骤是为了创建自定义的 VPC。 :::
- 选择 Region,创建 VPC(Launch VPC Wizard);
- 选择具有单个公共子网的 VPC,填写 VPC 名称,其他保持默认,确认 Create;
2.3 安装 AWS CLI
略。
2.4 创建任务定义
首次运行向导会帮助我们加载控制台预置的配置。
任务定义类似于应用程序的蓝图。每次在 Amazon ECS 中启动任务时,都需要指定任务定义。这样,服务知道要用于容器的 Docker 映像、任务中要使用的容器数量以及为每个容器分配的资源。
- 选择区域;
- 配置容器定义的参数
- 配置任务定义参数
2.5 配置服务
首次运行向导会预加载一个服务定义,通过选择 Edit 来查看和编辑详细信息:
2.6 配置集群
在向导的这一部分,需要为集群命名,然后 Amazon ECS 为您进行联网和 IAM 配置。
2.7 审核
查看您的任务定义、任务配置和集群配置,然后单击 Create (创建) 完成操作。您会定向到 Launch Status (启动状态) 页面,此页面显示您的启动状态。它描述此过程的每一步(在创建 Auto Scaling 组时,这可能需要几分钟才能完成和填充)。
在启动完成后,选择 View service (查看服务)。
2.8 查看运行的服务
如果您的服务是基于 Web 的应用程序 (如 Amazon ECS sample 应用程序),可以使用 Web 浏览器查看其容器。
- 在 Service:
service-name
页面上,选择 Tasks 选项卡。 - 从您的服务中的任务列表中选择任务。
- 在 Network 部分中,选择您的任务的 ENI Id。这将转到 Amazon EC2 控制台,您可以在其中查看与任务关联的网络接口的详细信息,包括 IPv4 Public IP (IPv4 公有 IP) 地址。
- 在 Web 浏览器中,输入 IPv4 Public IP (IPv4 公有 IP) 地址,您应该可以看到显示 Amazon ECS sample 应用程序的网页。
2.9 清除
有些 Amazon ECS 资源(如任务、服务、集群和容器实例)是使用 Amazon ECS 控制台清除的。其他资源(例如 Amazon EC2 实例、Elastic Load Balancing 负载均衡器和 Auto Scaling 组)必须在 Amazon EC2 控制台中手动清除或通过删除创建它们的 AWS CloudFormation 堆栈来清除。
- 在 Clusters (集群) 页面上,选择要删除的集群。
- 选择 Delete Cluster (删除集群)。在确认提示符处,输入 delete me,然后选择 Delete (删除)。删除该集群将清除使用该集群创建的关联资源,包括 Auto Scaling 组、VPC 或负载均衡器。
3. Fargate on ECS 注意事项
3.1 Task definitions
3.1.1 参数配置兼容性
ECS Task 中的参数并不是完全支持 Fargate 启动,一些参数完全不支持在 Fargate 中使用,一些则在 Fargate 中区别于 EC2 启动模式有不同的含义。
为确保在 Fargate 启动模式中 Task Definition 参数配置的正确性,可以使用以下方式:
- 在控制台创建 Task Definition,选择启动类型兼容性:Fargate;
- 在 AWS CLI 中创建 Task Definition,指定
--requires-compatibilities
选项为 faragte; - 在 Amazon ECS API 中创建 Task Definition,指定
requiresCompatibilities
属性;
3.1.2 Network mode
Fargate 启动模式中,Task Definition 的网络模式必需配置为 awsvpc
,它会为每个任务提供一个弹性的网络接口。
3.1.3 Task CPU and memory
在手动创建 Task Definition 时,Fargate 启动模式中尽管可以指定 Task-level 和 Container-level 的资源大小,但是官方还是推荐只需指定 Task-level 就可以了。
AWS 也推荐了一组较合理 CPU/Memory 搭配组合作为参考:
3.1.4 Task resource limits
用于 Fargate 的 Amazon ECS 任务定义支持 ulimits 参数,以定义为容器设置的资源限制。
nofile 资源限制设置了容器可以使用的打开文件数量的限制。对于 Fargate 任务,默认的 nofile 软限制是 1024,硬限制是 4096。如果任务需要处理大量文件,可以在任务定义中调整这些限制。下面显示了一个任务定义的代码片段,其中 nofile 限制被加倍:
"ulimits": [
{
"name": "nofile",
"softLimit": 2048,
"hardLimit": 8192
}
]
3.1.5 Logging
用于 Fargate 的 Amazon ECS 任务定义支持用于日志配置的 awslogs、splunk、firelens 和 fluentd 日志驱动程序。
awslogs
日志驱动将会使得 Fargate Task 将日志信息发送到 Amazon CloudWatch Logs 服务。示例:
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group" : "/ecs/fargate-task-definition",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
有关任务中使用 awslogs 的驱动程序:文档参考;
有关任务中使用 firelens 的驱动程序:文档参考;
有关任务中使用 splunk 的驱动程序:文档参考;
3.1.6 Amazon ECS task execution IAM role
通过 task execution IAM role,可以指定 Fargate task 通过 API 调用 ECR 服务。例如,API 可以拉取 Image,将容器日志存储到 CloudWatch。 文档参考;
Amazon ECS 提供了一个托管策略 AmazonECSTaskExecutionRolePolicy;
An Amazon ECS 控制台在首次运行向导中,会自动创建一个 task execution role,但是你必需手动将托管策略附加给 Task Role;
你可以在 IAM 控制台 Roles 界面查看是否存在 ecsTaskExecutionRole
,如果不存在可以通过 Creating the task execution IAM role 创建该角色;
3.1.7 Fargate 下的 TaskDefinition 示例
{
"containerDefinitions": [
{
"command": [
"/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\""
],
"entryPoint": [
"sh",
"-c"
],
"essential": true,
"image": "httpd:2.4",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group" : "/ecs/fargate-task-definition",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
},
"name": "sample-fargate-app",
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
]
}
],
"cpu": "256",
"executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
"family": "fargate-task-definition",
"memory": "512",
"networkMode": "awsvpc",
"requiresCompatibilities": [
"FARGATE"
]
}
3.1.8 Task storage
Fargate Task 支持两种存储:
- 需要持久化存储的 Amazon EFS volumes;
- 不需要持久化的临时存储,1.4.0 以后的平台,每个 task 会有 20GB 的临时存储;
3.2 Tasks and Services
为 Fargate 准备好 ECS Task Definition 之后,在创建服务时需要做一些决策。
3.2.1 Task networking
Fargate 的 ECS Task 需要 awsvpc 网络模式,它会为每个 Task 提供一个 Elastic Network Interface。使用 awsvpc 模式必需指定一个或多个子网来附加 Interface,并为这个 Interface 指定一个或多个安全组。
如果您使用公共子网,需要决定是否为 Interface 提供公共 IP 地址。对于公共子网中的 Fargate Task 来说,如果将一个公共 IP 地址分配给任务的 Interface,该 Interface 带有一条到 internet 的路由或一个 NAT 网关,可以将请求路由到 internet。
对于在私有子网中拉取容器映像的 Fargate 任务,私有子网需要一个 NAT 网关连接到 internet 的路由请求。有关更多信息,参考文档。
下面是 Fargate Service 的 networkConfiguration 片段示例:
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "ENABLED",
"securityGroups": [ "sg-12345678" ],
"subnets": [ "subnet-12345678" ]
}
}
3.2.2 Service load balancing
您可以选择配置 Fargate 上的 Amazon ECS Service,使用 Elastic Load Balancing 来在服务中的 Task 实例之间均匀地分配流量。
在 Fargate 上的 Amazon ECS Service 支持 Application Load Balancer 和 Network Load Balancer 类型。
- Application Load Balancer 用于路由 HTTP/HTTPS (或第7层)流量。
- Network Load Balancer 用于路由 TCP 或 UDP (或第4层)流量。
如果为 Fargate 的 Service 开启 Load Balancing,在为这些 Service 创建 目标组 时,必需选择 IP 作为目标类型,而不是 Instance。这是因为使用 awsvpc mode 的 task 是与一个 Interface 关联的,而不是 EC2 实例;
参考:Service load balancing
3.3 Private registry authentication
Fargate 的 ESC Task 可以使用第三方的 Image 仓库(例如 Docker Hub),但是前提是要进行用户的身份验证。
要使用第三方的 Image 仓库并进行身份验证,需要使用 AWS Secrets Manager
创建一个对应自己 Image 仓库账号的凭据。然后,在 Container Definition
中通过账号对应凭据的 full ARN
资源名称指定 repositoryCredentials
。
"containerDefinitions": [
{
"image": "private-repo/private-image",
"repositoryCredentials": {
"credentialsParameter": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name"
}
}
]
参考: Private registry authentication for tasks
3.4 Clusters
集群可以同时包含 Fargate 和 EC2 两种启动类型的任务;
在集群控制台,Fargate 和 EC2 任务是分别展示统计的;
3.5 Fargate Spot
AWS ECS 服务允许你同时使用 Fargate 和 Fargate Spot 容量来运行 ECS Task。
有了 Fargate Spot,你可以运行终端容忍的 Task 在 ECS 服务中,Spot 的折扣率很大,价格将比 Fargate 优惠更多。Fargate Spot 在 AWS 空闲计算服务中运行 Task,当 AWS 需要恢复计算容量时,那么你的 Task 就会被中断,但是会提前两分钟给你发送警告信息。
参考: AWS Fargate capacity providers
3.6 Usage metrics
可以在 CloudWatch 中可视化的查看你的服务当前资源的使用情况,AWS Fargate 使用情况对应这个 AWS Service 的资源配额。你可以配置警报,当你的使用量接近服务配额时发出警报。
参考: AWS Fargate service quotas、 Fargate usage metrics
3.7 Task retirement
当 AWS 检测到承载该任务的底层硬件出现无法弥补的故障,或者需要修复一个安全问题时,Fargate 任务将被计划退役。大多数安全补丁都是透明处理的,不需要您采取任何行动,也不需要重新启动任务。但对于某些问题,我们可能要求重新启动任务。
当一个任务到达预定的退休日期时,AWS 将停止或终止该任务。如果任务是服务的一部分,则该任务将自动停止,服务调度器将启动一个新的任务来替换它。如果您正在使用独立任务,则会收到任务退出的通知。
参考: Task retirement
3.8 Savings Plans
Savings Plans 是一种价格模式,可以大幅节省 AWS 的使用。您承诺1年或3年的持续使用(以每小时美元计算),并获得较低的使用价格。
参考:Savings Plans User Guide
如果要针对你的 Fargate 使用情况创建一个 Savings Plan,建议使用 Compute Savings Plans
类型。
参考: Getting started with Savings Plans