Salta al contenuto

Come posso trasmettere log da container a CloudWatch in Amazon EKS?

5 minuti di lettura
0

Desidero utilizzare Fluent Bit o Fluentd per trasmettere log da container eseguiti in Amazon Elastic Kubernetes Service (Amazon EKS) ad Amazon CloudWatch Logs.

Breve descrizione

Poiché Fluent Bit è la soluzione di log predefinita per CloudWatch Container Insights, è consigliabile utilizzare Fluent Bit anziché Fluentd. Amazon fornisce un'immagine del container Fluent Bit su Amazon Elastic Container Registry (Amazon ECR). Per ulteriori informazioni, consulta AWS for Fluent Bit image repositories for Amazon ECS (Repository AWS per immagini Fluent Bit per Amazon ECS).

Per scaricare Fluent Bit, consulta Getting started with Fluent Bit (Guida introduttiva a Fluent Bit) sul sito web di Fluent Bit. Per Fluentd, consulta Download Fluentd (Scarica Fluentd) sul sito web di Fluentd.

Quando configuri Fluent Bit come DaemonSet per inviare log a CloudWatch, Fluent Bit crea i seguenti gruppi e origini di log:

  • /aws/containerinsights/Cluster_Name/application: L'origine dei log è costituita da tutti i file di log in /var/log/containers.
  • /aws/containerinsights/Cluster_Name/host: L'origine dei log è costituita dai log in /var/log/dmesg, /var/log/secure e /var/log/messages.
  • /aws/containerinsights/Cluster_Name/dataplane: L'origine dei log è costituita dai log in /var/log/journal per kubelet.service, kubeproxy.service e docker.service.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Trasmetti i log dei container eseguiti in Amazon EKS su un cluster Amazon EC2

Completa i seguenti passaggi:

  1. Per creare un namespace denominato amazon-cloudwatch, esegui questo 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. Per creare una ConfigMap denominata fluent-bit-cluster-info che includa il nome del cluster e la R\egione AWS a cui desideri inviare i log, esegui questo 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: sostituisci my-cluster-name e my-cluster-region con il nome e la Regione del tuo cluster.

  3. Per utilizzare Fluent Bit per inviare log a un cluster Amazon Elastic Compute Cloud (Amazon EC2), esegui questo comando 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. (Facoltativo) Per utilizzare Fluent Bit su Amazon ECR, esegui questo comando DaemonSet aws-for-fluent-bit:

    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. Per creare ruoli AWS Identity and Access Management per gli account di servizio (IRSA), esegui questo 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

    Per ulteriori informazioni, consulta Set up Fluent Bit as a DaemonSet to send logs to CloudWatch Logs (Configurazione di Fluent Bit come DaemonSet per inviare log a CloudWatch Logs).

Risolvi i problemi relativi alla distribuzione di Fluent Bit

Completa i seguenti passaggi:

  1. Per elencare i nomi dei pod nel namespace amazon-cloudwatch, esegui questo comando:

    kubectl get pods -n amazon-cloudwatch

    Nota: il nome del pod viene restituito come fluent-bit-*****.

  2. Per controllare l'output degli eventi, esegui questo comando:

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    Nota: sostituisci POD_NAME con il nome del tuo pod.

  3. Per verificare i log, esegui questo comando:

    kubectl logs pod-name -n amazon-cloudwatch

    Nota: sostituisci POD_NAME con il nome del tuo pod.

Elimina la distribuzione di Fluent Bit

Per eliminare la distribuzione di Fluent Bit, esegui questi comandi:

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

Trasmetti i log dei container eseguiti in Amazon EKS su un cluster Fargate

Amazon EKS su un cluster AWS Fargate ha un router di log integrato basato su Fluent Bit. AWS esegue automaticamente Fluent Bit per te. Per ulteriori informazioni, consulta Start AWS Fargate logging for your cluster (Avvio della registrazione di AWS Fargate per un cluster).

Per trasmettere i log dai container a CloudWatch Logs, completa i seguenti passaggi:

  1. Per creare un namespace Kubernetes dedicato denominato aws-observability, esegui questo 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. Per creare una ConfigMap con un valore di dati Fluent Conf per trasmettere i log dai container a CloudWatch Logs, esegui questo 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 policy gestita da AWS per CloudWatch. Quindi collega la policy IAM al ruolo di esecuzione del pod che hai specificato per il profilo Fargate.

    Per scaricare il file della policy IAM, esegui questo comando:

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

    Per creare una policy IAM dal file della policy, esegui questo comando create-policy:

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

    Per collegare la policy IAM al ruolo di esecuzione del pod specificato per il profilo Fargate, esegui questo 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: sostituisci 111122223333 con l'ID del tuo account.

    Per ulteriori informazioni, consulta Troubleshooting (Risoluzione dei problemi).

Disattiva la trasmissione di log per i pod EKS su Fargate

Per disattivare la trasmissione di log per i pod EKS su Fargate, esegui questo comando:

kubectl delete namespace aws-observability

Elimina i pod e ridistribuiscili dopo aver eliminato il namespace aws-observability.