El servicio de Ecs no actualiza la definición de tarea

8

En el clúster ecs, tengo un servicio que se ejecuta con 2 instancias ec2. Y actualizo la definición de la tarea para tomar la nueva imagen del acoplador. Pero la antigua definición de tarea todavía se está ejecutando aunque haya una nueva definición de tarea.

He usado los siguientes comandos para actualizar la definición de tareas y el servicio.

aws ecs register-task-definition --family service90-task --cli-input-json file://service90-task.json

aws ecs update-service --cluster service90-cluster --service service90-service --desired-count 0

TASK_REVISION=`aws ecs describe-task-definition --task-definition service90-task | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//'`

aws ecs update-service --cluster service90-cluster --service service90-service --task-definition service90-task:${TASK_REVISION} --desired-count 2

Lo intenté varias veces, pero no puedo entender dónde me equivoqué. Quiero que el servicio ecs ejecute la nueva definición de tarea en lugar de la anterior.

Lahiru Liyanapathirana
fuente

Respuestas:

7

Como descubrí más adelante, la razón para no actualizar la tarea es que el recuento deseado se establece en 2 y solo hay 2 instancias de EC2 disponibles. Por lo tanto, el agente de ECS intenta retener el recuento deseado aunque la tarea se haya actualizado.

Solución: tenga una instancia de EC2 adicional (en este caso, 3 instancias de EC2). O tenga una instancia adicional que el número preferido de tareas.

De esta manera, la nueva definición de tarea puede ejecutarse en la instancia adicional. Una vez que se estabiliza en la instancia EC2 adicional, el agente ECS drenará la conexión en las otras dos instancias para la definición de tarea anterior, mientras que el equilibrador de carga redirige el tráfico a la instancia actualizada. El agente ECS reemplaza la antigua definición de tarea por las nuevas. Y luego mantiene la cuenta deseada como 2.

Lahiru Liyanapathirana
fuente
2

Una solución alternativa es establecer la Minimum healthy percentopción de implementación del servicio en 0, lo que hace que las tareas existentes se detengan antes de que se implemente la nueva versión.

Esto permite el uso de clústeres de instancia ec2 únicos, con los ahorros de costos asociados, etc.

No es adecuado para la producción, ya que tendrá tiempo de inactividad entre implementaciones

Nick Hammond
fuente
¡Días de investigación y reinicio del servidor, resueltos por esta respuesta! Gracias :)
Neara
2

Para actualizar una definición de tarea en las "tareas" que se ejecutan en el servicio, debe eliminar las tareas e iniciar una nueva tarea.

De esta manera, resuelvo el problema de actualizar la definición de tareas en tareas

He escrito el siguiente código:

    # Register a new Task definition 
    aws ecs register-task-definition --family testing-cluster --cli-input-json file://scripts/taskdefinition/testingtaskdef.json --region $AWS_REGION

    # Update Service in the Cluster
    aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE --task-definition testing-cluster --desired-count 1 --region $AWS_REGION 



    DECRIBED_SERVICE=$(aws ecs describe-services --region $AWS_REGION --cluster $CLUSTER_NAME --services $SERVICE);
    CURRENT_DESIRED_COUNT=$(echo $DECRIBED_SERVICE | jq --raw-output ".services[0].desiredCount")
    #    - echo $CURRENT_DESIRED_COUNT

    CURRENT_TASK_REVISION=$(echo $DECRIBED_SERVICE | jq -r ".services[0].taskDefinition")
    echo "Current Task definition in Service" + $CURRENT_TASK_REVISION

    CURRENT_RUNNING_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].runningCount")
    echo $CURRENT_RUNNING_TASK

    CURRENT_STALE_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].deployments | .[] | select(.taskDefinition != \"$CURRENT_TASK_REVISION\") | .taskDefinition")
    echo "Task defn apart from current service Taskdefn" +  $CURRENT_STALE_TASK
    #   - echo $CURRENT_STALE_TASK

    tasks=$(aws ecs --region $AWS_REGION list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns | map(.[40:]) | reduce .[] as $item (""; . + $item + " ")')
    echo "Tasks are as follows" 
    echo $tasks
    TASKS=$(aws ecs --region $AWS_REGION describe-tasks --cluster $CLUSTER_NAME --task $tasks);
    #    - echo $TASKS
    OLDER_TASK=$(echo $TASKS | jq -r ".tasks[] | select(.taskDefinitionArn!= \"$CURRENT_TASK_REVISION\") | .taskArn | split(\"/\") | .[1] ")
    echo "Older Task running  " + $OLDER_TASK
    for old_task in $OLDER_TASK; do
        aws ecs --region us-east-1 stop-task --cluster $CLUSTER_NAME --task $old_task
    done    

    # Run new tasks with the updated new Task-definition
    aws ecs --region $AWS_REGION run-task --cluster $CLUSTER_NAME --task-definition $CURRENT_TASK_REVISION
Roopa
fuente
0

He estado pensando mucho en esto durante mucho tiempo y nunca encontré una solución viable en ningún lugar hasta la semana pasada.

AWS acaba de lanzar su nueva API donde tienen la opción --force para la eliminación del servicio. El problema del grupo objetivo al que se enfrenta es simplemente porque el grupo objetivo registrado con su tarea ya está eliminado y no puede vincular un nuevo grupo objetivo. Entonces, dado que esta tarea y este servicio están dañados ahora, la única forma de tratar es eliminarlo, ya no puede actualizarlo.

Puede usar este comando para eliminar su servicio ahora; ¡fue imposible la semana pasada!

aws ecs delete-service --service my-http-service --force true

Espero que esto ayude

neocorp
fuente