用 Terraform 一键创建压测环境,如何保证与生产规格 100% 一致

解读

面试官想验证三件事:

  1. 你是否理解“100% 一致”不仅是 CPU/内存,还包含机型、内核参数、磁盘类型、网络拓扑、安全组、依赖服务版本、AZ 分布、甚至云厂商的“小版本”特性。
  2. 你是否能把“人肉配置”全部代码化,且代码在 Git 里可回溯、可审计。
  3. 你是否知道国内云厂商(阿里云、腾讯云、华为云)在规格、计费、可用区、限购策略上的差异,并能在 Terraform 里做可移植封装,避免“北京 Region 能跑,上海 Region 跑不通”。

知识点

  1. 生产 CMDB 反向生成 Terraform:
    • 用云厂商 OpenAPI 拉取生产资源清单 → 解析为 Terraform 状态 → 用 Terraformer 或 ROS-Template 反向生成 .tf 文件,保证字段级对齐。
  2. 数据面一致性:
    • 使用相同 InstanceType 族(如阿里云 ecs.c7ne.large),且必须指定“专用宿主机”或“裸金属”防止超卖;
    • 磁盘用相同 PerformanceLevel(PL1/PL2/PL3)与加密 ID;
    • 网络开启 Jumbo Frame 9001,安全组规则逐条比对,包括优先级数字。
  3. 控制面一致性:
    • 内核版本用 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" 而非通配。
  4. 状态一致性:
    • 远端状态锁放在 OSS + OTS(阿里云)或 COS + Tcaplus(腾讯云),开启 MFA 删除保护;
    • 每次 apply 前跑 terraform plan -detailed-exitcode,非 0 即中断,防止漂移。
  5. 成本与合规:
    • 国内账号默认按量计费上限 50 台,压测需提前提工单“提升配额”,Terraform 里用 alicloud_quotas_quota_application 自动提交;
    • 使用“按量+抢占式”混合策略,压测完立即销毁,通过 terraform destroy -auto-approve 绑定 CI 定时任务,避免隔夜费用。
  6. 可观测闭环:
    • user-data 里安装云监控插件,实例拉起即上报 CPU 等待、PSS 内存;
    • 把压测环境的节点自动注册到 Prometheus 联邦集群,标签 env=pt,确保监控规则与生产同构,方便比对。

答案

“我会把一致性拆成‘看得见’和‘看不见’两部分。
第一步,用 Terraformer 反向导出生产现有资源,生成基准 .tf 文件,保证字段级不差。
第二步,把所有‘看不见’的配置也代码化:内核版本、sysctl、Jumbo Frame、PL 等级、宿主机类型、甚至云盘加密密钥 ID,全部写进 Terraform,并通过 user-datacloud-init 一次性注入,杜绝人工 SSH 调优。
第三步,用 Terraform Workspace 区分 prod/pt,但共用同一套模块,确保唯一差异只是实例数量与计费方式;状态文件放在 OSS+OTS,开启版本控制与 MFA 删除,防止被人为篡改。
第四步,在 CI 里跑 terraform plan -detailed-exitcode,只要出现任何字段漂移就中断流水线;压测结束后自动 terraform destroy,并调用云 API 校验资源为 0,防止费用泄露。
第五步,把压测节点自动注册到与生产同一套 Prometheus 联邦,标签 env=pt,确保监控视角一致,方便后续量化对比。
通过这五步,可以把差异压缩到‘仅数据为空’,实现硬件、系统、网络、依赖、监控的 100% 镜像,从而让压测结果具备直接外推生产的可信度。”

拓展思考

  1. 如果生产用了混合云(线上 ACK + 线下物理机),如何让 Terraform 同时编排裸金属?
    思路:用 Terraform Provider for Redfish/IPMI 管理裸金属电源与 BIOS 设置,通过 Ansible Provider 做 OS 层配置,把裸金属当作“自定义计算资源”注册到线上 VPC,实现统一编排。
  2. 国内云厂商小版本号频繁升级,如何锁定?
    在 Terraform 里用 data "alicloud_images" prod { owners = "self" name_regex = "prod-base-20240515" } 把镜像 ID 写死,并开启镜像复制到压测账号,避免“最新镜像”带来差异。
  3. 压测环境需要 10 倍生产流量,但生产只有 3 个 AZ,如何既横向扩容又保持拓扑?
    用 Terraform 的 count + subnet_mapping 动态生成“子 AZ”,即在同一 Region 内新建多个虚拟交换机,绑定不同网段,通过 CLB 跨 AZ 挂载,模拟 3→9 的扩容,但保持延迟相近。