华为云弹性伸缩 AS 不扩容/不缩容/反复重建?分层排查指南
弹性伸缩 AS 最常见的求助有三类:CPU 很高却不扩容;业务闲下来实例数降不下去;实例刚创建就被删掉、再新建一台,循环往复。很多人第一反应是删策略重建,但一次伸缩要经过「伸缩组状态 → 策略触发 → 伸缩活动执行 → 实例通过健康检查」这条链路,任何一环卡住都像是「伸缩不工作」。本文对照华为云 AS 官方文档分层排查,最后附推荐顺序、速查表和常见坑。
一、先看活动历史,再定层
动手前,我习惯先打开伸缩组详情里的「活动历史」页签,这里记录了每次伸缩活动的状态、类型和起止时间,展开还能看到失败原因。据此先把问题归到某一层:
| 层 | 关注点 | 一句话判断 |
|---|---|---|
| 伸缩组状态与实例数边界 | 启用/停用/异常、期望/最小/最大实例数 | 伸缩组有没有资格发起活动 |
| 策略触发 | 策略是否启用、告警规则、CES 指标、冷却时间 | 活动历史里根本没有新记录 |
| 扩容执行 | 配额、欠费、规格售罄、子网 IP、伸缩配置资源 | 有活动记录但状态是「失败」 |
| 缩容边界 | 最小实例数、实例保护、手动移入实例 | 缩容没发生或没删掉服务器 |
| 健康检查与生命周期挂钩 | ELB 健康检查、宽限期、挂钩默认回调 | 实例反复创建又被移出 |
如果更习惯用 API 排查,官方「查询弹性伸缩组详情」接口可以直接看伸缩组状态字段 scaling_group_status,取值包括 INSERVICE(正常)、PAUSED(停用)、ERROR(异常)、DELETING(删除中)、FREEZED(已冻结):
GET https://{Endpoint}/autoscaling-api/v1/{project_id}/scaling_group/{scaling_group_id}
二、第 0 层:伸缩组状态与实例数边界
1. 伸缩组必须处于启用状态
官方「伸缩组的伸缩活动」页面列出了启动条件:扩容活动要求伸缩组状态为「启用」且期望实例数大于当前实例数;缩容活动要求状态为「启用」且期望实例数小于当前实例数。停用伸缩组不会中断正在进行的伸缩活动,但停用期间不满足上述启动条件。
伸缩组进入「异常」状态是另一种常见情况。官方说明,某些异常场景下伸缩活动一定会失败,伸缩组会进入异常状态,例如伸缩配置使用的密钥对已被删除、伸缩组使用的子网不存在;并且伸缩组在「异常」状态下,伸缩活动失败后无法自动重试。官方 FAQ「伸缩组异常情况下如何处理?」中,几乎每种情况的处理方法最后一步都是「之后重新启用伸缩组」。所以修完根因后,别忘了手动重新启用。
2. 期望、最小、最大实例数
三者的关系是「最小实例数 ≤ 期望实例数 ≤ 最大实例数」。伸缩策略执行时,本质是修改期望实例数,再由伸缩组让当前实例数向期望值靠拢。由此带来两个常见现象:
- 扩容到上限就停:当前实例数已等于最大实例数时无法扩容,API 错误码表中对应
AS.0050(Max. instances reached),处理措施是修改最大实例数。 - 缩容到下限就停:缩容不会让期望实例数低于最小实例数。很多人把最小实例数设成和日常峰值差不多,结果低峰期也缩不下来。
3. 失败后的自动重试
官方说明:伸缩活动失败后,若当前实例数仍不等于期望实例数,伸缩组会隔一段时间重试,连续失败时间隔逐渐延长(参考值最短 10 秒、最长 20 分钟)。非异常状态下修好根因后可能会自行恢复,异常状态则需重新启用。
三、第 1 层:策略为什么没有触发
活动历史里根本没有新的记录,问题大概率出在策略这一层。
1. 策略本身是否启用
官方 FAQ「伸缩策略启用失败如何处理?」列出的情况包括:告警策略使用的告警规则被删除;周期策略的生效时间已过期;定时策略的触发时间早于当前时间。告警规则是放在云监控 CES 里的,很多人在 CES 里清理告警规则时顺手删掉了它,伸缩策略就失去了触发源。另外,同一时间触发的多个定时或周期策略,官方说明只执行创建时间最晚的那个。
2. 指标看的是「伸缩组均值」,不是单台实例
官方指标说明中,伸缩组 CPU 使用率 =「组内所有云服务器 CPU 使用率之和 / 实例数」,内存、网络、磁盘同理。常见的情况是一台打满、其余很闲,平均没过阈值,策略就不会触发。此时应先查 ELB 分发和应用本身,而不是一味调低阈值。
3. 监控周期 × 连续出现次数
「连续出现次数」为 n,表示连续 n 个监控周期的采样点都满足条件才会告警并触发伸缩。监控周期 5 分钟、连续 3 次,就要持续约 15 分钟高负载,短时突刺不会触发扩容,这是设计如此。
4. 指标有没有数据
官方 FAQ 写明:未安装 VMTools 时,云监控无法监控内存使用率和带内网络流入/流出速率,对应伸缩指标就拿不到数据。如需按系统内真实内存等指标伸缩,应选带「(Agent)」字样的指标,且组内实例都要装好 Agent 插件。官方做法是先在一台 ECS 上装好 Agent,再制作私有镜像用于伸缩配置。
5. 冷却时间
官方定义:每次伸缩活动完成后开始计算冷却时间,期间拒绝告警策略触发,定时、周期策略和手动触发不受限。几个细节:
- 伸缩组冷却时间默认 300 秒,API 取值范围 0–86400 秒。
- 伸缩活动由伸缩策略触发时,以该策略的冷却时间为准;手动修改期望实例数等方式引起的,以伸缩组的冷却时间为准。
- 扩容活动进行中允许缩容策略触发,扩容结束后执行缩容,反之亦然,不受冷却时间影响。
API 错误码里,AS.0026 表示冷却时间内不允许伸缩活动,AS.0034 表示伸缩组正在进行活动、策略无法触发。看到这两个,不是配置错了,而是时机不对。
四、第 2 层:活动记录有了,但扩容失败
活动状态为「失败」时展开看原因。一次扩容只要有任一实例添加失败,整体就是「失败」,已成功的实例会保留。官方 FAQ 的高频原因大致分几类:
- 配额与账户:云服务器、云硬盘、弹性公网 IP 等配额不足;账户欠费或余额不足时伸缩组无法扩容。
- 网络资源:伸缩组使用的 VPC 或子网不存在;子网下私有 IP 被用尽。
- 资源售罄:所选可用区下伸缩配置里的规格已售罄或不支持该规格;磁盘类型对应的存储资源售罄。
- 伸缩配置引用的资源:镜像、规格、密钥对被删除;规格与镜像不匹配、规格与磁盘不匹配;共享带宽不存在,或单个共享带宽绑定的公网 IP 超过上限(官方写单个共享带宽最多 20 个(默认上限,可申请调整))。
- ELB 相关:监听器、后端云服务器组或负载均衡器不存在或不可用。
还有一点容易忽略:官方说明密钥对是用户级资源,不能跨用户使用,同账号下其他 IAM 用户操作时可能提示密钥对不存在。
售罄类问题的思路是「多给几个选择」。官方说明,伸缩组配置了多个可用区时,一次扩容会尝试在所有可用区创建,直到成功或全部失败;伸缩配置使用了多个规格时,也会依次尝试所有规格。所以我习惯给伸缩配置选两到三个规格、伸缩组配多个可用区。注意伸缩组的子网、安全组只有在无伸缩活动、实例数为 0 且非启用状态时才能修改;更换伸缩配置只影响之后新建的实例。
五、第 3 层:不缩容或缩了却没删机器
缩不下去,先排除三个原因:
- 最小实例数:期望实例数已经等于最小实例数,缩容到此为止。
- 实例保护:官方 FAQ 说明,对正常状态的实例启用实例保护后,自动缩容时这些实例不会被移除。
- 缩容阈值本身:缩容告警同样看组内均值,还要满足连续出现次数,并受冷却时间约束。
另一类困惑是「缩容成功了,ECS 还在」。按官方删除规则:自动创建的按需/竞价实例移除时会删除;改成包年包月的不删除;手动移入的服务器都不删除,且不遵循移除策略、优先级最低。自动缩容会先移除不属于当前配置可用区的实例,再按「较早创建的实例」等移除策略选择。
六、第 4 层:实例反复创建又被删除
这类问题的本质是:实例被判定为不健康,伸缩组把它移出,再新建一台补齐期望实例数。官方特别说明,健康检查失败导致的缩容活动不会修改期望实例数,所以伸缩组会一直补,形成循环。
1. 先确认用的是哪种健康检查
官方说明有两种:云服务器健康检查(默认,关机、删除视为异常)和弹性负载均衡健康检查(使用 ELB 时可选且默认开启,官方推荐)。检查间隔默认 5 分钟;绑定多个负载均衡器时,任一个判定异常实例就会被移出。
因此官方提醒不要在 ECS 页面停止或删除已加入伸缩组的实例。需要临时维护时,可以先把已启用的实例「转入备用」。官方说明这个功能用来让实例暂时不承载业务,同时又不被移出伸缩组,方便关机、重启、重装系统等操作。转入备用后,系统会把实例从关联的负载均衡上解绑,也不再对它做健康检查;还可以勾选向伸缩组加入等量的新实例,避免其他实例负载升高。前提是伸缩组当前没有伸缩活动。
2. ELB 健康检查失败的排查点
共享型 ELB:安全组和网络 ACL 放通 100.125.0.0/16,以及健康检查的协议和端口(AS FAQ 和现行共享型 ELB 用户指南都这么写)。独享型 ELB:不能只放通 100.125.0.0/16,应按独享型 ELB 文档放通 ELB 后端子网所属网段(默认与 ELB 所在子网一致,以控制台里该 ELB 的后端子网为准),以及健康检查的协议和端口;实例内防火墙也按对应的源网段放行。健康检查端口和业务端口不同时,两个都要放行。
在实例上可以用下面几条通用 Linux 命令自查(非华为云官方文档原话,端口和路径按实际替换):
ss -lntp | grep ':80 ' # 服务是否在监听健康检查端口
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:80/health # 健康检查路径能否返回正常码:共享型 HTTP 是 200/202/401,独享型是 200
systemctl is-active firewalld # 系统防火墙是否开启
3. 宽限期不够
应用还在初始化,ELB 健康检查就开始失败,是「刚建好就被删」的典型原因。官方的「健康状况检查宽限期」在实例进入已启用状态后开始计时,结束后才检查,默认 600 秒(API 范围 0–86400 秒),在 ELB 健康检查方式下生效。启动要拉代码、预热缓存的,需调大宽限期或优化启动脚本。
4. 生命周期挂钩的默认回调
用了生命周期挂钩时,还要看「默认回调操作」。超时时间取值 60–86400 秒。中文 API 写明:创建挂钩时如果不传 default_result,默认是 ABANDON(终止);不传超时时间,默认 3600 秒。控制台文档里的「继续」只是取值样例,不能据此认为控制台新建挂钩默认是「终止」。排查时直接看该挂钩的「默认回调操作」:如果是「终止」,而超时前没有回调「继续」,实例就会被删除并重建。另外,挂钩使用的通知主题如果被删除,官方说明伸缩组会进入异常状态。
5. 扩缩容阈值靠得太近
还有一种「反复伸缩」并非实例故障,而是扩缩阈值太近:扩一台后均值跌破缩容阈值,冷却一过又缩回。常见做法是拉开两个阈值,并给缩容更长的冷却时间和连续出现次数,数值按业务观察定。
七、推荐排查顺序
- 活动历史:有无新记录、成功还是失败、失败原因。
- 伸缩组状态与最小/期望/最大实例数;异常则修复后重新启用。
- 无记录:策略是否启用、告警规则、组内均值与连续次数、指标数据、冷却时间。
- 扩容失败:配额、欠费、子网 IP、售罄、伸缩配置资源,必要时增加规格与可用区。
- 缩不下去:最小实例数、实例保护、手动移入实例与计费方式。
- 反复重建:健康检查方式、按 ELB 类型放通健康检查源网段、检查路径、宽限期、挂钩默认回调。
八、速查表
| 现象 | 常见原因 | 先查哪里 |
|---|---|---|
| 活动历史无记录 | 伸缩组停用或异常 | 伸缩组状态 |
| 扩到某个数就不涨了 | 达到最大实例数 | 最大实例数 / AS.0050 |
| 单台 CPU 很高却不扩容 | 指标为组内均值 | 各实例负载分布 |
| 高负载持续几分钟也不扩容 | 连续出现次数未满足 | 监控周期与连续次数 |
| 内存策略从不触发 | 无 VMTools / Agent 数据 | 指标是否有数据 |
| 扩容后很久不再扩 | 冷却时间内拒绝告警策略 | 策略冷却时间 / AS.0026 |
| 策略突然失效 | 告警规则被删 | CES 告警规则 |
| 扩容活动失败 | 配额、欠费、售罄、子网 IP | 活动失败原因 |
| 伸缩组变异常 | 密钥对、子网、通知主题被删 | 伸缩配置与挂钩 |
| 缩不到想要的数量 | 最小实例数、实例保护 | 伸缩组参数 |
| 移出后 ECS 仍在 | 手动移入或包年包月 | 云服务器删除规则 |
| 实例刚建好就被删 | 宽限期不足、健康检查失败 | 宽限期、按 ELB 类型放通健康检查源网段 |
| 挂钩超时后实例被删 | 默认回调为「终止」 | 生命周期挂钩配置 |
九、常见坑
- 镜像没更新:改了线上实例的配置却没重做私有镜像,新扩出来的实例还是旧环境,健康检查继续失败。
- 只改了伸缩组安全组:官方说明伸缩配置和伸缩组同时指定安全组时,以伸缩配置中的为准,改错位置等于没改。
- 每组策略数量:官方 FAQ 写每个伸缩组同一时刻支持 1 个伸缩配置、10 个伸缩策略,策略多了要合并。
十、官方参考
伸缩组的伸缩活动
https://support.huaweicloud.com/usermanual-as/as_04_0100.html
伸缩组异常情况下如何处理(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0014.html
伸缩组启用失败如何处理(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0025.html
伸缩策略启用失败如何处理(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0026.html
什么是冷却时间,为什么需要冷却时间(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0035.html
创建伸缩策略
https://support.huaweicloud.com/usermanual-as/as_03_0102.html
监控指标说明(使用 CES 监控 AS)
https://support.huaweicloud.com/usermanual-as/as_06_0105.html
未安装 VMTools 对弹性伸缩组监控指标有什么影响(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0015.html
如何为伸缩组中的实例安装 Agent 插件(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_1908.html
弹性伸缩健康检查
https://support.huaweicloud.com/usermanual-as/as_06_0101.html
实例无法通过负载均衡健康检查而频繁被删除再重建(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_1205.html
配置后端服务器的安全组(共享型 ELB)
https://support.huaweicloud.com/usermanual-elb/elb_ug_hd_0002.html
配置后端服务器的安全组(独享型 ELB)
https://support.huaweicloud.com/usermanual-elb/elb_ug_hd_0007.html
健康检查异常排查(独享型)(FAQ)
https://support.huaweicloud.com/elb_faq/zh-cn_topic_0018127975.html
实例备用
https://support.huaweicloud.com/usermanual-as/as_04_0108.html
如何处理伸缩组中状态是"异常"的实例(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0030.html
如何阻止伸缩组内的云服务器被自动移除(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0028.html
同账户下不同用户操作时提示密钥对不存在(FAQ)
https://support.huaweicloud.com/as_faq/as_faq_0033.html
伸缩组生命周期挂钩管理
https://support.huaweicloud.com/usermanual-as/zh-cn_topic_0042018380.html
创建生命周期挂钩(API)
https://support.huaweicloud.com/api-as/as_06_0901.html
修改弹性伸缩组(API)
https://support.huaweicloud.com/api-as/as_06_0104.html
查询弹性伸缩组详情(API)
https://support.huaweicloud.com/api-as/as_06_0103.html
错误码(API)
https://support.huaweicloud.com/api-as/as_07_0102.html
- 点赞
- 收藏
- 关注作者
评论(0)