ECI支持搭配阿里云弹性伸缩服务实现自动扩缩容。本文以实际的容器应用(Spring Boot)为例,演示如何配置SLB和ESS,实现根据实时负载自动扩缩容ECI实例。
背景信息
本文将通过实际的容器应用(Spring Boot)来演示以下场景:
通过阿里云弹性伸缩和负载均衡服务,实现根据实时负载自动扩缩容ECI实例。
结合ECI的镜像缓存、日志采集、监控等能力验证serverless场景下的容器弹性能力。
借助弹性伸缩原生的扩缩容能力进行应用的灰度升级。
本文示例中各组件的关系如下图所示:
配置说明
配置应用镜像
本文示例基于Spring Boot实现了一个简易的HTTP Server,可以监听外部请求并为每个请求消耗5s左右的CPU时间。源代码详见SpringBootDemo。
示例采用TCP 8761端口作为应用监听的端口,您也可以自定义端口。
编译应用得到.jar文件,然后通过Docker打包成镜像。
FROM java:8
ADD target/*.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
打包好镜像后,将该镜像推送到您的镜像仓库中。
配置负载均衡
应用一般采用分布式多副本部署,当应用需要对外提供服务时,则需要负载均衡来实现流量分发,本文使用阿里云负载均衡SLB服务来实现(SLB分为ALB和CLB,本文以CLB为例)。相关操作如下:
配置伸缩组
登录弹性伸缩控制台。
在顶部菜单栏,选择地域。
创建弹性伸缩组。
在左侧导航栏,单击伸缩组管理。
单击创建伸缩组。
在弹出的对话框中完成伸缩组配置。
创建时需要注意的参数如下表所示。更多信息,请参见创建伸缩组。
参数
描述
示例
伸缩组类型
伸缩组内的实例类型。此处必须选择ECI。
ECI
组内实例配置信息来源
对应伸缩配置,包含扩容时创建的实例的配置信息。
选择已有实例:采用已有实例的信息,创建对应的伸缩配置。
从零开始创建:等伸缩组创建完成后再进行伸缩配置。
从零开始创建
组内最小实例数
伸缩组内的实例数量下限。当实例数量低于该下限时,伸缩组会自动添加实例,使得伸缩组内的实例数量等于下限。
1
组内最大实例数
伸缩组内的实例数量上限。当实例数量高于该上限时,伸缩组会自动移出实例,使得伸缩组内的实例数量等于上限。
50
专有网络、交换机
选择ECI实例所属的专有网络。
vpc-2zeghwzptn5zii0******
选择交换机
选择ECI实例所示的交换机,建议选择多个交换机实现多可用区功能。
vsw-2zevanrscmoiaxr******
vsw-2ze23nqzig8inpr******
关联传统型负载均衡CLB(原SLB)
关联CLB后,加入伸缩组的实例会自动添加为CLB实例的后端服务器。此处选择已创建的CLB实例。
lb-2zerkwijjdblq4n******
创建并启用伸缩配置。
在伸缩组管理页面,找到目标伸缩组,单击组内实例配置信息来源列对应的添加伸缩配置。
在弹出页面完成伸缩配置。
创建时需要注意的参数如下表所示。更多信息,请参见创建伸缩配置(ECI实例)。
配置模块
参数
描述
容器组配置
CPU、内存
请根据业务需要选择vCPU和内存规格。本文示例为4 vCPU、8 GiB内存。
存储
如果应用需要使用配置项,或者需要NAS等外部存储,则需要添加数据卷。更多信息,请参见数据卷。
临时存储大小
ECI实例默认提供30 GiB的免费存储空间,如果无法满足需求,您可以额外增加临时存储空间。更多信息,请参见自定义临时存储空间大小。
镜像缓存
镜像缓存用于加速拉取镜像。建议您开启该功能,开启后在后续扩容ECI实例时无需拉取相同镜像,从而提高扩容速度。更多信息,请参见镜像缓存概述。
容器配置
镜像
选择制作好的应用容器镜像以及版本。
启动命令
如果在镜像中没有设置好启动命令,您可以在此处配置,否则容器可能不会启动或者出现启动异常而退出。更多信息,请参见设置容器启动命令和参数。
环境变量
除了镜像自带的环境变量外,您可以自定义添加其它环境变量。建议您采用环境变量来自定义配置日志采集,更多信息,请参见自定义配置ECI日志采集。
示例如下图所示,表示将ECI实例的标准输出日志采集到自定义的store-ess配置中。
启用伸缩配置后,系统将自动创建ECI实例,以满足伸缩组内的最小实例数要求,并将组内所有ECI实例加入到CLB的后端服务器组中。
创建伸缩规则。
在伸缩组管理页面,找到目标伸缩组,单击伸缩组ID。
单击伸缩规则与伸缩活动页签。
单击创建伸缩规则。
在弹出的对话框中,完成伸缩规则配置。
伸缩规则用于触发伸缩活动,分为简单规则和目标追踪规则等,本文以目标追踪规则为例,采用CPU使用率作为扩缩容指标,目标值为60%,创建时需要注意的参数如下表所示。
参数
描述
示例
规则类型
分为简单规则和目标追踪规则:
简单规则:指定增加、减少的实例数,或者将实例数量调整到指定值。
目标追踪规则:选择某一监控指标并设置目标值,系统将自动增加或者减少实例数,使得监控指标值维持在目标值附近。
目标追踪规则
指标类型
设置目标追踪规则时,需选择要监控的指标。
CPU使用率
目标值
设置目标追踪规则时,需设置监控指标的目标值。
60
实例预热时间
处于预热状态的实例正常加入伸缩组,但是不会向云监控上报监控数据。动态计算需要扩缩容的实例数量时,处于预热状态的实例不计入现有实例数量,以免造成指标值波动。
30
扩容报警触发的阈值次数
触发扩容时,需要满足规则条件的次数。
1
缩容报警触发的阈值次数
触发缩容时,需要满足规则条件的次数。
10
测试弹性伸缩效果
默认情况下,弹性伸缩组保持初始状态,即组内实例数量为期望的实例数,不具备弹性伸缩的能力。配置伸缩规则后,当监控指标不满足规则条件时,将自动进行弹性伸缩。
由于示例的伸缩规则中以CPU使用率作为扩缩容指标,目标值为60%,扩容报警触发的阈值次数为1,缩容报警触发的阈值次数为10 ,则在CPU使用率出现一次60%以上时,将触发自动扩容;在CPU使用率连续10次低于60%时,将触发自动缩容。
测试过程如下:
模拟压测,按500次/分钟的频次向应用发起请求。
模拟压测的示例代码可参见HttpClientHelper。
停止发送请求。
此时应用负载降低到0,将触发缩容。缩容成功后,伸缩组中仅保留最小实例数。
配置应用升级
应用一般需要进行升级发布,目前弹性伸缩暂不支持基于ECI的滚动升级。您可以通过以下方式灰度升级应用版本,假设应用版本要从v4升级到v5版本,配置流程如下:
以弹性伸缩组v4为基础,克隆一个新的弹性伸缩组,命名为v5。
修改弹性伸缩组v4和v5的设置,实现v5扩容,v4缩容。
修改弹性伸缩组v5的伸缩规则,将CPU使用率阈值改为30%,即CPU高于30%就触发扩容。
修改弹性伸缩组v4的最小实例数为0。
由于两个伸缩组的扩缩容规则是相冲突的,所以v5会一直扩容,导致CPU使用率持续降低,最终触发v4缩容。过程如下:一段时间后,v4的实例数将缩容至0台,v5的实例数将扩容至CPU使用率为30%左右。
修改弹性伸缩组v5的伸缩规则,将CPU使用率阈值改回到60%。
由于整体负载水平较低(CPU使用率30%左右),因此需要修改v5的伸缩规则,将CPU使用率阈值改回到60%,此时v5的实例数将缩容至正常情况。
配置完成后,查看日志,可以看到一个基于ESS自动扩缩容能力的灰度发布过程。
v4
v5
该过程具备以下特点:
灰度发布过程中,应用负载不会突然增长,过渡比较平稳。
灰度发布过程完全可控。借助ESS的实例数量管理能力还可以精准控制新旧版本的实例副本比例,即流量比例。发布过程中随时可以直接回滚到之前版本,并且容器镜像自带的版本管理方便随时回滚到之前的任意版本。
借助ECI容器生命周期的postStart和preStop hook实现应用优雅上下线。