Que tipo de abordagem é recomendada para atualizar o contêiner de um serviço em execução no Amazon ECS?
A documentação da AWS diz: "Se você atualizou a imagem do Docker de seu aplicativo, pode criar uma nova definição de tarefa com essa imagem e implantá-la em seu serviço, uma tarefa por vez". Isso é praticamente tudo o que está atualmente disponível na documentação atualmente (13 de abril de 2015).
Eu entendi corretamente que a única maneira de atualizar meu contêiner de aplicativo no Amazon ECS é criar uma nova tarefa, parar a tarefa antiga e iniciar a nova tarefa?
Tenho usado com sucesso uma tag "latest" com Core OS e Fleetctl. Isso tem a vantagem de não precisar alterar a tag da imagem do Docker para novas atualizações, pois recarregar o serviço verá novas alterações e atualizará o contêiner (usando a mesma tag "latest").
Que tipo de abordagem você usou para atualizar seu serviço com a imagem do docker atualizada no Amazon ECS?
Não tenho certeza se isso é considerado uma pergunta abandonada - me deparei com isso enquanto solucionava meu problema e agora adicionava minha solução agora que foi resolvida.
Para atualizar o serviço com o novo contêiner, você precisa:
Se a tarefa de serviço não for atualizada para a versão mais recente, verifique se há erros na guia "eventos". Por exemplo, talvez o ECS não tenha conseguido iniciar uma nova versão do seu serviço: você tem apenas uma instância ec2 no cluster e a porta do aplicativo já é usada no host. Nesse caso, defina os limites "saúde mínima/saúde máxima" para "0%, 100%" - dessa forma, o ECS escolherá encerrar o contêiner antigo antes de implantar o novo. Isso também está acontecendo ao longo de alguns minutos - não se apresse se não receber um feedback imediato.
Abaixo está um exemplo de script de implantação para atualizar o contêiner em um cluster e serviço pré-configurados. Observe que não há necessidade de especificar versões se você quiser apenas "usar o mais recente da família".
Para atualizar seu aplicativo, atualize a definição da tarefa e, em seguida, atualize o serviço. Consulte http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html
Eu uso parte do script ecs-deploy com minhas melhorias (ele pega imagens de cada descrição de contêiner e substitui sua parte de tag por $TAG_PURE): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7ab9d714
Eu sei que este é um tópico antigo, mas a solução é muito mais fácil do que a maioria das respostas aqui faz parecer.
Como atualizar o contêiner em execução em duas etapas:
O abaixo assume que você tem um serviço executando uma tarefa que está referenciando um container marcado
latest
(ou qualquer outra tag estática que não muda nas atualizações do container).Se o objetivo é lançarmos uma nova construção na natureza, não precisamos realmente confiar em nosso serviço para isso (e eu diria que não devemos confiar nele). Se você eliminar sua tarefa, o serviço reconhecerá que não há nenhuma
Desired Count
tarefa em execução e simplesmente criará uma nova. Isso acionará uma nova extração de seu contêiner, com base na mesma tag.Os serviços ECS são uma rede de segurança HA, não uma substituição para seu pipeline de CD/CI.
Bônus: se o objetivo é fazer com que um serviço reconheça que um novo contêiner foi enviado (independentemente das tags), precisamos considerar as implicações disso. Realmente queremos um serviço básico controlando nosso pipeline de implantação para nós? Provavelmente não. Idealmente, você enviará seus contêineres com tags diferentes (com base em versões de lançamento ou algo assim). Nesse caso, a barreira para a implantação é que o serviço precisa ser notificado sobre algo novo -- novamente, é uma rede de segurança para o serviço e nada mais.
Como implantar novas tags em três etapas:
container:tag
para o repositóriotag
minimum healthy
definiu0%
como algumas outras respostas sugerem, você está dando à AWS autoridade total para eliminar todo o seu serviço para implantar a nova definição de tarefa. Se você preferir uma implantação contínua/gradual, defina seu mínimo para algo>0%
.minimum healthy
to100%
e yourmaximum healthy
to something>100%
para permitir que seu serviço implante as novas tarefas antes de eliminar as antigas (minimizando o impacto para seus usuários).A partir deste ponto, seu serviço reconhecerá automaticamente que você especificou uma nova tarefa e trabalhará na implantação dela com base nos limites
minimum
/maximum
saudáveis que você configurou.Você pode usar
--force-new-deployment
a opção naecs update-service
chamada da API. Não é necessário ter atualização para o serviço em si. Dos documentos :Isso é tão simples quanto com aws-cli:
Depois de carregar uma nova imagem do Docker, mesmo que ela tenha a mesma tag usada por uma tarefa, deve-se copiar a tarefa mais recente e, em seguida, configurar o serviço para usar essa nova tarefa. Opcionalmente, pode-se simplesmente ter 2 tarefas duplicadas e configurar o serviço para alternar entre elas sempre que a imagem do Docker for atualizada.
Basicamente, para fazer com que um novo Docker Container seja feito pelo ECS, uma atualização no Service deve acioná-lo, e a única maneira de fazer o Service acionar é atualizá-lo de alguma forma - como dizendo para usar um número de tarefa diferente.
Observe que os contêineres em execução existentes podem não parar automaticamente apenas porque o serviço foi atualizado - talvez seja necessário examinar sua lista de tarefas e interrompê-los manualmente.
A abordagem que funciona para mim é semelhante à anterior. Depois de criar seu serviço e tarefa, e iniciar tudo, edite o Auto-Scaling Group e certifique-se de que min , max e desejado estejam definidos como 1 .
O grupo pode ser o padrão; se não tiver certeza, você pode acessá-lo selecionando a guia ECS Instances em seu cluster e, no menu suspenso Actions , escolha Cluster Resources e clique no link próximo à parte inferior da caixa de diálogo que é aberta.
Quando tudo estiver pronto, sempre que você quiser implantar uma imagem de contêiner atualizada, vá para a área de tarefas do cluster e interrompa a tarefa . Você receberá um aviso, mas desde que o escalonamento automático esteja configurado, o serviço o iniciará novamente com o push mais recente.
Não há necessidade de criar novas versões do serviço ou da tarefa.
Observe que o serviço/tarefa se atualiza em qualquer lugar, desde instantaneamente até dentro de um minuto ou mais. Se você ficar desesperado esperando, basta executar a nova tarefa manualmente. O serviço não será o proprietário, portanto não é o ideal, mas ainda criará um novo se morrer.