Comment activer les métriques Container Insights sur un cluster Amazon EKS ?

Lecture de 7 minute(s)
0

Je souhaite configurer Amazon CloudWatch Container Insights pour consulter les métriques de mon cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Résolution

Container Insights n'est pris en charge que sur les instances Linux. Amazon fournit une image de conteneur d'agent CloudWatch sur Amazon Elastic Container Registry (Amazon ECR). Pour en savoir plus, consultez la section cloudwatch-agent/cloudwatch-agent.

Avant de commencer, assurez-vous que vous remplissez les prérequis pour accéder à Container Insights dans CloudWatch. Pour les clusters AWS Fargate, vous devez définir un profil Fargate pour planifier des pods. En outre, le rôle de gestion des identités et des accès (IAM) d'Amazon EKS Pod doit permettre aux composants qui s'exécutent sur l'infrastructure Fargate d’appeler les API AWS. Par exemple, le rôle IAM doit être capable d'extraire des images de conteneur depuis Amazon ECR.

Utiliser l'agent CloudWatch pour configurer les métriques Container Insights sur votre cluster EKS

L'agent CloudWatch crée d'abord un groupe de journaux nommé aws/containerinsights/Cluster_Name/performance, puis envoie les événements du journal des performances au groupe de journaux. Lorsque vous configurez Container Insights pour collecter des métriques, vous devez déployer l'image du conteneur de l'agent CloudWatch en tant que DaemonSet à partir de Docker Hub. Par défaut, vous déployez l'image de conteneur en tant qu'utilisateur anonyme.

Remarque : Docker peut limiter le nombre d'images que vous pouvez extraire.

Pour utiliser l'agent CloudWatch afin de configurer Container Insights, procédez comme suit :

  1. Exécutez la commande suivante pour créer un espace de noms 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 compte de service pour l'agent CloudWatch nommé cloudwatch-agent :

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
  3. Exécutez la commande suivante pour créer un configmap en tant que fichier de configuration pour l'agent CloudWatch :

    ClusterName= my-cluster-name curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -

    Remarque : Remplacez my-cluster-name par le nom de votre cluster EKS. Pour en savoir plus, consultez la section Créer un ConfigMap pour l'agent CloudWatch.

  4. Exécutez la commande suivante pour déployer le DaemonSet cloudwatch-agent :

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
  5. (Facultatif) Exécutez la commande suivante pour appliquer un correctif au DaemonSet cloudwatch-agent afin qu'il extrait l'agent CloudWatch de l'ECR :

    kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'
    

    Remarque : L'image Docker de l’agent Cloudwatch sur ECR prend en charge les architectures ARM et AMD64. Remplacez la dernière identification d'image en fonction de la version de l'image et de l'architecture. Pour en savoir plus, consultez la section cloudwatch-agent/cloudwatch-agent.

  6. Pour les rôles IAM des comptes de service, créez un fournisseur OIDC ainsi qu'un rôle et une politique IAM. Exécutez ensuite la commande suivante pour associer le rôle IAM au compte de service cloudwatch-agent :

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

    Remarque : Remplacez ACCOUNT_ID par l’ID de votre compte et IAM_ROLE_NAME par le rôle IAM que vous utilisez pour les comptes de service.

Résoudre les problèmes liés à l'agent CloudWatch

Procédez comme suit :

  1. Exécutez la commande suivante pour récupérer la liste de pods :

    kubectl get pods -n amazon-cloudwatch
  2. Exécutez la commande suivante pour vérifier les événements au bas de la sortie :

    kubectl describe pod pod-name -n amazon-cloudwatch
  3. Exécutez la commande suivante pour vérifier les journaux :

    kubectl logs pod-name -n amazon-cloudwatch
    
  4. Si une erreur CrashLoopBackOff s'affiche pour l'agent CloudWatch, vérifiez que vous avez correctement configuré vos autorisations IAM.

Supprimer l'agent CloudWatch

Exécutez la commande suivante pour supprimer l'agent 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/cloudwatch-namespace.yaml

Remarque : Si vous supprimez l'espace de noms, les ressources associées sont également supprimées.

Utiliser Distro for OpenTelemetry pour configurer les métriques Container Insights sur votre cluster EKS

AWS Distro for OpenTelemetry crée d'abord un groupe de journaux nommé aws/containerinsights/Cluster_Name/performance, puis envoie les événements du journal des performances à ce groupe de journaux.

Procédez comme suit :

  1. Exécutez la commande suivante pour déployer AWS OpenTelemetry Collector en tant que DaemonSet :

    curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -
    

    Remarque : Pour plus d'informations, consultez la section Métriques de l'infrastructure EKS de Container Insights.

  2. Exécutez la commande suivante pour vérifier que le collecteur est en cours d'exécution :

    kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
    
  3. (Facultatif) Exécutez la commande suivante pour appliquer le correctif aws-otel-eks-ci au DaemonSet afin qu'il extrait l'image Docker aws-otel-collector sur ECR :

    kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

    Remarque : L'image Docker Cloudwatch-agent sur Amazon ECR prend en charge les architectures ARM et AMD64. Remplacez la dernière identification d'image en fonction de la version de l'image et de l'architecture.

  4. (Facultatif) Pour les rôles IAM des comptes de service, créez un fournisseur OIDC ainsi qu'un rôle et une politique IAM. Exécutez ensuite la commande suivante pour associer le rôle IAM au compte de service aws-otel-sa :

    kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
    

    Remarque : Remplacez ACCOUNT_ID par l’ID de votre compte et IAM_ROLE_NAME par le rôle IAM que vous utilisez pour les comptes de service.

Supprimer Distro for OpenTelemetry

Exécutez la commande suivante pour supprimer Distro for OpenTelemetry :

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |kubectl delete -f -

Utiliser Distro for OpenTelemetry pour configurer les métriques Container Insights sur un cluster EKS Fargate

Pour les applications qui s'exécutent sur EKS et Fargate, vous pouvez utiliser Distro for OpenTelemetry pour configurer Container Insights.
AWS OpenTelemetry Collector envoie les métriques suivantes à CloudWatch pour chaque charge de travail exécutée sur EKS Fargate :

  • pod_cpu_utilization_over_pod_limit
  • pod_cpu_usage_total
  • pod_cpu_limit
  • pod_memory_utilization_over_pod_limit
  • pod_memory_working_set
  • pod_memory_limit
  • pod_network_rx_bytes
  • pod_network_tx_bytes

AWS OpenTelemetry Collector collecte chaque métrique dans l'espace de noms CloudWatch nommé ContainerInsights. Dans la console CloudWatch, choisissez Métriques, puis Toutes les métriques. Vous pouvez accéder à ContainerInsights sous Espace de noms personnalisé.

Chaque métrique est associée aux jeux de dimensions suivants :

  • Nom du cluster, Type de lancement
  • Nom du cluster, Espace de noms, Type de lancement
  • Nom du cluster, Espace de noms, Nom du pod, Type de lancement

Pour en savoir plus, consultez la section Container Insights EKS Fargate.

Pour déployer Distro for OpenTelemetry dans votre EKS Fargate, procédez comme suit :

  1. Créez un espace de noms nommé fargate-container-insights.

  2. Utiliser le script suivant pour créer un rôle IAM nommé EKS-ADOT-ServiceAccount-Role associé à un compte de service Kubernetes nommé adot-collector. Le script d'assistance suivant requiert la commande eksctl :

    #!/bin/bashCLUSTER_NAME=YOUR-EKS-CLUSTER-NAMEREGION=YOUR-EKS-CLUSTER-REGION
    SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights
    SERVICE_ACCOUNT_NAME=adot-collector
    SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role
    SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
    
    kubectl create ns fargate-container-insights
    
    eksctl utils associate-iam-oidc-provider \
    --cluster=$CLUSTER_NAME \
    --approve
    
    eksctl create iamserviceaccount \
    --cluster=$CLUSTER_NAME \
    --region=$REGION \
    --name=$SERVICE_ACCOUNT_NAME \
    --namespace=$SERVICE_ACCOUNT_NAMESPACE \
    --role-name=$SERVICE_ACCOUNT_IAM_ROLE \
    --attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
    --approve

    Remarque : Remplacez CLUSTER_NAME par le nom de votre cluster et RÉGION par votre région AWS.

  3. Exécutez la commande suivante pour déployer AWS OpenTelemetry Collector en tant que StatefulSet Kubernetes :

    ClusterName= your-cluster-name Region= your-cluster-region curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -
    

    Remarque : Remplacez your-cluster-name par le nom de votre cluster et your-cluster-region par la région dans laquelle se trouve votre cluster. Assurez-vous que vous disposez d’un profil Fargate correspondant pour provisionner les pods StatefulSet sur AWS Fargate.

  4. Exécutez la commande suivante pour vérifier que le pod Distro for Open Telemetry Collector est en cours d'exécution :

    kubectl get pods -n fargate-container-insights
  5. (Facultatif) Exécutez la commande suivante pour appliquer un correctif au StatefulSet adot-collector afin qu'il extrait l'image Docker aws-otel-collector sur ECR :

    kubectl patch sts adot-collector -n fargate-container-insights -p \'{"spec":{"template":{"spec":{"containers":[{"name":"adot-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'
    

Supprimer Distro for OpenTelemetry

Exécutez la commande suivante pour supprimer Distro for OpenTelemetry :

eksctl delete iamserviceaccount --cluster CLUSTER_NAME --name adot-collector
ClusterName= your-cluster-name Region= your-cluster-region
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -

Remarque : Remplacez your-cluster-name par le nom de votre cluster et your-cluster-region par le nom de la région dans laquelle se trouve votre cluster.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois