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

Lecture de 8 minute(s)
0

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

Brève description

Lorsque vous utilisez Container Insights avec Amazon EKS, celui-ci utilise une version conteneurisée de l'agent CloudWatch pour trouver tous les conteneurs en cours d'exécution dans un cluster. Container Insights utilise également le collecteur AWS Distro for OpenTelemetry (ADOT) pour rechercher des conteneurs dans un cluster. Container Insights collecte ensuite des données de performance à chaque couche de la pile de performance, notamment les événements du journal de performance qui utilisent un format métrique incorporé. Container Insights envoie ensuite ces données aux journaux CloudWatch sous le groupe de journaux /aws/containerinsights/cluster-name/performance où CloudWatch crée des métriques agrégées au niveau du cluster, du nœud et du pod. Container Insights prend également en charge la collecte de métriques à partir de clusters déployés sur AWS Fargate pour Amazon EKS. Pour plus d'informations, consultez la section Utilisation de Container Insights.

Remarque : 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 cloudwatch-agent/cloudwatch-agent sur Amazon ECR.

Résolution

Conditions préalables

  • Votre cluster Amazon EKS fonctionne avec des nœuds dans l'état Ready (Prêt) et la commande kubectl installée s'exécute.
  • La stratégie CloudWatchAgentServerPolicy conçue par AWS Identity and Access Management (IAM) active vos composants master Amazon EKS pour envoyer des métriques et des journaux à CloudWatch. Pour activer vos composants master, associez une stratégie au rôle IAM des composants master. Vous pouvez également utiliser un rôle IAM pour les comptes de service du cluster et associer la stratégie à ce rôle. Pour en savoir plus, consultez la section Rôles IAM pour les comptes de service.
  • Vous utilisez un cluster qui prend en charge la version 1.18 ou supérieure de Kubernetes. Il s'agit d'une exigence de Container Insights pour EKS Fargate. Assurez-vous également de définir un profil Fargate pour planifier les pods sur Fargate.
  • Le rôle IAM du pod Amazon EKS doit permettre aux composants qui s'exécutent sur l'infrastructure Fargate d’appeler les API AWS en votre nom. Par exemple, le rôle IAM doit être capable d'extraire des images de conteneurs depuis Amazon ECR.

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

L'agent CloudWatch ou ADOT 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. 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, l’opération s’effectue en tant qu'utilisateur anonyme. Cette extraction peut être soumise à une limite de taux.

1.Si vous n'avez pas d'espace de noms amazon-cloudwatch, créez-en 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.Créez 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.Créez 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.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

(Facultatif) pour extraire l'agent CloudWatch du registre conteneur Amazon Elastic, appliquez le correctif DaemonSet cloudwatch-agent :

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 Cloudwatch-agent sur Amazon ECR prend en charge les architectures ARM et AMD64. Remplacez la dernière étiquette d'image en fonction de la version de l'image et de l'architecture. Pour plus d'informations, reportez-vous aux étiquettes d'images cloudwatch-agent sur Amazon ECR.

5.Pour les rôles IAM des comptes de service, créez un fournisseur OIDC ainsi qu'un rôle et une politique IAM. Associez ensuite 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

1.Pour récupérer la liste des pods, exécutez cette commande :

kubectl get pods -n amazon-cloudwatch

2.Pour vérifier les événements en bas de la sortie, exécutez cette commande :

kubectl describe pod pod-name -n amazon-cloudwatch

3.Vérifier les journaux :

kubectl logs pod-name -n amazon-cloudwatch

4.Si l'erreur CrashLoopBackOff se produit pour l'agent CloudWatch, assurez-vous que vos autorisations IAM sont correctement définies. Pour plus d'informations, consultez la section Vérifier les conditions préalables.

Supprimer l'agent CloudWatch

Pour supprimer l'agent CloudWatch, exécutez cette commande :

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 : la suppression de l'espace de noms supprime également les ressources associées.

Utiliser ADOT pour configurer les métriques Container Insights sur votre cluster EC2

1.Pour déployer le collecteur ADOT en tant que DaemonSet, exécutez la commande suivante :

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

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

2.Pour confirmer que le collecteur est en cours d'exécution, exécutez la commande suivante :

kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks

3.(Facultatif) par défaut, l'image aws-otel-collector est extraite de Docker Hub en tant qu'utilisateur anonyme. Cette extraction peut être soumise à une limite de taux. Pour extraire l'image Docker aws-otel-collector d’Amazon ECR, appliquez le correctif DaemonSet aws-otel-eks-ci :

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 étiquette d'image en fonction de la version de l'image et de l'architecture. Pour plus d'informations, reportez-vous aux étiquettes d'images cloudwatch-agent sur Amazon ECR.

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. Associez ensuite 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 ADOT

Pour supprimer ADOT, exécutez la commande suivante :

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

Utiliser ADOT pour configurer les métriques Container Insights sur un cluster EKS Fargate

Pour les applications qui s'exécutent sur Amazon EKS et AWS Fargate, vous pouvez utiliser ADOT pour configurer Container Insights. L'architecture réseau EKS Fargate ne permet pas aux pods d'accéder directement au kubelet du composant pour récupérer les métriques des ressources. Le collecteur ADOT appelle d'abord le serveur d'API Kubernetes pour établir la connexion par proxy au kubelet sur un composant master. Il collecte ensuite les métriques Advisor de Kubelet pour les charges de travail sur ce nœud.

Le collecteur ADOT 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

Chaque métrique est associée à ces ensembles de dimensions et collectée sous l'espace de noms CloudWatch nommé ContainerInsights :

  • 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 ADOT dans votre EKS Fargate, procédez comme suit :

1.Associez un compte de service Kubernetes à un rôle IAM. Créez 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-NAME
REGION=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

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.

2.Pour déployer le collecteur ADOT en tant que StatefulSet Kubernetes, exécutez la commande suivante :

ClusterName=<my-cluster-name>Region=<my-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 : assurez-vous que vous avez un profil Fargate correspondant pour approvisionner les pods StatefulSet sur AWS Fargate. Remplacez my-cluster-name par le nom de votre cluster et my-cluster-region par le nom de la région AWS de votre cluster.

3.Pour vérifier que le pod ADOT Collector est en cours d'exécution, exécutez la commande suivante :

kubectl get pods -n fargate-container-insights

4.(Facultatif) par défaut, l'image aws-otel-collector est extraite de Docker Hub en tant qu'utilisateur anonyme. Cette extraction peut être soumise à une limite de taux. Pour extraire l'image Docker aws-otel-collector d’Amazon ECR, appliquez le correctif StatefulSet adot-collector :

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 ADOT

Pour supprimer ADOT, exécutez la commande suivante :

eksctl delete iamserviceaccount --cluster CLUSTER_NAME --name adot-collector

ClusterName=<my-cluster-name>Region=<my-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 -
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois