Démarrez la journalisation AWS Fargate pour votre cluster - Amazon EKS

Aidez à améliorer cette page

Pour contribuer à ce guide de l’utilisateur, cliquez sur le lien Modifier cette page sur GitHub qui se trouve dans le volet droit de chaque page.

Démarrez la journalisation AWS Fargate pour votre cluster

Amazon EKS on Fargate propose un routeur de journal intégré basé sur Fluent Bit. Cela signifie que vous n’exécutez pas explicitement un conteneur Fluent Bit comme sidecar, mais qu’Amazon l’exécute pour vous. Tout ce que vous avez à faire est de configurer le routeur de journaux. La configuration se fait par le biais d'un ConfigMap qui doit répondre aux critères suivants :

  • Nommé aws-logging

  • Créé dans un espace de noms dédié appelé aws-observability

  • Ne doit pas dépasser 5 300 caractères.

Une fois que vous avez créé le ConfigMap, Amazon EKS on Fargate le détecte automatiquement et configure le routeur de journaux avec lui. Fargate utilise une version de AWS pour Fluent Bit, une distribution compatible en amont de Fluent Bit gérée par AWS. Pour plus d'informations, consultez AWS for Fluent Bit sur GitHub.

Le routeur de journaux vous permet d'utiliser la diversité des services sur AWSpour l'analyse des journaux et le stockage. Vous pouvez diffuser les journaux depuis Fargate directement vers Amazon CloudWatch, Amazon OpenSearch Service. Vous pouvez également diffuser les journaux vers des destinations telles qu’Amazon S3Amazon Kinesis Data Streams et des outils partenaires via Amazon Data Firehose.

Configuration du routeur de journaux

Important

Pour que les journaux soient publiés avec succès, il doit y avoir un accès réseau depuis le VPC dans lequel se trouve votre cluster vers la destination des journaux. Cela concerne principalement les utilisateurs qui personnalisent les règles de sortie pour leur VPC. Pour un exemple d’utilisation de CloudWatch, consultez la section Utilisation des journaux CloudWatch avec les points de terminaison d’un VPC d’interface dans le Guide de l’utilisateur Amazon CloudWatch Logs.

Dans les étapes suivantes, remplacez chaque valeur d’exemple par vos propres valeurs.

  1. Créez un espace de noms Kubernetes dédié nommé aws-observability.

    1. Enregistrez le contenu suivant dans un fichier nommé aws-observability-namespace.yaml sur votre ordinateur. La valeur pour name doit être aws-observability et le label aws-observability: enabled est obligatoire.

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. Créez l'espace de noms.

      kubectl apply -f aws-observability-namespace.yaml
  2. Créez un ConfigMap avec une valeur de données Fluent Conf pour envoyer les journaux des conteneurs vers une destination. Fluent Conf est Fluent Bit, qui est un langage de configuration de processeur de journaux rapide et léger, utilisé pour acheminer les journaux des conteneurs vers une destination de journalisation de votre choix. Pour plus d'informations, consultez Fichier de configuration dans la documentation Fluent Bit.

    Important

    Dans une Fluent Conf type, les principales sections incluses sont Service, Input, Filter et Output. Le routeur de journaux Fargate n'accepte cependant que :

    • Les sections Filter et Output.

    • Une section Parser.

    Si vous fournissez d'autres sections, elles seront rejetées.

    Le routeur de journal Fargate gère les sections Service et Input. Il comporte la section Input suivante, qui ne peut pas être modifiée et n’est pas nécessaire dans votre ConfigMap. Cependant, vous pouvez en tirer des informations, telles que la limite de la mémoire tampon et la balise appliquée pour les journaux.

    [INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*

    Lors de la création du ConfigMap, prenez en compte les règles suivantes que Fargate utilise pour valider les champs :

    • [FILTER], [OUTPUT] et [PARSER] sont censés être spécifiés sous chaque clé correspondante. Par exemple, [FILTER] doit être inférieur à filters.conf. Vous pouvez avoir un ou plusieurs [FILTER] sous filters.conf. [OUTPUT] et [PARSER] doivent également être sous leurs clés correspondantes. En spécifiant plusieurs sections [OUTPUT], vous pouvez acheminer vos journaux vers différentes destinations en même temps.

    • Fargate valide les clés requises de chaque section. Name et match sont nécessaires pour chaque [FILTER] et [OUTPUT]. Name et format sont nécessaires pour chaque [PARSER]. Ces noms sont sensibles à la casse.

    • Les variables d’environnement telles que ${ENV_VAR} ne sont pas autorisées dans le ConfigMap.

    • L'indentation doit être la même pour la directive ou la paire clé-valeur dans chaque filters.conf, output.conf et parsers.conf. Les paires clé-valeur doivent être indentées plus que les directives.

    • Fargate valide par rapport aux filtres pris en charge suivants : grep, parser, record_modifier, rewrite_tag, throttle, nest, modify et kubernetes.

    • Fargate valide par rapport à la sortie prise en charge suivante : es, firehose, kinesis_firehose, cloudwatch, cloudwatch_logs et kinesis.

    • Au moins un plug-in Output doit être fourni dans le ConfigMap pour activer la journalisation. Filter et Parser ne sont pas nécessaires pour activer la journalisation.

      Vous pouvez également exécuter Fluent Bit sur Amazon EC2 en utilisant la configuration souhaitée pour résoudre les problèmes qui surviennent lors de la validation. Créez votre ConfigMap en utilisant l'un des exemples suivants.

      Important

      La journalisation Amazon EKS Fargate ne prend pas en charge la configuration dynamique d’un ConfigMap. Les modifications apportées à un ConfigMap sont appliquées uniquement aux nouveaux pods. Les modifications ne sont pas appliquées aux pods existants.

      Créez un ConfigMap en utilisant l'exemple pour votre destination de journal désirée.

      Note

      Vous pouvez également utiliser Amazon Kinesis Data Streams comme destination du journal. Si vous utilisez Kinesis Data Streams, assurez-vous que l'autorisation kinesis:PutRecords a été accordée au rôle d'exécution du pod. Pour plus d’informations, consultez Permissions d’Amazon Kinesis Data Streams dans le Manuel officiel Fluent Bit.

    CloudWatch

    Vous disposez de deux options de sortie lorsque vous utilisez CloudWatch :

    L'exemple suivant explique comment utiliser le plugin cloudwatch_logs pour envoyer des journaux à CloudWatch.

    1. Enregistrez le contenu suivant dans un fichier nommé aws-logging-cloudwatch-configmap.yaml. Remplacez region-code par la région AWS dans laquelle votre cluster se situe. Les paramètres sous [OUTPUT] sont requises.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: flb_log_cw: "false" # Set to true to ship Fluent Bit process logs to CloudWatch. filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off Buffer_Size 0 Kube_Meta_Cache_TTL 300s output.conf: | [OUTPUT] Name cloudwatch_logs Match kube.* region region-code log_group_name my-logs log_stream_prefix from-fluent-bit- log_retention_days 60 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
    2. Appliquez le manifeste à votre cluster.

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    Amazon OpenSearch Service

    Si vous souhaitez envoyer des journaux à Amazon OpenSearch Service, vous pouvez utiliser es output, un plug-in écrit en C. L’exemple suivant vous montre comment utiliser le plug-in pour envoyer des journaux à OpenSearch.

    1. Enregistrez le contenu suivant dans un fichier nommé aws-logging-opensearch-configmap.yaml. Remplacez la valeur d’exemple par vos propres valeurs.

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. Appliquez le manifeste à votre cluster.

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    Firehose

    Vous disposez de deux options de sortie lorsque vous envoyez des journaux à Firehose :

    • kinesis_firehose : un plug-in de sortie écrit en C.

    • firehose : un plug-in de sortie écrit en Golang.

      L’exemple suivant vous montre comment utiliser le plug-in kinesis_firehose pour envoyer des journaux à Firehose.

      1. Enregistrez le contenu suivant dans un fichier nommé aws-logging-firehose-configmap.yaml. Remplacez region-code par la région AWS dans laquelle votre cluster se situe.

        kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
      2. Appliquez le manifeste à votre cluster.

        kubectl apply -f aws-logging-firehose-configmap.yaml
  3. Configurez les autorisations pour le rôle d’exécution Fargate Pod afin d’envoyer les journaux vers votre destination.

    1. Téléchargez la politique IAM pour votre destination sur votre ordinateur.

      CloudWatch

      Téléchargez la politique IAM CloudWatch sur votre ordinateur. Vous pouvez également afficher la politique sur GitHub.

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

      Téléchargez la politique IAM OpenSearch sur votre ordinateur. Vous pouvez également afficher la politique sur GitHub.

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

      Assurez-vous que le contrôle d'accès OpenSearch Dashboards est correctement configuré. Le all_access role dans OpenSearch Dashboards doit avoir le rôle d’exécution du pod Fargate et le rôle IAM mappés. Le même mappage doit être fait pour le rôle security_manager. Vous pouvez ajouter les mappages précédents en sélectionnant Menu, Security et Roles, puis sélectionner les rôles correspondants. Pour plus d'informations, consultez Comment dépanner CloudWatch Logs afin qu'il diffuse vers mon domaine Amazon ES ?.

      Firehose

      Téléchargez la politique IAM Firehose sur votre ordinateur. Vous pouvez également afficher la politique sur GitHub.

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
    2. Créez une politique IAM à partir du fichier de politique que vous avez téléchargé.

      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
    3. Attachez la politique IAM au rôle d'exécution de pod spécifié pour votre profil Fargate avec la commande suivante. Remplacez 111122223333 par votre ID de compte. Remplacez AmazonEKSFargatePodExecutionRole par votre rôle d’exécution de pod (pour plus d’informations, consultez Étape 2 : créer un rôle d’exécution Fargate Pod).

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name AmazonEKSFargatePodExecutionRole

Prise en charge des filtres Kubernetes

Le filtre Kubernetes de Fluent Bit vous permet d'ajouter des métadonnées Kubernetes à vos fichiers journaux. Pour plus d'informations sur le filtre, consultez Kubernetes dans la documentation Fluent Bit. Vous pouvez appliquer un filtre en utilisant le point de terminaison du serveur d'API.

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
Important
  • Kube_URL, Kube_CA_File, Kube_Token_Command et Kube_Token_File sont des paramètres de configuration appartenant au service et ne doivent pas être spécifiés. Amazon EKS Fargate remplit ces valeurs.

  • Kube_Meta_Cache_TTL est le moment où Fluent Bit attend qu'il communique avec le serveur d'API pour obtenir les dernières métadonnées. Si la valeur Kube_Meta_Cache_TTL n’est pas spécifiée, Amazon EKS Fargate ajoute une valeur par défaut de 30 minutes pour diminuer la charge sur le serveur d’API.

Pour envoyer les journaux de processus de Fluent Bit à votre compte

Vous pouvez aussi envoyer les journaux de processus de Fluent Bit à Amazon CloudWatch en utilisant le ConfigMap suivant. L'envoi des journaux de processus Fluent Bit à CloudWatch implique des coûts supplémentaires d'ingestion de journaux et de stockage. Remplacez region-code par la région AWS dans laquelle votre cluster se situe.

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

Les journaux se trouvent dans CloudWatch, dans la même région AWS que le cluster. Le nom du groupe de journaux est my-cluster-fluent-bit-logs et le nom du flux de journaux Fluent Bit est fluent-bit-podname-pod-namespace .

Note
  • Les journaux de processus sont envoyés seulement lorsque le processus Fluent Bit démarre avec succès. S'il y a un échec lors du démarrage de Fluent Bit, les journaux de processus sont manqués. Vous pouvez uniquement envoyer les journaux de processus à CloudWatch.

  • Pour déboguer l'envoi des journaux de processus à votre compte, vous pouvez appliquer le ConfigMap précédent pour obtenir les journaux de processus. L'échec du démarrage de Fluent Bit est généralement dû au fait que votre ConfigMap n'est pas analysé ou accepté par Fluent Bit lors du démarrage.

Pour arrêter l’envoi des journaux de processus Fluent Bit

L'envoi des journaux de processus Fluent Bit à CloudWatch implique des coûts supplémentaires d'ingestion de journaux et de stockage. Pour exclure les journaux de processus d'une configuration de ConfigMap existante, procédez comme suit.

  1. Localisez le groupe de journaux CloudWatch créé automatiquement pour les journaux de processus Fluent Bit de votre cluster Amazon EKS après avoir activé la journalisation Fargate. Il utilise le format my-cluster-fluent-bit-logs.

  2. Supprimez les flux de journaux CloudWatch existants créés pour les journaux de processus de chaque pod dans le groupe de journaux CloudWatch.

  3. Modifiez la ConfigMap et définissez flb_log_cw: "false".

  4. Redémarrez tous les pods existants du cluster.

Tester l'application

  1. Déployez un exemple de pod.

    1. Enregistrez le contenu suivant dans un fichier nommé sample-app.yaml sur votre ordinateur.

      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. Appliquez le fichier manifeste à votre cluster.

      kubectl apply -f sample-app.yaml
  2. Affichez les journaux NGINX en utilisant les destinations que vous avez configurées dans le fichier ConfigMap.

Considérations sur les tailles

Nous vous suggérons de prévoir jusqu'à 50 Mo de mémoire pour le routeur de journaux. Si votre application doit générer des journaux à un débit très élevé, vous devez prévoir jusqu'à 100 Mo.

Dépannage

Pour vérifier si la fonctionnalité de journalisation est activée ou désactivée pour une raison quelconque, telle qu’une valeur non valide ConfigMap, et pourquoi elle n’est pas valide, vérifiez les événements de votre Pod avec kubectl describe pod pod-name . La sortie peut inclure des événements de pods qui précisent si la journalisation est activée ou non, comme l’exemple de sortie suivant.

[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND [...] 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

Les événements du pod sont éphémères avec une période de temps dépendant des paramètres. Vous pouvez également afficher les annotations d’un pod à l’aide de kubectl describe pod pod-name . Dans l’annotation du pod, il existe des informations sur l’activation ou la désactivation de la fonction de journalisation et la cause.