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

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

Je souhaite configurer Amazon CloudWatch Container Insights et consulter les métriques de mon cluster Amazon Elastic Kubernetes Service (Amazon EKS). Comment procéder ?

Brève description

Lorsqu'il est utilisé avec Amazon EKS, Container Insights utilise une version conteneurisée de l'agent CloudWatch ou du collecteur AWS Distro for OpenTelemetry (ADOT) pour identifier tous les conteneurs exécutés dans un cluster. Il collecte ensuite les données de performance dans chaque couche de la pile de performances. Container Insights collecte les données telles que les événements du journal de performances à l'aide d'un format de métriques intégrées. Le service envoie ensuite ces données à CloudWatch Logs, sous le groupe de journaux /aws/containerinsights/cluster-name/performance. À partir de ces données, 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 depuis des clusters déployés sur AWS Fargate pour Amazon EKS. Pour plus d'informations sur Container Insights, veuillez consulter Utilisation de Container Insights.

Remarque : Container Insights est pris en charge uniquement sur les instances Linux. Amazon fournit une image de conteneur d'agent CloudWatch sur Amazon Elastic Container Registry (Amazon ECR). Pour plus d'informations, veuillez consulter cloudwatch-agent sur Amazon ECR.

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.

Configurer des métriques Container Insights sur votre cluster EC2 EKS à l'aide de l'agent CloudWatch

L'agent CloudWatch (ou AWS Distro for OpenTelemetry) crée un groupe de journaux nommé aws/containerinsights/Cluster_Name/performance. Il envoie ensuite les événements du journal de performances à ce groupe de journaux.

Pour configurer Container Insights afin de collecter des métriques, procédez comme suit et déployez l'image de conteneur d'agent CloudWatch comme Daemonset depuis Docker Hub, en tant qu'utilisateur anonyme par défaut. Cette extraction peut être soumise à une limite de débit.

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.    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 fichier 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 personnaliser davantage la configuration de l'agent CloudWatch, veuillez consulter Créer une ConfigMap pour l'agent CloudWatch.

4.    Facultatif : pour extraire l'agent CloudWatch de l'Amazon Elastic Container Registry, appliquez un correctif au 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 ECR prend en charge les architectures ARM et AMD64. Remplacez la dernière identification d'image en fonction de la version et de l'architecture de l'image. Pour plus d'informations, veuillez consulter les identifications d'images cloudwatch-agent sur Amazon ECR.

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 au compte de service cloudwatch-agent. 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 cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Dépanner l'agent CloudWatch

1.    Exécutez cette commande pour obtenir la liste des pods :

kubectl get pods -n amazon-cloudwatch

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

kubectl describe pod pod-name -n amazon-cloudwatch

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

kubectl logs pod-name -n amazon-cloudwatch

4.    Si une erreur CrashLoopBackOff s'affiche pour l'agent CloudWatch, assurez-vous que vos autorisations IAM sont correctement définies.

Pour plus d'informations, veuillez consulter la section Vérifiez les conditions préalables.

Supprimer l'agent CloudWatch

Utilisez ces commandes 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
kubectl delete -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
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 delete -f -

Configurer des métriques Container Insights sur votre cluster EC2 EKS à l'aide d'ADOT

1.    Exécutez cette commande pour déployer le collecteur ADOT en tant que DaemonSet. Pour plus de personnalisations, veuillez consulter Container Insights EKS infrastructure metrics.

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

2.    Vérifiez que le collecteur est en cours d'exécution :

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

3.    Facultatif : l'image aws-otel-collector est extraite de Docker Hub en tant qu'utilisateur anonyme, par défaut. Cette extraction peut être soumise à une limite de débit. Pour extraire l'image Docker aws-otel-collector sur Amazon ECR, appliquez le correctif sur le 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 ECR prend en charge les architectures ARM et AMD64. Remplacez la dernière identification d'image en fonction de la version et de l'architecture de l'image. Pour plus d'informations, veuillez consulter les identifications d'images cloudwatch-agent sur Amazon ECR.

5.    Facultatif : 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 au compte de service aws-otel-sa. 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 aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Supprimer ADOT

Pour supprimer AWS Distro for OpenTelemetry, exécutez cette commande :

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

Configurer des métriques Container Insights sur un cluster EKS Fargate à l'aide d'ADOT

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

Remarque : une seule instance du collecteur ADOT n'est pas suffisante pour collecter des métriques de ressources depuis tous les nœuds d'un cluster.

Le collecteur ADOT envoie ces métriques à 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 aux jeux de dimensions suivants et collectée dans l'espace de noms CloudWatch nommé ContainerInsights.

  • ClusterName, LaunchType
  • ClusterName, Namespace, LaunchType
  • ClusterName, Namespace, PodName, LaunchType

Pour plus de détails, veuillez consulter la page Container Insights EKS Fargate.

Afin de déployer ADOT dans votre EKS Fargate, suivez ces étapes :

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. Veillez à modifier les variables CLUSTER_NAME et REGION. Ce script d'assistance nécessite eksctl.

#!/bin/bash
CLUSTER_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

2.    Déployez le collecteur ADOT en tant que Kubernetes StatefulSet à l'aide de cette commande. Remplacez my-cluster-name par le nom de votre cluster EKS et my-cluster-region par le nom de la région.

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 -

3.    Vérifiez que le pod de collecteur ADOT est en cours d'exécution :

kubectl get pods -n fargate-container-insights

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

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

Supprimer ADOT

Exécutez ces commandes pour supprimer ADOT.

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 -

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


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