帮助改进此页面
想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。
启用自动扩缩组指标收集
本主题介绍如何使用 Amazon Lambda
您可以使用自动扩缩组指标来跟踪自动扩缩组中的更改并设置阈值警报。自动扩缩组指标在 Auto Scaling 控制台或 Amazon CloudWatch
通过启用自动扩缩组指标收集,您将能够监控托管节点组的扩缩情况。自动扩缩组指标可报告自动扩缩组的最小、最大和所需大小。如果节点组中的节点数量小于最小大小(这表示节点组运行状况不佳),您可以创建警报。跟踪节点组大小在调整最大数量时也很有用,以便您的数据面板不会耗尽容量。
当您创建托管节点组时,Amazon CloudTrail 会向 Amazon EventBridgeCreateNodegroup
事件。通过创建与 CreateNodegroup
事件匹配的 Amazon EventBridge 规则,您可以触发 Lambda 函数,来为与托管节点组关联的自动扩缩组启用群组指标收集。
启用自动扩缩组指标收集
-
为 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
-
创建允许描述 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
-
向 Lambda 的 IAM 角色附加策略。
aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
-
添加
AWSLambdaBasicExecutionRole
托管策略,该策略具有函数将日志写入 CloudWatch Logs 所需的权限。aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
-
创建 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
-
创建部署程序包。
cd /tmp zip function.zip lambda-handler.py
-
创建一个 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
-
创建 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
-
添加 Lambda 函数作为目标。
aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
-
添加允许 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(启用)复选框。