Wie streame ich Container-Protokolle zu CloudWatch in Amazon EKS?
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 die externen Ressourcen Fluent Bit oder Fluentd verwenden, um Protokolle von Ihren Containern an Ihre CloudWatch-Protokolle zu senden. Fluent Bit ist die Standard-Protokoll-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 amazon-cloudwatch "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.
- Laden Sie die CloudWatch-IAM-Richtlinie auf Ihren Computer herunter. Sie können die Richtlinie auch auf GitHub einsehen.
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.
Relevante Informationen
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 7 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 6 Monaten
- Wie stelle ich externen Zugriff auf mehrere Kubernetes-Services in meinem Amazon EKS-Cluster bereit?AWS OFFICIALAktualisiert vor 2 Jahren