Activer la collecte des métriques de groupe Auto Scaling - Amazon EKS

Aidez à améliorer cette page

Vous souhaitez contribuer à ce guide de l'utilisateur ? Faites défiler cette page vers le bas et sélectionnez Modifier cette page sur GitHub. Vos contributions aideront à améliorer notre guide de l'utilisateur pour tout le monde.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Activer la collecte des métriques de groupe Auto Scaling

Cette rubrique explique comment activer la collecte des métriques de groupe Auto Scaling à l'aide de AWS Lambda et AWS CloudTrail. Amazon EKS n'active pas automatiquement la collecte des métriques de groupe Auto Scaling créées pour les nœuds gérés.

Vous pouvez utiliser les métriques de groupe Auto Scaling pour suivre les modifications apportées à un groupe Auto Scaling et pour définir des alarmes sur les valeurs de seuil. Les métriques de groupe Auto Scaling sont disponibles dans la console Auto Scaling ou sur la CloudWatch console Amazon. Une fois activé, le groupe Auto Scaling envoie des échantillons de données à Amazon CloudWatch toutes les minutes. L'activation de ces métriques est gratuite.

En activant la collecte des métriques de groupe Auto Scaling, vous pourrez surveiller le dimensionnement des groupes de nœuds gérés. Les métriques de groupe Auto Scaling indiquent les tailles minimale, maximale et souhaitée d'un groupe Auto Scaling. Vous pouvez créer une alarme si le nombre de nœuds d'un groupe de nœuds est inférieur à la taille minimale, ce qui indique que le groupe est défectueux. Le suivi de la taille des groupes de nœuds permet également d'ajuster le nombre maximal afin que votre plan de données ne se retrouve pas à court de capacité.

Lorsque vous créez un groupe de nœuds gérés, AWS CloudTrail envoie un CreateNodegroup événement à Amazon EventBridge. En créant une EventBridge règle Amazon correspondant à l'CreateNodegroupévénement, vous déclenchez une fonction Lambda pour permettre la collecte de métriques de groupe pour le groupe Auto Scaling associé au groupe de nœuds gérés.

Schéma illustrant le groupe de nœuds gérés et le EventBridge composant CloudTrail
Pour activer la collecte des métriques de groupe Auto Scaling
  1. Créez un rôle IAM pour Lambda.

    LAMBDA_ROLE=$(aws iam create-role \ --role-name lambda-asg-enable-metrics \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' \ --output text \ --query 'Role.Arn') echo $LAMBDA_ROLE
  2. Créez une stratégie permettant de décrire les groupes de nœuds Amazon EKS et d'activer la collecte des métriques de groupe Auto Scaling.

    cat > /tmp/lambda-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeNodegroup", "autoscaling:EnableMetricsCollection" ], "Resource": [ "*" ] } ] } EOF LAMBDA_POLICY_ARN=$(aws iam create-policy \ --policy-name lambda-asg-enable-metrics-policy \ --policy-document file:///tmp/lambda-policy.json \ --output text \ --query 'Policy.Arn') echo $LAMBDA_POLICY_ARN
  3. Attachez la stratégie au rôle IAM pour Lambda.

    aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
  4. Ajoutez la politique AWSLambdaBasicExecutionRole gérée, qui dispose des autorisations dont la fonction a besoin pour écrire des journaux dans CloudWatch Logs.

    aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  5. Créez le code Lambda.

    cat > /tmp/lambda-handler.py <<EOF import json import boto3 import time import logging eks = boto3.client('eks') autoscaling = boto3.client('autoscaling') logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ASG_METRICS_COLLLECTION_TAG_NAME = "ASG_METRICS_COLLLECTION_ENABLED" initial_retry_delay = 10 attempts = 0 #print(event) if not event["detail"]["eventName"] == "CreateNodegroup": print("invalid event.") return -1 clusterName = event["detail"]["requestParameters"]["name"] nodegroupName = event["detail"]["requestParameters"]["nodegroupName"] try: metricsCollectionEnabled = event["detail"]["requestParameters"]["tags"][ASG_METRICS_COLLLECTION_TAG_NAME] except KeyError: print(ASG_METRICS_COLLLECTION_TAG_NAME, "tag not found.") return # Check if metrics collection is enabled in tags if metricsCollectionEnabled.lower() != "true": print("Metrics collection is not enabled in nodegroup tags.") return # Get the name of the associated autoscaling group print("Getting the autoscaling group name for nodegroup=", nodegroupName, ", cluster=", clusterName ) for i in range(0,10): try: autoScalingGroup = eks.describe_nodegroup(clusterName=clusterName,nodegroupName=nodegroupName)["nodegroup"]["resources"]["autoScalingGroups"][0]["name"] except: attempts += 1 print("Failed to obtain the associated autoscaling group for nodegroup", nodegroupName, "Retrying in", initial_retry_delay*attempts, "seconds.") time.sleep(initial_retry_delay*attempts) else: break print("Enabling metrics collection on autoscaling group ", autoScalingGroup) # Enable metrics collection in the autoscaling group try: enableMetricsCollection = autoscaling.enable_metrics_collection(AutoScalingGroupName=autoScalingGroup,Granularity="1Minute") except: print("Unable to enable metrics collection on nodegroup=",nodegroup) print("Enabled metrics collection on nodegroup", nodegroupName) EOF
  6. Créez un package de déploiement.

    cd /tmp zip function.zip lambda-handler.py
  7. Créez une fonction Lambda.

    LAMBDA_ARN=$(aws lambda create-function --function-name asg-enable-metrics-collection \ --zip-file fileb://function.zip --handler lambda-handler.lambda_handler \ --runtime python3.9 \ --timeout 600 \ --role $LAMBDA_ROLE \ --output text \ --query 'FunctionArn') echo $LAMBDA_ARN
  8. Créez une EventBridge règle.

    RULE_ARN=$(aws events put-rule --name CreateNodegroupRuleToLambda \ --event-pattern "{\"source\":[\"aws.eks\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventName\":[\"CreateNodegroup\"],\"eventSource\":[\"eks.amazonaws.com\"]}}" \ --output text \ --query 'RuleArn') echo $RULE_ARN
  9. Ajoutez la fonction Lambda en tant que cible.

    aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
  10. Ajoutez une politique qui permet d' EventBridge invoquer la fonction Lambda.

    aws lambda add-permission \ --function-name asg-enable-metrics-collection \ --statement-id CreateNodegroupRuleToLambda \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn $RULE_ARN

La fonction Lambda permet la collecte des métriques de groupe Auto Scaling pour tous les groupes de nœuds gérés auxquels vous attribuez une balise ASG_METRICS_COLLLECTION_ENABLED définie sur TRUE. Pour vérifier que la collecte des métriques de groupe Auto Scaling est activée, accédez au groupe Auto Scaling associé sur la console Amazon EC2. Dans l'onglet Monitoring (Surveillance), la case Enable (Activer) doit être cochée.