华为云弹性伸缩AS实战:基于CPU使用率自动扩缩容ECS

举报
yd_282720827 发表于 2026/10/30 16:01:29 2026/10/30
【摘要】 本文以基于CPU使用率自动扩缩容ECS为例,讲解华为云弹性伸缩AS的伸缩组、伸缩配置、伸缩策略、冷却时间与健康检查等核心概念,演示控制台配置、hcloud CLI与API调用,并通过stress压测验证扩缩容效果,最后总结成本优化与常见避坑建议。

一、背景:为什么需要弹性伸缩

很多业务的流量都有明显的波峰波谷:电商大促、早晚高峰、定时批处理任务……如果按峰值采购 ECS,平时大量资源闲置;如果按均值采购,高峰期又容易出现 CPU 打满、接口超时。手动扩容不仅慢,还依赖值班人员的反应速度。

华为云弹性伸缩(Auto Scaling,简称 AS)可以根据监控指标或时间计划,自动增加或减少 ECS 实例,并自动挂载到 ELB 后端,做到"忙时多开、闲时少开"。本文以最常见的场景为例:当伸缩组平均 CPU 使用率持续高于 70% 时自动加 1 台,低于 30% 时自动减 1 台,从概念、控制台配置、CLI 调用到压测验证完整走一遍。

二、核心概念

在动手之前,先把几个关键概念理清楚:

概念 说明 本文取值示例
伸缩组 具有相同属性的实例集合,定义最小/最大/期望实例数、VPC、子网、ELB 等 最小 1,最大 4,期望 1
伸缩配置 新实例的"模板",包括镜像、规格、磁盘、安全组、密钥对、用户数据 自定义镜像 + 2vCPU 4GB
伸缩策略 触发伸缩动作的规则,可基于告警、定时或周期 CPU>70% 加 1 台,CPU<30% 减 1 台
冷却时间 一次伸缩动作完成后,在此时间内忽略告警触发的新动作,防止抖动 300 秒
健康检查 定期检查实例状态,异常实例会被移出并补充新实例 ELB 健康检查,周期 5 分钟

几点补充说明:

  1. 伸缩配置不可修改,只能新建并替换到伸缩组。因此建议提前把应用打成自定义镜像,或通过用户数据(cloud-init)在启动时拉取代码,确保新实例开机即可服务。
  2. 健康检查方式分为"云服务器健康检查"(只看 ECS 运行状态)和"弹性负载均衡健康检查"(看业务端口是否正常)。挂了 ELB 的 Web 业务推荐后者,能发现"机器活着但服务挂了"的情况。
  3. 冷却时间既有伸缩组级别的默认值,也可以在策略中单独设置;新实例从创建到应用就绪通常需要 1~3 分钟,冷却时间应大于这个时长。

三、控制台配置步骤

1. 准备工作

  • 创建 VPC、子网和安全组,放通业务端口(如 80)和必要的管理端口。
  • 准备一台已部署好应用的 ECS,制作私有镜像。
  • (可选)创建共享型或独享型 ELB 及监听器、后端服务器组。

2. 创建伸缩配置

进入控制台"弹性伸缩 > 伸缩实例 > 伸缩配置",点击"创建伸缩配置":

  • 配置模板:使用新模板;
  • 规格:通用计算增强型 2vCPU | 4GiB;
  • 镜像:选择上一步制作的私有镜像;
  • 磁盘:系统盘 40GB 通用型 SSD;
  • 安全组、登录方式(推荐密钥对);
  • 高级配置中可填写用户数据,例如启动时执行 systemctl start nginx。

3. 创建伸缩组

点击"创建伸缩组",关键参数如下:

  • 最大实例数 4、期望实例数 1、最小实例数 1;
  • 选择 VPC、子网,可选择多个可用区以提高可用性;
  • 负载均衡:选择 ELB 及后端服务器组,填写业务端口;
  • 实例移除策略:推荐"根据较早创建的配置较早创建的实例";
  • 健康检查方式:弹性负载均衡健康检查,检查间隔 5 分钟;
  • 默认冷却时间:300 秒;
  • 伸缩配置:选择上一步创建的配置。

创建完成后启用伸缩组,系统会按期望实例数自动拉起 1 台实例。

4. 添加伸缩策略

在伸缩组详情页"伸缩策略"中添加两条告警策略:

扩容策略:策略类型"告警策略",新建告警规则,监控指标选择"CPU使用率",统计方式"平均值",条件"连续 3 个周期 > 70%“(周期 5 分钟),执行动作"增加 1 个实例”,冷却时间 300 秒。

缩容策略:同样新建告警规则,条件"连续 3 个周期 < 30%“,执行动作"减少 1 个实例”,冷却时间 300 秒。

注意:这里的 CPU 使用率是伸缩组内所有实例的平均值,由云监控服务 CES 采集,指标命名空间为 SYS.AS。

四、使用 hcloud CLI / API 实现

对于需要基础设施即代码的团队,可以用华为云命令行工具 KooCLI(命令为 hcloud)完成同样的配置。以下示例中的 ID 均为占位符,认证信息请通过 hcloud configure init 交互式配置,切勿把 AK/SK 写进脚本或提交到代码仓库。

# 1. 初始化配置(交互式输入 AK/SK 与区域,信息仅保存在本地)
hcloud configure init

# 2. 创建伸缩配置
hcloud AS CreateScalingConfig \
  --cli-region="cn-north-4" \
  --project_id="<your-project-id>" \
  --scaling_configuration_name="as-config-web" \
  --instance_config.flavorRef="c7.large.2" \
  --instance_config.imageRef="<your-image-id>" \
  --instance_config.disk.1.size=40 \
  --instance_config.disk.1.volume_type="SSD" \
  --instance_config.disk.1.disk_type="SYS" \
  --instance_config.key_name="<your-keypair-name>" \
  --instance_config.security_groups.1.id="<your-sg-id>"

# 3. 创建伸缩组
hcloud AS CreateScalingGroup \
  --cli-region="cn-north-4" \
  --project_id="<your-project-id>" \
  --scaling_group_name="as-group-web" \
  --scaling_configuration_id="<scaling-config-id>" \
  --min_instance_number=1 \
  --max_instance_number=4 \
  --desire_instance_number=1 \
  --cool_down_time=300 \
  --vpc_id="<your-vpc-id>" \
  --networks.1.id="<your-subnet-id>" \
  --health_periodic_audit_method="ELB_AUDIT" \
  --health_periodic_audit_time=5 \
  --instance_terminate_policy="OLD_CONFIG_OLD_INSTANCE"

告警规则在 CES 中创建后,拿到 alarm_id,再创建告警类伸缩策略。直接调用 REST API 的请求体如下(POST /autoscaling-api/v1/{project_id}/scaling_policy):

{
  "scaling_policy_name": "cpu-high-scale-out",
  "scaling_group_id": "<scaling-group-id>",
  "scaling_policy_type": "ALARM",
  "alarm_id": "<ces-alarm-id>",
  "scaling_policy_action": {
    "operation": "ADD",
    "instance_number": 1
  },
  "cool_down_time": 300
}

缩容策略只需把 operation 改为 REMOVE,并关联 CPU 低于 30% 的告警规则即可。最后启用伸缩组:

hcloud AS ResumeScalingGroup \
  --cli-region="cn-north-4" \
  --project_id="<your-project-id>" \
  --scaling_group_id="<scaling-group-id>" \
  --action="resume"

不同版本 KooCLI 的参数名可能略有差异,可通过 hcloud AS CreateScalingGroup --help 查看当前版本支持的参数。

五、压测验证

登录伸缩组中的实例,安装 stress 工具制造 CPU 压力:

# CentOS / EulerOS
yum install -y epel-release && yum install -y stress
# Ubuntu
apt-get update && apt-get install -y stress

# 2 核机器跑满 2 个 CPU worker,持续 30 分钟
stress --cpu 2 --timeout 1800

# 另开终端观察 CPU
top -d 2

验证过程中重点观察:

  1. 云监控中伸缩组 CPU 使用率曲线是否超过 70%;
  2. 约 15 分钟(3 个周期)后告警触发,伸缩活动日志出现"增加实例"记录;
  3. 新实例状态变为"已启用",ELB 后端服务器组中出现新成员且健康检查正常;
  4. 停止 stress 后,CPU 回落到 30% 以下,经过若干周期后自动移除实例,最终回到最小实例数 1。

如果想更快看到效果,测试阶段可以把告警周期调为 1 分钟、连续次数调为 1,正式上线前再改回去。

六、成本与避坑指南

  • 设好最大实例数:它是成本的"保险丝",防止异常流量或程序死循环导致无限扩容。
  • 扩容快、缩容慢:扩容阈值和连续周期可以激进一点,缩容则保守一些,避免"刚扩就缩"的抖动。
  • 镜像要"开箱即用":应用启动慢会导致新实例被健康检查判定异常而反复重建。
  • 无状态化:会话、上传文件等放到 Redis、OBS 等外部存储,实例被缩容时才不会丢数据。
  • 计费方式:伸缩出的实例默认按需计费,对长期稳定的基线负载可用包年/包月实例承担,弹性部分交给 AS。
  • 缩容时优雅下线:可以利用生命周期挂钩,在实例移除前完成流量摘除和日志上传。
  • 配额检查:提前确认 ECS、EVS、EIP 等配额充足,否则扩容会失败。
  • 定时 + 告警组合:可预期的高峰(如每天 9 点)用定时策略提前扩容,再用告警策略兜底。

七、总结

本文围绕"基于 CPU 使用率自动扩缩容 ECS"这一典型场景,梳理了华为云弹性伸缩 AS 的五个核心概念:伸缩组、伸缩配置、伸缩策略、冷却时间和健康检查,并分别演示了控制台配置、hcloud CLI 与 REST API 的实现方式,最后通过 stress 压测验证了扩容和缩容的完整闭环。弹性伸缩的关键不在于"能扩",而在于阈值、冷却时间、最大实例数和应用无状态化之间的平衡。把这些细节处理好,就能在保证业务稳定的同时,把云资源成本控制在合理范围内。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。