想象你是“云端咖啡”连锁品牌的全球开店工程师。过去开一家分店,你要飞过去蹲守三个月:盯装修、催设备、培训店员,每个国家都得从头来一遍。现在总部要求你写一本《开店手册》,把开店流程全部标准化——设备清单、水电图纸、资产标签、当地供应商匹配表,全部装进一个活页夹。于是,东京店、法兰克福店、硅谷店可以同时动工,三周内统一开业,各不相同的地理环境被同一本手册“翻译”成了相似的分店。 这本“开店手册”在云计算世界里有一个专业名字:基础设施即代码(Infrastructure as Code,简称 IaC)。当你要在多个云厂商上部署 GPU 集群,用于 AI 训练和推理时,手工点击控制台已经完全不现实——你需要一套可复用的 IaC 模板,像开店手册一样,把“算力分店”同时开到 AWS、Azure、GCP。而 Terraform 就是写这本手册最流行的“笔”。接下来,我们就从零开始,把这本手册一页一页地拆开来看。

岗位关联

学完本文,你将能设计一套可复用的跨云 GPU 集群 Terraform 模板,掌握模板分层、网络抽象、标签治理与状态管理,这是云架构师与 DevOps 工程师的核心竞争力。

目录
  1. 可视化演示
  2. 1. 模板架构总览:开店手册的活页夹
  3. 2. GPU实例模板:设备采购清单不写死品牌
  4. 3. 网络配置抽象:水电图纸用相对坐标
  5. 4. 资源标签策略:每台设备都有资产标签
  6. 5. 多云适配层:当地供应商匹配表
  7. 6. 状态与编排:总部的统一账本与一把锁
  8. 7. 密钥与安全:密码锁进保险库
  9. 8. 运维实践方法:试营业、审批与版本统一
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示IaC模板统一管理多云GPU集群的部署流程,包含模板定义、跨云部署与GPU实例监控三个阶段。

本节配有交互动效(进入视口后自动加载,约 3KB)。

跨云GPU集群IaC模板设计 IaC模板:Terraform统一定义GPU实例规格 跨云部署:AWS/GCP/Azure三云同步应用 GPU监控:实例运行状态与资源利用率 总GPU = Σ(cloud_i.gpu_count)

1. 模板架构总览:开店手册的活页夹

你是一家跨国咖啡连锁的“开店工程师”。过去开一家分店,你要飞过去蹲守三个月,盯装修、催设备、培训店员,每个国家都从零折腾一遍。现在总部要求你把开店流程沉淀成一本《开店手册》,而且是活页夹:装修册、设备册、培训册、标签册各自独立。东京店只需要替换设备册里的电压适配页,其他册子原样照搬。不同国家的分店,就这样被同一本手册“翻译”成了相似的店面。

在云的世界里,这本活页夹就是 Terraform 工程的目录结构。modules/ 目录放可复用的子模块——gpu、network、tags 各占一册;根目录的 main.tf 负责把册子组装起来;variables.tf 是手册里的填空位,outputs.tf 是开业后向总部汇报的经营指标。再加上 dev、staging、prod 三套环境参数,试营业和正式营业互不干扰,就像手册的“演示版”和“正式版”分开印刷。

子模块按资源角色拆分,每个模块内部有独立的变量声明和输出定义,外部只通过变量传参沟通,就像活页册之间只通过目录索引互相引用。环境分层用 terraform.tfvars 按环境提供不同的变量值:生产环境的实例数量、规格、标签与开发环境完全隔离,避免“试营业把正式厨房搞乱”的悲剧。

cluster_name=project_env_region_role⏟全局唯一,一搜即得\text{cluster\_name} = \underbrace{\text{project}\_\text{env}\_\text{region}\_\text{role}}_{\text{全局唯一,一搜即得}}

1. project 项目标识:标记业务项目归属,如大模型训练项目 llm-lab,用于多项目隔离与账单归属。

project="llm-lab"\text{project} = \text{"llm-lab"}

2. env 环境标识:区分开发、预发与生产环境,保证环境之间互不干扰。

env∈{dev, staging, prod}\text{env} \in \{\text{dev},\ \text{staging},\ \text{prod}\}

3. region 区域取值:写入云厂商的区域代码,如 ap-southeast-1,决定资源部署的物理位置。

region="ap-southeast-1"\text{region} = \text{"ap-southeast-1"}

4. role 资源角色:标注资源用途,如训练节点或推理节点,便于针对性治理与检索。

role∈{train, infer, preprocess}\text{role} \in \{\text{train},\ \text{infer},\ \text{preprocess}\}

有了规范的活页夹,新店开业就变成“填表加组装”的流水线;有了规范的模板架构,接入新云、新环境也只是增加一页配置,而不是重写整本书。这,就是 IaC 模板设计的起点。

2. GPU实例模板:设备采购清单不写死品牌

翻开《开店手册》的设备册,你会发现它不会写“购买东京牌的咖啡机”,而是写“双锅炉意式咖啡机,支持 220V/110V 自适应,日产能不低于 500 杯”。东京店和法兰克福店按同一套能力标准在当地采购,品牌随区域而定。这样,设备清单才不会被单一供应商绑架。

GPU 实例模板也是同样的哲学:不把 p4d.24xlarge 这类具体机型写死在代码里,而是声明“我需要 8 卡 A100、显存 80GB、64 核 CPU”这样的能力规格。至于这个规格在 AWS 上是 p4d.24xlarge、在 Azure 上是 Standard_ND96asr_v4、在 GCP 上是 a2-highgpu-8g,统统交给适配层去翻译,模板主体永远只认抽象规格。

技术细节上,实例规格要用变量参数化:gpu_type、gpu_count、cpu_cores、memory_gb 全部来自变量;自定义镜像要固化驱动与 CUDA 版本,避免每次启动现场装环境;user_data 启动脚本负责拉起训练框架;弹性伸缩按训练队列长度扩容,闲时按需缩容,像“忙碌时段加开吧台,闲时关掉一台咖啡机”。

Ctotal=∑i=1npi×ti\displaystyle C_{\text{total}} = \sum_{i=1}^{n} p_i \times t_i

1. n 实例种类数:按 GPU 规格分组的实例种类数量,规格越少越易管理。

n=规格种类数n = \text{规格种类数}

2. p_i 单位价格:第 i 种实例每小时的单价,不同云、不同区域价格不同。

pi=单价(美元/小时)p_i = \text{单价(美元/小时)}

3. t_i 运行时长:第 i 种实例累计运行的小时数,弹性伸缩会影响这一项。

ti=运行小时数t_i = \text{运行小时数}

设备清单的标准不锁定品牌,门店才能快速复制;GPU 规格的声明不锁定云厂商,集群才能随处开张。这就是 GPU 实例模板“规格化”的威力。

3. 网络配置抽象:水电图纸用相对坐标

装修册里的图纸从不写绝对 GPS 坐标,而是写“吧台位于门厅右侧 3 米、后厨与吧台隔一堵承重墙”。这样不管店面是扇形还是长方形,都能按相对位置套用。云网络也一样,如果把网段写死,换个区域就全盘作废。

网络模块的核心是把 VPC、子网、安全组抽象成“相对图纸”。统一规划 CIDR 网段:管理子网、计算子网、存储子网各占一段,像厨房的水路、电路、燃气分开铺设;安全组就是一张“门禁卡授权表”,规定 22 端口谁能 SSH、GPU 节点之间的数据面端口如何放行、公网入口对谁开放。

此外,跨云集群需要互联:通过 VPC Peering 或 VPN 隧道,把三朵云的控制面和数据面打通,让训练任务可以跨云调度;负载均衡器把推理流量分发到各云的多副本上,像“总台把顾客引导到不同分店”。子网规划时要预留扩容量,否则后期加节点发现 IP 不够用,只能推倒重来。

2m≥Nnode+Nreserve2^{m} \ge N_{\text{node}} + N_{\text{reserve}}

1. m 主机位位数:子网掩码中剩余的主机位个数,决定该子网能容纳多少 IP。

m=主机位位数m = \text{主机位位数}

2. N_node 节点总数:需要承载的 GPU 计算节点数量,是容量的下限。

Nnode=GPU 节点数N_{\text{node}} = \text{GPU 节点数}

3. N_reserve 预留数量:为负载均衡、网关、运维跳板机预留的 IP 数。

Nreserve≈5∼10N_{\text{reserve}} \approx 5 \sim 10

图纸可复用、门禁规则跟人走,这就是网络配置抽象的价值:换一家店,重新量一下尺寸,但规则册一字不改。跨云组网亦是如此。

4. 资源标签策略:每台设备都有资产标签

每一家分店的每台设备,都要在显眼位置贴上“资产标签”:所属门店编号、购入日期、负责人姓名。月底财务对账靠它,总部盘点靠它,设备保修、事故追责还是靠它。没有标签的店,三个月后就成了一笔糊涂账。

云资源标签就是这套资产标签体系,本质是键值对。模板里要定义统一规范:project 标项目、env 标环境、team 标团队、cost_center 标成本中心。这些标签会跟随资源进入云厂商的账单,财务月底按标签自动出成本报表;IAM 权限策略也能按标签授权,比如“算法团队只能操作 team=algorithm 的资源”,相当于“只有后厨员工卡能开后厨门”。

实现上,标签要在模块入口统一注入,所有子资源强制继承,防止有人漏贴;标签键值要建立白名单校验,拼写漂移(如 team 和 Team 并存)会导致账单无法聚合;环境与团队标识是最低要求的两个标签,缺一不可。

T={(k1,v1),(k2,v2),…,(kn,vn)},(k,v)∈TT = \{(k_1, v_1), (k_2, v_2), \dots, (k_n, v_n)\}, \quad (k, v) \in T

1. k 标签键:标签的键必须来自白名单,如 project、env、team 等。

k∈{project, env, team, cost_center}k \in \{\text{project},\ \text{env},\ \text{team},\ \text{cost\_center}\}

2. v 标签值:与键对应的取值,如团队名 algorithm,表示资源的归属。

v="algorithm"v = \text{"algorithm"}

3. 集合运算关系:每个资源都附带一组标签集合,查询、审计、分摊都按集合筛选。

∀(k,v)∈T, 该资源可被检索与归集\forall (k, v) \in T,\ \text{该资源可被检索与归集}

资产标签让数百台设备井井有条,资源标签让跨云集群的账单和权限一清二楚。标签不是打给机器看的,是打给一个月后的自己看的。

5. 多云适配层:当地供应商匹配表

手册的最后几页,附了一张《当地供应商匹配表》:东京分店找东芝供货,法兰克福分店找西门子供货,多伦多分店找本地经销商。采购部照表执行,不需要临时询价、重新设计;手册正文永远只写“双锅炉意式咖啡机”。

适配层就是这张匹配表。Terraform 通过 provider 声明云厂商(aws、azurerm、google),每个 provider 是一个“当地供应商插件”;子模块内部用 count 或 for_each 根据 var.cloud 决定创建哪一类资源,用 provider 参数把不同云的具体资源配置传给子模块,结构上清晰得像查表。

实现技巧:维护一个“机型映射表”,把抽象规格翻译成各云机型;用 data source 读取区域可用区等只读信息,避免硬编码;多个 provider 别名对应多个区域,实现就近部署。用户只需在 tfvars 里声明“我要在 aws 的新加坡区域开 8 卡 A100”,剩下的由适配层完成。

machine=M(cloud, spec),M: Cloud×Spec→Instance\text{machine} = M(\text{cloud},\ \text{spec}), \qquad M:\ \text{Cloud} \times \text{Spec} \to \text{Instance}

1. cloud 云厂商标识:取值限定为已支持的云厂商,如 aws、azure、gcp。

cloud∈{aws, azure, gcp}\text{cloud} \in \{\text{aws},\ \text{azure},\ \text{gcp}\}

2. spec 算力规格:用户声明的抽象算力要求,如 8 卡 A100。

spec="8xA100"\text{spec} = \text{"8xA100"}

3. M 映射关系:把抽象规格翻译为各云具体机型的映射规则,如 AWS 对应 p4d.24xlarge。

M(aws, "8xA100")="p4d.24xlarge"M(\text{aws},\ \text{"8xA100"}) = \text{"p4d.24xlarge"}

供应商匹配表让采购标准化,适配层让“同样的算力诉求”在每朵云上都找到最合适的机型。模板主体一次编写,多处复用,跨云不再意味着重复劳动。

6. 状态与编排:总部的统一账本与一把锁

总部绝不能靠各店微信汇报来掌握资产。每家店的设备台账必须实时同步到总部 ERP,而且这本账一次只允许一个店长修改——两个人同时改同一行,账必乱。这是连锁管理的基本常识。

Terraform 的状态(state)文件就是这套账本,记录“模板中的逻辑资源 ↔ 云上的真实资源”的映射关系。它必须放在远程后端(如 S3、OSS、GCS),配一张锁表(如 DynamoDB),让团队共享账本且一次仅一人可写。本地文件只适合单人练习,团队协作时放在各自电脑里的账本必然漂移。

状态锁机制保证并发 apply 时不会互相踩踏;依赖编排通过 depends_on 和资源依赖图保证创建顺序:先建 VPC,再建子网,最后建 GPU 实例;工作空间按环境隔离状态文件,prod 和 dev 各有一本账,互不干扰,像“总账与门店备用账分开登记”。

St+1=Apply(St, D)S_{t+1} = \text{Apply}(S_t,\ D)

1. S_t 当前状态:当前状态文件所描述的资源集合,是“账本上的东西”。

St=当前已管理资源集合S_t = \text{当前已管理资源集合}

2. D 期望状态:模板声明的目标状态,即“手册里写明的设备清单”。

D=IaC 模板声明D = \text{IaC 模板声明}

3. Apply 差异执行:计算期望与当前的差集,对差集资源执行创建或更新,多余资源则删除。

Δ=D−St⇒create\Delta = D - S_t \Rightarrow \text{create}

有统一账本加一把锁,三家分店才敢同时动工互不踩踏;有了远程状态和锁机制,跨云集群的并发变更是安全、可审计的。

7. 密钥与安全:密码锁进保险库

开店手册的封面上,绝不会印“总保险柜密码 123456”。正确的做法是:密码由总部保险库保管,店长开业当天凭授权领取,手册里只写“去保险库领取本店密码”这一步操作。分店越多,越不能把密码写进每一本手册。

Terraform 项目同理。云厂商的访问密钥、数据库密码、API Key 这些敏感信息,绝不能以明文出现在模板或 tfvars 里。Provider 凭据通过环境变量或 CI 系统的密钥服务注入;资源密码通过 Vault、AWS SSM、Azure Key Vault 等密钥服务动态注入,模板里只写“从密钥服务读取”的声明,不写值本身。

还要注意:状态文件里会保存资源的敏感属性,因此远程状态必须加密存储、加密传输;权限遵循最小原则,生产与测试环境使用不同的凭据,就像“总店保险库的钥匙和分店备用钥匙分开保管”,即使一把泄露,损失也可控。

plain=Decryptkey(cipher)\text{plain} = \mathrm{Decrypt}_{\text{key}}(\text{cipher})

1. cipher 密文:状态文件或配置中的加密后敏感信息,泄露了也无法直接读取。

cipher=加密后的密钥\text{cipher} = \text{加密后的密钥}

2. key 加密密钥:由 KMS 等密钥管理系统保管的主密钥,用于解密操作。

key=KMS 主密钥\text{key} = \text{KMS 主密钥}

3. Decrypt 解密操作:仅授权实体可调用的解密函数,把密文还原为可用配置。

Decrypt: cipher↦plaintext\mathrm{Decrypt}:\ \text{cipher} \mapsto \text{plaintext}

把密码交给保险库而不是印在手册里,分店再多也安全;把密钥交给密钥服务而不是写进模板,云再多也不泄露。

8. 运维实践方法:试营业、审批与版本统一

新店正式开业前必须“试营业”:把手册和店面条件过一遍,模拟一次完整营业流程,区域经理签字后才能正式动工。同时,手册每次改版要统一印刷版号,绝不允许东京用 v1、法兰克福用 v3 的分裂状态。

对应到 IaC 运维:CI 流水线里先运行 terraform plan 生成变更预览,像“试营业”一样告诉人们这次改动会创建什么、修改什么、删除什么;人工审批通过后,才执行 terraform apply 真正生效。模块要打语义化版本号(如 v1.2.0),模板用固定版本引用,杜绝“在我机器上是好的”这类事故。

工具链上,Atlantis 或 Terraform Cloud 可以做到“PR 驱动审批流”——代码提交后自动 plan,审批按钮亮起后由工具执行 apply;状态文件定期备份;成本效率方面,spot 实例与按需实例混部、设置自动缩容策略,并按可用性指标定期复盘,像“每季度核对一次各店坪效”。

A=TupTup+Tdown×100%A = \frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}} \times 100\%

1. T_up 可用时长:集群正常提供服务的小时数,是公式的分子。

Tup=正常服务小时数T_{\text{up}} = \text{正常服务小时数}

2. T_down 不可用时长:故障或维护导致的不可用小时数,与可用时长相加为总时间。

Tdown=不可用小时数T_{\text{down}} = \text{不可用小时数}

3. A 可用性指标:最终计算出的百分比,目标是 99.9% 以上,作为运维复盘基准。

A≥99.9%A \ge 99.9\%

演练、审批、版本统一,让开分店变成可复制的流水线;跨云 GPU 集群的运维,也从“救火队”变成“标准化生产线”。

AI 应用场景

场景 1:跨云 AI 训练平台自动化交付

阶段:云基础设施交付(训练环境准备)

解决的问题:传统方式下,算法团队要在三个云控制台分别点击创建 VPC、实例、安全组,配置容易漂移,一套环境要等数周。采用 IaC 模板后,一套代码 + 适配层即可在半小时内交付三地同构的 GPU 训练环境,环境一致性由代码保证。

具体案例:某大模型创业公司在 AWS、Azure、GCP 上统一部署 8 卡 A100 训练集群,模板中声明 spec = "8xA100",适配层自动映射各云机型;所有资源打上 project=llm-lab、team=algorithm 标签,月底账单自动按团队分摊,训练环境从“申请-排队-搭建”变成“提交-自动交付”。

场景 2:推理集群跨云容灾与弹性扩容

阶段:推理服务部署与高可用运行

解决的问题:单一云厂商故障会导致线上推理中断。通过 IaC 模板把推理服务同时部署到两个云,配合跨云 VPN 与负载均衡,实现主备集群一键切换,故障时业务不中断。

具体案例:某智能客服 NLP 服务将推理集群部署在 AWS 与腾讯云,模板按 role=infer 标注资源,监控系统按标签聚合告警;高峰期通过弹性伸缩策略自动扩容 GPU 节点,闲时缩容,成本下降约 40%。

场景 3:多团队 GPU 成本归集与 FinOps 治理

阶段:资源成本管理与预算治理

解决的问题:多个算法团队共享 GPU 资源池,账单混在一起无法分账,预算超支找不到责任人。基于统一标签规范,资源自动归集到团队与成本中心,财务可按月输出分摊报表。

具体案例:某中型企业用模板强制注入 cost_center 标签并做白名单校验,接入云账单系统后,每个团队的 GPU 月成本一目了然;超出预算的团队在下次申请时收到自动提醒,治理效率大幅提升。

Python 演示

python70 行
# -*- coding: utf-8 -*-# 演示: 跨云GPU模板的适配层 + 标签 + 成本估算from datetime import date INSTANCE_MAP = {    "aws": {"8xA100": "p4d.24xlarge", "8xH100": "p5.48xlarge"},    "azure": {"8xA100": "Standard_ND96asr_v4", "8xH100": "Standard_ND96isr_H100_v5"},    "gcp": {"8xA100": "a2-highgpu-8g", "8xH100": "a3-highgpu-8g"},} PRICE_PER_HOUR = {    ("aws", "8xA100"): 32.77,    ("azure", "8xA100"): 31.50,    ("gcp", "8xA100"): 29.84,}  class GpuTemplate:    def __init__(self, project, env, region, role):        self._project = project        self._env = env        self._region = region        self._role = role        self._tags = {}     def cluster_name(self):        # 命名模板: project_env_region_role        return "{}_{}_{}_{}".format(self._project, self._env, self._region, self._role)     def build_tags(self, team, cost_center):        self._tags = {            "project": self._project,            "env": self._env,            "team": team,            "cost_center": cost_center,            "created": date.today().isoformat(),        }        return self._tags     def map_instance(self, cloud, spec):        # 适配层: 抽象规格 -> 各云具体机型        try:            return INSTANCE_MAP[cloud][spec]        except KeyError:            raise ValueError("unsupported cloud or spec: {}/{}".format(cloud, spec))     def estimate_cost(self, cloud, spec, hours):        # 成本公式: 单价 x 时长        price = PRICE_PER_HOUR[(cloud, spec)]        return {            "cloud": cloud,            "instance": self.map_instance(cloud, spec),            "hours": hours,            "unit_price": price,            "total": round(price * hours, 2),        }  def main():    tmpl = GpuTemplate("llm-lab", "prod", "ap-southeast-1", "train")    print("cluster name:", tmpl.cluster_name())    print("tags:", tmpl.build_tags("algorithm", "CC-9001"))    for cloud in ("aws", "azure", "gcp"):        detail = tmpl.estimate_cost(cloud, "8xA100", 24)        print("{} -> {} cost ${} for {}h".format(            cloud, detail["instance"], detail["total"], detail["hours"]))  if __name__ == "__main__":    main()
目的:用 Python 模拟跨云 GPU 模板核心逻辑——命名拼接、标签注入、机型映射与成本估算,帮助理解 Terraform 适配层的设计思想。
  1. return "{}_{}_{}_{}".format(...)实现命名模板 project_env_region_role,与正文公式一一对应。
  2. self._tags = {...}统一注入标签规范,所有资源继承同一套键值对。
  3. INSTANCE_MAP[cloud][spec]适配层查表逻辑,把抽象规格翻译成各云具体机型。
  4. PRICE_PER_HOUR[(cloud, spec)]成本单价表,对应成本公式中的 p_i。
  5. price * hours计算总成本,对应成本公式 C = Σ p × t。
  6. if __name__ == "__main__":可执行入口,让脚本既能被导入也能直接运行。

常见误区

误区“Terraform 支持多个 provider,我直接把 `aws_instance` 写死不就行了?跨云无非就是把这套文件复制一份改成 azure 的写法。”

正解为每个云各维护一套完整模板,等于三本手册各写一遍,改一处要同步三处,迟早走向配置漂移。正确做法是抽象出能力规格(如 8xA100),由适配层映射到各云机型。就像开店手册写死“东芝咖啡机”,到德国就抓瞎;应该写“双锅炉意式咖啡机”,让供应商匹配表去翻译。

为何常见:云厂商的 GPU 机型命名差异巨大,初学者直接照搬控制台上的机型名最省事,却忽略了模板复用才是 IaC 的价值所在。

误区“state 文件不就是个记录吗?丢了就丢了,我重新跑一遍 plan 让它对照真实资源生成一份新的不就行了。”

正解没有 state 文件,Terraform 无法判断哪些资源是自己创建的。重新 plan 时它会把所有资源当作“不在管理范围”,要么全部重建(造成停机与数据丢失),要么报错拒绝操作。state 是账本,账本丢了,设备台账就没了。必须使用远程状态并开启状态锁,定期备份。

为何常见:单人本地练手时,删掉 state 重来看似没损失,让人误以为它只是可再生的缓存,忽略了它记录“所有权”的关键作用。

误区“标签就是个备注,不影响功能,我随手写几个 key 就行,反正资源能跑起来。”

正解标签直接影响成本归集、权限控制和自动化运维。拼写不一致(如 team 和 Team 并存)会让账单无法聚合,月底财务对账时就像“两个分店的标签格式不同,总部盘点全乱”。应该在模块入口统一注入标签,并对键值做白名单校验。

为何常见:标签确实不改变资源的核心功能,短期内看不到任何后果;等到账单爆炸或权限出问题时,才意识到规范的重要性。

误区“反正我的仓库是私有的,把 access key 写进 tfvars 文件里,团队拉下来就能用,多方便。”

正解仓库私有不等于安全:代码会被复制进 CI 日志、会同步到同事电脑、可能出现在截图或备份里。密钥必须通过环境变量或密钥管理服务注入,状态文件中的敏感字段也要加密存储。就像手册封面不会印保险柜密码一样,模板里永远不该出现明文密钥。

为何常见:本地开发图省事,且私有仓库让人产生“没人看得到”的错觉,忽略了密钥一旦外泄就可能被用于恶意创建高价 GPU 实例。

面试题

Q1. 基础设施即代码(IaC)的核心思想是?

单选题 · easy

  • A.用声明式配置管理基础设施← 正确答案
  • B.用鼠标点击网页按钮建资源
  • C.用人工编写文档记录全部改动
  • D.用电子邮件审批所有变更请求

答案:A。IaC 的核心是把基础设施描述成声明式代码,由工具自动执行创建与变更。B 是传统控制台操作,C 只是文档化而非自动化,D 与基础设施管理无关。就像开店手册不是用来“读”的,而是用来“照着执行”的。

Q2. Terraform 模板文件默认使用的配置语言是?

单选题 · easy

  • A.Python 脚本语言
  • B.HCL 声明式语言← 正确答案
  • C.Shell 批处理命令
  • D.Docker 容器指令

答案:B。Terraform 使用 HCL(HashiCorp Configuration Language)声明式描述资源。Python 是通用编程语言,Shell 是命令脚本,Dockerfile 是容器构建指令,都不负责声明云资源状态。

Q3. 跨云 GPU 模板中“8 卡 A100”这类抽象规格,由哪一层负责映射到具体云机型?

单选题 · easy

  • A.网络配置层负责转换
  • B.资源标签层负责转换
  • C.多云适配层负责转换← 正确答案
  • D.远程状态层负责转换

答案:C。多云适配层维护“规格到机型”的映射表,把抽象算力规格翻译成 AWS、Azure、GCP 各自的实例型号。网络层管 IP 与安全,标签层管归属,状态层管账本,都不涉及机型翻译。

Q4. 资源标签策略最主要的业务价值是?

单选题 · mid

  • A.实现成本归集与团队权限联动← 正确答案
  • B.提高 GPU 芯片的浮点运算速度
  • C.自动加密所有云上静态数据
  • D.缩短跨区域网络传输的延迟

答案:A。标签是资源的资产标识,让账单按团队与项目归集,也让权限策略按标签授权。它与 GPU 算力、数据加密、网络延迟都没有关系,那些由硬件和专门的服务负责。

Q5. Terraform 远程状态文件的主要作用是?

单选题 · mid

  • A.保存 Terraform 模板的全部源码
  • B.缓存云厂商镜像用于快速启动
  • C.记录已管理资源与真实资源映射← 正确答案
  • D.存储应用日志以便排查线上故障

答案:C。状态文件是“逻辑资源到真实资源”的映射账本,是 Terraform 判断创建、更新还是删除的依据。源码由 Git 管理,镜像由云厂商管理,日志由日志系统管理,都不是 state 的职责。

Q6. 多人同时执行 apply 修改同一套资源,避免状态冲突的机制是?

单选题 · mid

  • A.状态锁机制防止并发写覆盖← 正确答案
  • B.多点备份防止文件意外丢失
  • C.自动重试直到操作成功
  • D.双机热备保障服务不中断

答案:A。远程后端配合锁表实现状态锁,同一时刻只允许一个 apply 写入状态,防止账本被并发改乱。备份解决丢失问题,重试不解决并发冲突,热备针对的是服务可用性而非状态一致。

Q7. 关于 IaC 模板模块化设计,下列做法最合理的是?

单选题 · mid

  • A.每个云单独维护一套完整模板
  • B.通用子模块按功能拆分复用← 正确答案
  • C.全部资源集中写在单个文件里
  • D.用复制粘贴方式实现环境隔离

答案:B。按功能拆分通用子模块(如 network、gpu、tags)并复用,是 IaC 最佳实践。每个云各写一套会导致维护成本翻倍,单文件集中不利于复用,复制粘贴会造成环境漂移。

Q8. 跨云 GPU 集群的网络配置抽象通常包含哪些?

多选题 · hard

  • A.VPC 与子网的统一规划← 正确答案
  • B.安全组的访问控制规则← 正确答案
  • C.跨云专线或 VPN 互联← 正确答案
  • D.实例的价格竞价策略

答案:ABC。网络抽象解决“资源如何连通、谁可以访问谁”的问题,包括子网规划、安全组规则和跨云互联。价格竞价策略属于成本优化范畴,与网络配置无关。

Q9. IaC 模板研发上线的合理流程包含哪些?

多选题 · hard

  • A.提交代码后先执行 plan 预览← 正确答案
  • B.管理人员审批通过后再 apply← 正确答案
  • C.模块版本用语义化标签管理← 正确答案
  • D.跳过审批直接在生产生效

答案:ABC。plan 预览变更、审批后 apply、模块打版本号,是 IaC 的标准发布流程,相当于“试营业 + 区域经理签字”。跳过审批直接生产生效会增加变更事故风险,违背变更管理原则。

Q10. 关于跨云 GPU 集群的密钥安全管理,正确的做法有哪些?

多选题 · hard

  • A.敏感信息存入远程状态需加密存储← 正确答案
  • B.云凭据通过环境变量或密钥服务注入← 正确答案
  • C.模板代码中严禁硬编码密钥明文← 正确答案
  • D.生产与测试环境可共用同一套密钥

答案:ABC。状态文件含敏感属性必须加密,凭据应通过环境变量或密钥服务注入,代码中禁止硬编码密钥。生产与测试环境共用密钥违背最小权限原则,一旦测试环境被攻破,生产资源也会暴露。