Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

424
Views
No puedo implementar un nuevo contenedor en mi clúster de ECS debido a los puertos en uso

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 task

Luego 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?

EDITAR: Entonces, si detengo una tarea, el servicio la reemplazará automáticamente. Entonces puedo actualizar mi servicio y "forzar una nueva implementación" y luego detener una tarea a la vez para obtener una especie de actualización continua. No estoy seguro de si hay una función para automatizar eso más allá de mi propia secuencia de comandos

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.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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.

magia

Para que pueda realizar implementaciones continuas, debe tener al menos 2 tareas en ejecución.

  • Número de tareas: el número de tareas que su servicio desea ejecutar (n)
  • Porcentaje mínimo saludable: el porcentaje mínimo saludable de n al implementar nuevas tareas
  • Porcentaje máximo: el porcentaje máximo de n que se puede agregar al implementar nuevas tareas

Entonces, 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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!