Habilitar coleta de métricas do grupo do Auto Scaling - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Role até o final desta página e selecione Editar esta página no GitHub. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Habilitar coleta de métricas do grupo do Auto Scaling

Este tópico descreve como você pode habilitar a coleta de métricas de grupo do Auto Scaling usando o AWS Lambda e o AWS CloudTrail. O Amazon EKS não habilita automaticamente a coleta de métricas de grupo para grupos do Auto Scaling criados para nós gerenciados.

Você pode usar métricas de grupo do Auto Scaling para rastrear alterações em um grupo do Auto Scaling e definir alarmes nos valores limite. As métricas de grupo do Auto Scaling estão disponíveis no console do Auto Scaling ou no console do Amazon CloudWatch. Uma vez habilitado, o grupo do Auto Scaling envia dados de amostragem ao Amazon CloudWatch a cada minuto. A habilitação dessas métricas não é cobrada.

Habilitando a coleta de métricas de grupo do Auto Scaling, você poderá monitorar a escalação de grupos de nós gerenciados. As métricas do grupo do Auto Scaling informam o tamanho mínimo, máximo e desejado de um grupo do Auto Scaling. Você pode criar um alarme se o número de nós em um grupo de nós ficar abaixo do tamanho mínimo, o que indicaria um grupo de nós não íntegro. O rastreamento do tamanho do grupo de nós também é útil para ajustar o número máximo para a capacidade do plano de dados não se esgote.

Quando você cria um grupo de nós gerenciados, o AWS CloudTrail envia um evento CreateNodegroup para o Amazon EventBridge. Criando uma regra do Amazon EventBridge que corresponda ao evento CreateNodegroup, você aciona uma função do Lambda para habilitar a coleta de métricas de grupo para o grupo do Auto Scaling associado ao grupo de nós gerenciados.

Diagrama mostrando o grupo de nós gerenciados, o CloudTrail e o componente EventBridge
Para habilitar coleta de métricas do grupo do Auto Scaling
  1. Crie um perfil do IAM para o 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. Crie uma política que permita descrever os grupos de nós do Amazon EKS e habilitar a coleta de métricas de grupo do 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. Anexe a política ao perfil do IAM para o Lambda.

    aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
  4. Adicione a política gerenciada do AWSLambdaBasicExecutionRole, que tem as permissões necessárias para a função gravar logs no CloudWatch Logs.

    aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  5. Crie o código do 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. Crie um pacote de implantação.

    cd /tmp zip function.zip lambda-handler.py
  7. Crie uma função do 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. Crie uma regra 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. Adicione a função do Lambda como destino.

    aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
  10. Adicione uma política que permita que o EventBridge invoque a função do 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

A função do Lambda permite a coleta de métricas de grupo do Auto Scaling para qualquer grupo de nós gerenciados que você marque com ASG_METRICS_COLLLECTION_ENABLED definido como TRUE. Para confirmar se a coleta de métricas do grupo do Auto Scaling está habilitada, navegue até o grupo do Auto Scaling associado no console do Amazon EC2. Na guia Monitoring (Monitoramento), você deve ver que a caixa de seleção Enable (Habilitar) está ativada.