3、计算资源优化(上):实例规格选型与弹性伸缩策略
大家好,我是老张。今天咱们聊聊计算资源优化里最基础、也最容易被忽视的一块——实例规格选型和弹性伸缩策略。说白了,就是「选什么样的机器」和「怎么让机器数量跟着业务跑」。
我在很多项目里都见过这样的情况:业务量上来了,机器配了一大堆,结果 CPU 利用率不到 10%,内存倒是快满了。或者反过来,CPU 打满,内存还剩一大半。嗯,这就是规格没选对。
3.1 实例规格选型:通用型 vs 计算型 vs 内存型
先说说这三类实例的核心区别。你想想看,云厂商把实例分成这几类,本质上就是让你按需分配 CPU 和内存的比例。
| 规格类型 | CPU:内存比例 | 典型场景 | 我踩过的坑 |
|---|---|---|---|
| 通用型 | 1:4 左右 | Web 服务器、中小型数据库、微服务 | 曾经用通用型跑高并发计算,CPU 打满,内存浪费 60% |
| 计算型 | 1:2 或 1:1 | 批处理、视频编码、科学计算 | 用计算型跑 Redis,内存不够,频繁 OOM |
| 内存型 | 1:8 或更高 | 缓存、内存数据库、实时分析 | 用内存型跑 Nginx,纯属浪费钱 |
我个人习惯是:先看业务对 CPU 和内存的敏感度。比如你的应用是 CPU 密集型的,那就别犹豫,直接上计算型。如果是缓存类应用,内存型才是正解。
核心原则:不要让 CPU 和内存的利用率差距超过 30%。如果差距太大,说明规格选错了。
3.2 弹性伸缩策略:HPA 与 VPA
选好了实例规格,接下来就是「怎么让机器数量跟着业务跑」。这里有两个主流策略:HPA(水平 Pod 自动伸缩)和 VPA(垂直 Pod 自动伸缩)。
3.2.1 HPA:加机器还是减机器
HPA 说白了就是「加机器」或「减机器」。它根据 CPU、内存或自定义指标,动态调整 Pod 的副本数。
我曾经在一个电商大促项目中,HPA 配置得太激进,结果流量一波动,Pod 频繁创建和销毁,反而把数据库打崩了。嗯,这里要注意:HPA 的冷却时间(cooldown)一定要设置合理。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # 冷却时间,避免频繁缩容
policies:
- type: Pods
value: 1
periodSeconds: 60
我的建议:HPA 的指标不要只用 CPU,最好加上内存或自定义的业务指标(比如 QPS)。单一指标容易误判。
3.2.2 VPA:调大还是调小
VPA 和 HPA 不同,它不加减机器,而是调整每个 Pod 的资源配置(CPU、内存)。说白了就是「给 Pod 增肥或减肥」。
VPA 适合那些「资源需求不稳定」的应用。比如一个 Java 应用,平时内存占用 2GB,高峰期突然飙到 4GB。用 VPA 可以自动把内存限制调上去。
但要注意:VPA 调整 Pod 资源时,需要重启 Pod。这在生产环境里是个大问题。我曾经在一个核心交易系统上试过 VPA,结果 Pod 重启导致了几秒的请求超时……嗯,从那以后,我建议核心业务用 HPA,非核心业务用 VPA。
避坑指南:VPA 和 HPA 不要同时用同一个指标。否则会出现「VPA 调大了 Pod 资源,HPA 觉得不需要加机器了」的冲突。我见过有人这么干,结果资源利用率反而下降了。
3.3 Spot 实例与预留实例组合策略
聊完了规格和伸缩,咱们再来说说「怎么省钱」。Spot 实例和预留实例是云厂商给的两大省钱利器,但用不好就是坑。
3.3.1 Spot 实例:便宜但有风险
Spot 实例说白了就是「云厂商的闲置资源」,价格可能只有按需实例的 20%-30%。但代价是:云厂商随时可能回收。
我建议把 Spot 实例用在「无状态、可中断」的服务上。比如批处理任务、视频转码、大数据计算。千万别把数据库或核心 API 跑在 Spot 上,否则云厂商一回收,你就等着报警吧。
3.3.2 预留实例:锁定价格
预留实例是「你承诺用一年或三年,云厂商给你打折」。折扣力度很大,但灵活性差。如果你业务稳定,预留实例是首选。
我个人习惯是:把基础负载(比如 60% 的流量)用预留实例覆盖,剩下的用按需或 Spot 实例。这样既保证了稳定性,又省了钱。
3.3.3 组合策略:混合部署
最理想的策略是「混合部署」。比如:
- 核心服务(数据库、API 网关):用预留实例 + 按需实例
- 弹性服务(Web 服务器、微服务):用 Spot 实例 + HPA
- 批处理任务:全用 Spot 实例
我曾经在一个视频处理平台上这么搞过:预留实例覆盖了 50% 的负载,Spot 实例覆盖了 40%,按需实例只占 10%。整体成本降低了 35% 左右。
核心思路:用预留实例兜底,用 Spot 实例冲高,用按需实例补缺口。
3.4 本章知识体系
下面这张图是我自己画的,把本章的核心逻辑串起来了。你一看就明白。
好了,这一章的内容就到这里。规格选型、弹性伸缩、成本策略,这三块是计算资源优化的核心。下一章咱们接着聊「存储资源优化」,到时候见。