Come posso evitare di posizionare attività su istanze di container Amazon ECS con AMI Amazon Linux 1 che non dispongono di spazio su disco sufficiente?

5 minuti di lettura
0

Uso istanze di container Amazon Elastic Container Service (Amazon ECS) con Amazon Machine Image (AMI) Amazon Linux 1. Tuttavia, non riesco ad avviare attività su istanze di container Amazon ECS con AMI Linux 1 che non dispongono di spazio su disco sufficiente. Questo problema si verifica quando il daemon Docker tenta di estrarre l'immagine Docker dal repository di immagini Docker e di eseguire le attività. Come posso evitare questo problema?

Breve descrizione

All’avvio di un'attività con il tipo di avvio Amazon Elastic Compute Cloud (Amazon EC2), Amazon ECS non considera la disponibilità di spazio su disco sulle istanze di container. Amazon ECS determina dove posizionare l'attività in base ai requisiti specificati nella definizione dell'attività, ad esempio CPU, memoria e porta. Per risolvere questo problema, è possibile utilizzare uno script di monitoraggio dello spazio su disco che monitora lo spazio su disco. Lo script restituisce un valore che indica lo spazio su disco disponibile sulle istanze di container Amazon ECS. Il valore restituito è associato a un'istanza di container come attributo personalizzato. Il ruolo AWS Identity and Access Management (IAM) associato al profilo dell'istanza di container deve disporre dell'autorizzazione per aggiornare questo valore di attributo personalizzato.

Quindi, utilizza una definizione delle attività per specificare un vincolo di posizionamento delle attività che limita il posizionamento delle attività su istanze di container che non dispongono di spazio su disco sufficiente.

Nota: La fine del supporto per Amazon Linux 1 è prevista per il 31 dicembre 2020. È consigliabile migrare i carichi di lavoro su Amazon Linux 2 prima della fine del supporto.

Risoluzione

Avvia l’istanza di container con un'AMI Amazon Linux ottimizzata per Amazon ECS

Importante: È consigliabile avviare istanze con un gruppo con scalabilità automatica configurato con più zone di disponibilità. È possibile aggiungere comandi per avviare le istanze nei dati utente della configurazione di avvio.

Nota: Se si verificano errori durante l'esecuzione dei comandi dell’interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

1.    Esegui il seguente comando per installare i pacchetti AWS CLI e jq nella sezione dati utente della configurazione di avvio dell'istanza di container. Per ulteriori informazioni, vedi ./jq sul sito web jq.

yum install -y aws-cli jq

Nota: La sezione dati utente avvia le istanze Amazon EC2 eseguendo comandi all'avvio.

2.    Apri la console IAM e crea la seguente policy inline:

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

Importante: La policy precedente utilizza un parametro con caratteri jolly che consente al principale di chiamare ecs:PutAttributes per le risorse compatibili (istanze di container) nell'account. L'esempio è fornito per una maggiore facilità d'uso, ma è consigliabile concedere privilegi minimi quando possibile. Per ulteriori informazioni, consulta gli esempi di policy basate sull'identità di Amazon Elastic Container Service. La seguente policy di esempio limita la chiamata alle sole istanze di container in un cluster specifico:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:PutAttributes"
            ],
            "Resource": [
                "arn:aws:ecs:<region>:<accountId>:container-instance/<clusterName>/*"
            ]
        }
    ]
}

3.    Associa la policy inline al ruolo IAM ecsInstanceRole.

Nota: L'autorizzazione IAM associa l'attributo personalizzato SpaceLeft all'istanza di container utilizzando il comando aws ecs put-attribute nell'interfaccia AWS CLI. L'attributo personalizzato SpaceLeft viene calcolato dallo script di monitoraggio dello spazio su disco.

Installa ed esegui lo script di monitoraggio dello spazio su disco sull'istanza di container Amazon ECS

1.    Per monitorare lo spazio su disco (in GB) del cluster, installa il seguente script sull'istanza di container:

#! /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"

Nota: È possibile denominare lo script diskspaceMonitoring.sh e aggiungerlo al percorso /home/ec2-user/diskspaceMonitoring.sh su ogni istanza di container Amazon ECS nel cluster. È inoltre possibile specificare lo script di monitoraggio dello spazio su disco nell’ambito dei dati utente nella configurazione di avvio dell'istanza di container.

2.    Sull'istanza di container, esegui il seguente script:

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

Nota: È possibile eseguire lo script periodicamente nell’ambito di un cronjob a intervalli di un minuto. È anche possibile scegliere un intervallo di tempo diverso. È possibile aggiungere lo script ai dati utente della configurazione di avvio.

3.    Apri la console Amazon ECS e crea un vincolo di posizionamento delle attività con la definizione delle attività Amazon ECS. Ad esempio:

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

La definizione delle attività associata presenta ora un vincolo di posizionamento che limita il posizionamento delle attività sulle istanze di container che non dispongono di spazio su disco sufficiente.


Informazioni correlate

CannotCreateContainerError: Errore API (500): devmapper

Configurazione dell'archiviazione delle AMI

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa