Configure Fluent Bit como DaemonSet para enviar registros a CloudWatch Logs - Amazon CloudWatch

Configure Fluent Bit como DaemonSet para enviar registros a CloudWatch Logs

Las siguientes secciones le ayudan a implementar Fluent Bit para enviar registros desde contenedores a CloudWatch Logs.

Diferencias en caso de que ya está usando Fluentd

Si ya está utilizando Fluentd para enviar registros desde contenedores a CloudWatch Logs, lea esta sección para ver las diferencias entre Fluentd y Fluent Bit. Si aún no está utilizando Fluentd con Información de contenedores de, puede saltar a Configuración de Fluent Bit.

Se le proporcionan dos configuraciones predeterminadas para Fluent Bit:

  • Configuración optimizada de Fluent Bit: una configuración alineada con las mejores prácticas de Fluent Bit.

  • Configuración compatible con Fluentd: una configuración que está alineada con el comportamiento de Fluentd tanto como sea posible.

En la siguiente lista se explican detalladamente las diferencias entre Fluentd y cada configuración de Fluent Bit.

  • Diferencias en los nombres de flujo de registro: si utiliza la configuración optimizada de Fluent Bit, los nombres de flujo de registro serán diferentes.

    Bajo el título /aws/containerinsights/Cluster_Name/application

    • La configuración optimizada de Fluent Bit envía registros a kubernetes-nodeName-application.var.log.containers.kubernetes-podName_kubernetes-namespace_kubernetes-container-name-kubernetes-containerID

    • Fluentd envía registros a kubernetes-podName_kubernetes-namespace_kubernetes-containerName_kubernetes-containerID

    Bajo el título /aws/containerinsights/Cluster_Name/host

    • La configuración optimizada de Fluent Bit envía registros a kubernetes-nodeName.host-log-file

    • Fluentd envía registros a host-log-file-Kubernetes-NodePrivateIp

    Bajo el título /aws/containerinsights/Cluster_Name/dataplane

    • La configuración optimizada de Fluent Bit envía registros a kubernetes-nodeName.dataplaneServiceLog

    • Fluentd envía registros a dataplaneServiceLog-Kubernetes-nodeName

  • Los archivos de registros kube-proxy y aws-node que Información de contenedores de ingresa se encuentran en diferentes ubicaciones. En la configuración de Fluentd, se encuentran en /aws/containerinsights/Cluster_Name/application. En la configuración optimizada de Fluent Bit, se encuentran en /aws/containerinsights/Cluster_Name/dataplane.

  • La mayoría de los metadatos, como pod_name y namespace_name son los mismos en Fluent Bit y Fluentd, pero los siguientes son diferentes.

    • La configuración optimizada de Fluent Bit utiliza docker_id y el uso de Fluentd Docker.container_id.

    • Ambas configuraciones de Bit Fluent no utilizan los siguientes metadatos. Están presentes sólo en Fluentd: container_image_id, master_url, namespace_id, y namespace_labels.

Configuración de Fluent Bit

Para configurar Fluent Bit para recopilar registros de los contenedores, puede seguir los pasos de Configuración de inicio rápido para Información de contenedores en Amazon EKS y Kubernetes o puede seguir los pasos de esta sección.

Con cualquiera de los métodos, el rol de IAM que está adjunto a los nodos del clúster debe tener permisos suficientes. Para obtener más información sobre los permisos necesarios para ejecutar un clúster de Amazon EKS, consulte Amazon EKS IAM Policies, Roles, and Permissions (Permisos, roles y políticas de IAM de Amazon EKS) en la Guía del usuario de Amazon EKS.

En los pasos que se describen a continuación, va a configurar Fluent Bit como DaemonSet para enviar registros a CloudWatch Logs. Cuando se completa este paso, Fluent Bit crea los siguientes grupos de registros si todavía no existen.

importante

Si ya tiene Fluentd configurado en Información de contenedores y el DaemonSet de Fluentd no funciona según lo esperado (esto puede ocurrir si utiliza el tiempo de ejecución containerd), debe desinstalarlo antes de instalar FluentBit para evitar que Fluentd procese los mensajes de registro de errores de Fluentd. De lo contrario, debe desinstalar Fluentd inmediatamente después de haber instalado FluentBit correctamente. Desinstalar Fluentd después de instalar Fluent Bit garantiza la ontinuidad del registro durante este proceso de migración. Solo se necesita uno de Fluent Bit o Fluentd para enviar registros a registros de CloudWatch.

Nombre de grupo de registro Fuente de registros

/aws/containerinsights/Cluster_Name/application

Todos los archivos de registros de /var/log/containers

/aws/containerinsights/Cluster_Name/host

Archivos de registros de /var/log/dmesg, /var/log/secure y /var/log/messages

/aws/containerinsights/Cluster_Name/dataplane

Los registros en /var/log/journal para kubelet.service, kubeproxy.service y docker.service.

Para instalar Fluent Bit con el fin de enviar registros desde contenedores a CloudWatch Logs
  1. Si aún no tiene un espacio de nombres llamado amazon-cloudwatch, cree uno con el siguiente comando:

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  2. Ejecute el siguiente comando para crear un ConfigMap denominado cluster-info con el nombre del clúster y la Región a la que se enviarán los registros. Sustituya cluster-name y cluster-region por el nombre y la Región del clúster.

    ClusterName=cluster-name RegionName=cluster-region FluentBitHttpPort='2020' FluentBitReadFromHead='Off' [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On' [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On' kubectl create configmap fluent-bit-cluster-info \ --from-literal=cluster.name=${ClusterName} \ --from-literal=http.server=${FluentBitHttpServer} \ --from-literal=http.port=${FluentBitHttpPort} \ --from-literal=read.head=${FluentBitReadFromHead} \ --from-literal=read.tail=${FluentBitReadFromTail} \ --from-literal=logs.region=${RegionName} -n amazon-cloudwatch

    En este comando, FluentBitHttpServer para supervisar las métricas del complemento está activado de forma predeterminada. Para desactivarlo, cambie la tercera línea del comando a FluentBitHttpPort='' (cadena vacía) en el comando.

    Además, de forma predeterminada, Fluent Bit lee los archivos de registro en cola y capturará solo los registros nuevos después de implementarlos. Si desea lo contrario, establezca FluentBitReadFromHead='On' y recopilará todos los registros en el sistema de archivos.

  3. Descargue e implemente el daemonSet de Fluent Bit en el clúster con uno de los siguientes comandos.

    • Si desea la configuración optimizada de Fluent Bit para computadoras con Linux, ejecute este comando.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
    • Si desea la configuración optimizada de Fluent Bit para computadoras con Windows, ejecute este comando.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-windows.yaml
    • Si utiliza computadoras con Linux y desea la configuración de Fluent Bit que sea más similar a Fluentd, ejecute este comando.

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
    importante

    De forma predeterminada, la configuración daemonset de Fluent Bit establece el nivel de registro en INFO, lo que puede generar mayores costes de ingesta de registros de CloudWatch. Si quiere reducir el volumen y los costes de la ingesta de registros, puede cambiar el nivel de registro a ERROR.

    Para obtener más información acerca de cómo reducir el volumen del registro, consulte (Opcional) Reducción del volumen de registros del Fluent Bit

  4. Especifique el siguiente comando para validar la implementación. Cada nodo debe tener un pod denominado fluent-bit-*.

    kubectl get pods -n amazon-cloudwatch

Los pasos anteriores crean los siguientes recursos en el clúster:

  • Una cuenta de servicio denominada Fluent-Bit en el espacio de nombres amazon-cloudwatch. Esta cuenta de servicio se utiliza para ejecutar el DaemonSet de FluentD. Para obtener más información, consulte Managing Service Accounts en la documentación de Kubernetes.

  • Un rol de clúster denominado Fluent-Bit-role en el espacio de nombres amazon-cloudwatch. Este rol de clúster concede los permisos get, list y watch para los registros de los pods a la cuenta de servicio Fluent-Bit. Para obtener información, consulte API Overview en la documentación de Kubernetes.

  • Un ConfigMap denominado Fluent-Bit-config en el espacio de nombres amazon-cloudwatch. Este ConfigMap contiene la configuración que va a utilizar Fluent Bit. Para obtener más información, consulte Configure a Pod to Use a ConfigMap en la documentación de tareas de Kubernetes.

Si desea verificar la configuración de Fluent Bit, siga estos pasos.

Verifique la configuración de Fluent Bit
  1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.

  2. En el panel de navegación, seleccione Grupos de registro.

  3. Asegúrese de que está en la Región donde ha implementado Fluent Bit.

  4. Verifique la lista de los grupos de registros de la Región. Debería ver lo siguiente:

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

  5. Desplácese a uno de estos grupos de registro y verifique la Last Event Time (Hora del último evento) para los flujos de registro. Si es reciente en relación con el momento en el que implementó Fluent Bit, se verifica la configuración.

    Puede haber un ligero retraso en la creación del grupo de registro de /dataplane. Esto es normal, ya que estos grupos de registro sólo se crean cuando el Fluent Bit comienza a enviar registros para ese grupo de registros.

Compatibilidad con registros de varias líneas

Para obtener información sobre cómo usar Fluent Bit con registros de varias líneas, consulte las siguientes secciones de la documentación de Fluent Bit:

(Opcional) Reducción del volumen de registros del Fluent Bit

De forma predeterminada, se envían registros de aplicaciones de Fluent Bit y metadatos de Kubernetes a CloudWatch. Si desea reducir el volumen de datos que se envía a CloudWatch, puede detener el envío de uno o ambos de estos orígenes de datos a CloudWatch. Si siguió los pasos de esta página para configurar Fluent Bit, descargue el archivo YAML del manifiesto de Kubernetes desde el comando kubectl apply que ejecutó anteriormente y modifíquelo con sus cambios, los cuales podrá volver a aplicar en su clúster. Como alternativa, si utiliza el complemento de observabilidad de EKS de Amazon CloudWatch o el gráfico de Helm, consulte Configuraciones adicionales (Opcional) para acceder a información sobre la administración de la configuración de Fluent Bit con la configuración avanzada del complemento o el gráfico de Helm.

Para detener los registros de aplicaciones de Fluent Bit, elimine la siguiente sección del archivo Fluent Bit configuration.

[INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

Para evitar que los metadatos de Kubernetes se agreguen a los eventos de registro que se envían a CloudWatch, incluya los siguientes filtros en la sección application-log.conf en la configuración de Fluent Bit. Sustituya <Metadata_1> y los campos similares por los identificadores de metadatos reales.

application-log.conf: | [FILTER] Name nest Match application.* Operation lift Nested_under kubernetes Add_prefix Kube. [FILTER] Name modify Match application.* Remove Kube.<Metadata_1> Remove Kube.<Metadata_2> Remove Kube.<Metadata_3> [FILTER] Name nest Match application.* Operation nest Wildcard Kube.* Nested_under kubernetes Remove_prefix Kube.

Resolución de problemas

Si no ve estos grupos de registros y está mirando en la Región correcta, verifique los registros de los pods del DaemonSet de Fluent Bit para buscar el error.

Ejecute el siguiente comando y asegúrese de que el estado es Running.

kubectl get pods -n amazon-cloudwatch

Si los registros tienen errores relacionados con los permisos de IAM, consulte el rol de IAM que está adjunto a los nodos del clúster. Para obtener más información sobre los permisos necesarios para ejecutar un clúster de Amazon EKS, consulte Amazon EKS IAM Policies, Roles, and Permissions (Permisos, roles y políticas de IAM de Amazon EKS) en la Guía del usuario de Amazon EKS.

Si el estado del pod es CreateContainerConfigError, obtenga el error exacto ejecutando el siguiente comando.

kubectl describe pod pod_name -n amazon-cloudwatch

Panel de control

Puede crearse un panel para supervisar las métricas de cada complemento en ejecución. Puede ver los datos de los bytes de entrada y salida y de las tasas de procesamiento de registros, así como los errores de salida y las tasas de intento y error. Para visualizar estas métricas, se deberá instalar el agente de CloudWatch con la colección de métricas de Prometheus para los clústeres de Amazon EKS y de Kubernetes. Para obtener más información acerca de cómo se configuran estos paneles, consulte Instale el agente de CloudWatch con la colección de métricas de Prometheus en clústeres de Amazon EKS y de Kubernetes.

nota

Antes de configurar este panel, debe configurar Información de contenedores de para las métricas de Prometheus. Para obtener más información, consulte Supervisión de métricas de Información de contenedores de Prometheus.

Para crear un panel para las métricas de Prometheus de Fluent Bit
  1. Cree variables de entorno, mediante el reemplazo de los valores de la derecha en las siguientes líneas para que concuerden con la implementación.

    DASHBOARD_NAME=your_cw_dashboard_name REGION_NAME=your_metric_region_such_as_us-west-1 CLUSTER_NAME=your_kubernetes_cluster_name
  2. Ejecute el siguiente comando para crear el panel.

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body