Wie streame ich Container-Protokolle in Amazon EKS an CloudWatch?

Lesedauer: 5 Minute
0

Ich möchte Fluent Bit oder Fluentd verwenden, um Protokolle von Containern, die in Amazon Elastic Kubernetes Service (Amazon EKS) ausgeführt werden, an Amazon CloudWatch-Protokolle zu streamen.

Kurzbeschreibung

Da Fluent Bit die Standardprotokolllösung für CloudWatch-Container-Insights ist, empfiehlt es sich, Fluent Bit anstelle von Fluentd zu verwenden. Amazon stellt ein Fluent-Bit-Container-Image in Amazon Elastic Container Registry (Amazon ECR) bereit. Weitere Informationen findest du unter AWS für Fluent-Bit-Image-Repositorys für Amazon ECS.

Um Fluent Bit herunterzuladen, siehe Erste Schritte mit Fluent Bit auf der Fluent-Bit-Website. Für Fluentd siehe Fluentd herunterladen auf der Fluentd-Website.

Wenn du Fluent Bit als DaemonSet einrichtest, um Protokolle an CloudWatch zu senden, erstellt Fluent Bit die folgenden Protokollgruppen und Quellen:

  • /aws/containerinsights/Cluster_Name/application: Protokollquelle sind alle Protokolldateien in /var/log/containers.
  • /aws/containerinsights/Cluster_Name/host: Die Protokollquelle sind Protokolle aus /var/log/dmesg, /var/log/secure und /var/log/messages.
  • /aws/containerinsights/Cluster_Name/dataplane: Die Protokollquelle sind die Protokolle in /var/log/journal für kubelet.service, kubeproxy.service und docker.service.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Streame Container-Protokolle, die in Amazon EKS auf einem Amazon EC2-Cluster ausgeführt werden

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um einen Namespace mit dem Namen amazon-cloudwatch zu erstellen:

    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. Führe den folgenden Befehl aus, um eine ConfigMap mit dem Namen fluent-bit-cluster-info zu erstellen, die den Clusternamen und die AWS-Region enthält, an die du Protokolle senden möchtest:

    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

    Hinweis: Ersetzen my-cluster-name und my-cluster-region durch deinen Clusternamen und deine Region.

  3. Um Fluent Bit zum Senden von Protokollen an ein Amazon Elastic Compute Cloud (Amazon EC2)-Cluster zu verwenden, führe den folgenden DaemonSet-Befehl aus:

    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. (Optional) Um Fluent Bit auf Amazon ECR zu verwenden, führe den folgenden DaemonSet-Befehl aws-for-fluent-bit aus:

    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. Um AWS Identity and Access Management-Rollen für Dienstkonten (IRSA) zu erstellen, führe den folgenden eksctl-Befehl aus:

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

    Weitere Informationen findest du unter Fluent Bit als DaemonSet einrichten, um Protokolle an CloudWatch-Protokolle zu senden.

Fehlerbehebung bei der Fluent Bit-Bereitstellung

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um die Pod-Namen im amazon-cloudwatch-Namespace aufzulisten: 

    kubectl get pods -n amazon-cloudwatch

    **Hinweis:**Der Pod-Name wird als fluent-bit-***** zurückgegeben.

  2. Führe den folgenden Befehl aus, um die Ausgabe der Ereignisse zu überprüfen:

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    Hinweis: Ersetze POD_NAME durch den Namen deines Pods. 

  3. Führe den folgenden Befehl aus, um die Protokolle zu überprüfen:

    kubectl logs pod-name -n amazon-cloudwatch

    Hinweis: Ersetze POD_NAME durch den Namen deines Pods.

Fluent-Bit-Bereitstellung löschen

Führe die folgenden Befehle aus, um die Fluent-Bit-Bereitstellung zu löschen:

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

Streame Container-Protokolle, die in Amazon EKS auf einem Fargate-Cluster ausgeführt werden

Amazon EKS auf einem AWS Fargate-Cluster verfügt über einen integrierten Protokoll-Router, der auf Fluent Bit basiert. AWS führt Fluent Bit automatisch für dich aus. Weitere Informationen findest du unter AWS Fargate-Protokollierung für dein Cluster starten.

Gehe wie folgt vor, um Container-Protokolle an CloudWatch-Protokolle zu streamen:

  1. Um einen dedizierten Kubernetes-Namespace mit dem Namenaws-observability zu erstellen, führe den folgenden Befehl aus:

    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. Um eine ConfigMap mit einem Fluent-Konfigurations-Datenwert zu erstellen, um Container-Protokolle an CloudWatch-Protokolle zu streamen, führe den folgenden Befehl aus:

    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. Erstelle eine von AWS verwaltete Richtlinie für CloudWatch. Hänge dann die IAM-Richtlinie an die Pod-Ausführungsrolle an, die du für dein Fargate-Profil angegeben hast.

    Führe den folgenden Befehl aus, um die IAM-Richtliniendatei herunterzuladen:

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

    Um eine IAM-Richtlinie aus der Richtliniendatei zu erstellen, führe den folgenden create-policy-Befehl aus:

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

    Um die IAM-Richtlinie an die Pod-Ausführungsrolle anzuhängen, die du für dein Fargate-Profil angegeben hast, führe den folgenden attach-role-policy-Befehl aus:

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

    Hinweis: Ersetze ** 111122223333** durch deine AWS-Konto-ID.

    Weitere Informationen findest du unter Problembehandlung.

Streaming-Protokolle für EKS auf den Fargate-Pods ausschalten

Führe den folgenden Befehl aus, um Streaming-Protokolle für deine EKS auf Fargate-Pods zu deaktivieren:

kubectl delete namespace aws-observability

Lösche Pods und stelle sie dann erneut bereit, nachdem du den aws-observability-Namespace gelöscht hast.