Habilitación de la recopilación de métricas de grupo de escalado automático - Amazon EKS

Ayude a mejorar esta página

¿Quiere contribuir a esta guía del usuario? Desplácese hasta el final de esta página y seleccione Editar esta página en GitHub. Sus contribuciones ayudarán a que nuestra guía del usuario sea mejor para todos.

Habilitación de la recopilación de métricas de grupo de escalado automático

En este tema, se explica cómo habilitar la recopilación de métricas de grupo de escalado automático mediante AWS Lambda y AWS CloudTrail. Amazon EKS no habilita automáticamente la recopilación de métricas de grupo para los grupos de escalado automático creados para los nodos administrados.

Puede utilizar las métricas de grupo de escalado automático para realizar un seguimiento de los cambios en un grupo de escalado automático y configurar alarmas en los valores de umbral. Las métricas de grupo de escalado automático están disponibles en la consola de Auto Scaling o en la consola de Amazon CloudWatch. Una vez habilitadas, el grupo de escalado automático envía datos de muestra a Amazon CloudWatch cada minuto. No se aplica ningún cargo por habilitar estas métricas.

Al habilitar la recopilación de métricas de grupo de escalado automático, podrá supervisar el escalado de los grupos de nodos administrados. Las métricas de grupo de escalado automático indican el tamaño mínimo, máximo y deseado de un grupo de escalado automático. Puede crear una alarma si el número de nodos de un grupo de nodos está por debajo del tamaño mínimo, lo que indicaría que el grupo de nodos no funciona bien. El seguimiento del tamaño de un grupo de nodos también es útil para ajustar el recuento máximo de modo que el plano de datos no se quede sin capacidad.

Al crear un grupo de nodos administrado, AWS CloudTrail envía un evento CreateNodegroup a Amazon EventBridge. Al crear una regla de Amazon EventBridge que coincida con el evento CreateNodegroup, se activa una función de Lambda para habilitar la recopilación de métricas de grupo para el grupo de escalado automático asociado al grupo de nodos administrado.

Diagrama que muestra el grupo de nodos administrado, CloudTrail y el componente EventBridge
Para habilitar la recopilación de métricas de grupo de escalado automático
  1. Cree un rol de IAM para 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. Cree una política que permita describir los grupos de nodos de Amazon EKS y habilitar la recopilación de métricas de grupo de escalado automático.

    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. Adjunte la política de rol de IAM para Lambda.

    aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
  4. Agregue la política administrada AWSLambdaBasicExecutionRole, que tiene los permisos que la función necesita para escribir registros en los registros de CloudWatch.

    aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  5. Cree el código de 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. Cree un paquete de implementación.

    cd /tmp zip function.zip lambda-handler.py
  7. Creación de una función de 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. Cree una regla de EventBridge.

    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. Agregue la función de Lambda como objetivo.

    aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
  10. Agregue una política que permita a EventBridge invocar la función de 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 función de Lambda permite recopilar métricas de grupo de escalado automático para cualquier grupo de nodos administrado que etiquete con ASG_METRICS_COLLLECTION_ENABLED establecido como TRUE. Para confirmar que la recopilación de métricas de grupo de escalado automático está habilitada, vaya al grupo de escalado automático en la consola de Amazon EC2. En la pestaña Monitoring (Supervisión), verá que la casilla Enable (Habilitar) está activada.