La definición de tarea que usa mi servicio está extrayendo la versión etiquetada "más reciente" de mi imagen.
Sin embargo, cuando actualizo mi servicio y "fuerzo una nueva implementación", miro los eventos y veo esto:
service MYSERVICE was unable to place a task because no container instance met all of its requirements. The closest matching container-instance .... is already using a port required by your taskLuego fui a mi clúster y detuve todas las tareas.
Luego volví a mi Servicio y actualicé con fuerza nueva implementación nuevamente. Esto parece haber funcionado
¿Tendré que detener todas las tareas y actualizar el servicio cada vez que quiera implementar una nueva imagen? ¿O hay una forma "correcta" de hacer esto?
Solo para hacer un seguimiento, como se indica en las respuestas, solo necesitaba usar el mapeo dinámico de puertos.
Inicialmente, cuando comencé, no tenía un balanceador de carga, así que accedía directamente a las instancias EC2 para acceder a los contenedores en ejecución. Por supuesto, para hacer esto tuve que exponer un puerto estático en el host EC2.
Agregué un balanceador de carga pero mantuve esa asignación de puertos estáticos sin entender cómo funcionaba la asignación de puertos dinámicos. Todo lo que tenía que hacer era cambiar la definición de mi tarea para establecer el puerto de host en "0". Ahora no tengo asignaciones de puertos estáticos en los hosts, el NLB hace el enrutamiento por mí e implementa el trabajo como se esperaba.
Si bien las otras respuestas son correctas, no creo que se apliquen al problema que tiene. Digo esto porque es un problema al que mi equipo también se ha enfrentado, y en realidad no tiene nada que ver con tratar de lanzar varios contenedores en la misma instancia; si entiendo correctamente, solo está tratando de reemplazar el contenedor existente de una definición de tarea actualizada. Si desea colocar varias copias del mismo contenedor en una sola caja, definitivamente mire las sugerencias de las otras respuestas (además de los detalles a continuación), pero para implementaciones continuas, los puertos dinámicos no son necesarios de ninguna manera.
[[ Nota al margen para completar: es posible que su implementación forzada arrojara el error que publicó porque EC2 tarda un tiempo en limpiar los recursos detenidos por ECS. Verá el mismo tipo de problema si intenta forzar la detención/inicio de una tarea; hemos visto errores similares al intentar reiniciar un contenedor que se configuró para asignar >50 % de la memoria de instancia disponible. Obtendrá esos tipos de errores de recursos hasta que la instancia EC2 se limpie por completo y se informe a ECS. He visto que esto toma más de 5 minutos. ]]
Entonces, a su pregunta, desafortunadamente, por ahora no hay ninguna gran mecánica integrada de AWS para realizar un reinicio continuo de tareas. Sin embargo, puede realizar implementaciones continuas.
Como probablemente ya sepa, su servicio se basa en una definición de tarea que se especifica. Tenga en cuenta que depende del número de definición de la tarea y no se preocupa por las etiquetas del contenedor de la forma en que lo hará la instancia EC2.
Las configuraciones a continuación son donde ocurre la magia para habilitar las implementaciones continuas; Puede encontrar estas opciones de configuración en la configuración de su servicio.
Para que pueda realizar implementaciones continuas, debe tener al menos 2 tareas en ejecución.
n al implementar nuevas tareasn que se puede agregar al implementar nuevas tareasEntonces, para un ejemplo real, supongamos que tiene la siguiente configuración:
Number of tasks: 3 Minimum healthy percent: 50 Maximum percent: 100 Si cambia la definición de la tarea a la que apunta su servicio, se iniciará una implementación continua. Tenemos 3 tareas en ejecución, pero permitimos >=50% saludable. ECS eliminará una de sus tareas, haciendo que el % saludable caiga al 66% , aún por encima del 50% . Una vez que aparece la nueva tarea, el servicio vuelve a estar al 100% y ECS puede continuar con la implementación a la siguiente instancia.
Del mismo modo, si tenía una configuración en la que minimum % == 100 y maximum % == 150 (suponiendo que tenga capacidad), ECS iniciará una tarea adicional ; una vez que está activo, tiene un porcentaje saludable de 133% y puede eliminar de manera segura una de las tareas antiguas. Este proceso continúa hasta que su nueva tarea se implementa por completo.
Cuando utilice ECS (o cualquier otro orquestador), se recomienda que utilice la asignación dinámica de puertos .
Básicamente, ECS asignará un puerto no asignado al azar a su contenedor. ECS luego ofrece formas de recuperar ese número de puerto, utilizando la API de introspección del agente o el propio cliente de Docker. Sin embargo, no intentaría recuperar el puerto, sino que confiaría en un Balanceador de carga de aplicaciones (ALB) que le permite usar un único punto final para acceder a cualquier contenedor objetivo independientemente de su puerto asignado dinámicamente. Al actualizar su servicio, el ALB pasará sin problemas a la versión más reciente del contenedor sin ninguna interrupción.
Finalmente, dentro del contenedor, el puerto local seguirá siendo el mismo para que no tenga que manejar las cosas de manera diferente.
Sin puertos dinámicos, solo se puede implementar una instancia de un servicio por contenedor, ya que el puerto que utiliza la instancia no puede ser utilizado por ninguna otra instancia. Cuando actualice el servicio, intentará reiniciar todas sus instancias y, si se inicia más de una instancia en un solo contenedor EC2, el inicio fallará.
Es mejor usar contenedores docker con mapeo dinámico de puertos en el clúster de ECS.