¿Cómo transmito registros de contenedores a CloudWatch en Amazon EKS?

6 minutos de lectura
0

Quiero transmitir los registros de contenedores que se ejecutan en Amazon Elastic Kubernetes Service (Amazon EKS) a un sistema de registro como CloudWatch Logs. ¿Cómo puedo hacerlo?

Descripción corta

Puede usar Fluent Bit o Fluentd para enviar registros de sus contenedores a sus registros de CloudWatch. Fluent Bit es la solución de registro predeterminada para Container Insights, por lo que se recomienda utilizar Fluent Bit en lugar de Fluentd. Amazon proporciona una imagen de contenedor de Fluent Bit en Amazon Elastic Container Registry (Amazon ECR). Para obtener más información, consulte cloudwatch-agent en Amazon ECR.

Cuando configura Fluent Bit como DaemonSet para enviar registros a CloudWatch, Fluent Bit crea estos grupos de registros, si aún no existen:

| Nombre del grupo de registros | Origen de registros | | /aws/containerinsights/Nombre_del_clúster/application | Todos los archivos de registro de /var/log/containers | | /aws/containerinsights/Nombre_del_clúster/host | Registros de /var/log/dmesg, /var/log/secure y /var/log/messages | | /aws/containerinsights/Nombre_del_clúster/dataplane | Los registros de /var/log/journal para kubelet.service, kubeproxy.service y docker.service |

Resolución

Requisitos previos

Antes de seguir estos pasos, revise los requisitos previos:

  • El clúster de EKS se ejecuta con nodos cuyo estado sea Ready (Listo), y el comando kubectl está instalado y en funcionamiento.
  • La CloudWatchAgentServerPolicy administrada por AWS Identity and Access Management (IAM) está implementada para permitir que los nodos de trabajo de Amazon EKS envíen métricas y registros a CloudWatch. Puede hacerlo adjuntando una política al rol de IAM de los nodos de trabajo. O bien, utilice un rol de IAM para las cuentas de servicio del clúster y adjunte la política a esta función. Para obtener más información, consulte Roles de IAM para cuentas de servicio.
  • Está poniendo en marcha un clúster que admite Kubernetes versión 1.18 o superior. Este es un requisito de Container Insights para EKS Fargate. También ha definido un perfil de Fargate para programar pods en Fargate.
  • El rol de funcionamiento del pod de EKS está implementada para permitir que los componentes que se pongan en marcha en la infraestructura de Fargate realicen llamadas a las API de AWS en su nombre. Por ejemplo, extraer imágenes de contenedores de Amazon ECR.

Transmisión de registros de contenedores que se ponen en marcha en su clúster de EC2 de EKS

Para transmitir los registros de contenedores a CloudWatch Logs, instale AWS para Fluent Bit siguiendo estos pasos:

1.    Cree un espacio de nombres llamado amazon-cloudwatch si aún no tiene ninguno:

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.    Ponga en marcha este comando para crear un ConfigMap llamado fluent-bit-cluster-info, que incluya el nombre del clúster y la región a la que quiere enviar los registros. Reemplace my-cluster-name y my-cluster-region por el nombre y la región de su clúster.

ClusterName=<my-cluster-name>
RegionName=<my-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

3.    Implemente el DaemonSet de configuración optimizada de Fluent Bit en el clúster:

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

4.    Opcional: revise el DaemonSet aws-for-fluent-bit para usar la imagen de AWS for Fluent Bit en Amazon Elastic Container Registry:

kubectl patch ds fluent-bit -n amazon-cloudwatch -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"fluent-bit","image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:latest"}]}}}}'

5.    Para los roles de IAM para cuentas de servicio, cree un proveedor de OIDC y una política y un rol de IAM. A continuación, asocie el rol de IAM a las cuentas de servicio cloudwatch-agent y fluent-bit. Sustituya ACCOUNT_ID e IAM_ROLE_NAME por el ID de cuenta de AWS y el rol de IAM utilizados para las cuentas de servicio.

kubectl annotate serviceaccounts fluent-bit -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Para obtener más personalización, consulte Configure Fluent Bit como DaemonSet para enviar registros a CloudWatch Logs.

Solución de problemas de implementación de Fluent Bit

1.    Ponga en marcha este comando y, a continuación, compruebe los eventos en la parte inferior de la salida:

kubectl describe pod pod-name -n amazon-cloudwatch

2.    Ponga en marcha este comando para comprobar los registros:

kubectl logs pod-name -n amazon-cloudwatch

Eliminación de la implementación de Fluent Bit

Para eliminar la implementación de Fluent Bit, ponga en marcha estos comandos:

kubectl delete configmap fluent-bit-cluster-info -n amazon-cloudwatch 

kubectl delete -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

Transmisión de registros de contenedores que se ponen en marcha en su clúster de Fargate de EKS

Amazon EKS en Fargate tiene un enrutador de registro integrado basado en Fluent Bit. Esto significa que no pone en marcha explícitamente un contenedor de Fluent Bit como sidecar. En cambio, Amazon lo pone en marcha por usted. Para obtener más información, consulte Registros de Fargate.

Siga estos pasos para transmitir los registros de contenedores a los registros de CloudWatch:

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

cat <<EOF > aws-observability-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: aws-observability
  labels:
    aws-observability: enabled
EOF

kubectl apply -f aws-observability-namespace.yaml

2.    Cree un ConfigMap con un valor de datos de Fluent Conf para enviar registros de contenedores a registros de CloudWatch:

cat <<EOF > aws-logging-cloudwatch-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
data:
  output.conf: |
    [OUTPUT]
        Name cloudwatch_logs
        Match   *
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
        log_key log

  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
  
  filters.conf: |
     [FILTER]
        Name parser
        Match *
        Key_name log
        Parser crio
EOF

kubectl apply -f aws-logging-cloudwatch-configmap.yaml

3.    Cree una política de IAM con la política de IAM de CloudWatch y, a continuación, adjúntela al rol de funcionamiento del pod que se especifica para su perfil de Fargate.

  • Descargue la política de IAM de CloudWatch en su ordenador. También puede consultar la política en GitHub.
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • Cree una política de IAM a partir del archivo de políticas que descargó.
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
  • Adjunte la política de IAM al rol de funcionamiento del pod que se especifica para su perfil de Fargate. Reemplace 111122223333 por el ID de su cuenta.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

Para obtener más información sobre la solución de problemas de AWS Fluent Bit que se pone en marcha en EKS Fargate, consulte la página Solución de problemas.

Desactivación de los registros de streaming de los pods de EKS Fargate

Para desactivar los registros de streaming para sus pods de EKS Fargate, ponga en marcha este comando:

kubectl delete namespace aws-observability

Elimine los pods y vuelva a implementarlos después de eliminar el aws-observability namespace.


Información relacionada

Uso de Container Insights

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años