Saltar al contenido

¿Cómo puedo transmitir los registros de los contenedores a CloudWatch en Amazon EKS?

5 minutos de lectura
0

Quiero usar Fluent Bit o Fluentd para transmitir registros desde contenedores que se ejecutan en Amazon Elastic Kubernetes Service (Amazon EKS) a Registros de Amazon CloudWatch.

Descripción corta

Dado que Fluent Bit es la solución de registro predeterminada para Información de contenedores de CloudWatch, 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, consulta Repositorios de imágenes de AWS para Fluent Bit para Amazon ECS.

Para descargar Fluent Bit, consulta Cómo empezar a usar Fluent Bit en el sitio web de Fluent Bit. Para Fluentd, consulta Descargar Fluentd en el sitio web de Fluentd.

Cuando configuras Fluent Bit como un DaemonSet para enviar registros a CloudWatch, Fluent Bit crea los siguientes orígenes y grupos de registros:

  • /aws/containerinsights/Cluster_Name/application: El origen del registro son todos los archivos de registro de /var/log/containers.
  • /aws/containerinsights/Cluster_Name/host: El origen del registro son los registros de /var/log/dmesg, /var/log/secure y /var/log/messages.
  • /aws/containerinsights/Cluster_Name/dataplane: El origen del registro son los registros de /var/log/journal for kubelet.service, kubeproxy.service y docker.service.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Transmisión de registros de contenedores que se ejecutan en Amazon EKS en un clúster de Amazon EC2

Sigue estos pasos:

  1. Para crear un espacio de nombres denominado amazon-cloudwatch, ejecuta 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. Para crear un ConfigMap denominado fluent-bit-cluster-info que incluya el nombre del clúster y la región de AWS a la que deseas enviar los registros, ejecuta el siguiente comando:

    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

    Nota: Sustituye my-cluster-name y my-cluster-region por tu nombre de clúster y región.

  3. Para usar Fluent Bit para enviar registros a un clúster de Amazon Elastic Compute Cloud (Amazon EC2), ejecuta el siguiente comando de DaemonSet:

    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) Para usar Fluent Bit en Amazon ECR, ejecuta el siguiente comando aws-for-fluent-bit de DaemonSet:

    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 crear roles de AWS Identity and Access Management para cuentas de servicio (IRSA), ejecuta el siguiente comando eksctl:

    eksctl create iamserviceaccount \
        --name fluent-bit \
        --namespace amazon-cloudwatch \
        --cluster $CLUSTER \
        --attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
        --approve \
        --override-existing-serviceaccounts

    Para obtener más información, consulta Configuración de Fluent Bit como un DaemonSet para enviar registros a Registros de CloudWatch.

Solución de problemas de despliegue de Fluent Bit

Sigue estos pasos:

  1. Para enumerar los nombres de los pods en el espacio de nombres amazon-cloudwatch, ejecuta el siguiente comando: 

    kubectl get pods -n amazon-cloudwatch

    Nota: El nombre del pod se devuelve como fluent-bit-*****.

  2. Para comprobar el resultado de los eventos, ejecuta el siguiente comando:

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    Nota: Sustituye POD_NAME por el nombre de tu pod. 

  3. Para comprobar los registros, ejecuta el siguiente comando:

    kubectl logs pod-name -n amazon-cloudwatch

    Nota: Sustituye POD_NAME por el nombre de tu pod.

Eliminación del despliegue de Fluent Bit

Para eliminar el despliegue de Fluent Bit, ejecuta los siguientes 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 ejecutan en Amazon EKS en un clúster de Fargate

Amazon EKS en un clúster de AWS Fargate tiene un enrutador de registros integrado que se basa en Fluent Bit. AWS ejecuta Fluent Bit automáticamente. Para obtener más información, consulta Inicio del registro de AWS Fargate para el clúster.

Para transmitir los registros de los contenedores a Registros de CloudWatch, sigue estos pasos:

  1. Para crear un espacio de nombres de Kubernetes dedicado denominado aws-observability, ejecuta el siguiente comando:

    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. Para crear un ConfigMap con un valor de datos de Fluent Conf para transmitir los registros del contenedor a Registros de CloudWatch, ejecuta el siguiente comando:

    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. Crea una política administrada por AWS para CloudWatch. A continuación, adjunta la política de IAM al rol de ejecución del pod que has especificado para tu perfil de Fargate.

    Para descargar el archivo de política de IAM, ejecuta el siguiente comando:

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json

    Para crear una política de IAM a partir del archivo de políticas, ejecuta el siguiente comando create-policy:

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

    Para adjuntar la política de IAM al rol de ejecución del pod que has especificado para tu perfil de Fargate, ejecuta el siguiente comando attach-role-policy:

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role

    Nota: Sustituye 111122223333 por el ID de tu cuenta.

    Para obtener más información, consulta Solución de problemas de AWS X-Ray.

Desactivación de los registros de transmisión de EKS en los pods Fargate

Para desactivar los registros de transmisión de tu EKS en los pods de Fargate, ejecuta el siguiente comando:

kubectl delete namespace aws-observability

Elimina los pods y, a continuación, vuelve a desplegarlos después de eliminar el espacio de nombres aws-observability.