第 10 章 · HPA 压测与容量运维
本章目标:用 k6 压测基线 + HPA + 副本数公式 把「感觉要扩容」变成可计算决策;与 架构 ch09 容量公式对齐;制定 demo-mall 大促 checklist。
学时建议:2.5~3 小时(含 2 小时跟练)
前置:ops-deploy ch07 监控;架构 ch09 容量规划;ch02 requests 已配置。
10.1 场景说明
| 项目 | 内容 |
|---|---|
| 背景 | demo-mall 大促预估 QPS 从 50 → 267;当前 prod 3 副本, unsure 是否够 |
| 痛点 | 上次大促手动加副本滞后 20min;曾 OOMKill |
| 你的角色 | 容量运维,产出压测报告 + HPA 配置 |
| 本章任务 | staging k6 压测填表;prod 配 HPA;CPU 加压观察扩容 |
| 约束 | 压测仅 staging-app;prod HPA maxReplicas 需变更单 |
10.2 学完你能
| 能力 | 验收标准 |
|---|---|
| 压测 | 运行 k6 并记录 VU/QPS/P99 表 |
| 安全水位 | 从数据得出单 Pod 安全 QPS |
| 副本公式 | 大促 267 QPS 算出建议副本 |
| HPA | 编写 v2 HPA YAML 并解释 behavior |
| 集群扩容 | HPA vs Cluster Autoscaler 分工 |
| 大促清单 | 6 项 checklist 勾选 |
10.3 容量运维闭环
业务预测 → k6 压测单 Pod 极限 → 算副本数 → HPA 自动 → 大促人工复核
你应该看到:文档链:业务 QPS 预测 → 压测报告 → HPA min/max → 变更单。
10.4 逐步跟练 · 第一步:k6 压测(约 50 分钟)
准备:staging demo-api 单副本或固定 1 Pod 压测(scale down 其他便于测单 Pod 极限)。
脚本 load-test.js:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 20 }, // 爬坡
{ duration: '5m', target: 60 },
{ duration: '3m', target: 100 },
{ duration: '2m', target: 0 }, // 降压
],
thresholds: {
http_req_failed: ['rate<0.001'],
http_req_duration: ['p(99)<400'],
},
};
export default function () {
const res = http.get('http://demo-api.staging-app.svc/api/v1/products');
check(res, { '200': r => r.status === 200 });
sleep(0.1);
}
运行(集群内 k6 Job 或本地 port-forward):
k6 run load-test.js
同步观察:运维 → 监控告警 CPU、P99、5xx。
结果记录表(单 Pod 2C4G 示例):
| VU | QPS | P99 | 错误率 | CPU% |
|---|---|---|---|---|
| 20 | 95 | 120ms | 0% | 42 |
| 40 | 175 | 280ms | 0% | 68 |
| 60 | 210 | 380ms | 0.1% | 82 |
| 80 | 228 | 520ms | 1.4% | 95 |
安全水位定义:P99 < 400ms 且错误率 < 0.1% 的最高 QPS → 本例 ≤ 180 QPS/Pod。
你应该看到:VU=80 时 thresholds 失败;k6 输出红色 ✗。
10.5 逐步跟练 · 第二步:副本数公式(约 20 分钟)
副本数 = ceil(目标QPS / 单Pod安全QPS × (1 + 冗余率))
| 场景 | 计算 | 建议副本 |
|---|---|---|
| 日常 50 QPS,冗余 35% | ceil(50/180×1.35)=1 | 3(跨 AZ N+1,非纯数学 1) |
| 大促 267 QPS | ceil(267/180×1.35)=2 | 6~8(含 HPA headroom) |
工程规则:数学 ceil 结果与 minReplicas、PDB、多 AZ 取 max。
你应该看到:书面结论「大促前 minReplicas 提至 6,maxReplicas 12」。
10.6 逐步跟练 · 第三步:HPA 配置(约 40 分钟)
应用部署 → prod-app → HPA 或 YAML:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: demo-api-hpa
namespace: prod-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: demo-api
minReplicas: 3
maxReplicas: 12
metrics:
- type: Resource
resource:
name: cpu
target: