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

Letzte Aktualisierung: 13.05.2022

Ich möchte Container-Protokolle, die in Amazon Elastic Kubernetes Service (Amazon EKS) ausgeführt werden, auf ein Protokollierungssystem wie CloudWatch Logs streamen. Wie kann ich vorgehen?

Kurzbeschreibung

Sie können Fluent Bit oder Fluentd verwenden, um Protokolle von Ihren Containern an Ihre CloudWatch-Protokolle zu senden. Fluent Bit ist die Standard-Log-Lösung für Container Insights, daher ist es eine bewährte Methode, Fluent Bit anstelle von Fluentd zu verwenden. Amazon stellt ein Fluent Bit-Container-Image in der Amazon Elastic Container Registry (Amazon ECR) bereit. Weitere Informationen finden Sie unter cloudwatch-agent auf Amazon ECR.

Wenn Sie Fluent Bit als DaemonSet einrichten, um Protokolle an CloudWatch zu senden, erstellt FluentBit diese Protokollgruppen, falls sie noch nicht existieren:

Gruppenname protokollieren Quelle protokollieren
/aws/containerinsights/ Cluster_Name/Anwendung Alle Protokolldateien in /var/log/containers
/aws/containerinsights/ Cluster_Name/host Protokolle von /var/log/dmesg, /var/log/secure und /var/log/messages
/aws/containerinsights/ Cluster_Name/dataplane Die Protokolle in /var/log/journal für kubelet.service, kubeproxy.service und docker.service

Lösung

Voraussetzungen

Bevor Sie diese Schritte ausführen, sollten Sie die Voraussetzungen überprüfen:

  • Ihr EKS-Cluster läuft mit Knoten im Status Ready, und der Befehl kubectl ist installiert und wird ausgeführt.
  • Die von AWS Identity and Access Management (IAM) verwaltete CloudWatchAgentServerPolicy ermöglicht es Ihren Amazon EKS-Worker-Knoten, Metriken und Protokolle an CloudWatch zu senden. Sie können dies tun, indem Sie der IAM-Rolle Ihrer Worker-Knoten eine Richtlinie hinzufügen. Oder verwenden Sie eine IAM-Rolle für Dienstkonten für den Cluster und fügen Sie die Richtlinie dieser Rolle hinzu. Weitere Informationen finden Sie unter IAM-Rollen für Dienstkonten.
  • Sie betreiben einen Cluster, der Kubernetes Version 1.18 oder höher unterstützt. Dies ist eine Anforderung von Container Insights für EKS Fargate. Sie haben auch ein Fargate-Profil definiert, um Pods auf Fargate zu planen.
  • Die EKS-Pod-Ausführungsrolle ist vorhanden, damit Komponenten, die auf der Fargate-Infrastruktur ausgeführt werden, in Ihrem Namen AWS-APIs aufrufen können. Zum Beispiel das Abrufen von Container-Images aus Amazon ECR.

Streamen Sie Container-Protokolle, die in Ihrem EKS-EC2-Cluster laufen

Um Container-Protokolle in CloudWatch-Protokolle zu streamen, installieren Sie AWS for Fluent Bit mit den folgenden Schritten:

1.    Erstellen Sie einen Namespace namens amazon-cloudwatch, falls Sie noch keinen haben:

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ühren Sie diesen Befehl aus, um eine ConfigMap namens fluent-bit-cluster-info zu erstellen, einschließlich des Cluster-Namens und der Region, an die Sie Protokolle senden möchten. Ersetzen Sie my-cluster-name und my-cluster-region durch den Namen und die Region Ihres Clusters.

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.    Stellen Sie die für Fluent Bit optimierte Konfiguration DaemonSet im Cluster bereit:

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: Patchen Sie das aws-for-fluent-bit-DaemonSet, um das AWS for Fluent-Bit-Image in der Amazon Elastic Container Registry zu verwenden:

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.    Erstellen Sie für IAM-Rollen für Dienstkonten einen OIDC-Anbieter und eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle cloudwatch-Agent- und Fluent-Bit-Servicekonten zu. Ersetzen Sie ACCOUNT_ID und IAM_ROLE_NAME durch die AWS-Konto-ID und die IAM-Rolle, die für Dienstkonten verwendet wird.

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

Weitere Anpassungen finden Sie unter Richten Sie Fluent Bit als DaemonSet ein, um Protokolle an CloudWatch Logs zu senden.

Problembehandlung bei der Fluent-Bit-Bereitstellung

1.    Führen Sie diesen Befehl aus und überprüfen Sie dann die Ereignisse am Ende der Ausgabe:

kubectl describe pod pod-name -n amazon-cloudwatch

2.    Führen Sie diesen Befehl aus, um die Protokolle zu überprüfen:

kubectl logs pod-name -n amazon-cloudwatch

Fluent-Bit-Bereitstellung löschen

Führen Sie diese 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

Streamen Sie Container-Protokolle, die in Ihrem EKS-Fargate-Cluster laufen

Amazon EKS auf Fargate hat einen integrierten Protokoll-Router, der auf Fluent Bit basiert. Das bedeutet, dass Sie einen Fluent-Bit-Container nicht explizit als Sidecar ausführen. Stattdessen führt Amazon es für Sie aus. Weitere Einzelheiten finden Sie unter Fargate-Protokollierung.

Folgen Sie diesen Schritten, um Container-Protokolle in CloudWatch-Protokolle zu streamen:

1.    Erstellen Sie einen dedizierten Kubernetes-Namespace namens 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.    Erstellen Sie eine ConfigMap mit einem Fluent-Conf-Datenwert, um Container-Protokolle an CloudWatch-Protokolle zu versenden:

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.    Erstellen Sie eine IAM-Richtlinie mithilfe der CloudWatch-IAM-Richtlinie, und fügen Sie sie dann der Pod-Ausführungsrolle hinzu, die für Ihr Fargate-Profil angegeben ist.

curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • Erstellen Sie eine IAM-Richtlinie aus der Richtliniendatei, die Sie heruntergeladen haben.
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
  • Ordnen Sie die IAM-Richtlinie der Pod-Ausführungsrolle zu, die für Ihr Fargate-Profil angegeben ist. Ersetzen Sie 111122223333 durch Ihre Konto-ID.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

Weitere Informationen zur Problembehandlung bei AWS Fluent Bit auf EKS Fargate finden Sie auf der Seite zur Fehlerbehebung.

Streaming-Protokolle für EKS-Fargate-Pods deaktivieren

Führen Sie diesen Befehl aus, um Streaming-Protokolle für Ihre EKS-Fargate-Pods zu deaktivieren:

kubectl delete namespace aws-observability

Löschen Sie Pods und stellen Sie sie erneut bereit, nachdem Sie den aws-observability-Namespace gelöscht haben.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?