[AWS Call for Papers] ECS facilita la orquestación de contenedores

Amazon Elastic Container Service (Amazon ECS) es un servicio de administración de contenedores de alto rendimiento, altamente escalable y exclusivo de Amazon que puede ejecutar, detener y administrar contenedores Docker en el clúster con facilidad.

Con ECS, ya no necesita instalar, operar y expandir su propia infraestructura de administración de clústeres. Solo una simple llamada a la API puede iniciar y detener aplicaciones de Docker, consultar el estado del clúster, etc. La ubicación de los contenedores en el clúster se puede organizar de acuerdo con los requisitos de recursos, las estrategias de aislamiento y los requisitos de disponibilidad. ECS integra Amazon Elastic Container Registry, Elastic Load Balancing, Elastic Block Store, Elastic Network Interfaces, Virtual Private Cloud, IAM y CloudTrail para proporcionar una solución completa para ejecutar varias aplicaciones o servicios en contenedores.

ECS es una solución probada que se ha aplicado a muchos otros servicios de AWS, como Amazon SageMaker y Amazon Lex. Esto es suficiente para demostrar la seguridad, confiabilidad y disponibilidad de ECS, y se puede utilizar en un entorno de producción.

Tipo de inicio

ECS admite dos tipos de inicio: Fargate y EC2.

Tipo de inicio de Fargate

El tipo de inicio de Fargate no necesita configurar y administrar la infraestructura subyacente. Solo necesita definir tareas (equivalentes a Kubernetes Pods), especificar CPU, memoria, red, políticas de IAM, etc., para ejecutar aplicaciones en contenedores.
[AWS Call for Papers] ECS facilita la orquestación de contenedores

Tipo de inicio EC2

El tipo de lanzamiento EC2 permite que las aplicaciones en contenedores se ejecuten en un clúster de instancias EC2 administradas por él mismo.
[AWS Call for Papers] ECS facilita la orquestación de contenedores

Puede utilizar el tipo de inicio Fargate para iniciar servicios o tareas y ejecutar en la infraestructura sin servidor administrada por ECS sin tener que administrar clústeres o servidores de instancias de Amazon EC2. Para mayor control, puede utilizar el tipo de inicio EC2.

A continuación se explica el uso del tipo de inicio Fargate para implementar aplicaciones Spring Boot 2 Spring Boot y Angular integradas de Angular 9 .

Crear imagen de Docker

Archivo Dockerfile del proyecto Spring Boot:

Dockerfile.spring

FROM openjdk:8-jdk-slim

WORKDIR app
ARG APPJAR=target/heroes-api-1.0.0.jar
COPY ${APPJAR} app.jar

ENTRYPOINT ["java","-jar","app.jar"]

Dockerfile para proyecto Angular:

Dockerfile.angular

FROM httpd:2.4

ARG DISTPATH=./dist/
ARG CONFFILE=./heroes-httpd.conf
COPY ${DISTPATH} /usr/local/apache2/htdocs/
COPY ${CONFFILE} /usr/local/apache2/conf/httpd.conf

Tome la implementación en Apache como ejemplo, ejecute el siguiente comando para obtener httpd.conf:

Docker ejecutar --rm httpd: 2.4 cat /usr/local/apache2/conf/httpd.conf> heroes-httpd.conf

Modifique el archivo de configuración, habilite proxy_module, proxy_http_module, rewrite_module y luego agregue el siguiente contenido:

ProxyPreserveHost on
ProxyPass "/api" "http://127.0.0.1:8080/api"
ProxyPa***everse "/api" "http://127.0.0.1:8080/api"

RewriteEngine  on
RewriteRule ^/$ /en/index.html

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# If the requested resource doesn't exist, use index.html
RewriteRule ^/zh /zh/index.html
RewriteRule ^/en /en/index.html

Incluiremos estas dos imágenes en una tarea, utilizando la dirección de backend del proxy de Apache.

Build Image
Ejecute el siguiente comando para construir Image:

docker build --build-arg APPJAR=heroes-api-1.0.0.jar -f Dockerfile.spring -t heroes-api .
docker build -f Dockerfile.angular -t heroes-web .

Empuje la imagen a ECR

Amazon Elastic Container Registry (Amazon ECR) es un servicio de Docker Container Registry que permite a los desarrolladores almacenar, administrar e implementar fácilmente imágenes de contenedores de Docker.

  1. Crear repositorio ECR

Primero cree dos repositorios ECR, que se pueden crear desde la consola, o puede ejecutar los siguientes comandos de la AWS CLI:

aws ecr create-repository --repository-name heroes/heroes-api
aws ecr create-repository --repository-name heroes/heroes-web
  1. Inicie sesión en el repositorio de ECR

Ejecute los siguientes comandos:

`aws ecr get-login --no-include-email`


aws ecr get-login-password | docker login --username AWS --password-stdin 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn
  1. Marcar imagen
docker tag heroes-api:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker tag heroes-web:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest
  1. Empuje la imagen
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest

Crea un clúster

Un clúster de Amazon ECS es una agrupación lógica de tareas o servicios. Se pueden crear varios clústeres en una cuenta para mantener los recursos independientes.

Crear un clúster de Fargate es muy simple. Ingrese a la consola del clúster de ECS, haga clic en "Crear clúster", seleccione la plantilla de clúster "Solo red", haga clic en "Siguiente", luego ingrese el nombre del clúster "héroes" y haga clic en "Crear".

Crear definición de tarea

La definición de la tarea es similar al plano de una aplicación y se requiere la definición de la tarea para ejecutar contenedores de Docker en Amazon ECS.

Algunos parámetros que se pueden especificar en la definición de la tarea de Fargate:

  • Imagen de Docker para la tarea
  • El número de CPU y memoria para la tarea.
  • Configuración de registro de tareas
  • Rol de IAM utilizado por la tarea
  • El volumen de datos utilizado para el contenedor en la tarea
  • El comando que debe ejecutar el contenedor cuando se inicia

Realice los siguientes pasos para crear una definición de tarea:

  1. Ingrese a la consola de definición de tareas de ECS, haga clic en Crear definición de tarea
  2. Seleccione el tipo de inicio FARGATE, haga clic en Siguiente
  3. En la página de definición de la tarea de configuración y del contenedor, ingrese el nombre de la definición de la tarea (héroes), seleccione el rol de la tarea y configure la memoria de tareas y la CPU

Combinación efectiva de memoria y CPU

Valor de la CPU Valor de memoria (MiB)
256 (0,25 vCPU) 512 MB, 1 GB, 2 GB
512 (0,5 vCPU) 1 GB 、 2 GB 、 3 GB 、 4 GB
1024 (1 CPU virtual) 2 GB 、 3 GB 、 4 GB 、 5 GB 、 6 GB 、 7 GB 、 8 GB
2048 (2 CPU virtuales) 4GB a 16GB (en incrementos de 1GB)
4096 (4 CPU virtuales) 8GB a 30GB (en incrementos de 1GB)

Almacenamiento de contenedores y volumen compartido
Tipo de inicio de Fargate, el almacenamiento máximo de contenedores de la tarea es de 10 GB y el tamaño máximo del volumen compartido utilizado por varios contenedores es de 4 GB. Para agregar un volumen compartido, haga clic en "Agregar volumen" en la sección Configuración de volumen, ingrese el nombre del volumen y haga clic en "Agregar". Tenga en cuenta que el almacenamiento de tareas es un almacenamiento a corto plazo. Una vez detenida la tarea de Fargate, se eliminará el almacenamiento.

Agregar un contenedor
A continuación, haga clic en el botón "Agregar contenedor" en la sección de definición del contenedor para agregar contenedores heroes-api y heroes-web: los
[AWS Call for Papers] ECS facilita la orquestación de contenedores
puntos de montaje y los registros de configuración se pueden agregar en la sección "Almacenamiento y registro" de la parte inferior de la configuración avanzada del contenedor:
[AWS Call for Papers] ECS facilita la orquestación de contenedores
predeterminado, Las tareas de Fargate registran registros en CloudWatch Log, y puede establecer el nombre del grupo de registros y el prefijo del flujo de registros de cada contenedor.

Finalmente, haga clic en "Crear" para completar la definición de la tarea.

Crear servicio

El servicio puede ejecutar y administrar simultáneamente una cantidad específica de instancias de definición de tareas en un clúster de Amazon ECS. Si la tarea falla o se detiene por cualquier motivo, el programador del servicio iniciará otra instancia de definición de tarea para reemplazarla y conservar el número esperado de tareas en el servicio de acuerdo con la estrategia de planificación utilizada.

Además de mantener la cantidad esperada de tareas en el servicio, también puede optar por ejecutar el servicio con un equilibrador de carga. El equilibrador de carga distribuirá el tráfico entre las diversas tareas asociadas con el servicio.

En la consola de ECS, los servicios se pueden crear a partir de clústeres y definiciones de tareas. Tomando la definición de tarea como ejemplo, los pasos son los siguientes:

Configurar los parámetros básicos
Seleccione la definición de la tarea principal, luego haga clic en Acción -> Crear servicio, y complete los siguientes parámetros en la página Configurar servicio:

  • Tipo de inicio: FARGATE
  • Cluster: héroes
  • Nombre del servicio: héroes
  • Número de tareas: 1
  • Tipo de implementación: actualización continua

Haga clic en Siguiente.

La configuración de la red se encuentra
en la sección VPC y grupo de seguridad, seleccione la VPC y la subred del clúster. Un nombre de grupo de seguridad se genera automáticamente de forma predeterminada. Puede hacer clic en Editar para modificar el nombre del grupo de seguridad o seleccionar un grupo de seguridad existente. Si elige crear un nuevo grupo de seguridad, las reglas de entrada del puerto 80 se configuran de forma predeterminada.
Usamos ELB y no necesitamos IP pública. Establezca la opción de asignar automáticamente IP pública a DISABLED.

Para el equilibrio de carga,
creamos un nuevo ALB sin crear un grupo objetivo.

  • Tipo de balanceador de carga: Balanceador de carga de aplicaciones
  • Nombre del equilibrador de carga: seleccione el ALB recién creado
  • Elija un recipiente: héroes en la web: 80: 80, a continuación, haga clic en "Añadir a equilibrador de carga" e introduzca los siguientes parámetros:
    puerto de escucha de producción: Nueva 80
    protocolo de escucha Producción: HTTP
    grupo objetivo nombre: Nueva ECS-héroes
    objetivo Protocolo de grupo: HTTP

Configurar el
servicio Auto Scaling Auto Scaling: No ajuste el recuento esperado del servicio

Después de revisar y
verificar, haga clic en Crear servicio.

Regrese a la interfaz del clúster, puede ver que el clúster de héroes contiene un servicio y una tarea en ejecución.

El servicio está limitado a
la interfaz de tareas del clúster. Si detenemos la tarea actual, la nueva tarea se reiniciará automáticamente más tarde y el grupo objetivo de ELB se actualizará automáticamente.

El programador de servicios de Amazon ECS contiene lógica para limitar la frecuencia de reinicio de las tareas de servicio después de fallas repetidas.

Si una tarea de servicio de ECS siempre falla en ingresar al estado EN EJECUCIÓN (salta directamente de PENDIENTE a DETENIDO), el intervalo entre los intentos de reinicio posteriores aumentará gradualmente, hasta 15 minutos

Para acceder al servicio,
vaya al clúster de héroes -> tarea, haga clic en la tarea e ingrese a la página de detalles de la tarea, puede ver la dirección IP privada de la tarea. En la red interna, puede utilizar la IP privada para acceder a las aplicaciones implementadas por cada tarea. La red pública accede a los servicios a través de ELB.

Configuración de registro

awslogs

De forma predeterminada, las tareas de Fargate utilizan el controlador de registro awslogs para registrar registros en CloudWatch Log.

opciones del controlador de registro de awslogs

Opciones Tiene que Descripción
awslogs-create-group No Para crear automáticamente un grupo de registros, la política de IAM debe incluir los registros: permiso CreateLogGroup. El valor predeterminado es falso.
awslogs-region si El área donde el controlador de registro debe enviar registros de Docker
awslogs-group si El grupo de registros al que el controlador de registros envía el flujo de registros
prefijo awslogs-stream si Prefijo de secuencia de registro, formato de secuencia de registro: nombre-prefijo / nombre-contenedor / ecs-task-id
awslogs-formato de fecha y hora No Definir el modo de posición de inicio de varias líneas en formato Python strftime
awslogs-multiline-pattern No Utilice expresiones regulares para definir patrones de posición de inicio de varias líneas

Nota: Si awslogs-datetime-format y awslogs-multiline-pattern se configuran al mismo tiempo, la opción awslogs-datetime-format tiene prioridad. El registro de varias líneas realiza el análisis y la coincidencia de expresiones regulares en todos los mensajes de registro, lo que puede tener un impacto negativo en el rendimiento del registro.

Integración con FireLens

FireLens para Amazon ECS puede enrutar registros a servicios de AWS o destinos de AWS Partner Network (APN) para el almacenamiento y análisis de registros. FireLens se puede usar en combinación con Fluentd y Fluent Bit. AWS proporciona imágenes y complementos de Fluent Bit para CloudWatch Logs y Kinesis Data Firehose. También puede utilizar sus propias imágenes de Fluentd o Fluent Bit.

Fluent Bit y Fluentd son dos herramientas de recopilación de registros. El complemento Fluent Bit ahorra recursos y es más eficiente. Se recomienda utilizar Fluent Bit como enrutador de registros.

Seleccione la tarea que creamos anteriormente y haga clic en "Crear nueva revisión" para habilitar la integración de FireLens:

[AWS Call for Papers] ECS facilita la orquestación de contenedores

Como se muestra en la figura anterior, después de seleccionar fluentbit, la dirección de la imagen se completará automáticamente y el contenedor log_router se agregará automáticamente al hacer clic en Aplicar .

Tenga en cuenta que para usar el complemento de CloudWatch, el rol de tarea debe tener permisos CreateLogGroup, CreateLogStream, DescribeLogStreams, PutLogEvents; para usar el complemento AmazonKinesisFirehose, debe tener el permiso "firehose: PutRecordBatch".

Configurar log_router

{
    "essential": true,
    "image": "128054284489.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-for-fluent-bit:latest",
    "name": "log_router",
    "firelensConfiguration": {
        "type": "fluentbit"
    },
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "/ecs/firelens",
            "awslogs-region": "cn-north-1",
            "awslogs-create-group": "true",
            "awslogs-stream-prefix": "firelens"
        }
    },
    "memoryReservation": 50
}

Los registros de Log Router son controlados por awslogs y registrados en CloudWatch:
[AWS Call for Papers] ECS facilita la orquestación de contenedores

A continuación, usamos Fluent Bit para reenviar registros a CloudWatch Logs y Kinesis Data Firehose.

Reenviar registros a CloudWatch Logs

Modifique la configuración de registro del contenedor heroes-api. El controlador selecciona "awsfirelens", la opción de registro "Nombre" se establece en "cloudwatch" y el complemento de CloudWatch Logs está habilitado. Otras configuraciones son las siguientes:

{
    "essential": true,
    "image": "888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest",
    "name": "heroes-api",
    "logConfiguration": {
       "logDriver": "awsfirelens",
       "options": {
         "Name": "cloudwatch",
         "region": "cn-north-1",
         "log_group_name": "/ecs/heroes-api",
         "log_stream_prefix": "from-fluent-bit",
         "auto_create_group": "true"
       }
    }
}

[AWS Call for Papers] ECS facilita la orquestación de contenedores

Una vez modificada la tarea, haga clic en "Crear" para guardar la definición de la tarea.

Regrese a la consola del clúster, seleccione el servicio que creamos, haga clic en "Actualizar", luego seleccione la última definición de tarea, seleccione "Aplicar una nueva implementación" y guarde el servicio paso a paso.

Después de que la actualización del servicio sea exitosa, se creará una nueva tarea y se ingresará a la consola de Cloud Watch para ver el registro. El formato del registro es el siguiente:

{
    "container_id": "cda4f603d8e485d48fd7e1a77b3737026221c165b8f6d582ed78bd947a12b911",
    "container_name": "/ecs-heroes-2-heroes-api-c2f3d4a8bdbcf3f9e601",
    "ecs_cluster": "arn:aws-cn:ecs:cn-north-1:888888888888:cluster/isd",
    "ecs_task_arn": "arn:aws-cn:ecs:cn-north-1:888888888888:task/078dd364-28b6-4650-b294-5eac6b39d08f",
    "ecs_task_definition": "heroes:2",
    "log": " /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\",
    "source": "stdout"
}

Como puede ver, se han agregado nuevos campos de identificación al registro: container_id, container_name, ecs_cluster, ecs_task_arn, ecs_task_definition y source.

Durante la definición de la tarea, haga clic en "Configurar mediante JSON" y establezca la opción de fluentbit enable-ecs-log-metadata en false para deshabilitar los tres metadatos de ecs anteriores:

"firelensConfiguration": {
    "type": "fluentbit",
    "options": {
        "enable-ecs-log-metadata": "false"
    }
}

En la configuración de registro del contenedor, la opción log_key se agrega solo para reenviar elementos de registro:

"log_key": "log"

Opciones admitidas por el complemento CloudWatch Logs:

  • región: región de AWS
  • log_group_name: nombre del grupo de registros de CloudWatch
  • log_stream_name: nombre de la secuencia de registro de CloudWatch
  • log_stream_prefix: el prefijo del nombre del flujo de registro, incompatible con la opción log_stream_name
  • log_key: de forma predeterminada, el registro de registro completo se envía a CloudWatch. Si se especifica el nombre de la clave, solo los elementos especificados se envían a CloudWatch
  • log_format: formato de registro
  • auto_create_group: crea automáticamente un grupo de registros, el valor predeterminado es falso

Reenviar registros a Amazon Kinesis Data Firehose

Opciones admitidas por el complemento Kinesis Data Firehose:

  • región: región de AWS
  • delivery_stream: el nombre del flujo de entrega de Kinesis Data Firehose
  • data_keys: de forma predeterminada, el registro completo se envía a Kinesis. Si se especifican los nombres de las claves, solo los elementos especificados se envían a Kinesis. Varios nombres están separados por comas.

El flujo de entrega de Kinesis Data Firehose puede enviar registros a Amazon S3, Amazon Redshift y Amazon Elasticsearch Service.

Tomando S3 como ejemplo, primero creamos el flujo de transporte heroes-web-log en S3, y luego modificamos la configuración de registro del contenedor heroes-web. El controlador selecciona "awsfirelens", la opción de registro "Nombre" se establece en "firehose" y Kinesis está habilitado. Complemento Data Firehose, otras configuraciones son las siguientes:

{
    "essential": true,
    "image": "888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest",
    "name": "heroes-web",    
    "logConfiguration": {
      "logDriver":"awsfirelens",
      "options": {
        "Name": "firehose",
        "region": "cn-north-1",
        "delivery_stream": "heroes-web-log",
        "data_keys": "log"
      }
    },
    "memoryReservation": 100        
}

[AWS Call for Papers] ECS facilita la orquestación de contenedores

Después de guardar la definición de la tarea y actualizar el servicio, puede ir a S3 para ver el registro.

ECS frente a EKS

Amazon Elastic Kubernetes Service (Amazon EKS) es un servicio de Kubernetes totalmente administrado que ejecuta Kubernetes de código abierto para implementar, administrar y escalar aplicaciones en contenedores. EKS no necesita utilizar el plano de control de Kubernetes, lo que elimina la principal carga operativa de ejecutar Kubernetes, lo que le permite centrarse en la creación de aplicaciones en lugar de gestionar la infraestructura de AWS. EKS puede ejecutarse en varias zonas de disponibilidad de AWS, es compatible con Kubernetes, puede usar todos los complementos y herramientas existentes proporcionados por la comunidad de Kubernetes, y todas las aplicaciones que se ejecutan en el entorno estándar de Kubernetes se pueden migrar fácilmente a EKS.

Universal
ECS es una tecnología propiedad de AWS, mientras que EKS ejecuta Kubernetes de código abierto. Por lo tanto, si su entorno de implementación no se limita a AWS, por ejemplo, puede implementar en Google GKE (Google Kubernetes Engine), Microsoft AKS (Azure Kubernetes Service) o Kubernetes estándar, debe elegir EKS.

Simplicity
ECS es una solución lista para usar que se puede implementar fácilmente a través de la consola de AWS. EKS es un poco complicado, requiere más configuración y más experiencia.

Precio
ECS no cobra ninguna tarifa adicional y solo paga por los recursos informáticos utilizados por el contenedor. Los clústeres de EKS deben pagar 0,688 CNY por hora (puede usar el espacio de nombres de Kubernetes y las políticas de seguridad de IAM para usar un clúster de EKS para ejecutar múltiples aplicaciones), y los recursos de AWS usados ​​para ejecutar los nodos de trabajo de Kubernetes deben pagarse de acuerdo con el uso real.

Después de probar y comparar las tres soluciones de orquestación de contenedores de ECS, EKS y Kubernetes, elegí ECS en mi trabajo. ECS satisface completamente las necesidades del proyecto, facilitando la implementación, la operación y el mantenimiento y los costos.

Documentos de referencia

Servicio de contenedor elástico de Amazon 文档

Supongo que te gusta

Origin blog.51cto.com/7308310/2536584
Recomendado
Clasificación