通过函数自定义ECS实例缩容策略

如果您对于缩容哪些实例有一定要求(例如需要优先缩容CPU负载最小的实例),您可以通过函数计算来自定义设置实例移出策略。在弹性伸缩执行缩容活动时,系统可以根据设置的实例移出策略,自动选择某些特定的实例进行缩容。

背景信息

弹性伸缩支持多种实例移出策略,伸缩组触发缩容活动时,系统可以根据实例创建的时间、实例对应的伸缩配置版本等筛选条件设置优先级来缩容实例。更多信息,请参见设置伸缩组的实例终止策略

如果您对于缩容的实例有更多要求,可以结合自身业务特性,利用函数计算来自定义设置实例移出策略。示例场景:

  • 场景一:优先缩容CPU负载最小的实例,以减少对业务本身的影响。

  • 场景二:基于业务自身调度系统,优先缩容空闲实例,保证业务的同时降低使用成本。

前提条件

操作步骤

步骤一:创建函数

阿里云函数计算控制台目前存在两个版本(即函数计算FC 2.0和函数计算FC 3.0),本操作使用函数计算2.0版本。

  1. 登录函数计算FC控制台

    如果您已进入函数计算FC 3.0的控制台,请单击返回函数计算2.0进入函数计算2.0版本的控制台。

    函数计算2.0.jpg

  2. 在左侧导航栏,单击服务及函数

  3. 在顶部菜单栏,选择地域。

  4. 创建服务。

    1. 服务列表页面,单击创建服务

    2. 在弹出面板中,完成服务配置,然后单击确定

      本文采用以下配置作为示例,未提及的参数保持默认即可。更多信息,请参见创建服务

      参数

      示例

      说明

      服务名称

      test-service

      输入阿里云函数计算服务的名称。格式要求请参考界面提示。

      描述

      test

      输入函数计算服务的描述。

      日志功能

      启用

      是否启用阿里云日志服务。启用后,可以通过日志服务查询函数的执行日志,便于您进行代码调试、故障分析和数据分析等。

  5. 创建函数。

    1. 单击服务名称,单击左侧的函数管理进入函数管理页面。

    2. 单击创建函数

    3. 创建函数页面,完成函数配置,然后单击创建

      本文选择使用内置运行时创建方式来创建函数,采用以下配置作为示例,未提及的参数保持默认即可。更多信息,请参见创建函数

      参数

      示例

      说明

      基本设置

      函数名称

      test-fc

      输入函数名称。格式要求请参考界面提示。

      请求处理程序类型

      处理事件请求

      支持以下两种请求方式:

      • 处理事件请求:用于处理事件请求的函数。

      • 处理HTTP请求:用于处理HTTP请求或WebSocket请求的函数。

      函数代码

      运行环境

      Python 3.9

      选择代码的运行环境。

      代码上传方式

      使用示例代码

      Hello, world! 示例

      选择上传函数代码到函数计算的方式。

  6. 编写并部署函数代码。

    1. 单击函数名称,进入函数详情页面。

    2. 函数代码页签下,在代码编辑器中编辑index.py,然后单击部署代码

      您可以基于自身业务特性引入特定筛选策略,例如:获取各实例的CPU使用率或者查询自身业务调度系统等。

      本文采用以下代码作为示例,可以实现基于传入的缩容实例数量(Capacity)、实例ID列表(InstanceId)等筛选缩容的实例。

      # -*- coding: utf-8 -*-
      import logging
      import json
      
      
      def handler(event, context):
          evt = json.loads(event)
          logger = logging.getLogger()
          logger.info(evt)
          removeCount = 0
          if "CapacityToRemove" in evt:
              for cp in evt["CapacityToRemove"]:
                  logger.info(cp["Capacity"])
                  removeCount += int(cp["Capacity"])
          instances_to_terminate = []
          if "Instances" in evt:
              for i in evt["Instances"]:
                  instances_to_terminate.append(i["InstanceId"])
          response = {
              'InstanceIds': instances_to_terminate[:removeCount]
          }
          logger.info(response)
          return response
      
  7. (可选)测试函数。

    1. 函数代码页签下,单击测试函数右侧的图标图标,从下拉列表中选择配置测试参数

    2. 输入测试代码,然后单击确定

      本文采用以下代码作为测试示例,其中ScalingGroupId表示要操作的伸缩组,CapacityToRemove表示从cn-beijing-g可用区移出1台ECS实例,Instances表示当前可移出的实例列表。

      {
      	"ScalingGroupARN": "acs:ess:cn-beijing:160998252992****.scalinggroup/asg-2zei8mzn72rb115k****",
      	"ScalingGroupId": "asg-2zei8mzn72rb115k****",
      	"CapacityToRemove": [{
      		"ZoneId": "cn-beijing-g",
      		"Capacity": 1
      	}],
      	"Instances": [{
      			"InstanceId": "i-2zeinb37ovdsx6l0****",
      			"ZoneId": "cn-beijing-g",
      			"InstanceType": "ecs.g7.xlarge",
      			"ChargeType": "PostPaid"
      		},
      		{
      			"InstanceId": "i-2zeinb37ovdsx6l0****",
      			"ZoneId": "cn-beijing-g",
      			"InstanceType": "ecs.g7.xlarge",
      			"ChargeType": "PostPaid"
      		},
      		{
      			"InstanceId": "i-2zeinb37ovdsx6l0****",
      			"ZoneId": "cn-beijing-g",
      			"InstanceType": "ecs.g7.xlarge",
      			"ChargeType": "PostPaid"
      		}
      	],
      	"AdjustmentType": "SystemScaleIn"
      }
    3. 单击测试函数

    4. 返回结果页签,查看测试结果。

      基于测试代码执行函数的预期返回如下,表示伸缩组缩容时会移出1台实例ID排在第一位的实例。

      {
          "InstanceIds": [
              "i-2zeinb37ovdsx6l0****"
          ]
      }
  8. 在页面顶部位置,单击发布版本,然后单击确定

步骤二:配置伸缩组的实例移出策略

以下步骤以新建伸缩组为例,介绍如何自定义配置伸缩组的实例移出策略。如果您已有伸缩组,可直接修改伸缩组的实例移出策略。

  1. 登录弹性伸缩控制台

  2. 创建伸缩组。

    1. 伸缩组管理页面,单击创建伸缩组

    2. 完成伸缩组配置,单击创建

      本文使用以下参数配置作为示例,未提及的参数可保持默认。更多信息,请参见配置伸缩组

      实例移出策略.png

      参数

      示例

      说明

      伸缩组名称

      test

      输入伸缩组名称。格式要求请参考界面提示。

      伸缩组类型

      ECS

      指定伸缩组内的实例类型。

      本文以ECS为例,表示伸缩组内的实例类型为ECS实例。

      组内实例配置信息来源

      从零开始创建

      选择创建实例的配置模板。

      本文以从零开始创建为例,表示先不指定自动创建实例的模板。伸缩组创建完成后,您需要继续创建伸缩配置。

      实例移出策略

      自定义策略

      • 服务:test-service

      • 版本:LATEST

      • 函数:test-fc

      配置缩容活动时,从伸缩组中移出实例的策略。

      请选择自定义策略,然后选择步骤一创建的函数。

      组内最小实例数

      0

      设置伸缩组内实例数量的下限。当前实例数量低于下限时,伸缩组会自动添加实例,使得伸缩组内的实例数量等于下限。

      组内最大实例数

      5

      设置伸缩组内实例数量的上限。当前实例数量超过上限时,伸缩组会自动移出实例,使得伸缩组内的实例数量等于上限。

      开启期望实例数组内期望实例数

      开启,3

      开启期望实例数功能,并配置期望实例数。伸缩组会自动将实例数量维持在期望实例数。

  3. 创建伸缩配置。具体操作,请参见创建伸缩配置(ECS实例)

  4. 启用伸缩组。具体操作,请参见启用或停用伸缩组

    由于示例的伸缩组的期望实例数配置为3,因此启用伸缩组后,会自动创建3台ECS实例。

步骤三:验证缩容效果

  1. 触发缩容活动,并确认缩容实例的信息。

    1. 修改伸缩组的期望实例数,触发缩容活动。具体操作,请参见查看或修改伸缩组

      重要

      您也可以通过定时任务、报警任务或者手动执行伸缩规则等方式触发缩容活动。但通过修改伸缩组最大、最小实例数而触发的缩容活动,无法应用通过函数计算自定义设置的实例移出策略。

      本文以将期望实例数修改为2作为验证示例。由于之前伸缩组内已有3台ECS实例,因此会自动触发缩容活动,移出1台ECS实例,使得实例数与修改后的期望实例数一致。

    2. 查看伸缩活动详情,确认缩容实例的信息。具体操作,请参见查看伸缩活动详情

      示例如下,缩容的实例ID为i-2ze2qdthrkpf****tldq

      自定义缩容.png

  2. 查看函数的调用日志,确认缩容活动触发函数调用的记录信息。

    1. 函数计算FC控制台服务列表页面,单击服务名称。

    2. 函数管理页面,单击函数名称。

    3. 在函数详情页面,单击调用日志页签。

    4. 请求列表页签的调用请求列表中,找到缩容活动时间点对应的请求,单击请求ID。

    5. 在弹出的请求详情页面,单击日志详情,查看缩容活动触发函数调用的日志记录。

      示例如下,从日志中可以看出触发缩容活动时,弹性伸缩向函数计算传入了需要缩容的实例数和当前伸缩组内的实例ID列表,经过函数筛选后要缩容的实例ID为i-2ze2qdthrkpf****tldq,这与实际缩容的实例ID一致。

      函数计算日志.png