弹性伸缩触发缩容活动时,系统可以根据自身设置的自定义实例移出策略选择缩容某些特定实例。本文主要介绍如何通过阿里云函数计算设置伸缩组的自定义实例移出策略。

前提条件

背景信息

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

当您的业务对于待缩容的实例有更高要求时,需要结合自身业务特性,自定义缩容实例的移出策略。对于这种需要定制化的需求,建议弹性伸缩通过函数计算功能设置自定义实例移出策略。适用场景举例:
  • 场景一:优先缩容CPU负载最小的实例,以减少该缩容实例对业务本身的影响。
  • 场景二:基于业务自身调度系统,优先缩容空闲实例,保证业务的同时降低使用成本。

自定义移出策略说明

您可以自定义实例的移出策略,该策略表示伸缩组当前的实例列表信息。弹性伸缩在触发弹性缩容活动时,从当前实例列表中筛选出需要删除的实例。示例如下所示:
{
    "ScalingGroupARN": "acs:ess:cn-hangzhou:160998252992****:scalinggroup/asg-bp12zc8b5m4mxhra****",
    "ScalingGroupId": "asg-bp12zc8b5m4mxhra****",
    "CapacityToRemove": [
        {
            "ZoneId": "cn-hangzhou-i",
            "Capacity": 1
        }
    ],
    "Instances": [
        {
            "InstanceId": "i-bp11az18341u****t47v",
            "ZoneId": "cn-hangzhou-i",
            "InstanceType": "ecs.g7.xlarge",
            "ChargeType": "PostPaid"
        },
        {
            "InstanceId": "i-bp11mcx562ak****lcn6",
            "ZoneId": "cn-hangzhou-i",
            "InstanceType": "ecs.g7.xlarge",
            "ChargeType": "PostPaid"
        },
        {
            "InstanceId": "i-bp11mcx562aky****lcn7",
            "ZoneId": "cn-hangzhou-i",
            "InstanceType": "ecs.g7.xlarge",
            "ChargeType": "PostPaid"
        }
    ],
    "AdjustmentType": "SystemScaleIn"
}
上述示例中主要参数说明如下所示:
参数说明
ScalingGroupARN伸缩组的标识符,用于定位伸缩组资源。
ScalingGroupId伸缩组的ID。
CapacityToRemove系统推荐各可用区移出的实例数,供您参考。

其中Capacity总和为本次缩容活动期望缩容实例总数,为保证缩容活动实际缩容数符合预期,应确保返回参数中缩容实例ID数量不小于该值。

Instances伸缩组当前可以移出实例的信息列表。每个实例包含实例ID、可用区、实例规格以及付费类型参数。
AdjustmentType伸缩规则的调整方式。

步骤一:创建阿里云函数计算

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,单击创建服务
  5. 创建服务面板,设置以下配置项(服务名称、描述和日志功能),然后单击确定
    说明 如果您自定义逻辑需要访问VPC网络或者公网,单击显示高级选项开启对应功能。更多信息,请参见创建服务
    配置项说明示例
    服务名称输入阿里云函数计算服务的名称。

    由1~128个字符组成,不能以数字或短划线(-)开头,可包含字母、数字、下划线(_)和短划线(-)。

    ess_custom_terminate_policy
    描述输入函数计算服务的描述。-
    日志功能是否启用阿里云日志服务。取值说明如下:
    • 启用:函数的执行日志被持久化保存到日志服务,方便您代码调试、故障分析和数据分析等。
    • 禁用:函数的执行日志将无法通过日志服务存储和查询。
    启用
  6. 进入函数管理页面后,单击创建函数
  7. 创建函数页面,配置各参数项后,单击创建
    创建函数
    主要配置项说明如下:
    说明 下表中未涉及的配置项保持默认即可。如需了解创建函数时可选择的其他配置项,更多信息,请参见创建函数
    配置项说明示例
    请选择一种创建函数的方式支持以下三种创建方式:
    • 使用内置运行时创建
    • 使用自定义运行时创建
    • 使用容器镜像创建
    使用内置运行时创建
    基本设置函数名称输入函数名称。

    由1~64个字符组成,不能以数字或短划线(-)开头,可包含字母、数字、下划线(_)和短划线(-)。

    ess_custom_terminate_policy_function
    请求处理程序类型支持以下两种请求方式:
    • 处理事件请求:用于处理事件请求的函数。
    • 处理HTTP请求:用于处理HTTP请求或Websocket请求的函数。
    处理事件请求
    函数代码运行环境函数计算支持的运行环境。Python 3.9
    代码上传方式选择上传函数代码到函数计算的方式。支持以下四种上传方式:
    • 使用示例代码
    • 通过 ZIP 包上传代码
    • 通过文件夹上传代码
    • 通过 OSS 上传代码

    本步骤以选择使用示例代码页签下的Hello, world! 示例为例。

    Hello, world! 示例
  8. 函数代码页签下,在代码编辑器中编辑index.py代码为如下函数代码,然后单击部署代码
    说明 如果进入函数详情页面时,弹出Web IDE使用必读对话框,单击我知道了即可。
    在函数代码中,您可以基于自身业务特性引入特定筛选策略,例如,获取各实例的CPU使用率或者查询自身业务调度系统等。本示例实现了基于实例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
  9. 函数代码页签下,单击测试函数右侧的图标图标,从下拉列表中选择配置测试参数,输入自定义移出策略说明中的示例代码,然后单击确定
    配置参数
  10. 单击测试函数
    函数执行成功后,您可以在返回结果页签下,查看基于函数的自定义移出策略返回结果,显示了选择移出实例的列表。返回结果如下:
    {
        "InstanceIds": [
            "i-bp11az18341u****t47v"
        ]
    }
    InstanceIds表示可以移出实例的列表。伸缩组缩容活动基于此列表结合缩容规则选择缩容实例。例如:
    • 当伸缩活动期望缩容1台实例时,从InstanceIds列表中选择移出1台实例。
    • 当InstanceIds为空时,表示当前没有合适的缩容实例,伸缩活动不移出实例。
  11. 在页面顶部位置,单击发布版本,然后单击确定

步骤二:配置自定义移出策略伸缩组

  1. 登录弹性伸缩控制台
  2. 创建伸缩组。
    具体操作,请参见创建伸缩组。在创建伸缩组时配置自定义实例移出策略,配置参数如下所示:创建伸缩组
    本步骤中主要配置参数说明如下:
    配置项说明示例
    伸缩组类型指定伸缩组内提供计算能力的实例的类型,弹性伸缩会根据该配置为伸缩组扩缩容对应的实例。
    • ECS:伸缩组内的实例都为ECS实例。
    • ECI:伸缩组内的实例都为ECI实例。
    ECS
    组内实例配置信息来源弹性伸缩使用该配置创建实例。伸缩组支持以下来源类型:
    • 启动模板
    • 选择已有实例
    • 从零开始创建
    从零开始创建
    实例移出策略当需要从伸缩组移出实例并且有多种选择时,按该策略选择需要移出的实例。仅伸缩组类型ECS时,支持配置该参数项。
    说明 如果按策略筛选后仍有多台实例满足要求,则随机移出一台。
    该项支持以下策略:
    • 最早伸缩配置对应的实例
    • 最早创建的实例
    • 最新创建的实例
    • 自定义策略
    自定义策略
    • 服务:ess_custom_terminate_policy
    • 版本:LATEST
    • 函数:ess_custom_terminate_policy_function
    组内最大实例数当前实例数量超过上限时,伸缩组会自动移出实例,使得伸缩组内的实例数量等于上限。3
    说明 设置组内最大实例数为3,方便后续验证测试。
    专有网络选择已创建的专有网络。vpc-bp1l5b6zsvw30qb6t****
    交换机一个交换机只能属于一个可用区,您可以指定多个属于不同可用区的交换机,从而达到多可用区的效果。vsw-bp1qo7s91cbch5i4l****
  3. 创建伸缩配置。
    具体操作,请参见创建伸缩配置(ECS实例)
  4. 启用伸缩组。
    具体操作,请参见启用或停用伸缩组
  5. 创建伸缩规则。
    本步骤以创建两条简单规则类型的伸缩规则为例。具体操作,请参见创建伸缩规则
    • 伸缩规则(Add1):创建一条扩容的伸缩规则。其中,执行的操作参数选择调整至3台
    • 伸缩规则(Remove1):创建一条缩容的伸缩规则。其中,执行的操作参数选择减少1台
  6. 执行伸缩规则。
    分别执行扩容伸缩规则和缩容伸缩规则。具体操作,请参见执行伸缩规则
    您可以在伸缩活动页签下查看伸缩活动的执行状态。

检查自定义移出策略与伸缩组缩容实例列表

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,找到步骤一:创建阿里云函数计算中已创建的服务(ess_custom_terminate_policy),单击对应操作列的函数管理
  5. 进入函数管理页面,找到步骤一:创建阿里云函数计算中已创建的函数(ess_custom_terminate_policy_function),单击该函数名称。
  6. 进入函数详情页面,单击调用日志页签。
  7. 单击函数日志页签,查看缩容活动触发函数调用的记录信息。
  8. 获取日志记录入参请求和返回参数。
    函数的日志记录如下所示:
    1-640ad88d-b59ed1af57161e4b363cb7c9 [INFO] {'ScalingGroupARN': 'acs:ess:cn-hangzhou:160998252992****:scalinggroup/asg-bp12zc8b5m4mxhra****', 'ScalingGroupId': 'asg-bp12zc8b5m4mxhra****', 'CapacityToRemove': [{'ZoneId': 'cn-hangzhou-i', 'Capacity': 1}], 'Instances': [{'InstanceId': 'i-bp11az18341u****t47v', 'ZoneId': 'cn-hangzhou-b', 'InstanceType': 'ecs.g7.xlarge', 'ChargeType': 'PostPaid'}, {'InstanceId': 'i-bp11mcx562ak****lcn6', 'ZoneId': 'cn-hangzhou-i', 'InstanceType': 'ecs.g7.xlarge', 'ChargeType': 'PostPaid'}, {'InstanceId': 'i-bp11mcx562aky****lcn7', 'ZoneId': 'cn-hangzhou-i', 'InstanceType': 'ecs.g7.xlarge', 'ChargeType': 'PostPaid'}], 'AdjustmentType': 'SystemScaleIn'}
    1-640ad88d-b59ed1af57161e4b363cb7c9 [INFO] 1
    1-640ad88d-b59ed1af57161e4b363cb7c9 [INFO] {'InstanceIds': ['i-bp11az18341u****t47v']}
  9. 查看伸缩活动缩容实例详细信息。
    具体操作,请参见查看伸缩活动详情伸缩活动详情
    在函数日志的返回列表中显示伸缩活动的缩容实例为{'InstanceIds': ['i-bp11az18341u****t47v']},与伸缩活动详情信息中显示的一致(即Instances "i-bp11az18341u****t47v" are deleted),验证符合功能预期。