AWS ECS任务被OOM杀死无痕迹,如何查询类似K8s的重启计数?
我在AWS ECS集群中部署了作为守护进程运行的监控容器(示例为Datadog Agent),这些容器时常因OOM(内存不足)被杀死,但ECS集群事件里找不到任务重启的相关记录,也没留下明显痕迹,还引发了日志重复问题。
我熟悉Kubernetes,类似场景下执行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
ECS本身没有像K8s那样直接显示容器重启次数的字段,但可以通过以下几种方式追踪OOM杀死和重启事件:
查看ECS容器实例的系统日志
容器被OOM杀死的记录会存在EC2实例的系统日志里,可通过两种方式获取:- 登录对应的EC2容器实例,查看
/var/log/messages或/var/log/syslog(取决于操作系统),搜索Out of memory或docker相关的OOM kill记录。 - 通过AWS Systems Manager的Run Command批量执行命令查询:
grep -i "out of memory" /var/log/messages
- 登录对应的EC2容器实例,查看
启用ECS任务的容器日志收集
确保容器的stdout/stderr日志被收集到CloudWatch Logs,部分容器在OOM退出前会输出相关日志。在任务定义里配置日志驱动为awslogs,即可在CloudWatch Logs中查看容器的启动/退出日志,判断是否因OOM重启。查询ECS任务的历史状态与API调用记录
虽然集群事件无显示,但可通过AWS CLI查询任务的历史状态:aws ecs describe-tasks --cluster <集群名称> --tasks <任务ARN> --include TAGS查看返回结果中的
lastStatus变化,以及任务的version字段(每次任务状态变更version会递增),若version大于1,说明任务有过状态变更。另外,也可通过CloudTrail追踪ECS的StartTask或StopTaskAPI调用,确认是否有任务重启操作。查看Docker容器的重启次数
直接在EC2容器实例上执行Docker命令,查看容器的重启计数:docker inspect <容器ID> | grep -i restartcount这个结果和K8s的
RESTARTS字段作用类似。监控ECS容器内存指标
通过CloudWatch监控ECS容器的MemoryUtilization指标,设置告警阈值,当内存使用率接近上限时触发告警,提前发现OOM风险。同时,在任务定义中合理配置memoryReservation和memory参数,避免内存资源不足。
内容的提问来源于stack exchange,提问作者BlackStar

