es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El contenedor de Nginx en ECS no está siguiendo la actualización gradual.

Estoy tan cerca de encontrar una buena configuración con Docker Compose y ECS, pero queda una pequeña cosa.

La situación es la siguiente:

  1. Actualizar el código fuente de la aplicación (Django) y desplegarlo en ECS usando Docker Compose y Docker Context.
  2. ECS registra una nueva tarea para la aplicación y la inicia junto con la anterior.
  3. Problema: Nginx realiza comprobaciones de salud en el antiguo contenedor y cuando éste se elimina del registro, nginx comienza a arrojar errores 502 y reinicia la tarea, lo que provoca tiempo de inactividad y no disponibilidad.
  4. Nginx vuelve a iniciarse y realiza comprobaciones de salud en el nuevo contenedor, la aplicación vuelve a funcionar, pero con un tiempo de inactividad no deseado, como se mencionó anteriormente.

¿Hay alguna configuración que deba hacer aquí? ¿Me estoy olvidando algo?

Para referencia, el archivo docker-compose.yml:

services:
  web:
    image: # Imagen desde ECR, construida a partir de GH-action.
    command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
    environment:
      # ...
    volumes:
      # ...
    deploy:
      replicas: 1

nginx:
    image: # Imagen desde ECR, mantenida estática
    ports:
      - "80:80"
    volumes:
      # ...
    depends_on:
      - web
    deploy:
      replicas: 1
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es configurar Nginx para que utilice una configuración de upstream dinámica en lugar de estática. Esto implica utilizar la directiva “resolver” de Nginx para resolver dinámicamente las direcciones IP de los contenedores en ejecución en tiempo de ejecución.

    Aquí hay un ejemplo de configuración de Nginx que utiliza upstreams dinámicos:

    http {
        upstream django {
            server ${TASK_IPS};
        }
    
        server {
            listen       80;
            server_name  localhost;
    
            location / {
                proxy_pass http://django;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
    
            # ...
        }
    }
    

    En esta configuración, ${TASK_IPS} es un marcador de posición para las direcciones IP de los contenedores en ejecución, que serán resueltas dinámicamente por Nginx en tiempo de ejecución. Puede obtener las direcciones IP utilizando AWS CLI o SDK, y pasarlas al contenedor de Nginx utilizando variables de entorno.

    Con esta configuración, cuando se registra un nuevo contenedor en ECS, Nginx comenzará automáticamente a enrutar el tráfico hacia él tan pronto como esté disponible. Esto debería eliminar el tiempo de inactividad causado por las comprobaciones de salud en el contenedor antiguo.

    Tenga en cuenta que este enfoque requiere una configuración adicional, pero proporciona una forma más confiable y escalable de gestionar las implementaciones de contenedores en ECS.

Comments are closed.