¿Cuál es el enfoque correcto para que mis tareas de Amazon ECS actualicen sus imágenes de Docker, una vez que dichas imágenes se hayan actualizado en el registro correspondiente?
docker
docker-registry
amazon-ecs
aknuds1
fuente
fuente
Respuestas:
Si su tarea se ejecuta bajo un servicio, puede forzar una nueva implementación. Esto obliga a reevaluar la definición de la tarea y extraer la nueva imagen del contenedor.
fuente
Cada vez que inicie una tarea (ya sea a través de las llamadas
StartTask
yRunTask
API o que se inicie automáticamente como parte de un Servicio), el Agente de ECS realizará unadocker pull
de lasimage
que especifique en la definición de la tarea. Si usa el mismo nombre de imagen (incluida la etiqueta) cada vez que ingresa a su registro, debería poder ejecutar la nueva imagen ejecutando una nueva tarea. Tenga en cuenta que si Docker no puede acceder al registro por algún motivo (por ejemplo, problemas de red o problemas de autenticación), el agente de ECS intentará utilizar una imagen en caché; Si desea evitar que se usen imágenes almacenadas en caché cuando actualice su imagen, querrá insertar una etiqueta diferente en su registro cada vez y actualizar la definición de la tarea correspondientemente antes de ejecutar la nueva tarea.Actualización: este comportamiento ahora se puede ajustar a través de la
ECS_IMAGE_PULL_BEHAVIOR
variable de entorno establecida en el agente de ECS. Consulte la documentación para obtener más detalles. En el momento de escribir este artículo, se admiten las siguientes configuraciones:fuente
/var/log/ecs
.Registrar una nueva definición de tarea y actualizar el servicio para usar la nueva definición de tarea es el enfoque recomendado por AWS. La forma más sencilla de hacerlo es:
Este tutorial tiene más detalles y describe cómo los pasos anteriores encajan en un proceso de desarrollo de producto de un extremo a otro.
Divulgación completa: este tutorial presenta contenedores de Bitnami y yo trabajo para Bitnami. Sin embargo, los pensamientos expresados aquí son míos y no la opinión de Bitnami.
fuente
Hay dos maneras de hacer esto.
Primero, use AWS CodeDeploy. Puede configurar las secciones de implementación azul / verde en la definición del servicio ECS. Esto incluye un CodeDeployRoleForECS, otro TargetGroup para conmutador y un escucha de prueba (opcional). AWS ECS creará el grupo de implementación y la aplicación CodeDeploy y vinculará estos recursos de CodeDeploy con su clúster / servicio ECS y sus grupos ELB / TargetGroups por usted. Luego, puede usar CodeDeploy para iniciar una implementación, en la que debe ingresar una AppSpec que especifica el uso de qué tarea / contenedor para actualizar qué servicio. Aquí es donde especifica su nueva tarea / contenedor. Luego, verá que se activan nuevas instancias en el nuevo TargetGroup y el antiguo TargetGroup se desconecta del ELB, y pronto se cancelarán las antiguas instancias registradas en el antiguo TargetGroup.
Suena muy complicado. En realidad, dado que / si ha habilitado el escalado automático en su servicio ECS, una forma sencilla de hacerlo es simplemente forzar una nueva implementación usando la consola o cli, como un caballero señaló aquí:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
De esta manera, puede seguir utilizando el tipo de implementación de "actualización continua", y ECS simplemente activará nuevas instancias y agotará las antiguas sin tiempo de inactividad de su servicio si todo está bien. El lado malo es que pierde el control sobre la implementación y no puede volver a la versión anterior si hay un error y esto interrumpirá el servicio en curso. Pero esta es una forma realmente sencilla de hacerlo.
Por cierto, no olvide establecer los números adecuados para el porcentaje mínimo saludable y el porcentaje máximo, como 100 y 200.
fuente
Creé un script para implementar imágenes de Docker actualizadas en un servicio de ensayo en ECS, de modo que la definición de tarea correspondiente se refiera a las versiones actuales de las imágenes de Docker. No sé con certeza si sigo las mejores prácticas, por lo que agradeceríamos recibir comentarios.
Para que el script funcione, necesita una instancia de ECS de repuesto o un
deploymentConfiguration.minimumHealthyPercent
valor para que ECS pueda robar una instancia para implementar la definición de tarea actualizada.Mi algoritmo es así:
Mi código pegado a continuación:
deploy-ecs
_common.py
fuente
AWS CodePipeline.
Puede establecer ECR como fuente y ECS como destino para la implementación.
fuente
Lo siguiente funcionó para mí en caso de que la etiqueta de la imagen de la ventana acoplable sea la misma:
fuente
Me encontré con el mismo problema. Después de pasar horas, he concluido estos pasos simplificados para la implementación automatizada de la imagen actualizada:
1.Cambios en la definición de la tarea de ECS: para una mejor comprensión, supongamos que ha creado una definición de tarea con los detalles a continuación (nota: estos números cambiarían en consecuencia según la definición de su tarea):
Entonces necesitas hacer los siguientes cambios:
2. Etiquete su imagen como < su-nombre-de-imagen>: última . La última clave se encarga de que la tarea ECS correspondiente la tire.
3.Presione la imagen a ECR
4.aplicar despliegue forzado
Nota: He escrito todos los comandos asumiendo que la región es us-east-1 . Simplemente reemplácelo con su región respectiva durante la implementación.
fuente
Usando AWS cli probé aws ecs update-service como se sugirió anteriormente. No recogió la última ventana acoplable de ECR. Al final, volví a ejecutar mi libro de jugadas de Ansible que creó el clúster ECS. La versión de la definición de la tarea cambia cuando se ejecuta ecs_taskdefinition. Entonces todo va bien. Se recoge la nueva imagen de la ventana acoplable.
A decir verdad, no estoy seguro de si el cambio de versión de la tarea obliga a la redistribución o si el libro de jugadas que usa ecs_service hace que la tarea se recargue.
Si alguien está interesado, obtendré permiso para publicar una versión desinfectada de mi libro de jugadas.
fuente
Bueno, también estoy tratando de encontrar una forma automatizada de hacerlo, es decir, impulsar los cambios a ECR y luego el servicio debería recoger la última etiqueta. Puede hacerlo manualmente deteniendo la tarea de su servicio desde su clúster. Las nuevas tareas extraerán los contenedores ECR actualizados.
fuente
Los siguientes comandos funcionaron para mí
fuente