(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 |
---|---|
|
Todos los archivos de registros de |
|
Archivos de registros de |
|
Los registros en |
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 nombresamazon-cloudwatch
. Esta cuenta de servicio se utiliza para ejecutar el DaemonSet de Fluentd. Para obtener más información, consulte Managing Service Accountsen la documentación de Kubernetes. -
Un rol de clúster denominado
fluentd
en el espacio de nombresamazon-cloudwatch
. Este rol de clúster concede los permisosget
,list
ywatch
para los registros de los pods a la cuenta de serviciofluentd
. Para obtener información, consulte API Overviewen la documentación de Kubernetes. -
Un ConfigMap denominado
fluentd-config
en el espacio de nombresamazon-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 ConfigMapen la documentación de tareas de Kubernetes.
Para instalar Fluentd
-
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 -
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 sufijoarm64
.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
. -
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
Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/
. -
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