结论: 多云管理没有"一个平台搞定"的银弹,主流做法是按层分工——用 Terraform 统一资源编排(Infrastructure as Code)、用 Ansible 统一配置、用 Kubernetes 统一运行时、用 CMP 云管平台统一账单与权限视图。中小团队若没有明确的容灾或合规诉求,不建议为了"不锁定"而上多云,其运维代价通常远高于收益。
业务先上了 A 云,后来因为价格或活动又买了 B 云,再后来客户指定要用 C 云——三年之后,你发现自己有 40 台机器分布在三个控制台、三套账单、三种权限模型里,改一条安全组规则要开三个网页。这就是"多云"最真实的由来:多数团队的多云不是设计出来的,是长出来的。
本文解决的就是这个局面:多云到底要管什么,有哪些工具可选,各自适合什么规模,以及——多云的真实代价。文中的 Terraform 语法基于 Terraform 1.9+,命令与示例截至 2026 年可用,各云 provider 版本号以官方 Registry 为准。
一、多云首先要解决什么:五类问题
结论:把"多云管理"拆成五个具体问题后再选工具,否则很容易买了一个大而全的平台却一个都没解决好。 下表是拆法,也是本文后续选型的坐标系。
| 问题 | 具体表现 | 典型解决手段 | 不解决会怎样 |
|---|---|---|---|
| 资源视图分散 | 开三个控制台才知道一共有多少台机器、哪些在跑 | CMP 云管平台、自建 CMDB、Terraform state | 资源清单永远是糊涂账,闲置资源长期扣费 |
| 账单割裂 | 三家账单口径不同(带宽/存储/IP 计费项命名不一) | FinOps 工具、标签体系 + 统一成本模型 | 无法回答"哪个项目最烧钱",降本无从下手 |
| 权限不统一 | A 云用 RAM、B 云用 CAM,账号体系与审批流各写一套 | 统一身份源(SSO/LDAP)+ 最小权限模板 | 权限越授越乱,离职账号清不干净 |
| 运维流程不一致 | 同一次发版在两地命令不同、镜像不同、脚本版本不同 | Ansible 统一配置、镜像仓库统一、流水线统一 | 环境漂移,故障只在某一个云上复现 |
| 厂商锁定与可用性 | 单云地域故障导致全站不可用;议价能力弱 | 跨云部署 + 全局流量调度(GSLB/DNS) | 一次区域故障就是一次全站事故 |
必须承认的现实:前四类问题是"管理问题",第五类才是"架构问题"。 大多数团队说要上多云,实际痛点是前四类;但如果只用架构手段(跨云部署)去解决管理问题,代价会大到失控。反过来,如果真有容灾诉求却只做了管理统一,那故障来了照样全站挂。
二、五类方案的定位与局限对比
结论:这五类方案不是"五选一",而是"按层叠加"——Terraform 管资源、Ansible 管配置、Kubernetes 管运行时、CMP 管视图与流程、厂商原生工具做深度功能兜底。
| 方案 | 定位 | 学习成本 | 适用规模 | 主要局限 |
|---|---|---|---|---|
| Terraform | 基础设施即代码(IaC),一份代码编排多云资源 | 中高(需掌握 HCL、state 管理) | 10 台以上、需要可复现环境 | 只管"资源创建",不管配置与运行时;state 文件是核心资产需妥善保管;旧资源纳管需逐个 import |
| Ansible | 配置管理与批量执行,跨云主机统一初始化 | 低(YAML + SSH,无需 agent) | 任意规模,20 台以内尤其划算 | SSH 批量在百台以上效率下降;无内置状态收敛与漂移检测(AWX/Tower 可补) |
| Kubernetes 跨云 | 统一运行时:同一份 YAML 在任何云上跑 | 高(K8s 本身学习曲线陡) | 容器化改造完成、多集群场景 | 只解决应用层;跨云网络与存储仍需自行打通;多集群管理还要引入 Karmada/OCM 等 |
| CMP 云管平台 | 统一门户:资源视图、账单、权限、审批、运维 | 低(面向使用者,开箱即用) | 中大型企业、多部门多账号 | 商业产品有授权成本;深度功能常落后于厂商原生控制台;定制能力有限 |
| 云厂商原生工具 | 单云的资源编排、监控、运维套件 | 低(与自家产品深度集成) | 单云为主、多云为辅 | 天然不跨云;用它越多锁定越深 |
选型时最容易犯的错,是试图让某一个层去干所有层的事:
- 用 Terraform 去写应用配置 → 代码膨胀、执行缓慢、改一行要
plan半天; - 用 CMP 平台去做精细的资源编排 → 表达力不足,最后还得在控制台手改,漂移从此开始;
- 用 Ansible 去管上千台机器的长期状态收敛 → 没有状态模型,跑一次全量要几十分钟。
三、Terraform:一份代码编排多个云
结论:Terraform 是多云编排的事实标准,它的价值在于"资源可复现"——任何一台机器、任何一条安全组规则都能从代码推导出来,而不是靠人记忆。 上手的关键是理解 provider(云插件)与 state(状态文件)两个概念。
# main.tf —— 同一份代码里编排两家云
terraform {
required_version = ">= 1.9"
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.230"
}
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "~> 1.81"
}
}
# 状态文件必须放远端并加锁,本地 tfstate 是团队协作的灾难
backend "s3" {
bucket = "my-tf-state"
key = "prod/multi-cloud/terraform.tfstate"
region = "ap-guangzhou"
encrypt = true
}
}
variable "instance_type_a" { default = "ecs.g7.large" }
variable "instance_type_b" { default = "S5.MEDIUM4" }
# 凭证一律走环境变量,绝不写进代码或提交到仓库
provider "alicloud" {
region = "cn-hangzhou"
# 对应环境变量:ALICLOUD_ACCESS_KEY / ALICLOUD_SECRET_KEY / ALICLOUD_REGION
}
provider "tencentcloud" {
region = "ap-guangzhou"
# 对应环境变量:TENCENTCLOUD_SECRET_ID / TENCENTCLOUD_SECRET_KEY
}
# A 云:ECS 实例
resource "alicloud_instance" "web_a" {
instance_type = var.instance_type_a
image_id = "ubuntu_24_04_x64_20G_alibase_20260101.vhd"
instance_name = "web-a-01"
vswitch_id = alicloud_vswitch.vsw_a.id
security_groups = [alicloud_security_group.sg_a.id]
internet_charge_type = "PayByTraffic"
tags = {
Env = "prod"
ManagedBy = "terraform"
}
}
# B 云:CVM 实例(镜像用 data source 查询,避免硬编码 ID 失效)
data "tencentcloud_images" "ubuntu" {
image_name_regex = "Ubuntu Server 24.04 LTS"
}
resource "tencentcloud_instance" "web_b" {
instance_name = "web-b-01"
availability_zone = "ap-guangzhou-3"
image_id = data.tencentcloud_images.ubuntu.images[0].image_id
instance_type = var.instance_type_b
tags = {
Env = "prod"
ManagedBy = "terraform"
}
}
output "web_a_ip" { value = alicloud_instance.web_a.public_ip }
output "web_b_ip" { value = tencentcloud_instance.web_b.public_ip }配套命令与团队协作规范:
# 初始化(下载 provider 插件、初始化 backend)
terraform init
# 格式化与语法检查,进 CI 的必备两步
terraform fmt -recursive
terraform validate
# 预览变更(务必先看 plan 再 apply)
terraform plan -out=tfplan
# 执行变更(用 plan 文件,避免 plan 与 apply 之间状态漂移)
terraform apply tfplan
# 查看已纳管的资源清单
terraform state list
# 把存量机器纳入管理(逐个导入,这是上 IaC 最耗时的一步)
terraform import alicloud_instance.web_a i-xxxxxxxx
# 只针对某个资源操作,缩小爆炸半径
terraform apply -target=alicloud_instance.web_a
# 销毁(危险操作,务必确认 backend 与 workspace 正确)
terraform destroy三条血泪经验:
- state 文件就是你的基础设施账本,必须远端存储 + 加锁 + 定期备份;多人同时 apply 导致 state 冲突,是最常见的团队协作事故。
- 先把新资源接入 IaC,存量资源用
import逐步纳管,不要试图一次性重写全部基础设施。 - provider 版本要锁定(
~> 1.230),否则某次init升级后可能出现字段重命名导致 plan 结果出乎意料。
四、Ansible 与 Kubernetes:配置层与运行时层的一致性
结论:Terraform 解决"机器怎么建",Ansible 解决"机器建好后装什么、配成什么样",Kubernetes 解决"应用怎么跑"。三层各司其职,才能做到"在哪个云上部署出来的东西都一样"。
Ansible:跨云统一配置
# inventory.yml —— 多云主机统一纳管,按云分组
all:
children:
cloud_a:
hosts:
web-a-01:
ansible_host: 47.x.x.x
web-a-02:
ansible_host: 47.x.x.y
cloud_b:
hosts:
web-b-01:
ansible_host: 119.x.x.x
vars:
ansible_user: ops
ansible_ssh_private_key_file: ~/.ssh/id_ed25519
ansible_python_interpreter: /usr/bin/python3# 连通性验证
ansible all -i inventory.yml -m ping
# 只在某一个云上执行(分组即环境边界)
ansible cloud_a -i inventory.yml -m shell -a "uptime"
# 执行统一初始化 playbook(NTP、sudo 用户、sshd 配置、监控 agent)
ansible-playbook -i inventory.yml site.yml --limit cloud_a
# 先干跑看会改什么(--check 是救命参数)
ansible-playbook -i inventory.yml site.yml --check --diffAnsible 的优势是零 agent、学习成本低、20 台以内性价比极高;短板是缺少状态收敛能力,建议配合 AWX 做定时巡检与漂移检测。
Kubernetes:把"跨云"变成"跨集群"
# 跨云部署:用拓扑约束把副本摊到不同地域/不同云
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 6
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/region
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web
containers:
- name: web
image: registry.example.com/web:1.4.2
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"Kubernetes 是最强的跨云抽象层:同一份镜像与 YAML,在三个云上跑出来的行为基本一致。但它有两个前提和两个代价——前提是应用已经容器化、镜像仓库已统一(否则跨云拉镜像会成为瓶颈);代价是 K8s 本身的学习曲线,以及跨云网络(专线/VPN)与存储(分布式存储或对象存储网关)必须自行解决。多集群统一调度还需引入 Karmada、OCM 之类的多集群管理组件,这又是新的一套复杂度。
五、选型建议与多云的真实代价
结论:按团队规模给建议最实用——小于 20 台机器的团队,用 Terraform + Ansible 就够了;真正需要 CMP 平台的是"多部门、多账号、需要审批与成本分摊"的中大型组织。
| 团队规模 / 场景 | 推荐组合 | 优先级 |
|---|---|---|
| 个人 / 小团队,< 20 台 | Ansible + 少量 Terraform | 先统一配置,再逐步 IaC |
| 中小企业,20~100 台,两朵云 | Terraform(资源)+ Ansible(配置)+ 统一标签(成本) | 把资源与账单先理清楚 |
| 已容器化,多集群 | Kubernetes + Terraform + 统一镜像仓库 | 运行时一致性优先 |
| 中大型企业,多部门多账号 | CMP 云管平台 + Terraform + SSO 统一身份 | 权限、审批、成本分摊优先 |
| 有真实容灾诉求(RTO < 30 分钟) | 跨云双活 + GSLB/DNS 调度 + 数据双向同步 | 架构优先,代价最高 |
多云的真实代价,上之前必须先算清楚
- 网络打通:跨云内网不互通,两条专线或 IPsec VPN 的年成本通常以万元计,而且延迟从 < 2 ms 变成 10~40 ms,所有"内网调用"的假设都要重新评估。
- 镜像与制品同步:容器镜像、软件包、数据库备份都要跨云复制,既是带宽成本也是一致性风险(版本不一致会导致"只有 B 云出问题")。
- 人力成本翻倍:三个控制台 = 三套 API、三套权限模型、三套告警体系。没有专职平台工程团队的小公司,往往管不住。
- 能力下限被拉平:跨云架构只能使用各云的"交集能力"。A 云的高阶托管数据库、B 云的特定网络产品都用不了,因为要在另一朵云上找到对等物。
- 账单未必下降:多云常被寄予"压价"期望,但现实中因管理不善导致的闲置资源浪费,通常超过议价带来的折扣。
一句话总结:多云是手段,不是目的。 如果目标是省钱,先做单云的成本优化(闲置资源清理、规格下调、预留实例);如果目标是高可用,先确认能否用单云的多可用区方案满足——它能解决 90% 的可用性问题,代价却只有多云的十分之一。
常见误区 / 排错提示
- 误区一:为了"不被锁定"而上多云。 锁定主要来自托管服务与数据,而不是虚拟机本身。跨云部署却仍使用各家专有 SDK 与托管数据库,锁定一点没少,复杂度却翻倍。真正降低锁定的手段是容器化 + 开源中间件 + IaC。
- 误区二:买了 CMP 平台就以为不用写代码了。 CMP 擅长视图、审批与账单,精细的资源编排仍要靠 Terraform 或厂商 API。指望一个平台覆盖所有场景,最后往往是"平台管一半、控制台手改一半",漂移从此产生。
- 误区三:Terraform 的 state 放本地或提交到 Git。 state 里包含资源 ID 甚至敏感输出,本地丢失等于基础设施失去账本,提交到仓库则存在泄露风险。必须远端存储 + 加密 + 加锁 + 备份。
- 误区四:多云但监控各管各的。 三朵云三套告警,故障时需要人肉关联。至少要把指标汇聚到统一的 Prometheus + Grafana 或统一的可观测平台,否则"统一视图"只是自欺欺人。
- 排错提示:
terraform plan显示要销毁重建 —— 通常是资源在控制台被手改过(漂移),或 provider 版本升级导致字段语义变化。先用terraform state show <资源>对比实际值,再决定是import修正还是prevent_destroy保命。 - 排错提示:
terraform apply报 403 / 无权限 —— 检查执行所用的 AccessKey 是否具备对应 Action,以及是否被权限边界(Permissions Boundary)或策略中的显式Deny拦截。 - 排错提示:Ansible 跨云执行超时 —— 多半是安全组未放行 SSH 来源,或两台机器主机名冲突导致 inventory 分组错乱;先用
ansible all -m ping分层验证。 - 排错提示:跨云 K8s 集群的 Pod 拉不到镜像 —— 镜像仓库只在单一云内网可用,跨云节点拉取失败。应搭建统一的镜像仓库并配置跨云加速,或在每个云部署本地镜像缓存。
常见问题(FAQ)
中小团队有必要上多云吗?
结论:绝大多数中小团队没必要,单云多可用区已能解决大部分可用性问题。 上多云的真实代价包括网络打通(专线或 VPN 年成本常以万元计)、镜像与制品同步、三套控制台带来的人力翻倍。真正值得上多云的是三种情况:客户或合规明确要求、有 RTO 小于 30 分钟的容灾诉求、或单云某区域故障影响过你。否则优先做单云成本优化。
Terraform 和 Ansible 该选哪个?
结论:不是二选一,而是 Terraform 管资源创建、Ansible 管资源配置,两者配合。 Terraform 声明式地描述"要有几台机器、什么规格、什么网络",并维护 state 记录实际状态,适合基础设施生命周期管理;Ansible 通过 SSH 执行"装 Nginx、改 sshd、下发配置文件"这类动作,无需 agent、上手快。常见分工是 Terraform 创建机器后用 terraform output 生成 inventory,再交给 Ansible 做初始化。
什么是 CMP 云管平台?和 Terraform 有什么区别?
结论:CMP(Cloud Management Platform)是面向使用者的统一门户,Terraform 是面向工程师的编排工具,定位不同。 CMP 解决资源总览、多账号权限与审批、成本分摊与账单分析、运维流程与工单,开箱即用、学习成本低,适合多部门多账号的中大型组织;Terraform 解决"资源可复现、变更可审计",表达力强但需要掌握 HCL 与 state 管理。实践中 CMP 常作为上层门户,底层仍用 Terraform 或云 API 完成实际编排。
怎么避免云厂商锁定?
结论:降低锁定的关键在应用架构,而不是"用几家云"——容器化、开源中间件、IaC 三件套最有效。 具体做法:应用打包成标准容器镜像,不依赖厂商专有运行时;中间件优先选开源或标准协议产品(MySQL、Redis、Kafka);基础设施用 Terraform 描述以便迁移时复现;数据保持可导出格式并定期做跨云恢复演练。反之,重度使用专有 SDK 或托管数据库,部署在两朵云上锁定程度也不会降低。
多云能省钱吗?
结论:不一定,管理不善时反而更贵;省钱主要靠成本治理而不是多云本身。 多云确实能带来议价空间与活动价套利,但同时会新增专线带宽、镜像同步存储、重复的人力投入,以及更容易产生的闲置资源。多数团队的实测结果是:先清理闲置云盘与未绑定公网 IP、下调偏高规格、改用预留实例或节省计划,能立刻降低 20%~40% 成本,这比上多云的投入产出比高得多。
多云的监控和日志怎么统一?
结论:把指标、日志、链路数据汇聚到统一的可观测平台,不要让每朵云各管各的。 推荐做法是各云主机统一部署采集 agent(如 Prometheus Node Exporter、Vector/Fluent Bit),指标汇聚到中心 Prometheus 或托管可观测服务,日志投递到统一存储,告警规则集中管理并统一通知渠道。关键是给资源打上一致的标签体系(项目、环境、云厂商、地域),否则汇聚之后也无法按维度聚合。跨云网络要走专线或 VPN 并加密。
企业QQ咨询




