¿Qué tipo de enfoque se recomienda para actualizar el contenedor de un servicio que se ejecuta en Amazon ECS?
La documentación de AWS dice: "Si ha actualizado la imagen de Docker de su aplicación, puede crear una nueva definición de tarea con esa imagen e implementarla en su servicio, una tarea a la vez". Esto es prácticamente todo lo que está actualmente disponible en la documentación actualmente (13 de abril de 2015).
¿Comprendí correctamente que la única forma de actualizar mi contenedor de aplicaciones en Amazon ECS es crear una nueva tarea, luego detener la tarea anterior y comenzar la nueva tarea?
He estado usando con éxito una etiqueta "más reciente" con Core OS y Fleetctl. Esto tiene el beneficio de no necesitar cambiar la etiqueta de la imagen de Docker para nuevas actualizaciones, ya que al recargar el servicio verá nuevos cambios y actualizará el contenedor (usando la misma etiqueta "más reciente").
¿Qué tipo de enfoques ha utilizado para actualizar su servicio con la imagen acoplada actualizada en Amazon ECS?
fuente
Respuestas:
No estoy seguro de si esto se considera una pregunta abandonada: tropecé con esto al solucionar mi problema y ahora agrego mi solución ahora que está resuelta.
Para actualizar el servicio con un nuevo contenedor, debe:
Si la tarea de servicio no se actualiza a la última versión, revise la pestaña "eventos" para ver si hay errores. Por ejemplo, quizás ECS no pudo iniciar una nueva versión de su servicio: solo tiene una instancia de ec2 en el clúster y el puerto de la aplicación ya está en uso en el host. En este caso, establezca los límites de "salud mínima / salud máxima" en "0%, 100%"; de esta forma, ECS elegirá matar el contenedor antiguo antes de implementar uno nuevo. Esto también sucede en unos pocos minutos: no se apresure si no ve comentarios inmediatos.
A continuación se muestra un script de implementación de ejemplo para actualizar el contenedor en un clúster y servicio preconfigurado. Tenga en cuenta que no hay necesidad de especificar versiones si solo quiere decir "usar lo último de la familia".
fuente
set "min health/max health" limits to "0%, 100%"
son dorados. Muchas gracias!min
que0%
, al cambiar la definición de tarea despliega sus servicios, básicamente estás dándole plena autoridad para derribar todas las tareas al mismo tiempo para que el despliegue.Para actualizar su aplicación, actualice la definición de la tarea y luego actualice el servicio. Ver http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html
fuente
Utilizo parte de la secuencia de comandos ecs-deploy con mis mejoras (toma imágenes de cada descripción de contenedor y reemplaza su parte de etiqueta con $ TAG_PURE): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7ab9d714
fuente
Después de cargar una nueva imagen de Docker, incluso si tiene la misma etiqueta que la utilizada por una Tarea, se debe copiar la última tarea y luego configurar el Servicio para usar esa nueva Tarea. Opcionalmente, uno podría simplemente tener 2 tareas duplicadas y configurar el Servicio para intercambiarlas cada vez que se actualice la Imagen Docker.
Básicamente, para hacer que ECS haga un nuevo Contenedor Docker, una actualización del Servicio debe activarlo, y la única forma de activarlo es Actualizarlo de alguna manera, como diciéndole que use un Número de tarea diferente.
Tenga en cuenta que los Contenedores en ejecución existentes pueden no detenerse automáticamente solo porque el Servicio se actualizó; es posible que deba mirar su lista de Tareas y detenerlos manualmente.
fuente
tag
El enfoque que funciona para mí es similar al anterior. Después de crear su servicio y tarea, y de comenzar todo, edite el Grupo de Auto-Scaling y asegúrese de que min , max y deseado estén configurados en 1 .
El grupo puede ser el predeterminado; si no está seguro, puede hacerlo seleccionando la pestaña Instancias ECS en su clúster, luego en el menú desplegable Acciones elija Recursos del clúster y haga clic en el enlace cerca de la parte inferior del cuadro de diálogo que se abre.
Cuando todo esté en su lugar, cada vez que desee implementar una imagen de contenedor actualizada, vaya al área Tarea del clúster y detenga la tarea . Recibirá una advertencia, pero siempre que la escala automática esté configurada, el servicio comenzará a funcionar nuevamente con el último impulso.
No es necesario crear nuevas versiones ni del servicio ni de la tarea.
Tenga en cuenta que el servicio / tarea se actualiza a sí mismo en cualquier lugar desde instantáneamente hasta dentro de un minuto aproximadamente. Si espera desesperadamente, puede simplemente ejecutar Nueva tarea manualmente. El servicio no será el propietario, por lo que no es ideal, pero seguirá generando uno nuevo si muere.
fuente
Sé que este es un hilo viejo, pero la solución es mucho más fácil de lo que la mayoría de las respuestas aquí hacen.
Cómo actualizar el contenedor en ejecución en dos pasos:
A continuación, se supone que tiene un servicio que ejecuta una tarea que hace referencia a un contenedor etiquetado
latest
(o cualquier otra etiqueta estática que no cambie entre las actualizaciones del contenedor).Si el objetivo es que tengamos una nueva construcción en la naturaleza, realmente no necesitamos confiar en nuestro servicio para eso (y diría que no deberíamos confiar en él). Si elimina su tarea, el servicio reconocerá que no tiene las
Desired Count
tareas en ejecución y simplemente activará una nueva. Esto activará una nueva extracción de su contenedor, basado en la misma etiqueta.Los servicios ECS son una red de seguridad HA, no un reemplazo para su canalización de CD / CI.
Bonificación: si el objetivo es que un servicio reconozca que se ha enviado un nuevo contenedor (independientemente de las etiquetas), debemos considerar las implicaciones de eso. ¿Realmente queremos un servicio básico que controle nuestro canal de implementación para nosotros? Probablemente no. Idealmente, empujará sus contenedores con diferentes etiquetas (basadas en versiones de lanzamiento o algo así). En este caso, la barrera para la implementación es que el servicio debe ser notificado de algo nuevo; nuevamente, es una red de seguridad para el servicio, y nada más.
Cómo implementar nuevas etiquetas en tres pasos:
container:tag
al repositoriotag
minimum healthy
configurado0%
como sugieren algunas otras respuestas, le está dando a AWS plena autoridad para eliminar todo su servicio a fin de implementar la nueva definición de tarea. Si prefiere una implementación gradual / gradual, establezca su mínimo en algo>0%
.minimum healthy
a100%
y sumaximum healthy
algo>100%
para permitir su servicio para desplegar las nuevas tareas antes de matar a los viejos (minimizar el impacto en los usuarios).A partir de este punto, su servicio reconocerá automáticamente que ha especificado una nueva tarea y trabajará en implementarla en función de los umbrales
minimum
/maximum
saludables que haya configurado.fuente