启用自动扩缩组指标收集 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

启用自动扩缩组指标收集

本主题介绍如何使用 Amazon LambdaAmazon CloudTrail 启用自动扩缩组指标收集。Amazon EKS 不会自动为托管节点创建的自动扩缩组启用群组指标收集。

您可以使用自动扩缩组指标来跟踪自动扩缩组中的更改并设置阈值警报。自动扩缩组指标在 Auto Scaling 控制台或 Amazon CloudWatch 控制台中提供。启用后,自动扩缩组每分钟向 Amazon CloudWatch 发送采样数据。启用这些指标无需支付费用。

通过启用自动扩缩组指标收集,您将能够监控托管节点组的扩缩情况。自动扩缩组指标可报告自动扩缩组的最小、最大和所需大小。如果节点组中的节点数量小于最小大小(这表示节点组运行状况不佳),您可以创建警报。跟踪节点组大小在调整最大数量时也很有用,以便您的数据面板不会耗尽容量。

当您创建托管节点组时,Amazon CloudTrail 会向 Amazon EventBridge 发送一个 CreateNodegroup 事件。通过创建与 CreateNodegroup 事件匹配的 Amazon EventBridge 规则,您可以触发 Lambda 函数,来为与托管节点组关联的自动扩缩组启用群组指标收集。


            该示意图显示了托管节点组、CloudTrail 和 EventBridge 组件
启用自动扩缩组指标收集
  1. 为 Lambda 创建 IAM 角色。

    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. 创建允许描述 Amazon EKS 节点组和启用自动扩缩组指标收集的策略。

    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. 向 Lambda 的 IAM 角色附加策略。

    aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
  4. 添加 AWSLambdaBasicExecutionRole 托管策略,该策略具有函数将日志写入 CloudWatch Logs 所需的权限。

    aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  5. 创建 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. 创建部署程序包。

    cd /tmp zip function.zip lambda-handler.py
  7. 创建一个 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. 创建 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. 添加 Lambda 函数作为目标。

    aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
  10. 添加允许 EventBridge 调用 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

对于您使用 ASG_METRICS_COLLLECTION_ENABLED 设置为 TRUE 进行标记的任何托管节点组,Lambda 函数可为这些节点组启用自动扩缩组指标收集。要确认已启用 Auto Scaling group metrics collection(自动扩缩组指标收集),请在 Amazon EC2 控制台中导航到关联的自动扩缩组。在 Monitoring(监控)选项卡中,您可看到已激活 Enable(启用)复选框。