Passer au contenu

Comment puis-je diffuser des journaux de conteneurs vers CloudWatch dans Amazon EKS ?

Lecture de 6 minute(s)
0

Je souhaite utiliser Fluent Bit ou Fluentd pour diffuser des journaux depuis des conteneurs exécutés dans Amazon Elastic Kubernetes Service (Amazon EKS) vers Amazon CloudWatch Logs.

Brève description

Fluent Bit étant la solution de journal par défaut pour CloudWatch Container Insights, il est recommandé d'utiliser Fluent Bit au lieu de Fluentd.Amazon fournit une image de conteneur d'agent Fluent Bit sur Amazon Elastic Container Registry (Amazon ECR). Pour plus d'informations, consultez la section AWS pour les référentiels d’images AWS for Fluent Bit pour Amazon ECS.

Pour télécharger Fluent Bit, consultez la section Mise en route avec Fluent Bit sur le site Web de Fluent Bit. Pour Fluentd, consultez la section Télécharger Fluentd sur le site Web de Fluentd.

Lorsque vous configurez Fluent Bit en tant que DaemonSet pour envoyer des journaux à CloudWatch, Fluent Bit crée les groupes de journaux et les sources suivants :

  • /aws/containerinsights/Cluster_Name/application : La source du journal est constituée de tous les fichiers journaux contenus dans /var/log/containers.
  • /aws/containerinsights/Cluster_Name/host : La source du journal est constituée des journaux provenant de /var/log/dmesg, /var/log/secure et de /var/log/messages.
  • /aws/containerinsights/Cluster_Name/dataplane : La source du journal est constituée des journaux dans /var/log/journal pour kubelet.service, kubeproxy.service et docker.service.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.

Diffuser les journaux de conteneurs qui s'exécutent dans Amazon EKS sur un cluster Amazon EC2

Procédez comme suit :

  1. Pour créer un espace de noms appelé amazon-cloudwatch, exécutez la commande suivante :

    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. Pour créer un ConfigMap appelé fluent-bit-cluster-info qui inclut le nom du cluster et la région AWS vers laquelle vous souhaitez envoyer des journaux, exécutez la commande suivante :

    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

    Remarque : Remplacez my-cluster-name et my-cluster-region par le nom de votre cluster et votre région.

  3. Pour utiliser Fluent Bit afin d'envoyer des journaux à un cluster Amazon Elastic Compute Cloud (Amazon EC2), exécutez la commande DaemonSet suivante :

    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. (Facultatif) Pour utiliser Fluent Bit sur Amazon ECR, exécutez la commande DaemonSet aws-for-fluent-bit suivante :

    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. Pour créer des rôles AWS Identity and Access Management pour les comptes de service (IRSA), exécutez la commande eksctl suivante :

    eksctl create iamserviceaccount \
        --name fluent-bit \
        --namespace amazon-cloudwatch \
        --cluster $CLUSTER \
        --attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
        --approve \
        --override-existing-serviceaccounts

    Pour plus d'informations, consultez la section Configurer Fluent Bit en tant que DaemonSet pour envoyer des journaux à CloudWatch Logs.

Résoudre les problèmes de déploiement de Fluent Bit

Procédez comme suit :

  1. Pour répertorier les noms de pods dans l'espace de noms amazon-cloudwatch, exécutez la commande suivante :

    kubectl get pods -n amazon-cloudwatch

    Remarque : Le nom du pod est renvoyé sous la forme fluent-bit-*****.

  2. Pour vérifier la sortie des événements, exécutez la commande suivante :

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    Remarque : Remplacez POD_NAME par le nom de votre pod.

  3. Pour vérifier les journaux, exécutez la commande suivante :

    kubectl logs pod-name -n amazon-cloudwatch

    Remarque : Remplacez POD_NAME par le nom de votre pod.

Supprimer le déploiement de Fluent Bit

Pour supprimer le déploiement de Fluent Bit, exécutez les commandes suivantes :

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

Diffuser les journaux de conteneurs qui s'exécutent dans Amazon EKS sur un cluster Fargate

Amazon EKS sur un cluster AWS Fargate comprend un routeur de journal intégré basé sur Fluent Bit. AWS exécute automatiquement Fluent Bit pour vous. Pour plus de détails, consultez la section Démarrer la journalisation AWS Fargate pour votre cluster.

Pour diffuser les journaux des conteneurs vers CloudWatch Logs, procédez comme suit :

  1. Pour créer un espace de noms Kubernetes dédié appelé aws-observability, exécutez la commande suivante :

    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. Pour créer un ConfigMap avec une valeur de données FluentConf afin de diffuser les journaux de conteneurs vers CloudWatch Logs, exécutez la commande suivante :

    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. Créez une politique gérée par AWS pour CloudWatch. Associez ensuite la politique IAM au rôle d'exécution du pod que vous avez spécifié pour votre profil Fargate.

    Pour télécharger le fichier de politique IAM, exécutez la commande suivante :

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

    Pour créer une politique IAM à partir du fichier de politique, exécutez la commande create-policy suivante :

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

    Pour associer la politique IAM au rôle d'exécution du pod que vous avez spécifié pour votre profil Fargate, exécutez la commande attach-role-policy suivante :

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role

    Remarque : Remplacez 111122223333 par votre ID de compte.

    Pour en savoir plus, consultez la section Résolution des problèmes.

Désactiver les journaux de streaming pour EKS sur les pods Fargate

Pour désactiver les journaux de streaming pour vos pods EKS sur Fargate, exécutez la commande suivante :

kubectl delete namespace aws-observability

Supprimez des pods, puis redéployez-les après avoir supprimé l'espace de noms aws-observability.