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 est la solution de journalisation par défaut pour CloudWatch Container Insights. Il est recommandé d'utiliser Fluent Bit au lieu de Fluentd. Amazon fournit une image de conteneur Fluent Bit sur Amazon Elastic Container Registry (Amazon ECR). Pour plus d'informations, consultez la section AWS pour les référentiels AWS pour Fluent Bit Image pour Amazon ECS.

Pour télécharger Fluent Bit, consultez la section Premiers pas 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.

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ésolution des erreurs liées à l'AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

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

Procédez comme suit :

  1. Exécutez la commande kubectl suivante pour créer un espace de noms appelé amazon-cloudwatch :

    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. Exécutez la commande suivante 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 :

    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 par le nom de votre cluster et MY-CLUSTER-REGION par la région de votre cluster.

  3. Pour déployer Fluent Bit en tant que DaemonSet afin d'envoyer des journaux à votre cluster Amazon Elastic Compute Cloud (Amazon EC2), 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/fluent-bit/fluent-bit.yaml

    Une fois que vous avez exécuté la commande précédente, Fluent Bit crée les groupes de journaux et les sources d'applications, d'hôtes et de plans de données suivants dans CloudWatch :
    La source du journal /aws/containerinsights/Cluster_Name/application est constituée de tous les fichiers journaux du groupe de journaux /var/log/containers.
    La source de journal /aws/containerinsights/Cluster_Name/host collecte les journaux des groupes de journaux /var/log/dmesg, /var/log/secure et /var/log/messages.
    La source de journal /aws/containerinsights/Cluster_Name/dataplane collecte les journaux des groupes de journaux /var/log/journal pour les groupes de journaux kubelet.service,kubeproxy.service, et docker.service.

  4. (Facultatif) Exécutez la commande suivante pour utiliser Fluent Bit sur Amazon ECR au lieu de l'image par défaut :

    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. Installez eksctl.
    Remarque : pour exécuter la commande suivante, vous devez installer eksctl.

  6. Exécutez la commande eksctl suivante Pour créer des rôles Gestion des identités et des accès AWS (IAM) pour les comptes de service (IRSA) :

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

Vérifier le déploiement de Fluent Bit

Procédez comme suit :

  1. Exécutez la commande kubectl suivante pour répertorier les noms de pods dans l'espace de noms amazon-cloudwatch :
    kubectl get pods -n amazon-cloudwatch
    Remarque : le nom du pod est renvoyé sous la forme fluent-bit-*****.
  2. Exécutez la commande kubectl describe suivante pour vérifier la sortie des événements pour un pod spécifique :
    kubectl describe pod POD_NAME -n amazon-cloudwatch
    Remarque : remplacez POD_NAME par le nom de votre pod.
  3. Exécutez la commande kubectl suivante pour vérifier les journaux :
    kubectl logs pod-name -n amazon-cloudwatch
    Remarque : remplacez POD_NAME par le nom de votre pod.

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 en votre nom. Pour plus de détails, consultez la section Démarrer la journalisation AWS Fargate pour votre cluster.

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.
    Remarque : associez ensuite la politique IAM au rôle d'exécution du pod que vous avez spécifié pour votre profil Fargate. Remplacez 111122223333 par votre identifiant de compte AWS et your-pod-execution-role par le nom de votre rôle d'exécution de pod.

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

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  5. Exécutez la commande create-policy suivante pour créer une politique IAM à partir du fichier de politique :

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  6. Exécutez la commande attach-role-policy suivante au rôle d'exécution du pod que vous avez spécifié pour votre profil Fargate, pour associer la politique IAM :

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role
  7. Exécutez la commande kubectl suivante pour vérifier que la configuration de journalisation s'applique à vos pods Fargate :

    kubectl describe pod POD-NAME

    Remarque : remplacez POD_NAME par le nom de votre pod. La sortie inclut des événements Pod qui confirment si la journalisation est active. Pour en savoir plus, consultez la section Résolution des problèmes.

Nettoyez le déploiement du flux de journaux Fluent Bit

Si vous avez déployé Fluent Bit sur un cluster EC2, exécutez les commandes kubectl suivantes pour supprimer le déploiement de Fluent Bit :

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

Si vous avez déployé Fluent Bit sur un cluster Fargate, exécutez la commande kubectl suivante pour supprimer l'espace de noms aws-observability. Cela supprime le ConfigMap et arrête la diffusion des journaux :

kubectl delete namespace aws-observability

Remarque : une fois que vous avez supprimé l'espace de noms aws-observability, les nouveaux pods Fargate n'envoient pas de journaux à CloudWatch Logs. Les pods existants continuent à envoyer des journaux jusqu'à ce que vous les supprimiez et que vous les redéployiez. Les journaux que CloudWatch a déjà reçus restent disponibles dans CloudWatch Logs.

Informations connexes

Configurer Fluent Bit en tant que DaemonSet pour envoyer des journaux à CloudWatch Logs