Comment diffuser les journaux de conteneurs vers CloudWatch dans Amazon EKS ?

Dernière mise à jour : 13/05/2022

Je souhaite diffuser les journaux de conteneurs exécutés dans Amazon Elastic Kubernetes Service (Amazon EKS) vers un système de journalisation tel que CloudWatch Logs. Comment procéder ?

Brève description

Vous pouvez utiliser Fluent Bit ou Fluentd pour envoyer des journaux depuis vos conteneurs vers vos journaux CloudWatch. Fluent Bit est la solution de journalisation par défaut pour Container Insights. Il est donc 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, veuillez consulter cloudwatch-agent sur Amazon ECR.

Lorsque vous configurez Fluent Bit en tant que DaemonSet pour l'envoi de journaux vers CloudWatch, Fluent Bit crée ces groupes de journaux, s'ils n'existent pas déjà :

Nom du groupe de journaux Source des journaux
/aws/containerinsights/ Cluster_Name/application Tous les fichiers journaux dans /var/log/containers
/aws/containerinsights/ Cluster_Name/host Journaux provenant de /var/log/dmesg, /var/log/secure et /var/log/messages
/aws/containerinsights/ Cluster_Name/dataplane Les journaux dans /var/log/journal pour kubelet.service, kubeproxy.service et docker.service

Solution

Conditions préalables

Avant de suivre ces étapes, passez en revue les conditions préalables :

  • Votre cluster EKS fonctionne avec des nœuds à l'état Ready (Prêt), et la commande kubectl est installée et en cours d'exécution.
  • La politique CloudWatchAgentServerPolicy gérée par AWS Identity and Access Management (IAM) permet à vos composants master Amazon EKS d'envoyer des métriques et des journaux vers CloudWatch. Pour ce faire, vous pouvez attacher une politique au rôle IAM de vos composants master. Vous pouvez également utiliser un rôle IAM pour les comptes de service du cluster et attacher la politique à ce rôle. Pour plus d'informations, veuillez consulter Rôles IAM pour les comptes de service.
  • Vous exécutez un cluster qui prend en charge Kubernetes version 1.18 ou ultérieure. Il s'agit d'une exigence de Container Insights pour EKS Fargate. Vous avez également défini un profil Fargate pour la planification des pods sur Fargate.
  • Le rôle d'exécution de pods EKS permet aux composants qui s'exécutent sur l'infrastructure Fargate d'appeler les API AWS en votre nom. Par exemple, pour l'extraction d'images de conteneurs depuis Amazon ECR.

Diffuser les journaux de conteneurs exécutés dans votre cluster EC2 EKS

Pour diffuser les journaux de conteneurs vers CloudWatch Logs, installez AWS for Fluent Bit en procédant comme suit :

1.    Créez un espace de noms appelé amazon-cloudwatch, si vous n'en avez pas déjà un :

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 cette commande afin de créer un fichier ConfigMap appelé fluent-bit-cluster-info, comprenant le nom du cluster et la région auxquels vous souhaitez envoyer des journaux. Remplacez my-cluster-name et my-cluster-region par le nom et la région de votre cluster.

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.    Déployez le DaemonSet de configuration optimisée Fluent Bit sur le cluster :

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 : appliquez un correctif au DaemonSet aws-for-fluent-bit pour utiliser l'image AWS for Fluent Bit sur Amazon Elastic Container Registry :

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 les rôles IAM de comptes de service, créez un fournisseur OIDC ainsi qu'un rôle et une politique IAM. Associez ensuite le rôle IAM aux comptes de service cloudwatch-agent et fluent-bit. Remplacez ACCOUNT_ID et IAM_ROLE_NAME par l'ID de compte AWS et le rôle IAM utilisés pour les comptes de service.

kubectl annotate serviceaccounts fluent-bit -n cloudwatch-agent "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Pour plus de personnalisation, veuillez consulter Configurer Fluent Bit en tant que DaemonSet pour l'envoi de journaux à CloudWatch Logs.

Dépanner le déploiement de Fluent Bit

1.    Exécutez cette commande puis vérifiez les événements en bas de la sortie :

kubectl describe pod pod-name -n amazon-cloudwatch

2.    Exécutez cette commande pour vérifier les journaux :

kubectl logs pod-name -n amazon-cloudwatch

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 exécutés dans votre cluster EKS Fargate

Amazon EKS sur Fargate est doté d'un routeur de journaux intégré basé sur Fluent Bit. Cela signifie que vous n'exécutez pas explicitement un conteneur Fluent Bit en tant que side-car. Au lieu de cela, Amazon l'exécute pour vous. Pour plus de détails, veuillez consulter Journalisation Fargate.

Procédez comme suit pour diffuser les journaux de conteneurs vers CloudWatch Logs :

1.    Créez un espace de noms Kubernetes dédié appelé 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.    Créez un fichier ConfigMap avec une valeur de données Fluent Conf pour envoyer les journaux de conteneurs vers CloudWatch Logs :

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 IAM à l'aide de la politique IAM CloudWatch, puis attachez-la au rôle d'exécution de pod spécifié pour votre profil Fargate.

  • Téléchargez la politique IAM CloudWatch sur votre ordinateur. Vous pouvez également consulter la politique sur GitHub.
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  • 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
  • Attachez la politique IAM au rôle d'exécution de pod spécifié pour votre profil Fargate. Remplacez « 111122223333 » par votre ID de compte.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
--role-name your-pod-execution-role

Pour plus d'informations sur le dépannage d'AWS Fluent Bit exécuté sur EKS Fargate, veuillez consulter la page Dépannage.

Désactiver les journaux de streaming des pods EKS Fargate

Pour désactiver les journaux de streaming de vos pods EKS Fargate, exécutez cette commande :

kubectl delete namespace aws-observability

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


Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?