Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Wie streame ich Container-Protokolle in Amazon EKS an CloudWatch?
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:
-
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
-
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.
-
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
-
(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"}]}}}}'
-
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:
-
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.
-
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.
-
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:
-
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
-
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
-
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.

Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Monaten