(Opcional) Configure Fluentd como DaemonSet para que envíe registros a registros de CloudWatch - Amazon CloudWatch

(Opcional) Configure Fluentd como DaemonSet para que envíe registros a registros de CloudWatch

aviso

La compatibilidad con Información de contenedores para Fluentd está en mantenimiento actualmente, lo que significa que AWS no proporcionará ninguna actualización adicional para Fluentd y que se está planeando darlo de baja próximamente. Además, la configuración actual de Fluentd para Información de contenedores está utilizando una versión antigua de la imagen de Fluentd fluent/fluentd-kubernetes-daemonset:v1.10.3-debian-cloudwatch-1.0 que no tiene las últimas mejoras y parches de seguridad. Para obtener la imagen de Fluentd más reciente compatible con la comunidad de código abierto, consulte fluentd-kubernetes-daemonset.

Se recomienda que migre para utilizar FluentBit con Información de contenedores siempre que sea posible. El uso de FluentBit como reenviador de registros para Información de contenedores proporciona importantes ganancias de rendimiento.

Para obtener más información, consulte Configure Fluent Bit como DaemonSet para enviar registros a CloudWatch Logs y Diferencias en caso de que ya está usando Fluentd.

Para configurar Fluentd para recopilar registros de sus 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. En los pasos que se describen a continuación, va a configurar Fluentd como DaemonSet para enviar registros a registros de CloudWatch. Cuando se complete este paso, Fluentd creará los siguientes grupos de registros si no existen ya.

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.

Paso 1: Cree un espacio de nombres para CloudWatch

Siga el paso que se describe a continuación para crear un espacio de nombres denominado amazon-cloudwatch para CloudWatch. Puede omitir este paso si ya ha creado este espacio de nombres.

Para crear un espacio de nombres para CloudWatch
  • Escriba 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

Paso 2: Instalar Fluentd

Inicie este proceso descargando Fluentd. Cuando termine estos pasos, la implementación creará los siguientes recursos en el clúster:

  • Una cuenta de servicio denominada fluentd 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 fluentd 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 fluentd. Para obtener información, consulte API Overview en la documentación de Kubernetes.

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

Para instalar Fluentd
  1. Cree un ConfigMap denominado cluster-info con el nombre del clúster y la región de AWS a la que se enviarán los registros. Ejecute el siguiente comando sustituyendo los marcadores de posición de los nombres de clúster y de región.

    kubectl create configmap cluster-info \ --from-literal=cluster.name=cluster_name \ --from-literal=logs.region=region_name -n amazon-cloudwatch
  2. Descargue e implemente el DaemonSet de Fluentd en el clúster ejecutando el siguiente comando. Asegúrese de que esté utilizando la imagen de contenedor con la arquitectura correcta. El manifiesto de ejemplo solo funciona en instancias x86 e ingresará CrashLoopBackOff si cuenta con instancias de Advanced RISC Machine (ARM) en el clúster. El daemonSet de Fluentd no tiene una imagen de Docker oficial de varias arquitecturas que le permita utilizar una etiqueta para varias imágenes subyacentes y dejar que el tiempo de ejecución del contenedor extraiga la correcta. La imagen ARM de Fluentd utiliza una etiqueta diferente con un sufijo arm64.

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

    Debido a un cambio reciente para optimizar la configuración de Fluentd y minimizar el impacto de las solicitudes de la API de Fluentd en los puntos de enlace de la API de Kubernetes, la opción “Mirar” para los filtros de Kubernetes se ha desactivado de forma predeterminada. Para obtener más detalles, consulte fluent-plugin-kubernetes_metadata_filter.

  3. Valide la implementación ejecutando el siguiente comando. Cada nodo debe tener un pod denominado fluentd-cloudwatch-*.

    kubectl get pods -n amazon-cloudwatch

Paso 3: Verifique la configuración de Fluentd

Para comprobar la configuración de Fluentd, siga los pasos a continuación.

Cómo verificar la configuración de Fluentd para Información de contenedores
  1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.

  2. En el panel de navegación, seleccione Grupos de registro. Asegúrese de que está en la región donde ha implementado Fluentd en los contenedores.

    En la lista de 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

    Si ve estos grupos de registros, la configuración de Fluentd es correcta.

Compatibilidad con registros de varias líneas

El 19 de agosto de 2019, añadimos compatibilidad con registros de varias líneas para los registros recopilados por Fluentd.

De forma predeterminada, el iniciador de entrada de registro de varias líneas es cualquier carácter sin espacios en blanco. Esto significa que todas las líneas de registro que comienzan con un carácter que no tiene espacios en blanco se consideran una nueva entrada de registro de varias líneas.

Si sus propios registros de aplicación utilizan un iniciador de varias líneas diferente, puede conseguir que se admitan realizando dos cambios en el archivo fluentd.yaml.

En primer lugar, exclúyalos de la compatibilidad de varias líneas predeterminada añadiendo los nombres de ruta de los archivos de registro a un campo exclude_path de la sección containers de fluentd.yaml. A continuación, se muestra un ejemplo.

<source> @type tail @id in_tail_container_logs @label @containers path /var/log/containers/*.log exclude_path ["full_pathname_of_log_file*", "full_pathname_of_log_file2*"]

A continuación, añada un bloque de archivos de registro al archivo fluentd.yaml. El siguiente ejemplo se utiliza para el archivo de registro del agente de CloudWatch, que utiliza una expresión regular de marca temporal como iniciador de varias líneas. Puede copiar este bloque y añadirlo a fluentd.yaml. Cambie las líneas indicadas para reflejar el nombre del archivo de registro de la aplicación y el iniciador de varias líneas que desee utilizar.

<source> @type tail @id in_tail_cwagent_logs @label @cwagentlogs path /var/log/containers/cloudwatch-agent* pos_file /var/log/cloudwatch-agent.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>
<label @cwagentlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_cwagent </filter> <filter **> @type record_transformer @id filter_cwagent_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <filter **> @type concat key log multiline_start_regexp /^\d{4}[-/]\d{1,2}[-/]\d{1,2}/ separator "" flush_interval 5 timeout_label @NORMAL </filter> <match **> @type relabel @label @NORMAL </match> </label>

(Opcional) Reducción del volumen de registro de Fluentd

De forma predeterminada, se envían los registros de aplicaciones de Fluentd 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.

Para detener los registros de aplicaciones Fluentd, elimine la siguiente sección del archivo fluentd.yaml.

<source> @type tail @id in_tail_fluentd_logs @label @fluentdlogs path /var/log/containers/fluentd* pos_file /var/log/fluentd.log.pos tag * read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <label @fluentdlogs> <filter **> @type kubernetes_metadata @id filter_kube_metadata_fluentd </filter> <filter **> @type record_transformer @id filter_fluentd_stream_transformer <record> stream_name ${tag_parts[3]} </record> </filter> <match **> @type relabel @label @NORMAL </match> </label>

Para evitar que los metadatos de Kubernetes se añadan a los eventos de registro que se envían a CloudWatch, agregue una línea a la sección record_transformer en el archivo fluentd.yaml. Añada la siguiente línea en el origen de registros en el que desea eliminar esos metadatos.

remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id

Por ejemplo:

<filter **> @type record_transformer @id filter_containers_stream_transformer <record> stream_name ${tag_parts[3]} </record> remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id </filter>

Resolución de problemas

Si no ve estos grupos de registros y está mirando en la región correcta, compruebe los registros de los pods del DaemonSet de Fluentd para buscar el error.

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

kubectl get pods -n amazon-cloudwatch

En los resultados del comando anterior, anote el nombre del pod que comienza por fluentd-cloudwatch. Utilice este nombre de pod en el siguiente comando.

kubectl logs pod_name -n amazon-cloudwatch

Si los registros tienen errores relacionados con los permisos de IAM, verifique 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

Si el estado del pod es CrashLoopBackOff, asegúrese de que la arquitectura de la imagen de contenedor de Fluentd sea la misma que la del nodo cuando se instaló Fluentd. Si el clúster tiene nodos x86 y ARM64, se puede usar una etiqueta kubernetes.io/arch para colocar las imágenes en el nodo correcto. Para obtener más información, consulte kuberntes.io/arch.