Fargate-Protokollierung - Amazon EKS

Fargate-Protokollierung

Amazon EKS auf Fargate bietet einen integrierten Log-Router basierend auf Fluent Bit. Dies bedeutet, dass Sie einen Fluent-Bit-Container nicht explizit als Sidecar ausführen, sondern Amazon für Sie ausführen. Alles, was Sie tun müssen, ist den Log-Router zu konfigurieren. Die Konfiguration erfolgt über ein dediziertes ConfigMap, das die folgenden Kriterien erfüllen muss:

  • Benannte aws-logging

  • Erstellt in einem dedizierten Namespace namens aws-observability

Sobald Sie die ConfigMap erstellt haben, erkennt Amazon EKS auf Fargate sie automatisch und konfiguriert den Protokollrouter damit. Fargate verwendet eine Version von AWS für Fluent Bit, eine Upstream-kompatible Distribution von Fluent Bit, die von AWS verwaltet wird. Weitere Informationen finden Sie unter AWS für Fluent Bit auf GitHub.

Mit dem Log-Router können Sie die Bandbreite der Dienste von AWS für Protokoll-Analysen und -Speicherung nutzen. Sie können Protokolle von Fargate direkt an Amazon CloudWatch streamen, Amazon OpenSearch Service. Sie können Protokolle auch über Amazon Kinesis Data Firehose an Ziele wie Amazon S3, Amazon Kinesis Data Streams und Partnerwerkzeuge streamen.

Prerequisites

Router-Konfiguration protokollieren

So konfigurieren Sie den Protokollrouter

Ersetzen Sie in den folgenden Schritten das <example values> (einschließlich <>) durch Ihre eigenen Werte.

  1. Erstellen Sie einen dedizierten Kubernetes-Namespace namens aws-observability.

    1. Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen aws-observability-namespace.yaml auf Ihrem Computer. Der Wert für name muss aws-observability sein und das Label aws-observability: enabled ist erforderlich.

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. Erstellen Sie den Namespace.

      kubectl apply -f aws-observability-namespace.yaml
  2. Erstellen Sie ein ConfigMap mit einem Fluent Conf-Datenwert, um Container-Logs an ein Ziel zu versenden. Fluent Conf ist Fluent Bit, eine schnelle und leichte Konfigurationssprache für den Protokollprozessor, die verwendet wird, um Containerprotokolle an ein Protokollziel Ihrer Wahl weiterzuleiten. Weitere Informationen finden Sie unter Konfigurationsdatei in der Fluent-Bit-Dokumentation.

    Wichtig

    In einem typischen Fluent Conf sind die Hauptabschnitte Service, Input, Filter und Output enthalten. Der Fargate-Protokoll-Router akzeptiert jedoch nur:

    • Die Abschnitte Filter und Output und verwaltet die Abschnitte Service und Input selbst.

    • Ein Parser-Abschnitt.

    wenn Sie einen anderen Abschnitt als Filter, Output, und Parser angeben, werden die Abschnitte abgelehnt.

    Berücksichtigen Sie beim Erstellen des ConfigMap, die folgenden Regeln, die Fargate verwendet, um Felder zu validieren:

    • [FILTER], [OUTPUT], und [PARSER] sollen unter jedem entsprechenden Schlüssel angegeben werden. [FILTER] muss beispielsweise unter filters.conf liegen. Sie können ein oder mehrere [FILTER] in der filter.conf haben. Die Abschnitte [OUTPUT] und [PARSER] sollten sich auch unter den entsprechenden Schlüssel befinden. Durch die Angabe mehrerer [OUTPUT]-Abschnitte können Sie Ihre Protokolle gleichzeitig an verschiedene Ziele weiterleiten.

    • Fargate validiert die erforderlichen Schlüssel für jeden Abschnitt. Name und matchsind für jedes [FILTER] und [OUTPUT] erforderlich. Name und format werden jeweils für jeden [PARSER] benötigt. Bei den Schlüssel wird nicht zwischen Groß- und Kleinschreibung unterschieden.

    • Umgebungsvariablen wie ${ENV_VAR} sind im ConfigMap nicht erlaubt.

    • Die Einrückung muss für die Direktive oder das Schlüssel-Wert-Paar innerhalb von filters.conf, output.conf und parsers.conf gleich sein. Schlüssel-Wert-Paare müssen stärker eingerückt werden als Direktiven.

    • Fargate validiert gegen die folgenden unterstützten Filter: grep, parser, record_modifier, rewrite_tag, throttle, nest, und modify.

    • Fargate validiert mit der folgenden unterstützten Ausgabe: es, firehose, kinesis_firehose, cloudwatch, cloudwatch_logs, und kinesis.

    • Mindestens ein unterstütztes Output-Plugin muss im ConfigMap bereitgestellt werden, um die Protokollierung zu ermöglichen. Filter und Parser sind nicht erforderlich, um die Protokollierung zu aktivieren.

    Sie können Fluent Bit auch auf Amazon EC2 mit der gewünschten Konfiguration ausführen, um alle Probleme zu beheben, die sich aus der Validierung ergeben. Erstellen Sie Ihr ConfigMap mit einem der folgenden Beispiele.

    Wichtig

    Die Amazon EKS Fargate-Protokollierung unterstützt keine dynamische Konfiguration von ConfigMaps. Alle Änderungen an ConfigMaps werden nur auf neue Pods angewendet. Änderungen werden nicht auf vorhandene Pods angewendet.

    Erstellen Sie anhand des Beispiels ein ConfigMap für Ihr gewünschtes Protokollziel.

    CloudWatch

    Bei der Verwendung von CloudWatch haben Sie zwei Ausgabeoptionen:

    Das folgende Beispiel zeigt Ihnen, wie Sie das cloudwatch_logs-Plug-in verwenden, um Protokolle an CloudWatch zu senden.

    1. Speichern Sie den folgenden Inhalt in einer Datei namens aws-logging-cloudwatch-configmap.yaml. Die Parameter unter [OUTPUT] sind erforderlich.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region us-east-1 log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true 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 Reserve_Data On Preserve_Key On
    2. Wenden Sie das Manifest auf Ihren Cluster an.

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. Laden Sie die CloudWatch IAM-Richtlinie auf Ihren Computer herunter. Sie können die Richtlinie auch auf GitHub anzeigen.

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

    Wenn Sie Protokolle an Amazon OpenSearch Service. Sie können es-Ausgabe verwenden, ein in C geschriebenes Plugin. Das folgende Beispiel zeigt Ihnen, wie Sie das Plugin verwenden, um Protokolle an OpenSearch zu senden.

    1. Speichern Sie den folgenden Inhalt in einer Datei namens aws-logging-opensearch-configmap.yaml.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.us-east-1.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region us-east-1 tls On
    2. Wenden Sie das Manifest auf Ihren Cluster an.

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. Laden Sie die OpenSearch-IAM-Richtlinie auf Ihren Computer herunter. Sie können die Richtlinie auch auf GitHub anzeigen.

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

      Stellen Sie sicher, dass die Zugriffssteuerung von OpenSearch Dashboards richtig konfiguriert ist. Dem all_access role in OpenSearch-Dashboards muss die Fargate-Pod-Ausführungsrolle sowie die IAM-Rolle zugeordnet sein. Das gleiche Mapping muss für die security_manager-Rolle durchgeführt werden. Sie können die vorherigen Zuordnungen hinzufügen, indem Sie Menu, dann Security, dann Roles und dann die entsprechenden Rollen auswählen. Weitere Informationen finden Sie unter Wie behebe ich Probleme mit CloudWatch Logs, damit es an meine Amazon-ES-Domäne gestreamt wird?.

    Kinesis Data Firehose

    Senden Sie Protokolle an Kinesis Data Firehose. Bei Verwendung von Kinesis Data Firehose haben Sie zwei Ausgabeoptionen:

    Das folgende Beispiel zeigt Ihnen, wie Sie das kinesis_firehose-Plugin verwenden, um Protokolle an Kinesis Data Firehose zu senden.

    1. Speichern Sie den folgenden Inhalt in einer Datei namens aws-logging-firehose-configmap.yaml.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region us-east-1 delivery_stream my-stream-firehose
    2. Wenden Sie das Manifest auf Ihren Cluster an.

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. Laden Sie die Kinesis-Data-Firehose-IAM-Richtlinie auf Ihren Computer herunter. Sie können die Richtlinie auch auf GitHub anzeigen.

      curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. Erstellen Sie eine IAM-Richtlinie aus der Richtliniendatei, die Sie in einem vorherigen Schritt heruntergeladen haben.

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. Hängen Sie die IAM-Richtlinie an die Pod-Ausführungsrolle an, 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

Testanwendung

  1. Stellen Sie einen Beispiel-Pod bereit.

    1. Speichern Sie den folgenden Inhalt in einer Datei namens sample-app.yaml auf Ihrem Computer.

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. Wenden Sie das Manifest auf den Cluster an.

      kubectl apply -f sample-app.yaml
  2. Zeigen Sie die NGINX-Protokolle mit den Zielen an, die Sie im ConfigMap.

Größenüberlegungen

Wir empfehlen Ihnen, für den Protokoll-Router bis zu 50 MB Speicher einzuplanen. Wenn Sie erwarten, dass Ihre Anwendung Protokolle mit sehr hohem Durchsatz generiert, sollten Sie bis zu 100 MB einplanen.

Troubleshooting

Um zu überprüfen, ob die Protokollierungsfunktion aus irgendeinem Grund aktiviert oder deaktiviert ist, z. B. ein ungültiges ConfigMap, und warum es ungültig ist, überprüfen Sie Ihre Pod-Ereignisse mit kubectl describe pod pod_name. Die Ausgabe kann Pod-Ereignisse enthalten, die klarstellen, ob die Protokollierung aktiviert ist oder nicht, wie die folgende Beispielausgabe.

... Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Die Pod-Ereignisse sind kurzlebig mit einem Zeitraum, der von den Einstellungen abhängt. Sie können die Anmerkungen eines Pods auch mit kubectl describe pod pod-name anzeigen. In der Pod-Anmerkung finden Sie Informationen darüber, ob die Protokollierungsfunktion aktiviert oder deaktiviert ist, und den Grund.