如何避免在带有 Amazon Linux 1 AMI 且磁盘空间不足的 Amazon ECS 容器实例上放置任务?

上次更新时间:2020 年 8 月 20 日

我无法在带有 Amazon Linux 1 Amazon 系统映像 (AMI) 且磁盘空间不足的 Amazon Elastic Container Service (Amazon ECS) 容器实例上启动任务。在 Docker 守护程序尝试从我的 Docker 映像存储库中拉取 Docker 映像之后运行任务时,会出现此情况。

简短描述

当您启动一项使用 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型的任务时,Amazon ECS 将会根据任务定义中指定的要求决定放置任务的位置,如 CPU、内存和端口等。Amazon ECS 不会考虑容器实例上的可用磁盘空间。

要解决此问题,您可以使用监控磁盘空间的磁盘空间监控脚本,然后返回一个值,该值显示 Amazon ECS 容器实例上的可用磁盘空间。该值作为自定义属性与容器实例关联。与容器实例的实例配置文件关联的 AWS Identity and Access Management (IAM) 角色必须拥有更新此自定义属性值的权限。安装此脚本之后,使用任务定义指定任务放置限制,以限制将任务放置在磁盘空间不足的容器实例上。

注意:Amazon Linux 1 的支持服务将于 2020 年 12 月 31 日终止。最佳做法是在支持终止之前将工作负载迁移到 Amazon Linux 2。

解决方法

启动带有为 Amazon ECS 优化的 Amazon Linux AMI 的容器实例

重要提示:最佳做法是启动带有配置了多个可用区的 Auto Scaling 组的实例。您可以添加命令来引导启动配置的用户数据中的实例。

1.    要在容器实例启动配置的用户数据分区中安装 AWS 命令行界面 (AWS CLI) 和 jq 程序包(来自 jq 网站),请运行以下命令:

yum install -y aws-cli jq

注意:用户数据分区通过在启动时运行命令引导 Amazon EC2 实例。

2.    打开 IAM 控制台,然后创建以下内联策略

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

注意:内联策略将对与附加到容器实例的 IAM 实例配置文件关联的 IAM 角色授权。

3.    将内联策略ecsInstanceRole IAM 角色关联。

注意:IAM 权限在 AWS CLI 中使用 aws ecs put-attribute 命令将 SpaceLeft 自定义属性与容器实例关联。SpaceLeft 自定义属性由磁盘监控脚本计算。

在 Amazon ECS 容器实例上安装和运行磁盘监控脚本

1.    要监控集群的磁盘空间 (GB),请在容器实例上安装以下脚本:

#! /usr/bin/env bash
set -o pipefail
set -o nounset
set -o errexit

until curl -s http://localhost:51678/v1/metadata
do
   sleep 1
done

clusterName=$(curl -s http://localhost:51678/v1/metadata | jq .Cluster | tr -d '"' )
SpaceLeft=$(docker info | grep 'Data Space Available' | cut -d':' -f2)
Unit=$(echo "$SpaceLeft" | grep -o '..$')
if [ "$Unit" != GB ]; then
    SpaceLeft=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g' | cut -d '.' -f1)
    SpaceLeftValue=$(echo "$SpaceLeft" | awk '{$1=$1/(1000); print $1;}')
else
        SpaceLeftValue=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g')
fi

instanceArn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')

aws ecs put-attributes \
  --cluster "$clusterName" \
  --attributes name="SpaceLeft",value="$SpaceLeftValue",targetType="container-instance",targetId="$instanceArn" \
  --region "$region"

注意:您可以将脚本命名为 diskspaceMonitoring.sh,然后将其添加到集群中每个 Amazon ECS 容器实例上的 /home/ec2-user/diskspaceMonitoring.sh 路径。您也可以在容器实例启动配置上的用户数据中指定磁盘空间监控脚本。

2.    在容器实例上,运行以下脚本:

$echo "* * * * * root /home/ec2-user/diskspaceMonitoring.sh" >> /etc/crontab

注意:您可以将脚本作为 cron 作业的一部分以一分钟的间隔定期运行。您也可以选择不同的时间间隔。您可以将脚本添加到启动配置上的用户数据中。

3.    打开 Amazon ECS 控制台,然后通过 Amazon ECS 任务定义创建任务放置限制。例如:

"placementConstraints": [
    {
        "expression": "attribute:SpaceLeft >= 0.1",
        "type": "memberOf"
    }
]

注意:关联的任务定义现在具有放置限制,可限制将任务放置在磁盘空间不足的容器实例上。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?