用 Terraform 一键创建压测环境,如何保证与生产规格 100% 一致
解读
面试官想验证三件事:
- 你是否理解“100% 一致”不仅是 CPU/内存,还包含机型、内核参数、磁盘类型、网络拓扑、安全组、依赖服务版本、AZ 分布、甚至云厂商的“小版本”特性。
- 你是否能把“人肉配置”全部代码化,且代码在 Git 里可回溯、可审计。
- 你是否知道国内云厂商(阿里云、腾讯云、华为云)在规格、计费、可用区、限购策略上的差异,并能在 Terraform 里做可移植封装,避免“北京 Region 能跑,上海 Region 跑不通”。
知识点
- 生产 CMDB 反向生成 Terraform:
- 用云厂商 OpenAPI 拉取生产资源清单 → 解析为 Terraform 状态 → 用 Terraformer 或 ROS-Template 反向生成 .tf 文件,保证字段级对齐。
- 数据面一致性:
- 使用相同 InstanceType 族(如阿里云 ecs.c7ne.large),且必须指定“专用宿主机”或“裸金属”防止超卖;
- 磁盘用相同 PerformanceLevel(PL1/PL2/PL3)与加密 ID;
- 网络开启 Jumbo Frame 9001,安全组规则逐条比对,包括优先级数字。
- 控制面一致性:
- 内核版本用 user-data 强制锁定
kernel-4.19.91-27.1.al7.x86_64; - 系统参数通过
sysctl.d/99-prod.conf注入,禁用透明大页、调整 netdev_budget; - 依赖服务(PolarDB、Tair、Kafka)用相同小版本,Terraform 里用
engine_version = "8.0.1.1.2"而非通配。
- 内核版本用 user-data 强制锁定
- 状态一致性:
- 远端状态锁放在 OSS + OTS(阿里云)或 COS + Tcaplus(腾讯云),开启 MFA 删除保护;
- 每次 apply 前跑
terraform plan -detailed-exitcode,非 0 即中断,防止漂移。
- 成本与合规:
- 国内账号默认按量计费上限 50 台,压测需提前提工单“提升配额”,Terraform 里用
alicloud_quotas_quota_application自动提交; - 使用“按量+抢占式”混合策略,压测完立即销毁,通过
terraform destroy -auto-approve绑定 CI 定时任务,避免隔夜费用。
- 国内账号默认按量计费上限 50 台,压测需提前提工单“提升配额”,Terraform 里用
- 可观测闭环:
- 在
user-data里安装云监控插件,实例拉起即上报 CPU 等待、PSS 内存; - 把压测环境的节点自动注册到 Prometheus 联邦集群,标签
env=pt,确保监控规则与生产同构,方便比对。
- 在
答案
“我会把一致性拆成‘看得见’和‘看不见’两部分。
第一步,用 Terraformer 反向导出生产现有资源,生成基准 .tf 文件,保证字段级不差。
第二步,把所有‘看不见’的配置也代码化:内核版本、sysctl、Jumbo Frame、PL 等级、宿主机类型、甚至云盘加密密钥 ID,全部写进 Terraform,并通过 user-data 与 cloud-init 一次性注入,杜绝人工 SSH 调优。
第三步,用 Terraform Workspace 区分 prod/pt,但共用同一套模块,确保唯一差异只是实例数量与计费方式;状态文件放在 OSS+OTS,开启版本控制与 MFA 删除,防止被人为篡改。
第四步,在 CI 里跑 terraform plan -detailed-exitcode,只要出现任何字段漂移就中断流水线;压测结束后自动 terraform destroy,并调用云 API 校验资源为 0,防止费用泄露。
第五步,把压测节点自动注册到与生产同一套 Prometheus 联邦,标签 env=pt,确保监控视角一致,方便后续量化对比。
通过这五步,可以把差异压缩到‘仅数据为空’,实现硬件、系统、网络、依赖、监控的 100% 镜像,从而让压测结果具备直接外推生产的可信度。”
拓展思考
- 如果生产用了混合云(线上 ACK + 线下物理机),如何让 Terraform 同时编排裸金属?
思路:用 Terraform Provider for Redfish/IPMI 管理裸金属电源与 BIOS 设置,通过 Ansible Provider 做 OS 层配置,把裸金属当作“自定义计算资源”注册到线上 VPC,实现统一编排。 - 国内云厂商小版本号频繁升级,如何锁定?
在 Terraform 里用data "alicloud_images" prod { owners = "self" name_regex = "prod-base-20240515" }把镜像 ID 写死,并开启镜像复制到压测账号,避免“最新镜像”带来差异。 - 压测环境需要 10 倍生产流量,但生产只有 3 个 AZ,如何既横向扩容又保持拓扑?
用 Terraform 的count+subnet_mapping动态生成“子 AZ”,即在同一 Region 内新建多个虚拟交换机,绑定不同网段,通过 CLB 跨 AZ 挂载,模拟 3→9 的扩容,但保持延迟相近。