Inicio del registro de AWS Fargate para un clúster - Amazon EKS

Ayude a mejorar esta página

¿Quiere contribuir a esta guía del usuario? Desplácese hasta el final de esta página y seleccione Editar esta página en GitHub. Sus contribuciones ayudarán a que nuestra guía del usuario sea mejor para todos.

Inicio del registro de AWS Fargate para un clúster

importante

AWS Fargate con Amazon EKS no está disponible en AWS GovCloud (Este de EE. UU.) y AWS GovCloud (Oeste de EE. UU.).

Amazon EKS en Fargate ofrece un enrutador de registros integrado basado en Fluent Bit. Esto significa que no ejecuta explícitamente un contenedor de Fluent Bit como archivo sidecar, sino que Amazon lo ejecuta por usted. Todo lo que tiene que hacer es configurar el enrutador de registros. La configuración se realiza a través de un ConfigMap dedicado que debe cumplir los siguientes criterios:

  • Tener un aws-logging con nombre.

  • Haber sido creado en un espacio de nombres dedicado llamado aws-observability.

  • No puede superar los 5300 caracteres.

Una vez que haya creado ConfigMap, Amazon EKS en Fargate lo detecta automáticamente y configura el enrutador de registros con él. Fargate utiliza una versión de AWS para Fluent Bit, una distribución conforme del cliente al servidor de Fluent Bit administrada por AWS. Para obtener más información, consulte AWS para Fluent Bit en GitHub.

El enrutador de registros le permite utilizar la amplia gama de servicios de AWS para el análisis y el almacenamiento de registros. Puede transmitir registros desde Fargate directamente a Amazon CloudWatch, Amazon OpenSearch Service. También puede transmitir registros a destinos como Amazon S3, Amazon Kinesis Data Streams y herramientas de socios a través de Amazon Data Firehose.

Requisitos previos

Configuración del enrutador de registros

Configurar el enrutador de registros

En los pasos siguientes, reemplace cada example value por valores propios.

  1. Cree un espacio de nombres Kubernetes dedicado denominado aws-observability.

    1. Guarde el siguiente contenido en un archivo llamado aws-observability-namespace.yaml en el equipo. El valor de name debe ser aws-observability y la etiqueta aws-observability: enabled es obligatoria.

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. Cree el espacio de nombres.

      kubectl apply -f aws-observability-namespace.yaml
  2. Cree un ConfigMap con un valor de datos de Fluent Conf para enviar los registros de contenedores a un destino.. Fluent Conf es Fluent Bit, que es un lenguaje de configuración del procesador de registros rápido y ligero que se utiliza para dirigir los registros del contenedor a un destino de registro de su elección. Para obtener más información, consulte Archivo de configuración en la documentación de Fluent Bit.

    importante

    En un Fluent Conf típico, las secciones principales incluidas son Service, Input, Filter y Output. Sin embargo, el enrutador de registros de Fargate solo acepta:

    • Las secciones Filter y Output.

    • Una sección Parser.

    Si proporciona otras secciones, se rechazarán.

    El enrutador de registros de Fargate administra las secciones Service e Input. Tiene la siguiente sección Input, la cual no se puede modificar y no es necesaria en su ConfigMap. Sin embargo, puede obtener información a partir de ella, como el límite del búfer de memoria y la etiqueta aplicada a los registros.

    [INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*

    Al crear el ConfigMap, debe tener en cuenta las siguientes reglas que Fargate utiliza para validar campos:

    • Se supone que [FILTER], [OUTPUT] y [PARSER] deben especificarse en cada clave correspondiente. Por ejemplo, [FILTER] debe estar en filters.conf. Puede tener uno o más [FILTER] en filters.conf. Las secciones [OUTPUT] y [PARSER] también deben estar en sus claves correspondientes. Mediante la especificación de varias secciones [OUTPUT], puede dirigir sus registros a diferentes destinos al mismo tiempo.

    • Fargate valida las claves requeridas para cada sección. Name y match son necesarias para cada [FILTER] y [OUTPUT]. Name y format son necesarias para cada [PARSER]. Las claves distinguen entre mayúsculas y minúsculas.

    • Las variables de entorno como ${ENV_VAR} no se permiten en ConfigMap.

    • La sangría tiene que ser la misma para la política o el par clave-valor dentro de cada filters.conf, output.conf y parsers.conf. Los pares clave-valor deben tener más sangría que las políticas.

    • Fargate valida con los siguientes filtros compatibles: grep, parser, record_modifier, rewrite_tag, throttle, nest, modify y kubernetes.

    • Fargate verifica las siguientes salidas compatibles: es, firehose, kinesis_firehose, cloudwatch, cloudwatch_logs y kinesis.

    • Tiene que proporcionarse al menos un complemento de Output compatible en el ConfigMap a fin de habilitar el registro. Filter y Parser no son necesarios para habilitar el registro.

    También puede ejecutar Fluent Bit en Amazon EC2 con la configuración deseada para solucionar cualquier problema que surja de la validación. Cree su ConfigMap con uno de los siguientes ejemplos.

    importante

    El registro de Fargate de Amazon EKS no admite la configuración dinámica del ConfigMaps. Cualquier cambio en ConfigMaps solo se aplica a los Pods nuevos. Los cambios no se aplican a los Pods existentes.

    Cree un ConfigMap con el ejemplo para el destino de registro deseado.

    nota

    También puede utilizar Amazon Kinesis Data Streams como destino para su registro. Si usa Kinesis Data Streams, asegúrese de que la función de ejecución del pod tenga otorgado el permiso kinesis:PutRecords. Para obtener más información, consulte Permisos de Amazon Kinesis Data Streams en Fluent Bit: Manual oficial.

    CloudWatch

    Para crear un ConfigMap para CloudWatch

    Tiene dos opciones de salida al utilizar CloudWatch:

    En el siguiente ejemplo se muestra cómo utilizar el complemento de cloudwatch_logs para enviar registros a CloudWatch.

    1. Guarde los siguientes contenidos en un archivo llamado aws-logging-cloudwatch-configmap.yaml. Reemplace region-code por la Región de AWS en la que se encuentra el clúster. Se requieren los parámetros en [OUTPUT].

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: flb_log_cw: "false" # Set to true to ship Fluent Bit process logs to CloudWatch. filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off Buffer_Size 0 Kube_Meta_Cache_TTL 300s output.conf: | [OUTPUT] Name cloudwatch_logs Match kube.* region region-code log_group_name my-logs log_stream_prefix from-fluent-bit- log_retention_days 60 auto_create_group true parsers.conf: | [PARSER] Name crio Format Regex Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$ Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L%z
    2. Aplique el manifiesto al clúster.

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. Descargue la política de IAM de CloudWatch en su equipo. También puede ver la política en GitHub.

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
    Amazon OpenSearch Service

    Para crear un ConfigMap de Amazon OpenSearch Service

    Si desea enviar registros a Amazon OpenSearch Service, puede utilizar salida es, que es un complemento escrito en C. En el siguiente ejemplo se muestra cómo utilizar el complemento para enviar registros a OpenSearch.

    1. Guarde los siguientes contenidos en un archivo llamado aws-logging-opensearch-configmap.yaml. Sustituya cada example value con valores propios.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. Aplique el manifiesto al clúster.

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. Descargue la política de IAM de OpenSearch en su ordenador. También puede ver la política en GitHub.

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json

      Asegúrese de que el control de acceso de OpenSearch Dashboards esté configurado correctamente. El all_access role en OpenSearch Dashboards debe tener el rol de ejecución de Pod de Fargate y el rol de IAM asignados. Se debe hacer el mismo mapeo para el rol de security_manager. Puede agregar los mapeos anteriores al seleccionar Menu, Security y Roles y, a continuación, seleccionar los roles respectivos. Para obtener más información, consulte ¿Cómo puedo solucionar los problemas de CloudWatch Logs para que transmita a mi dominio de Amazon ES?.

    Firehose

    Para crear una ConfigMap para Firehose

    Tiene dos opciones de salida al enviar registros a Firehose:

    En el siguiente ejemplo se muestra cómo utilizar el complemento de kinesis_firehose para enviar registros a Firehose.

    1. Guarde los siguientes contenidos en un archivo llamado aws-logging-firehose-configmap.yaml. Reemplace region-code por la Región de AWS en la que se encuentra el clúster.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
    2. Aplique el manifiesto al clúster.

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. Descargue la política de IAM de Firehose en su ordenador. También puede ver la política en GitHub.

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. Cree una política de IAM a partir del archivo de política que descargó en el paso anterior.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. Adjunte la política de IAM al rol de ejecución de pods especificado para el perfil de Fargate con el siguiente comando. Reemplace 111122223333 por su ID de cuenta. Reemplace AmazonEKSFargatePodExecutionRole por el rol de ejecución de Pod (para obtener más información, consulte Paso 2: cree un rol de ejecución de Pod de Fargate).

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name AmazonEKSFargatePodExecutionRole

Compatibilidad de filtro de Kubernetes

Esta característica requiere la siguiente versión mínima de Kubernetes y nivel de plataforma, o posterior.

Versión de Kubernetes Nivel de plataforma
1.23 y posterior eks.1

El filtro Fluent Bit Kubernetes le permite agregar metadatos de Kubernetes a los archivos de registro. Para obtener más información acerca del filtro, consulte Kubernetes en la documentación de Fluent Bit. Puede aplicar un filtro mediante el punto de conexión del servidor de la API.

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
importante
  • Kube_URL, Kube_CA_File, Kube_Token_Command y Kube_Token_File son parámetros de configuración propiedad del servicio y no deben especificarse. Amazon EKS Fargate completa estos valores.

  • Kube_Meta_Cache_TTL es el tiempo que Fluent Bit espera hasta que se comunica con el servidor de la API para obtener los metadatos más recientes. Si Kube_Meta_Cache_TTL no se especifica, Amazon EKS Fargate agrega un valor predeterminado de 30 minutos para reducir la carga en el servidor de la API.

Para enviar registros de procesos de Fluent Bit a su cuenta

Puede enviar opcionalmente registros de procesos de Fluent Bit a Amazon CloudWatch mediante el siguiente ConfigMap. El envío de registros de procesos de Fluent Bit a CloudWatch requiere costos adicionales de ingesta y almacenamiento de registros. Reemplace region-code por la Región de AWS en la que se encuentra el clúster.

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

Los registros se encuentran en la Región de AWS en la que reside el clúster en CloudWatch. El nombre del grupo de registros es my-cluster-fluent-bit-logs y el nombre del flujo de registros de Fluent Bit es fluent-bit-podname-pod-namespace.

nota
  • Los registros de proceso se envían solo cuando el proceso de Fluent Bit se inicia de forma correcta. Si se produce un error al iniciar Fluent Bit, se pierden los registros del proceso. Solo puede enviar los registros del proceso a CloudWatch.

  • Para depurar los registros del proceso de envío en la cuenta, puede aplicar el ConfigMap anterior para obtener los registros del proceso. El hecho de que Fluent Bit no pueda iniciar suele deberse a que su ConfigMap no ha sido analizado ni aceptado por Fluent Bit durante el inicio.

Para detener el envío de registros de procesos de Fluent Bit

El envío de registros de procesos de Fluent Bit a CloudWatch requiere costos adicionales de ingesta y almacenamiento de registros. Para excluir los registros de procesos de una configuración de ConfigMap existente, siga estos pasos.

  1. Busque el grupo de registros de CloudWatch creado automáticamente para los registros de procesos de Fluent Bit del clúster de Amazon EKS después de habilitar el registro de Fargate. Sigue el formato {cluster_name}-fluent-bit-logs.

  2. Elimine los flujos de registro de CloudWatch existentes creados para los registros de procesos de cada Pod's en el grupo de registros de CloudWatch.

  3. Edite el ConfigMap y configure flb_log_cw: "false".

  4. Reinicie todos los Pods existentes en el clúster.

Probar la aplicación

  1. Implemente un Pod de ejemplo.

    1. Guarde el siguiente contenido en un archivo llamado sample-app.yaml en el equipo.

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. Aplique el manifiesto al clúster.

      kubectl apply -f sample-app.yaml
  2. Vea los registros NGINX con los destinos que configuró en el ConfigMap.

Consideraciones sobre el tamaño

Le sugerimos que planee utilizar hasta 50 MB de memoria para el enrutador de registros. Si anticipa que su aplicación generará registros con un rendimiento muy alto, entonces debe planificar utilizar hasta 100 MB.

Resolución de problemas

Para confirmar si la característica de registro está habilitada o deshabilitada por algún motivo, como un ConfigMap que no es válido y desea saber por qué no es válido, verifique los eventos de Pod con kubectl describe pod pod_name. La salida puede incluir eventos del Pod que aclaran si el registro está habilitado o no, como la siguiente salida de ejemplo.

[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Los eventos de Pod son efímeros con un periodo de tiempo en función de la configuración. También puede ver los comentarios de un Pod's con kubectl describe pod pod-name. En el comentario del Pod, hay información sobre si la característica de registro está habilitada o deshabilitada y el motivo.