根据实时负载自动扩缩容ECI实例

ECI支持搭配使用阿里云弹性伸缩(ESS)服务,实现根据实时负载动态增加或者减少ECI实例,从而提升资源利用率和系统可用性,降低使用成本。本文以Spring Boot容器应用为例,演示如何配置负载均衡和弹性伸缩,实现根据实时负载自动扩缩容ECI实例。

背景信息

本文将通过Spring Boot容器应用来演示以下场景:

  • 通过阿里云弹性伸缩和负载均衡服务,实现根据实时负载自动扩缩容ECI实例。

  • 结合ECI的镜像缓存、日志采集、监控等能力验证Serverless场景下的容器弹性能力。

  • 借助弹性伸缩原生的扩缩容能力进行应用的灰度升级。

本文示例中各组件的关系如下图所示:弹性伸缩

配置说明

配置应用镜像

本文示例基于Spring Boot实现了一个简易的HTTP Server,可以监听外部请求并为每个请求消耗5s左右的CPU时间。源代码详见SpringBootDemo

说明

示例采用TCP 8761端口作为应用监听的端口,您也可以自定义端口。

  1. 编译应用得到.jar文件,然后通过Docker打包成镜像。

    FROM java:8
    ADD target/*.jar /app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  2. 将打包好的镜像推送到您的镜像仓库中。

配置负载均衡

应用一般采用分布式多副本部署,当应用需要对外提供服务时,则需要负载均衡来实现流量分发,本文使用阿里云负载均衡SLB服务来实现(SLB分为ALB和CLB,本文以CLB为例)。相关操作如下:

  1. 登录传统型负载均衡CLB控制台

  2. 创建CLB实例。

    CLB实例是负载均衡服务实体,用于接收流量并进行分发。具体操作,请参见创建CLB实例

  3. 配置监听。

    监听可以检查客户端请求,并将请求发送到后端服务器。由于示例应用开启的端口为TCP 8761端口,则CLB实例需要监听的后端端口为TCP 8761端口。具体操作,请参见添加TCP监听

    ess-eci-1

配置伸缩组

  1. 登录弹性伸缩控制台

  2. 创建弹性伸缩组。

    1. 在左侧导航栏,单击伸缩组管理

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

    3. 单击创建伸缩组

    4. 在弹出的对话框中完成伸缩组配置。

      创建时需要注意的参数如下表所示。更多信息,请参见创建伸缩组

      参数

      描述

      示例

      伸缩组类型

      伸缩组内的实例类型。此处必须选择ECI

      ECI

      组内实例配置信息来源

      对应伸缩配置,包含扩容时创建的实例的配置信息。

      • 选择已有实例:采用已有实例的信息,创建对应的伸缩配置。

      • 从零开始创建:等伸缩组创建完成后再进行伸缩配置。

      从零开始创建

      组内最小实例数

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

      1

      组内最大实例数

      伸缩组内的实例数量上限。当实例数量高于该上限时,伸缩组会自动移出实例,使得伸缩组内的实例数量等于上限。

      50

      专有网络

      选择ECI实例所属的专有网络。

      vpc-2zeghwzptn5zii0******

      选择交换机

      选择ECI实例所示的交换机,建议选择多个交换机实现多可用区功能。

      • vsw-2zevanrscmoiaxr******

      • vsw-2ze23nqzig8inpr******

      关联传统型负载均衡CLB(原SLB)

      关联CLB后,加入伸缩组的实例会自动添加为CLB实例的后端服务器。此处选择已创建的CLB实例。

      lb-2zerkwijjdblq4n******

  3. 创建并启用伸缩配置。

    1. 伸缩组管理页面,找到目标伸缩组,单击组内实例配置信息来源列对应的添加伸缩配置

    2. 在弹出页面完成伸缩配置。

      创建时需要注意的参数如下表所示。更多信息,请参见创建伸缩配置(ECI实例)

      配置模块

      参数

      描述

      容器组配置

      CPU、内存

      请根据业务需要选择vCPU和内存规格。本文示例为4 vCPU、8 GiB内存。

      存储

      如果应用需要使用配置项,或者需要NAS等外部存储,则需要添加数据卷。更多信息,请参见数据卷

      临时存储大小

      ECI实例默认提供30 GiB的免费存储空间,如果无法满足需求,您可以额外增加临时存储空间。更多信息,请参见自定义临时存储空间大小

      镜像缓存

      镜像缓存用于加速拉取镜像。建议您开启该功能,开启后在后续扩容ECI实例时无需拉取相同镜像,从而提高扩容速度。更多信息,请参见镜像缓存概述

      容器配置

      镜像

      选择制作好的应用容器镜像以及版本。

      启动命令

      如果在镜像中没有设置好启动命令,您可以在此处配置,否则容器可能不会启动或者出现启动异常而退出。更多信息,请参见设置容器启动命令和参数

      环境变量

      除了镜像自带的环境变量外,您可以自定义添加其他环境变量。建议您采用环境变量来自定义配置日志采集,更多信息,请参见自定义配置ECI日志采集

      示例如下图所示,表示将ECI实例的标准输出日志采集到自定义的store-ess配置中。环境变量

      启用伸缩配置后,系统将自动创建ECI实例,以满足伸缩组内的最小实例数要求,并将组内所有ECI实例加入到CLB的后端服务器组中。

  4. 创建伸缩规则。

    1. 伸缩组管理页面,找到目标伸缩组,单击伸缩组ID。

    2. 单击伸缩规则与报警任务页签。

    3. 伸缩规则页签下,单击创建伸缩规则

    4. 在弹出的对话框中,完成伸缩规则配置。

      伸缩规则用于触发伸缩活动,分为简单规则和目标追踪规则等,本文以目标追踪规则为例,采用CPU使用率作为扩缩容指标,目标值为60%,创建时需要注意的参数如下表所示。

      参数

      描述

      示例

      规则类型

      分为简单规则和目标追踪规则:

      • 简单规则:指定增加、减少的实例数,或者将实例数量调整到指定值。

      • 目标追踪规则:选择某一监控指标并设置目标值,系统将自动增加或者减少实例数,使得监控指标值维持在目标值附近。

      目标追踪规则

      指标类型

      设置目标追踪规则时,需选择要监控的指标。

      CPU使用率

      目标值

      设置目标追踪规则时,需设置监控指标的目标值。

      60

      实例预热时间

      处于预热状态的实例正常加入伸缩组,但是不会向云监控上报监控数据。动态计算需要扩缩容的实例数量时,处于预热状态的实例不计入现有实例数量,以免造成指标值波动。

      30

      扩容报警触发的阈值次数

      触发扩容时,需要满足规则条件的次数。

      1

      缩容报警触发的阈值次数

      触发缩容时,需要满足规则条件的次数。

      10

测试弹性伸缩效果

默认情况下,弹性伸缩组保持初始状态,即组内实例数量为期望的实例数,不具备弹性伸缩的能力。配置伸缩规则后,当监控指标不满足规则条件时,将自动进行弹性伸缩。

由于示例的伸缩规则中以CPU使用率作为扩缩容指标,目标值为60%,扩容报警触发的阈值次数为1,缩容报警触发的阈值次数为10 ,则在CPU使用率出现一次60%以上时,将触发自动扩容;在CPU使用率连续10次低于60%时,将触发自动缩容。

测试过程如下:

  1. 模拟压测,按500次/分钟的频次向应用发起请求。

    模拟压测的示例代码可参见HttpClientHelper

    1. 日志服务控制台查看日志,可以看到应用容器处理每个请求时,会打印一条输出日志。

      在创建伸缩配置时已通过环境变量配置日志采集,因此容器的标准输出日志将采集到配置的store-ess中。ess-eci-2

    2. 弹性容器实例控制台查看ECI实例的监控指标,可以看到CPU使用率已达到100%(图中示例中单个ECI实例含4个vCPU)。ess-eci-3

    3. 查看是否已成功扩容。

      • 已触发扩容ess-eci-4

      • 扩容成功ess-eci-5本示例使用的应用镜像大约250 MB,由于在创建伸缩配置时开启了自动镜像缓存功能,扩容单个ECI实例时仅需要几秒。ess-eci-6

      • 扩容后的监控指标

        扩容后,CPU使用率稳定在50%~60%之间(图中示例中单个ECI实例含4个vCPU)。

        ess-eci-7

  2. 停止发送请求。

    此时应用负载降低到0,将触发缩容。缩容成功后,伸缩组中仅保留最小实例数。

配置应用升级

应用一般需要进行升级发布,目前弹性伸缩暂不支持基于ECI的滚动升级。您可以通过以下方式灰度升级应用版本,假设应用版本要从v4升级到v5版本,配置流程如下:

  1. 以弹性伸缩组v4为基础,克隆一个新的弹性伸缩组,命名为v5。ess-eci-8ess-eci-10

  2. 修改弹性伸缩组v4和v5的设置,实现v5扩容,v4缩容。

    1. 修改弹性伸缩组v5的伸缩规则,将CPU使用率阈值改为30%,即CPU高于30%就触发扩容。

    2. 修改弹性伸缩组v4的最小实例数为0。

    由于两个伸缩组的扩缩容规则是相冲突的,所以v5会一直扩容,导致CPU使用率持续降低,最终触发v4缩容。过程如下:ess-eci-9一段时间后,v4的实例数将缩容至0台,v5的实例数将扩容至CPU使用率为30%左右。ess-eci-11

  3. 修改弹性伸缩组v5的伸缩规则,将CPU使用率阈值改回到60%。

    由于整体负载水平较低(CPU使用率30%左右),因此需要修改v5的伸缩规则,将CPU使用率阈值改回到60%,此时v5的实例数将缩容至正常情况。ess-eci-12

配置完成后,查看日志,可以看到一个基于ESS自动扩缩容能力的灰度发布过程。

  • v4ess-eci-13

  • v5ess-eci-14

该过程具备以下特点:

  • 灰度发布过程中,应用负载不会突然增长,过渡比较平稳。

  • 灰度发布过程完全可控。借助ESS的实例数量管理能力还可以精准控制新旧版本的实例副本比例,即流量比例。发布过程中随时可以直接回滚到之前版本,并且容器镜像自带的版本管理方便随时回滚到之前的任意版本。

  • 借助ECI容器生命周期的postStart和preStop hook实现应用优雅上下线。

相关文档

如需了解更多关于弹性伸缩的功能,请参见弹性伸缩常用操作导航