O serviço Ecs não atualiza a definição da tarefa

5

No cluster ecs, tenho um serviço em execução com 2 instâncias ec2. E eu atualizo a definição da tarefa para tirar a nova imagem do docker. Mas a antiga definição de tarefa ainda está em execução, embora haja uma nova definição de tarefa.

Eu usei os seguintes comandos para atualizar a definição e o serviço da tarefa.

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

Eu tentei várias vezes, mas não consigo descobrir onde eu errei. Eu quero que o serviço ecs execute a nova definição de tarefa em vez da antiga.

    
por Lahiru Liyanapathirana 16.12.2016 / 05:35

4 respostas

5

Como descobri mais tarde, o motivo para não atualizar a tarefa é que a contagem desejada é definida como 2 e há apenas duas instâncias do EC2 disponíveis. Assim, o agente do ECS tenta manter a contagem desejada mesmo que a tarefa tenha sido atualizada.

Solução - Tenha uma instância extra do EC2 (nesse caso, 3 instâncias do EC2). Ou ter uma instância extra do que o número preferido de tarefas.

Desta forma, a nova definição de tarefa pode ser executada na instância extra. Depois que ele é estabilizado na instância extra do EC2, o agente do ECS drenará a conexão nas outras duas instâncias para a definição de tarefa antiga, enquanto o balanceador de carga redirecionará o tráfego para a instância atualizada. O agente do ECS substitui a antiga definição de tarefa pelas novas. E então mantém a contagem desejada como 2.

    
por 29.12.2016 / 06:08
1

Uma solução alternativa é definir a opção de implantação Minimum healthy percent do serviço como 0 , o que resulta na interrupção das tarefas existentes antes da implantação da nova versão.

Isso permite que clusters únicos de instância ec2 sejam usados, com a redução de custos associada, etc.

Não é adequado para produção porque você terá tempo de inatividade entre as implantações

    
por 03.08.2017 / 11:59
1

Para atualizar uma definição de tarefa nas "tarefas" em execução no serviço Você precisa excluir as tarefas e Iniciar uma nova tarefa.

Desta forma, eu resolvo o problema de atualizar a definição de tarefas em tarefas

Eu escrevi o seguinte 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
    
por 07.05.2018 / 07:45
0

Eu tenho coçado minha cabeça por um longo tempo e nunca encontrei uma solução viável em qualquer lugar até a semana passada. A AWS acaba de lançar sua nova API, onde eles têm a opção - force para remoção de serviço. A questão do Grupo Alvo que você está enfrentando é simplesmente porque o Grupo-alvo registrado com a sua tarefa já foi excluído e você não pode vincular um novo Grupo alvo a ele. Então, como essa tarefa e o serviço estão corrompidos agora, a única forma de lidar é excluí-lo, você não pode mais atualizá-lo.

Você pode usar este comando para excluir seu serviço agora; foi impossível semana passada! {code} aws ecs delete-service - serviço my-http-service --force true {code}

Espero que isso ajude

    
por 11.07.2018 / 10:33