Blog de Amazon Web Services (AWS)
Log centralizado para contenedores Windows en Amazon EKS utilizando Fluent Bit
Por Harsh Rawat, Software Engineer en Amazon Web Services e
Marcio Morales, Principal Solutions Architect en Amazon Web Services.
Intro
En noviembre de 2022, Amazon Web Services (AWS) anunció el soporte de imágenes de contenedores Fluent Bit para el sistema operativo Windows. Este soporte elimina la necesidad a los clientes que utilizan Windows de implementar una solución de logging personalizada en el código de la aplicación o de administrar agentes personalizados en sus nodos Windows para extraer los logs. Para obtener más información sobre las versiones compatibles de Windows y de las imágenes de Fluent Bit, consulta nuestra documentación aquí.
Fluent Bit es un procesador y enrutador de logs rápido y flexible. compatible con varios sistemas operativos. Se utiliza para enrutar los logs a varios destinos de AWS, como Amazon CloudWatch, Amazon Kinesis Data Firehose, Amazon Simple Storage Service (Amazon S3) y Amazon OpenSearch. Además de los destinos en AWS, Fluent Bit ofrece soporte a soluciones de terceros, como Datadog, Splunk, servidores HTTP personalizados y más. Para obtener más información sobre el enrutamiento de logs en contenedores, visite el enlace del blog aquí. AWS ya admite imágenes de contenedores de Fluent Bit basadas en el sistema operativo Linux y esta versión permite a los clientes disponer de un mecanismo centralizado para procesar y enrutar sus logs en Amazon Elastic Container Service ( Amazon ECS) y Amazon Elastic Kubernetes Service (Amazon EKS) para cargas de trabajo Linux y Windows.
En esta publicación, analizamos cómo los clientes de Amazon EKS pueden desplegar imágenes Windows de Fluent Bit como un DaemonSet en sus nodos Windows para enviar los logs de Internet Information Services (IIS) generados en los pods Windows a los logs de Amazon CloudWatch, como una forma de centralizar el registro de logs. Vamos a configurar Fluent Bit para que enrute todos los logs generados por los pods en diferentes namespaces a los respectivos grupos de logs de CloudWatch. Además, cada entrada de log se enriquecería con metadatos adicionales de Kubernetes, como el namespace, el nombre del pod, el nombre del contenedor, el nombre de la imagen, el nombre del host, etc. Para obtener más información sobre la implementación de Fluent Bit en el clúster de Amazon ECS Windows, visite nuestra entrada de blog aquí.
Prerrequisitos
Prerrequisitos y premisas:
- Amazon EKS Cluster (1.20 o posterior) instalado y en ejecución. Consulte esta guía paso a paso.
- Iniciar los nodos Windows de Amazon EKS. Consulte esta guía paso a paso.
- Instalación y configuración adecuada de la interfaz de línea de comandos de Amazon (AWS CLI), eksctl y kubectl.
- Para crear una imagen de contenedor Windows, inicie una instancia de Windows en Amazon Elastic Compute Cloud (Amazon EC2) con Docker instalado, que se basa en la misma versión de Windows que nodos de Amazon EKS. Como alternativa, también puede utilizar Amazon EC2 Image Builder para crear la imagen del contenedor.
- Crear el repositorio Amazon Elastic Container Registry (Amazon ECR) para alojar la imagen del contenedor Windows. Consulte este tutorial paso a paso.
Descripción general de la solución
En este blog, realizaremos las siguientes tareas:
- Verificar que los nodos Windows estén funcionando.
- Crear el namespace de Kubernetes Amazon-CloudWatch, donde se ejecutará Fluent Bit.
- Configurar las políticas de AWS Identity and Access Management (AWS IAM) necesarias para permitir que Fluent Bit envíe los logs a los destinos requeridos.
- Crear un config map con la configuración necesaria.
- [Opcional] Crear una imagen de contenedor Windows que contenga IIS y LogMonitor.
- Implementar FluentBit en el nodo de trabajo Windows como un DaemonSet.
- Implementar una imagen de Windows en un contenedore que contenga IIS y LogMonitor.
- [Opcional] Acceder a los pods de IIS para generar los logs.
- Comprobar los logs en Amazon CloudWatch.
- Eliminar los recursos creados.
Puede esperar el siguiente resultado:
Como puede ver, tenemos dos nodos con Windows Server 2019 basados en la versión 1.23 de Amazon EKS, que utilizan el entorno de ejecución (runtime) docker y containerd respectivamente .
2. Crear el namespace de Kubernetes Amazon-CloudWatch, donde se ejecutará Fluent Bit.
Los namespaces, o espacios de nombres de Kubernetes, proporcionan un medio para organizar las carga de trabajo dentro del clúster. Para consolidar todas las funciones de Fluent Bit, crearemos un namespace
llamado amazon-cloudwatch.
2.1 Cree un archivo con el siguiente contenido y asígnele el nombrenamespace.yaml
:
2.2 Ejecute el siguiente comando para crear el namespace:
3. Configurar las políticas de IAM necesarias para permitir que Fluent Bit envíe los logs a los destinos requeridos
Fluent Bit requiere permisos de IAM específicos para enviar los logs a los destinos en AWS. Los permisos necesarios para un plug-in de salida de Fluent Bit se mencionan en la documentación de Fluent Bit para este tema específico. Por ejemplo, vamos a utilizar Amazon CloudWatch como destino de para los logs. Se aplica el siguiente permiso de IAM:
También puedes consultar detalles adicionales en la documentación oficial de Fluent Bit.
Siguiendo el principio del menor privilegio, en lugar de crear y distribuir sus credenciales de AWS para los contenedores o utilizar el instance role de Amazon EC2, puede utilizar los roles de IAM para cuentas de servicio, o IAM Roles for Service Accounts (IRSA), y configurar sus pods para que usen la cuenta de servicio de Kubernetes. Para obtener más información, consulte la documentación aquí.
Como alternativa, Fluent Bit puede usar los permisos del rol de IAM adjuntos a la instancia de Amazon EC2. Para obtener más información sobre cómo adjuntar políticas de IAM específicas al crear nodegroups mediante eksctl, consulte la documentación del schema aquí. También puede adjuntar políticas de IAM después de que el nodegroup se haya creado. Consulte la documentación aquí.
3.1 Para configurar los roles de IAM para las cuentas de servicio (es decir, IRSA) en Amazon EKS, necesitamos asociar un proveedor IAM OpenID Connect (OIDC) al clúster de Amazon EKS. Compruebe que su clúster de Amazon EKS tiene un proveedor de IAM OIDC existente mediante la ejecución del siguiente comando:
3.2 Si necesita crear un proveedor IAM OIDC, ejecute el siguiente comando:
3.3 Cree un archivo llamado fluent-bit-policy.json
con la política mencionada anteriormente. Ejecute el siguiente comando para crear la política de IAM.
3.4 Cree la cuenta de servicio IAM y adjunte la política creada anteriormente.
Ejecute el siguiente comando para crear una cuenta de servicio IAM medianteeksctl
:
Para realizar la misma configuración mediante el CLI de AWS, consulte la documentación aquí.
4. Crear un config map con la configuración necesaria
Necesitamos proporcionar algunos detalles a Fluent Bit para su configuración. Esto incluye el nombre y la región del clúster. Podemos hacerlo mediante Config Maps.
4.1 Ejecute el siguiente comando para crear un config map que proporcione las opciones de configuración a Fluent Bit:
De forma predeterminada, Fluent Bit lee los archivos de registro desde la cola y solo captura los registros nuevos después de la implementación. Si desea lo contrario, defina FluentBitReadFromHead=’ON’ y recopilará todos los registros del sistema de archivos.
5. [Opcional] Crear una imagen de contenedor Windows que contenga IIS y LogMonitor
Si ya tienes una imagen de contenedor Windows para tu aplicación, no dudes en saltarte esta sección.
5.1 Para probar la funcionalidad explicada en esta publicación, creamos una imagen de contenedor Windows que contenga IIS y LogMonitor. De forma predeterminada, los contenedores Windows envían logs al Event Tracing de Windows (ETW), al Event Log y a los registros de logs personalizados. Sin embargo, los procesadores de logs como Fluent Bit y fluentd, buscan logs de contenedores en el pipeline STDOUT que no existe en los contenedores Windows. LogMonitor es un plug-in open source creado por Microsoft para crear un pipeline STDOUT dentro del contenedor Windows, de modo que estas herramientas puedan buscar los logs correctamente tal como lo hacen en un entorno Linux.
Para obtener más instrucciones sobre cómo usar LogMonitor, visita el repositorio oficial de GitHub o la entrada del blog de Microsoft al respecto.
En el siguiente ejemplo tenemos un Dockerfile que crea una imagen de contenedor Windows que contiene IIS y LogMonitor.
Este ejemplo de configuración de LogMonitorConfig recupera todos los archivos de log con la extensión.log guardados en C:\inetpub\logs y sus subdirectorios, incluidos los registros de acceso a IIS.
Cuando la compilación finalice, suba la imagen a su registro de Amazon ECR.
6. Implementar Fluent Bit en los nodos (worker nodes) Windows como un DaemonSet
Un DaemonSet
garantiza que todos (o algunos de) los nodos ejecuten una copia de un pod. A medida que se agregan nodos al clúster, también se les agregan los pods. Para asegurarnos de que todos los nodos Windows tengan una copia del pod de Windows Fluent Bit, implementamos un DaemonSet
mediante el archivo de implementación que se especifica en los siguientes pasos.
6.1 Copia el siguiente manifiesto en un archivo llamado fluent-bit-daemon-set.yaml
.
Según la configuración anterior, el Fluent Bit debería:
- Utilizar el plugin tail output para buscar nuevas entradas en los logs que se adjunten a los archivos de logs específicos del contenedor, gestionados por el motor de ejecución del contenedor.
- Utilizar el Kubernetes Fluent Bit filter para añadir metadatos adicionales a cada entrada del log. Esto se hace consultando el servidor Kube-API.
- Utilizar el grupo de logs de Amazon CloudWatch, que contiene
default
al final del nombre, para enviar los logs de las aplicaciones de los pods que se ejecutan en el namespacedefault
de Kubernetes. - Utilizar el grupo de logs de Amazon CloudWatch, que contiene
amazon-cloudwatch
al final del nombre, para enviar los logs generados por los pods de Fluent Bit que se ejecutan en el namespaceamazon-cloudwatch
de Kubernetes.
La etiqueta o tag en cada entrada de registro tiene el formato application.C.var.log.container.<POD_NAME>_<NAMESPACE_NAME>_<CONTAINER_NAME>-<DOCKER_ID>
. En el ejemplo de configuración de Fluent Bit anterior, enrutamos los logs en función de namspaces utilizando regex en la configuración de Match para los plug-ins de salida. Para obtener más información sobre cómo se puede configurar Fluent Bit para usar Tag y Match, consulte la documentación aquí.
También puede consultar nuestra documentación aquí para obtener instrucciones sobre cómo personalizar su Log Group o Stream de Amazon CloudWatch con metadatos de Kubernetes.
Nota: En esta publicación, configuramos el filtro de Kubernetes para usar el servidor de Kube-API en lugar del endpoint kubelet para consultar metadatos adicionales. Esto se debe a que kubelet en Windows se ejecuta en el host network namespace, mientras que Fluent Bit se ejecuta en la red de contenedores. Podemos utilizar el endpoint o punto de acceso al kubelet si los pods de Fluent Bit se lanzan como pods de tipoHostProcess.
6.2 Implemente este manifiesto mediante el siguiente comando:
7. Implementar una imagen de Windows en un contenedore que contenga IIS y LogMonitor
En este paso, implementaremos los pods Windows en los nodos Windows.
7.1 Cree un archivo de despliegue denominado windows_manifest.yaml
con el siguiente contenido:
7.2 Implemente el manifiesto mediante el siguiente comando:
8. [Opcional] Acceder a los pods de IIS para generar registros
Este es un paso opcional. Puede esperar que el tráfico real llegue al pod Windows que aloja el servidor web con IIS (Internet Information Services). Como alternativa, puedes entrar en tu contenedor y forzar los logs.
8.1 Ejecute el siguiente comando para iniciar sesión en su contenedor:
8.2 Desde el contenedor, ejecute el siguiente comando para acceder al servidor web:
9. Comprobar los logs en Amazon CloudWatch
En este paso, iniciamos sesión en la consola de Amazon CloudWatch y observamos los logs que se generaron. Puede acceder a la consola de Amazon CloudWatch a través del enlace que aparece aquí. Acceda a la consola de Log Group desde el panel lateral a través de Logs/Log Groups .
Puede esperar log groups con el nombre:
/aws/containerinsights/<CLUSTER_NAME>/default
/aws/containerinsights/<CLUSTER_NAME>/amazon-cloudwatch
Cada log group debe contener los logs de los pods implementados en los respectivos namespaces de Kubernetes.
Limpieza
Cuando termines el tutorial de esta publicación, borra los recursos asociados a él para evitar cargos por las funciones que no utilices:
- Eliminar la implementación de Windows
Eliminar el FluentBit DaemonSet
- Eliminar los log groups creados por Fluent Bit
Conclusión
En esta publicación, le mostramos cómo implementar Fluent Bit como DaemonSet
en los nodos Windows de Amazon EKS.
El uso de FluentBit como enrutador de logs es una forma efectiva de centralizar los logs en las cargas de trabajo de Amazon EKS para Linux y Windows. Fluent Bit puede enviar los logs a varias soluciones de destino, lo que proporciona flexibilidad a los clientes.
Este artículo fue traducido del Blog da AWS em Inglés.
Acerca de los autores
Harsh Rawat es ingeniero de software en Amazon Web Services.
Marcio Morales es Principal Solutions Architect en Amazon Web Services. Marcio es SME global en contenedores Windows y ayuda a los clientes de AWS a diseñar, crear, proteger y optimizar cargas de trabajo basadas en contenedores Windows en AWS.
Revisor
Borja Prado es Senior Solutions Architect en AWS, especializado en tecnologías Microsoft. Trabaja ayudando a nuestros clientes en la migración, despliegue y modernización de cargas de trabajo Windows en AWS. Además, está especializado en el diseño y arquitectura de soluciones escalables con .NET y es SME en Sitecore.