【问题标题】:AWS ECS tasks are being killed by OOM without leaving any traceAWS ECS 任务被 OOM 杀死而没有留下任何痕迹
【发布时间】:2023-02-07 14:50:38
【问题描述】:

我有一个 ECS 集群,我在其中放置一个作为守护进程运行的容器来监视所有其他进程。但是,我看到这个容器不时地被 OOM 杀死而没有留下任何痕迹。我只是碰巧发现其中一个被杀。这导致了一些日志重复,但我想知道是否有一种方法可以跟踪这些重新启动,因为当我查看 ECS 集群事件时,没有关于此任务以任何方式重新启动的信息。

我对 kubernetes 了解更多,所以我会在这里打个比方。当这种情况发生在 kubernetes 上时,当您从所有 pod (kubectl get pods) 获取信息时,您会看到一个 RESTARTS 计数器,有什么方法可以找到有关 AWS ECS 任务的信息吗?我正在努力寻找文档

我确定了任务,还确定了每个任务的状态以获取更多信息,但我找不到任何提示该进程之前已重新启动或终止。

这是一个任务细节示例

- attachments: []
  attributes:
  - name: ecs.cpu-architecture
    value: x86_64
  availabilityZone: us-east-2c
  clusterArn: arn:aws:ecs:us-west-2:99999999999:cluster/dev
  connectivity: CONNECTED
  connectivityAt: '2023-01-24T23:03:23.315000-05:00'
  containerInstanceArn: arn:aws:ecs:us-east-2:99999999999:container-instance/dev/eb8875fhfghghghfjyjk88c8f96433b8
  containers:
  - containerArn: arn:aws:ecs:us-east-2:99999999999:container/dev/05d4a402ee274a3ca90a86e46292a63a/e54af51f-2420-47ab-bff6-dcd4f976ad2e
    cpu: '500'
    healthStatus: HEALTHY
    image: public.ecr.aws/datadog/agent:7.36.1
    lastStatus: RUNNING
    memory: '750'
    name: datadog-agent
    networkBindings:
    - bindIP: 0.0.0.0
      containerPort: 8125
      hostPort: 8125
      protocol: udp
    - bindIP: 0.0.0.0
      containerPort: 8126
      hostPort: 8126
      protocol: tcp
    networkInterfaces: []
    runtimeId: 75559b7327258d69fe61cac2dfe58b12d292bdb7b3a720c457231ee9e3e4190a
    taskArn: arn:aws:ecs:us-east-2:99999999999:task/dev/05d4a402ee274a3ca90a86e46292a63a
  cpu: '500'
  createdAt: '2023-01-24T23:03:22.841000-05:00'
  desiredStatus: RUNNING
  enableExecuteCommand: false
  group: service:datadog-agent
  healthStatus: HEALTHY
  lastStatus: RUNNING
  launchType: EC2
  memory: '750'
  overrides:
    containerOverrides:
    - name: datadog-agent
    inferenceAcceleratorOverrides: []
  pullStartedAt: '2023-01-24T23:03:25.471000-05:00'
  pullStoppedAt: '2023-01-24T23:03:39.790000-05:00'
  startedAt: '2023-01-24T23:03:47.514000-05:00'
  startedBy: ecs-svc/1726924224402147943
  tags: []
  taskArn: arn:aws:ecs:us-west-2:99999999999:task/dev/05d4a402ee274a3ca90a86e46292a63a
  taskDefinitionArn: arn:aws:ecs:us-west-2:99999999999:task-definition/datadog-agent-task:5
  version: 2

【问题讨论】:

    标签: amazon-web-services amazon-ecs datadog


    【解决方案1】:

    我认为 ECS 不会跟踪或公开任务的重启计数器。如果你想收到任务重启的通知,你可以创建一个Event Bridge 订阅。

    【讨论】:

      【解决方案2】:

      您可以将 ECS EventEventBridge 一起使用,并在此类事件发生时添加任何操作,例如记录日志。

      【讨论】:

        【解决方案3】:

        因此,在 AWS 为这个用例提供的少量信息中进行了大量调试之后,我最终做了一个寻找答案的过程:

        1. 使用带标志 --desired-status STOPPED 的 aws-cli 列出给定服务的所有任务 ID,并将所有任务转储到 json 文件

          aws ecs list-tasks --cluster dev --service-name datadog-agent --desired-status STOPPED --output json > ecs_tasks.json

          1. 使用 jq 和 aws-cli,描述所有以前找到的任务 ID,以获取有关每个任务的更多信息

          aws ecs describe-tasks --cluster dev --tasks $(jq -j '.taskArns[] | (.|" ",.)' ./ecs_tasks.json) --output yaml > ecs_tasks_describe.log

          1. 我可以想出一个脚本来对信息进行分组和总结,但是,由于我只需要观察 20 多个停止的任务,为了方便起见,我最终将信息转储为 yaml 格式。我在输出中发现了两个关键属性:

            • 对于每个任务对象,都有一个停止的原因,除了告诉我它停止是因为任务中的一个容器退出(虽然没有说退出代码有帮助)

          stoppedReason:任务中的基本容器已退出

          * For each task object, there is an array of containers objects under **containers** property. There you'll sometimes find **reason** property which can explain a bit more of why the container stopped
          

          原因:'OutOfMemoryError:容器因内存使用而被杀死'

          注意:此信息至少会为您提供给定服务在过去一小时内的所有事件。就我而言,它给了我 8 小时的事件,但 AWS 文档只承诺 1 小时https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-errors.html

          已停止的任务仅在任务停止后至少 1 小时内出现在 Amazon ECS 控制台、AWS CLI 和 AWS 开发工具包中。之后,已停止任务的详细信息将过期并且在 Amazon ECS 中不可用。

        【讨论】: