如何处理 AWS Fargate Spot 任务中的 Spot 终止通知?

3 分钟阅读
0

我想知道如何处理 AWS Fargate Spot 任务中的 Spot 终止通知。

简短描述

您可以使用 Fargate Spot 运行容许中断的 Amazon Elastic Container Service(Amazon ECS)任务。终止通知是您在 Fargate Spot 任务到期终止之前两分钟收到的警告。此警告可让您的应用程序有时间为正常关闭做好准备,从而帮助您管理 Spot 中断。Fargate Spot 任务被标记为终止后,会立即创建终止通知。该通知会指明将终止正在运行的 Fargate Spot 任务的时间。警告将作为任务状态变更事件发送到 Amazon EventBridge,并作为 SIGTERM 信号发送给正在运行的任务。

要确保 Fargate Spot 上的容器在任务停止之前退出,请在任务使用的容器定义中指定不超过 120 秒的 stopTimeout 值。指定 stopTimeout 值可以让容器有时间正常退出。超过此时间后,容器将被强制停止。

**注意:**您可以为 stopTimeout 指定的最大值为 120 秒。如果未为此参数指定任何值,将使用默认值 30 秒。

在使用 Fargate Spot 的 Amazon ECS 服务上收到中断信号时,服务调度器将确定是否有额外的可用容量。服务调度器将使用 minimumHealthyPercentmaximumPercent 值进行确定。如果有可用容量,服务调度器会尝试在 Fargate Spot 上启动其他任务。但是,如果服务调度器找不到可用于新任务的容量,将在 stopTimeout 时间结束后终止旧任务。

将 Fargate Spot 与负载均衡器结合使用时,请考虑以下事项:

  • 作为 FARGATE_SPOT 运行的任务直到转换为 STOPPED(已停止)状态,才可能会从负载均衡器的目标组中取消注册。
  • 对于 FARGATE_SPOT 任务,在任务关闭之前,您只有两分钟的时间从目标组取消注册。这意味着您必须将与 FARGATE_SPOT 关联的所有目标组的取消注册延迟设置为小于两分钟的值。

解决方法

当 Fargate Spot 没有容量或容量被收回时,ECS 服务调度器无法启动新任务。相反,调度器会在发出两分钟通知后终止现有任务。但是,Amazon ECS 控制台中不会报告这些事件。

来自 ECS 的事件接近实时地传输到 EventBridge。因此,最佳做法是编写简单的规则来指明您选择的事件以及事件与规则匹配时要执行的自动操作。本文介绍了适用于以下使用案例的 EventBridge 规则:

  • 由于 Fargate Spot 中断,FARGATE_SPOT 任务被关闭。
  • 由于 Fargate Spot 容量不可用,无法放置 FARGATE_SPOT 任务。

由于 Fargate Spot 中断,FARGATE_SPOT 任务被关闭

以下是任务状态变更事件的片段,其中显示了 Fargate Spot 中断的停止原因和停止代码:

{
  "version": "0",
  "id": "a99d3f53-4a7c-4153-a1a5-48957fc83b8f",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9b"
  ],
  "detail": {
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "createdAt": "2022-02-25T10:13:08.455Z",
    "desiredStatus": "STOPPED",
    "lastStatus": "RUNNING",
    "stoppedReason": "Your Spot Task was interrupted.",
    "stopCode": "SpotInterruption",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

请注意,当任务由于 Fargate Spot 中断而停止时,stopCode 被称为 SpotInterruption。您可以创建一个 EventBridge 规则,每当 FARGATE_SPOT 任务被 SpotInterruption 停止时,该规则就会发送 Amazon Simple Notification Service(Amazon SNS)提示。

执行以下操作:

1.    创建 Amazon SNS 主题

2.    为此使用案例创建 EventBridge 规则。

要为此使用案例创建 EventBridge 规则,请执行以下操作:

1.    打开 Amazon EventBridge 控制台

2.    在导航窗格中,选择规则

3.    选择 Create rule(创建规则)。

4.    输入规则的名称和描述。

5.    对于 Event bus(事件总线),选择 AWS default event bus(AWS 默认事件总线)。

6.    对于 Rule type(规则类型),选择 Rule with an event pattern(具有事件模式的规则)。

7.    选择 Next(下一步)。

8.    对于 Event source(事件源),选择 AWS services(AWS 服务)。

9.    对于 Event pattern(事件模式),选择 Custom patterns (JSON editor) [自定义模式(JSON 编辑器)],然后添加以下模式:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "stopCode": [
      "SpotInterruption"
    ],
    "clusterArn": [
      "arn:aws:ecs:exampleregion:1111222233334444:cluster/examplecluster"
    ]
  }
}

10.    选择 Next(下一步)。

11.    对于 Target types(目标类型),选择 AWS service(AWS 服务)。

12.    对于 Select a target(选择目标),选择 SNS topic(SNS 主题)。

13.    对于 Topic(主题),选择您创建的 SNS 主题。

14.    选择 Next(下一步)。

15.    在 configure tags - optional(配置标记 – 可选)页面中,选择 Next(下一步)。

16.    查看选项并选择 Create rule(创建规则)。

由于 Fargate Spot 容量不可用,无法放置 FARGATE_SPOT 任务

以下是在下列条件下发生的服务任务放置失败事件的片段:

  • 任务正在尝试使用 FARGATE_SPOT 容量提供程序。
  • 服务调度器无法获取任何 Fargate Spot 容量。
{
  "version": "0",
  "id": "403b98b2-616e-4ec7-8dff-b2cba8d5bf64",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "time": "2022-02-25T14:56:32.756Z",
  "region": "ap-southeast-2",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "capacityProviderArns": [
      "arn:aws:ecs:ap-southeast-2:1111222233334444:capacity-provider/FARGATE_SPOT"
    ],
    "reason": "RESOURCE:FARGATE",
    "createdAt": "2022-02-25T14:21:04.163Z"
  }
}

当由于 Fargate Spot 容量不可用而无法放置任务时,eventName 会被称为 SERVICE_TASK_PLACEMENT_FAILURE。这意味着您可以创建 EventBridge 规则,以便在无法放置 FARGATE_SPOT 任务时发送 SNS 提示。

执行以下操作:

1.    创建 SNS 主题

2.    为此使用案例创建一个 Amazon EventBridge 规则。为此,请按照由于 Fargate Spot 中断,FARGATE_SPOT 任务被关闭部分中提供的说明进行操作,但以下变更除外:

对于 Event pattern(事件模式),选择 Custom patterns (JSON editor)(自定义模式(JSON 编辑器)),然后添加以下模式:

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Deployment State Change"
  ],
  "detail": {
    "eventName": [
      "SERVICE_TASK_PLACEMENT_FAILURE"
    ],
    "clusterArn": [
      "arn:aws:ecs:example-region:1111222233334444:cluster/example-cluster"
    ],
    "reason": [
      "RESOURCE:FARGATE"
    ]
  }
}

相关信息

处理 Fargate Spot 终止通知

创建对事件做出反应的 Amazon EventBridge 规则

AWS 官方
AWS 官方已更新 2 年前