2019 年,一家欧洲金融科技公司在 AWS 上运行全部核心业务。年度 AWS 账单 1200 万美元,合同续签时 AWS 给出的折扣力度不如预期。CTO 拍板:“我们要做多云,把 30% 的工作负载迁到 GCP,增加谈判筹码。”18 个月后,GCP 上确实跑了一部分服务,但公司为此新招了 8 名专职云平台工程师,重写了 40% 的基础设施代码,数据跨云同步引入了平均 45ms 的额外延迟,年度云总开支反而涨到了 1600 万美元——多出来的 400 万里,有 280 万是工程人力成本,有 80 万是跨云数据出口流量(Egress)费用,只有 40 万是 GCP 资源本身。
这个案例不是孤例。Flexera 2024 年云状态报告显示,87% 的企业声称采用了多云策略,但只有不到 20% 的企业真正在多个云上运行生产工作负载并能自由迁移。多数企业的”多云”实际上是”多个云账单”——不同团队各自选了不同的云,没有统一的抽象层,没有跨云的服务发现,甚至连 IAM 策略都无法统一管理。
这篇文章要回答一个核心问题:多云是真需求还是 CTO 的政治正确?抽象层带来的复杂度到底值不值?
在 上一篇 中我们讨论了服务网格如何解决微服务间的通信治理问题。本文将聚焦更上层的架构决策——当你的基础设施需要跨越多个云提供商时,技术栈、组织和成本层面分别会面临什么挑战,以及哪些场景下多云是正确答案,哪些场景下它只是在制造问题。
一、定义澄清:多云与混合云不是同一件事
行业里经常把多云(Multi-Cloud)和混合云(Hybrid Cloud)混着用,但它们描述的是不同的架构模式。
多云指同时使用两个或以上公有云提供商的服务,且工作负载可以在它们之间分布或迁移。典型场景:计算跑在 AWS 上,AI/ML 训练跑在 GCP 上,面向欧洲客户的合规数据存在 Azure 的欧洲区域。关键特征是所有环境都是公有云。
混合云指公有云与私有基础设施(本地数据中心、私有云、边缘节点)的组合。典型场景:核心交易系统跑在自建数据中心,弹性扩展层和 CDN 用公有云,边缘 IoT 网关跑在工厂本地。关键特征是跨越了公有云和非公有云的边界。
两者可以叠加:一家企业同时使用 AWS + Azure(多云),并且保留了自建数据中心的核心数据库(混合云),这就是多云混合云架构。
| 维度 | 单云(Single Cloud) | 多云(Multi-Cloud) | 混合云(Hybrid Cloud) |
|---|---|---|---|
| 云提供商数量 | 1 个公有云 | 2 个以上公有云 | 公有云 + 私有基础设施 |
| 典型驱动力 | 简单、成本最优 | 避免锁定、合规、最佳服务 | 数据主权、延迟、遗留系统 |
| 网络复杂度 | 低 | 高 | 高 |
| 数据一致性挑战 | 低 | 高(跨云同步) | 高(跨公私网同步) |
| 人才要求 | 单一云技能栈 | 多云技能栈 + 抽象层 | 云 + 传统基础设施 |
| 运维工具链 | 云原生工具即可 | 需要跨云统一平面 | 需要统一编排层 |
| 适用组织规模 | 任意 | 中大型(通常 50+ 工程师) | 有自建 IDC 的企业 |
理解这个区分很重要,因为两者的技术挑战和解决方案完全不同。多云的核心挑战是云间 API 差异和数据同步;混合云的核心挑战是公私网络互通和统一身份认证。后面的讨论会明确标注哪些方案适用于哪种模式。
二、供应商锁定的真实成本:比你想象的更复杂
“避免供应商锁定”是推动多云的最常见理由。但锁定的真实成本到底有多大?很多技术决策者高估了锁定的风险,低估了避免锁定的代价。
2.1 锁定的三个层次
第一层:基础设施锁定。使用了云提供商的计算、存储、网络基础资源。这一层的可移植性最高——一个跑在 EC2 上的 Docker 容器,迁到 GCE 或 Azure VM 上通常不需要改代码,只需要调整部署脚本。迁移成本相对可控。
第二层:托管服务锁定。使用了 DynamoDB、Cloud Spanner、Azure Cosmos DB 这类云提供商特有的托管服务。这些服务的 API、数据模型和行为语义各不相同,迁移意味着数据模型重设计、应用层代码重写、性能特征重验证。迁移成本显著。
第三层:生态锁定。围绕云提供商的生态建立了完整的开发和运维流程——CI/CD 用 CodePipeline,监控用 CloudWatch,日志用 CloudWatch Logs,IAM 权限用 AWS 原生策略,安全合规用 Security Hub。这一层的迁移不仅是技术问题,还是组织和流程问题,成本最高。
2.2 锁定成本的量化框架
评估锁定成本时,需要考虑以下几个维度:
迁移成本(Migration Cost):把工作负载从一个云迁到另一个云的直接技术成本。包括代码改造、数据迁移、测试验证、割接停机。根据 Gartner 2023 年的调研数据,中型企业(200-500 名工程师)的跨云迁移项目平均耗时 14 个月,直接工程成本在 200-800 万美元之间。
人才成本(Talent Cost):维持多云能力需要工程师同时掌握多个云平台的服务和工具。市场上同时精通 AWS 和 GCP 的工程师薪资比单云工程师高 20-35%(Levels.fyi 2024 数据),且招聘难度显著增大。
功能差异成本(Feature Gap Cost):为了保持跨云可移植性,往往不得不放弃某些云的差异化能力。例如放弃 Aurora Serverless v2 的瞬时扩缩容、放弃 BigQuery 的 ML 内置函数、放弃 Cosmos DB 的多模型 API。这些功能差异可能直接影响产品的竞争力和开发效率。
议价能力(Bargaining Power):这是锁定的隐性成本。当 80% 的工作负载在单一云上时,合同续签的谈判空间有限。但需要注意,大客户通常可以通过承诺用量(Committed Use Discount / Savings Plans)获得 30-60% 的折扣,这个折扣幅度可能已经超过了多云策略节省的费用。
2.3 一个量化对比
假设一个年度云开支 500 万美元的企业,评估”保持单云 + 最大化云原生服务”和”投入多云抽象层”两种策略的 3 年总拥有成本(TCO):
| 成本项 | 单云 + 云原生(3 年) | 多云抽象层(3 年) |
|---|---|---|
| 云资源费用 | 1500 万(CUD 折扣后约 900 万) | 1600 万(分散采购折扣低,约 1250 万) |
| 工程人力 | 基线 | +300-500 万(抽象层开发维护) |
| 出口流量 | 可忽略 | +50-150 万(跨云数据同步) |
| 迁移一次性成本 | 0 | +200-400 万 |
| 被锁定的潜在损失 | 0-200 万(续签溢价风险) | 0 |
| 3 年 TCO | 900-1100 万 | 1800-2300 万 |
这个粗略估算说明一个事实:对大多数企业而言,锁定的实际成本远低于避免锁定的成本。 多云策略在财务上合理的前提是——要么你的云开支大到单一提供商的议价空间不再增长(通常是年开支 5000 万美元以上),要么你有非成本驱动的硬性需求。
三、多云的真实驱动力:哪些是合理的,哪些是伪需求
3.1 合理的驱动力
合规与数据主权。GDPR 要求欧盟公民数据存储在欧盟境内,某些行业监管要求数据不能存储在特定国家。如果你的主力云提供商在某个受管辖区域没有合规认证的可用区,你必须使用另一个云。这是硬性约束,不是选择题。
灾备与高可用。如果业务的可用性 SLA 要求超过单一云提供商的 SLA 上限,跨云灾备是合理的。AWS 单区域 SLA 通常是 99.99%(年停机约 52 分钟),如果业务要求 99.999%(年停机约 5 分钟),跨云冗余是实现路径之一。但需要注意:大多数团队的实际可用性瓶颈不在云平台本身,而在自己的代码和运维流程。
最佳服务选择(Best-of-Breed)。不同云在不同领域有明确优势:GCP 的 BigQuery 和 Vertex AI 在数据分析和 ML 领域领先;AWS 的服务广度和全球基础设施覆盖最强;Azure 在企业 AD 集成和 Office 365 生态中不可替代。如果团队有明确的技术评估结论,选择性地使用不同云的优势服务是合理的——但这更接近”多云使用”而非”多云架构”,区别在于是否有跨云的统一控制面。
并购整合。公司收购了一家跑在 GCP 上的企业,母公司跑在 AWS 上。短期内不可能合并到单一云,多云是既成事实。这种场景下,优先建立统一的可观测性和安全基线,长期规划渐进式合并。
议价杠杆。这个理由在大型企业中确实成立。当年度云开支超过 2000 万美元时,让云提供商知道你有替代选项(并且技术上确实具备迁移能力),可以在合同谈判中获得更好的条件。但要注意:拥有迁移能力和实际执行迁移是两回事。维持迁移能力本身就是一项持续投入。
3.2 伪需求
“避免把鸡蛋放在一个篮子里”。这是一个直觉正确但分析错误的类比。公有云不是一个篮子——AWS 有 30+ 个区域,每个区域有 3 个以上可用区,每个可用区是物理隔离的数据中心。跨可用区甚至跨区域部署已经提供了极高的冗余度。跨云冗余是把问题从”单一故障域”推到了”多套复杂系统的一致性管理”,整体风险未必下降。
“云涨价了我们就迁走”。理论上可行,实践中几乎不会发生。过去十年,三大云提供商的核心计算和存储价格持续下降,竞争非常充分。即使某个云的某项服务涨价,迁移的成本和周期远大于价格差异带来的损失。
“我们的工程师应该同时掌握多个云”。这个想法忽略了深度和广度的矛盾。一个工程师深度掌握 AWS 的 IAM、VPC、EKS、RDS 等核心服务已经需要 1-2 年的实践积累。同时要求掌握 GCP 和 Azure,结果往往是三个云都停留在表面理解,出了问题排查效率极低。
四、多云架构的抽象层策略
如果经过评估确实需要多云,核心技术挑战是:如何在不同云的 API 之上建立统一的抽象层,使应用与具体云提供商解耦?
4.1 抽象层的设计光谱
抽象层有不同的深度级别:
最低抽象:Terraform 多 Provider(基础设施层面的抽象)
↓
中等抽象:Crossplane Composite Resources(Kubernetes API 统一控制面)
↓
较高抽象:KubeVela OAM(应用层面的抽象,隐藏基础设施细节)
↓
最高抽象:内部开发者平台 PaaS(完全屏蔽云差异)
抽象层越高,应用可移植性越好,但能利用的云差异化能力越少。这是根本性的取舍。
4.2 Crossplane:基于 Kubernetes 的统一控制面
Crossplane 的核心思想是把所有云资源都表达为 Kubernetes 自定义资源(Custom Resource),通过 Kubernetes API 来统一管理跨云基础设施。它不替代 Terraform,而是把基础设施管理从”声明式配置文件 + CLI 执行”提升到”Kubernetes 控制循环持续调谐”。
Crossplane 的关键概念包括:
- Provider:封装了与特定云 API 的交互逻辑(如 provider-aws、provider-gcp)
- Managed Resource:对应云上的具体资源(如 RDS 实例、GCS Bucket)
- Composite Resource(XR):自定义的高层抽象资源,组合多个 Managed Resource
- Composition:定义 XR 如何映射到具体云的 Managed Resource
以下是一个 Crossplane CompositeResourceDefinition 示例,定义一个跨云的数据库抽象:
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.infra.example.com
spec:
group: infra.example.com
names:
kind: XDatabase
plural: xdatabases
claimNames:
kind: Database
plural: databases
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
parameters:
type: object
properties:
engine:
type: string
enum: ["postgres", "mysql"]
version:
type: string
storageGB:
type: integer
minimum: 10
maximum: 1000
instanceClass:
type: string
enum: ["small", "medium", "large"]
required:
- engine
- storageGB
- instanceClass对应的 Composition 将这个抽象映射到 AWS RDS:
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: xdatabases-aws
labels:
provider: aws
spec:
compositeTypeRef:
apiVersion: infra.example.com/v1alpha1
kind: XDatabase
resources:
- name: rds-instance
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
region: us-east-1
engine: postgres
instanceClass: db.t3.medium
allocatedStorage: 20
skipFinalSnapshot: true
publiclyAccessible: false
providerConfigRef:
name: aws-provider
patches:
- fromFieldPath: "spec.parameters.engine"
toFieldPath: "spec.forProvider.engine"
- fromFieldPath: "spec.parameters.storageGB"
toFieldPath: "spec.forProvider.allocatedStorage"
- fromFieldPath: "spec.parameters.instanceClass"
toFieldPath: "spec.forProvider.instanceClass"
transforms:
- type: map
map:
small: db.t3.small
medium: db.t3.medium
large: db.r5.large
- name: subnet-group
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: SubnetGroup
spec:
forProvider:
region: us-east-1
subnetIds:
- subnet-0a1b2c3d4e5f
- subnet-1a2b3c4d5e6f开发者使用时只需要创建一个 Claim:
apiVersion: infra.example.com/v1alpha1
kind: Database
metadata:
name: order-db
namespace: production
spec:
parameters:
engine: postgres
storageGB: 100
instanceClass: medium
compositionSelector:
matchLabels:
provider: aws通过切换 compositionSelector 的
provider 标签,同一个 Claim 可以在
AWS、GCP、Azure
上创建对应的数据库实例——前提是你为每个云都写好了
Composition。
4.3 KubeVela 与 OAM:应用级抽象
如果 Crossplane 解决的是”基础设施在哪个云上创建”的问题,KubeVela 则更进一步,试图解决”应用如何在多云上部署和管理”的问题。它基于开放应用模型(Open Application Model,OAM),将应用描述为组件(Component)+ 运维特征(Trait)+ 工作流(Workflow)的组合。
一个典型的 KubeVela Application 定义:
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: order-service
namespace: production
spec:
components:
- name: order-api
type: webservice
properties:
image: registry.example.com/order-api:v2.3.1
port: 8080
cpu: "500m"
memory: "512Mi"
env:
- name: DB_HOST
value: order-db.internal
- name: CACHE_HOST
value: redis.internal
traits:
- type: scaler
properties:
replicas: 3
- type: gateway
properties:
domain: api.example.com
path: /orders
protocol: HTTPS
- name: order-worker
type: worker
properties:
image: registry.example.com/order-worker:v2.3.1
cpu: "1000m"
memory: "1Gi"
policies:
- name: multi-cluster
type: topology
properties:
clusters:
- aws-us-east
- gcp-europe-west
namespace: production
- name: traffic-split
type: override
properties:
components:
- name: order-api
traits:
- type: scaler
properties:
replicas: 5
workflow:
steps:
- name: deploy-to-aws
type: deploy
properties:
policies: ["multi-cluster"]
clusters: ["aws-us-east"]
- name: verify-aws
type: webhook
properties:
url: https://ci.example.com/verify
timeout: 300
- name: deploy-to-gcp
type: deploy
properties:
policies: ["multi-cluster"]
clusters: ["gcp-europe-west"]
dependsOn:
- verify-aws这个定义描述了一个渐进式的多云部署流程:先部署到 AWS,通过验证后再部署到 GCP。应用开发者不需要知道底层用的是 EKS 还是 GKE,只需要声明”我的应用需要什么资源,部署到哪些集群”。
4.4 多云 Terraform 配置
对于不使用 Kubernetes 作为控制面的团队,Terraform 的多 Provider 配置是更务实的选择:
# providers.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
alias = "primary"
}
provider "google" {
project = "my-project-id"
region = "europe-west1"
alias = "dr"
}
# modules/database/main.tf — 封装跨云数据库创建
variable "provider_type" {
type = string
description = "Cloud provider: aws or gcp"
validation {
condition = contains(["aws", "gcp"], var.provider_type)
error_message = "Supported providers: aws, gcp."
}
}
variable "db_config" {
type = object({
engine = string
version = string
storage_gb = number
tier = string
})
}
resource "aws_db_instance" "this" {
count = var.provider_type == "aws" ? 1 : 0
engine = var.db_config.engine
engine_version = var.db_config.version
instance_class = var.db_config.tier
allocated_storage = var.db_config.storage_gb
skip_final_snapshot = true
publicly_accessible = false
tags = {
ManagedBy = "terraform"
Purpose = "multi-cloud-db"
}
}
resource "google_sql_database_instance" "this" {
count = var.provider_type == "gcp" ? 1 : 0
database_version = upper("${var.db_config.engine}_${var.db_config.version}")
region = "europe-west1"
settings {
tier = var.db_config.tier
disk_size = var.db_config.storage_gb
disk_type = "PD_SSD"
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.vpc.id
}
}
deletion_protection = false
}
Terraform 的多 Provider 方案在工程上更成熟,但它的问题是抽象层需要你自己用 HCL 的条件逻辑去实现,代码量大且难以维护。当云服务数量增长到几十种时,Terraform Module 的维护成本会急剧上升。
五、数据跨云同步:最昂贵的技术挑战
多云架构中,最容易被低估也最昂贵的挑战是数据同步。计算层的多云相对容易——容器化的应用在不同云的 Kubernetes 集群上运行差异不大。但数据是有引力的(Data Gravity),数据在哪里,计算就倾向于在哪里。
5.1 三个核心挑战
延迟。AWS us-east-1 到 GCP us-central1 的网络往返延迟约 15-30ms,到 Azure West Europe 约 70-100ms。对于需要同步复制的场景,这个延迟直接叠加到每一次写操作上。如果一个事务需要等待跨云确认,用户感知的写延迟可能从 5ms 变成 80ms。
一致性。跨云同步面临经典的 CAP 取舍。强一致(Strong Consistency)要求所有云上的数据在任意时刻都相同,代价是写延迟和可用性;最终一致(Eventual Consistency)允许短暂的数据差异,但应用层需要处理读取到旧数据的情况。跨云场景下,由于网络分区的概率更高,这个取舍比单云内更尖锐。
出口流量成本。这是多云架构中最容易被忽视的成本项。数据进入云是免费的,但离开云是收费的。
5.2 出口流量成本对比
| 出口流量区间 | AWS(美元/GB) | GCP(美元/GB) | Azure(美元/GB) |
|---|---|---|---|
| 前 1 GB | 免费 | 免费 | 免费 |
| 1-10 TB/月 | 0.09 | 0.12 | 0.087 |
| 10-50 TB/月 | 0.085 | 0.11 | 0.083 |
| 50-150 TB/月 | 0.07 | 0.08 | 0.075 |
| 150 TB+/月 | 0.05 | 0.06(可谈判) | 0.05 |
| 跨云专线 | 0.02(Direct Connect) | 0.02(Interconnect) | 0.02(ExpressRoute) |
以数据说话:如果每月有 50 TB 数据需要在 AWS 和 GCP 之间双向同步,公网出口流量费用约为 50 × 0.085 × 2 = 8500 美元/月,年费用超过 10 万美元。使用云间专线可以降至约 2 万美元/年,但专线本身有月租费用(AWS Direct Connect 10 Gbps 端口费约 2200 美元/月)。
2023 年 Google Cloud 宣布取消云迁移场景下的出口流量费用,Cloudflare 的 Bandwidth Alliance 提供零出口流量费用。但这些优惠通常有条件限制,不能覆盖常态化的跨云数据同步。
5.3 数据同步架构
以下是一个典型的跨云数据同步架构:
graph TB
subgraph AWS["AWS(主站)"]
APP_A[应用服务] --> DB_A[(Aurora PostgreSQL)]
DB_A --> CDC_A[CDC 捕获<br/>Debezium]
CDC_A --> KAFKA_A[MSK / Kafka]
end
subgraph GCP["GCP(灾备 / 分析)"]
KAFKA_G[Kafka Mirror] --> CDC_G[CDC 消费者]
CDC_G --> DB_G[(Cloud SQL)]
CDC_G --> BQ[BigQuery<br/>分析副本]
APP_G[灾备应用] --> DB_G
end
KAFKA_A -->|"跨云复制<br/>延迟 30-80ms<br/>出口流量计费"| KAFKA_G
subgraph 监控["同步监控"]
LAG[复制延迟监控]
DRIFT[数据漂移检测]
COST[流量成本告警]
end
KAFKA_A --> LAG
KAFKA_G --> LAG
DB_A --> DRIFT
DB_G --> DRIFT
这个架构使用 CDC(Change Data Capture)捕获主库的变更事件,通过 Kafka 跨云复制到目标云。优点是应用层无需改造,数据同步在基础设施层完成;缺点是引入了 Kafka 集群的运维复杂度,且同步延迟取决于网络状况和 Kafka 消费者的消费速度。
在实践中,跨云数据同步需要关注几个关键指标:
- 复制延迟(Replication Lag):正常状态下应控制在秒级,超过 30 秒需要告警
- 数据漂移(Data Drift):定期对比两端数据的校验和,检测同步遗漏
- 流量成本:设置出口流量的预算告警,防止意外的数据量暴增导致天价账单
六、多云网络互联
多云架构的网络互联是基础中的基础。没有稳定、低延迟、高带宽的云间网络连接,上面讨论的一切——应用部署、数据同步、服务发现——都无从谈起。
6.1 互联方案对比
VPN(Virtual Private Network)。通过公网建立加密隧道,成本最低,部署最快,但带宽和延迟受公网影响,通常适用于开发测试环境或低流量生产环境。AWS Site-to-Site VPN 的带宽上限约为 1.25 Gbps。
专线互联(Dedicated Interconnect)。物理光纤直连云提供商的网络,提供稳定的低延迟和高带宽。AWS 的 Direct Connect、GCP 的 Cloud Interconnect、Azure 的 ExpressRoute 都支持 10 Gbps 和 100 Gbps 端口。延迟比公网低 30-50%,且流量费率显著降低。缺点是部署周期长(4-12 周)、需要签订月付合同、需要在托管数据中心(Colocation Facility)有物理存在。
SD-WAN(Software-Defined Wide Area Network)。在 VPN 和专线之间的中间方案,通过软件定义的方式动态选择最优路径,支持多条链路的负载均衡和故障切换。适合多分支机构接入多云的场景。
云间直连(Cloud-to-Cloud Interconnect)。部分云提供商之间有直接的互联通道。例如 Megaport、Equinix Fabric 等网络即服务(NaaS)平台,可以在数分钟内建立跨云的专线连接,不需要你自己部署物理设备。
| 方案 | 带宽 | 延迟 | 成本(月) | 部署时间 | 适用场景 |
|---|---|---|---|---|---|
| VPN | 最大 1.25 Gbps | 高(公网) | 36-73 美元 | 分钟级 | 开发测试、低流量 |
| 专线(10G) | 10 Gbps | 低(确定性) | 2200+ 美元 | 4-12 周 | 生产环境、大数据量 |
| 专线(100G) | 100 Gbps | 低(确定性) | 17000+ 美元 | 8-16 周 | 超大规模数据同步 |
| SD-WAN | 动态 | 中等 | 500-5000 美元 | 天级 | 多分支多云 |
| NaaS(Megaport) | 1-10 Gbps | 低 | 500-3000 美元 | 分钟级 | 灵活跨云互联 |
6.2 多云网络架构
生产级多云网络通常采用”Hub-and-Spoke”或”Full Mesh”拓扑:
graph TB
subgraph Hub["中转枢纽(Equinix / Megaport)"]
NaaS[网络即服务平台]
end
subgraph AWS["AWS VPC"]
TGW[Transit Gateway] --> EKS_A[EKS 集群]
TGW --> RDS_A[(RDS)]
end
subgraph GCP["GCP VPC"]
CR[Cloud Router] --> GKE[GKE 集群]
CR --> CSQL[(Cloud SQL)]
end
subgraph Azure["Azure VNet"]
VNG[Virtual Network Gateway] --> AKS[AKS 集群]
VNG --> PSQL[(PostgreSQL Flexible)]
end
AWS -->|"Direct Connect"| NaaS
GCP -->|"Cloud Interconnect"| NaaS
Azure -->|"ExpressRoute"| NaaS
DNS[统一 DNS<br/>CoreDNS / Route53<br/>Private Hosted Zone] --> AWS
DNS --> GCP
DNS --> Azure
Hub-and-Spoke 模型通过一个中转枢纽连接所有云,管理简单但中转枢纽是单点;Full Mesh 模型让每对云之间直连,延迟最低但连接数为 N×(N-1)/2,管理复杂度随云数量快速增长。
6.3 多云 DNS 与服务发现
跨云服务发现是一个经常被忽略的问题。在单云环境中,AWS 的 Cloud Map、GCP 的 Service Directory 各自提供了服务注册和发现机制。但在多云环境中,需要一个跨云的统一 DNS 层。
常见方案包括:
- CoreDNS + etcd:在每个云的 Kubernetes 集群中部署 CoreDNS,通过 etcd 同步服务记录
- Consul:HashiCorp Consul 原生支持多数据中心的服务发现和健康检查
- 外部 DNS 服务:使用 NS1、Cloudflare DNS 等第三方 DNS 服务作为统一入口
七、多云 Kubernetes:统一编排的现实与理想
Kubernetes 已经成为多云架构的事实标准计算平面。它提供了一个相对统一的 API 来管理容器化工作负载,屏蔽了底层云基础设施的差异。但”相对统一”里的”相对”二字至关重要——不同云的托管 Kubernetes 服务(EKS、GKE、AKS)在网络模型、存储驱动、负载均衡器实现、身份认证集成等方面都有差异。
7.1 多集群管理工具
Cluster API(CAPI)。Kubernetes 子项目,用 Kubernetes 自身来管理 Kubernetes 集群的生命周期——集群的创建、升级、扩缩容都通过 Kubernetes API 完成。支持 AWS、GCP、Azure、vSphere 等多种 Infrastructure Provider。
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: production-gcp
namespace: cluster-management
spec:
clusterNetwork:
services:
cidrBlocks: ["10.96.0.0/12"]
pods:
cidrBlocks: ["192.168.0.0/16"]
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
name: production-gcp-control-plane
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPCluster
name: production-gcp
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPCluster
metadata:
name: production-gcp
namespace: cluster-management
spec:
project: my-project-id
region: europe-west1
network:
name: production-vpcRancher。SUSE 旗下的多集群管理平台,提供统一的 Web UI 和 API 来管理跨云的 Kubernetes 集群。支持导入已有集群(EKS、GKE、AKS)和创建新集群(RKE2)。优势在于用户体验和企业级功能(RBAC、审计、策略管理),劣势在于 Rancher Server 本身的高可用部署和运维。
Anthos / Azure Arc / EKS Anywhere。三大云提供商各自的多云 Kubernetes 方案。Google Anthos 最为成熟,支持在 AWS、Azure 和本地数据中心运行 GKE 集群,并通过 Anthos Config Management 实现跨集群的策略同步。但 Anthos 本质上是用 Google 的控制面管理多云,某种程度上是用新的锁定替代旧的锁定。
7.2 多集群服务发现与流量管理
跨集群的服务发现有两种主要模式:
DNS 联邦(DNS
Federation)。每个集群维护自己的 DNS,通过一个全局
DNS 层聚合。服务 A 在 AWS 集群注册为
a.aws.svc.mesh,在 GCP 集群注册为
a.gcp.svc.mesh,全局 DNS
通过健康检查和地理位置决定将请求路由到哪个集群。
Service Mesh 联邦(Mesh Federation)。Istio 的多集群模式支持跨集群的服务发现和流量路由。两个集群的 Istio 控制面交换服务端点信息,数据面通过 mTLS 建立跨集群的安全连接。但多集群 Istio 的配置复杂度很高,Istio 社区自己也承认这是一个”高级用法”。
// 多集群路由决策的简化逻辑
func selectCluster(request *Request, clusters []Cluster) *Cluster {
// 优先级 1:数据主权约束
for _, c := range clusters {
if c.Region == request.DataResidencyRequirement {
if c.HealthStatus == Healthy {
return &c
}
}
}
// 优先级 2:最低延迟
var best *Cluster
var bestLatency time.Duration = time.Hour
for _, c := range clusters {
if c.HealthStatus != Healthy {
continue
}
latency := measureLatency(request.SourceRegion, c.Region)
if latency < bestLatency {
bestLatency = latency
best = &c
}
}
if best != nil {
return best
}
// 优先级 3:成本权重
sort.Slice(clusters, func(i, j int) bool {
return clusters[i].CostPerRequest < clusters[j].CostPerRequest
})
for _, c := range clusters {
if c.HealthStatus == Healthy {
return &c
}
}
return nil
}八、成本分析:多云溢价到底有多大
多云架构的总成本包括直接成本(云资源、出口流量)和间接成本(工程人力、运维复杂度、学习曲线)。下面从三个维度量化多云溢价。
8.1 资源成本溢价
单云策略下,企业可以通过预留实例(Reserved Instances)、节省计划(Savings Plans)或承诺使用折扣(Committed Use Discount)获得 30-60% 的折扣。多云策略下,工作负载分散到多个云,每个云上的用量都达不到最优折扣门槛,整体折扣率通常降低 10-20 个百分点。
以年度计算开支 300 万美元为例:
| 场景 | 资源原价 | 折扣率 | 实际费用 |
|---|---|---|---|
| 全量 AWS + 3 年预留 | 300 万 | 55% | 135 万 |
| 70% AWS + 30% GCP(各自 1 年承诺) | 300 万 | 35% | 195 万 |
| 差额 | — | — | +60 万/年 |
8.2 工程人力成本
多云抽象层不是建好就完事的。云提供商每季度都有 API 变更和新功能发布,抽象层需要持续跟进。根据实际项目经验,维护一个生产级多云抽象层需要 3-5 名全职平台工程师,年薪中位数约 18 万美元(美国市场),人力成本 54-90 万美元/年。
8.3 运维复杂度成本
这个成本最难量化,但影响最深远。多云环境下:
- 每次事故排查需要同时检查多个云的日志和监控,平均故障定位时间(MTTD)增加 40-60%
- 安全合规审计需要覆盖多个云的配置基线,审计工作量翻倍
- 基础设施变更需要在多个云上同步测试和部署,发布周期延长
8.4 多云溢价总结
| 成本项 | 年增量(以 300 万基线) | 占基线比例 |
|---|---|---|
| 折扣率损失 | +60 万 | 20% |
| 出口流量 | +12-50 万 | 4-17% |
| 平台工程团队 | +54-90 万 | 18-30% |
| 运维效率损失 | +20-40 万(估算) | 7-13% |
| 合计 | +146-240 万 | 49-80% |
多云溢价在基线云开支的 50-80% 之间。这意味着如果你的年度云开支是 300 万美元,多云策略会让总成本变成 450-540 万美元。只有当避免锁定的收益——无论是合规需求、灾备需求还是议价能力——超过这个溢价时,多云才是经济上合理的。
九、工程案例:某金融科技公司的多云实践
9.1 背景
这是一家总部位于新加坡的支付平台,服务覆盖东南亚六国,日均交易量 800 万笔,年处理金额 120 亿美元。2021 年之前全栈跑在 AWS 上,年度 AWS 开支约 2000 万美元。
推动多云的驱动力有两个硬性需求:
- 监管合规。印尼金融监管局(OJK)要求在 2023 年底前,处理印尼用户的支付数据必须存储在印尼境内的数据中心。AWS 在 2022 年才在雅加达开设区域,且部分合规认证尚未完成。GCP 在雅加达的区域更早获得了相关认证。
- 灾备 SLA。与多家银行的合作协议要求支付通道的可用性达到 99.999%,且灾备切换时间不超过 60 秒。仅靠 AWS 多区域部署无法满足这个 SLA。
9.2 架构设计
团队花了 6 个月设计多云架构,核心决策如下:
计算层:主站在 AWS ap-southeast-1(新加坡),灾备站在 GCP asia-southeast2(雅加达)。两个站点各运行一套完整的 Kubernetes 集群(EKS + GKE),通过 Istio 多集群模式实现服务网格联邦。
数据层:核心交易数据库使用 CockroachDB 跨云部署,利用其原生的多区域复制能力实现强一致性。分析数据通过 CDC 单向同步到 GCP BigQuery。用户画像和风控模型数据使用 Redis Enterprise 的 Active-Active 模式跨云同步。
网络层:AWS 和 GCP 之间通过 Equinix Fabric 建立了两条 10 Gbps 专线(互为备份),端到端延迟约 12ms。DNS 使用 Cloudflare 作为全局负载均衡入口。
抽象层:基础设施管理使用 Crossplane,应用部署使用 ArgoCD 的 ApplicationSet 实现跨集群 GitOps。
9.3 实施结果
实施周期 14 个月,投入 12 名平台工程师(6 名新招)。
成功的方面:
- 印尼合规需求按期达成,避免了潜在的监管处罚(根据 OJK 规定,违规罚款可达年营收的 1%)
- 灾备切换时间从 AWS 多区域的 8 分钟缩短到跨云的 45 秒(通过 DNS 权重切换 + CockroachDB 自动选主)
- 2023 年 AWS ap-southeast-1 发生过一次持续 47 分钟的区域性故障,系统在 38 秒内自动切换到 GCP,零交易中断
付出的代价:
- 年度云总开支从 2000 万美元增长到 2900 万美元(+45%)
- 平台工程团队从 8 人扩展到 20 人
- CockroachDB 的跨云写延迟比 Aurora 高出约 15ms,部分对延迟敏感的交易接口从 P99 25ms 退化到 P99 42ms
- Istio 多集群模式的调试复杂度极高,前 6 个月有 3 次因为 Istio 配置错误导致的跨集群路由失败
9.4 复盘总结
团队的复盘结论是:多云是正确的决策,但代价比预期高 60%。 如果重新做这个项目,他们会做以下调整:
- 用 GCP 仅承载合规数据存储和灾备切换,不在 GCP 上跑日常生产流量,减少跨云数据同步的常态化开销
- 用 Consul 替代 Istio 做跨集群服务发现,降低运维复杂度
- 在项目启动前先建立跨云的统一可观测性平台,而不是事后补建
十、多云决策框架:什么时候应该多云
基于前面的分析,以下是一个实用的决策框架。
10.1 决策树
先回答三个前置问题:
问题 1:是否有硬性约束要求多云? 如果有监管合规、数据主权、或合同 SLA 等不可协商的要求,且单一云无法满足,多云是必选项,不需要讨论值不值。
问题 2:年度云开支是否超过 2000 万美元? 云开支在这个量级以上,多云的议价杠杆和避免锁定的收益才可能覆盖多云溢价。低于这个量级,单云 + 最大化折扣几乎总是更优的选择。
问题 3:平台工程团队是否超过 10 人? 多云抽象层的建设和维护需要专职团队。如果你的基础设施团队不到 10 人,多云策略会严重分散本就有限的工程资源。
如果三个问题的答案都是”否”,建议坚持单云策略,把精力投入到用好一个云的深度能力上。
10.2 多云实施的优先级
如果决定走多云路线,按以下优先级逐步推进,而不是一次性全面铺开:
第一阶段:统一可观测性(3 个月)。在所有云环境中部署统一的监控(Prometheus / Grafana)、日志(Loki / Elasticsearch)和链路追踪(OpenTelemetry)平台。这是跨云运维的前提。
第二阶段:统一身份与安全(3 个月)。建立跨云的统一 IAM 策略,使用 OIDC 联邦或 SPIFFE/SPIRE 实现跨云的工作负载身份认证。安全基线不统一,多云就是多个攻击面。
第三阶段:基础设施抽象层(6 个月)。选择 Crossplane 或 Terraform + 自定义模块,建立核心资源(计算、数据库、消息队列、对象存储)的跨云抽象。
第四阶段:应用层多云部署(6 个月)。使用 KubeVela、ArgoCD ApplicationSet 或自建的部署系统,实现应用在多个云集群上的声明式部署和渐进式发布。
第五阶段:数据层跨云(持续)。最后处理数据同步,因为这是最复杂、风险最高的部分。从非关键数据(日志、分析数据)开始,逐步扩展到核心数据。
10.3 不该做多云的场景
以下场景中,多云策略的成本几乎必然大于收益:
- 初创公司(A/B 轮):工程资源极其有限,应该 all-in 一个云,把精力放在产品上
- 年度云开支低于 500 万美元:多云溢价比例太高,不经济
- 业务不涉及跨国合规:没有硬性约束推动多云
- 团队缺乏 Kubernetes 经验:多云几乎都建立在 Kubernetes 之上,如果 K8s 本身还没玩熟,叠加多云只会雪上加霜
- CTO 只是想”对标大厂”:这是最常见也最昂贵的伪需求
10.4 架构全景图
以下是一个完整的多云架构参考模型:
graph TB
subgraph 用户层["用户流量入口"]
GLB[全局负载均衡<br/>Cloudflare / Route53]
end
subgraph 抽象层["多云抽象层"]
CP[Crossplane<br/>基础设施抽象]
KV[KubeVela / ArgoCD<br/>应用编排]
OBS[统一可观测性<br/>Prometheus + Grafana<br/>+ OpenTelemetry]
IAM_U[统一身份<br/>SPIFFE / SPIRE]
end
subgraph AWS_Cloud["AWS"]
EKS[EKS 集群]
RDS[(Aurora)]
S3[(S3)]
end
subgraph GCP_Cloud["GCP"]
GKE[GKE 集群]
CSQL2[(Cloud SQL)]
GCS[(GCS)]
end
subgraph Azure_Cloud["Azure"]
AKS2[AKS 集群]
PSQL2[(PostgreSQL Flexible)]
BLOB[(Blob Storage)]
end
GLB --> EKS
GLB --> GKE
GLB --> AKS2
CP --> AWS_Cloud
CP --> GCP_Cloud
CP --> Azure_Cloud
KV --> EKS
KV --> GKE
KV --> AKS2
OBS --> AWS_Cloud
OBS --> GCP_Cloud
OBS --> Azure_Cloud
IAM_U --> AWS_Cloud
IAM_U --> GCP_Cloud
IAM_U --> Azure_Cloud
EKS <-->|"专线互联"| GKE
GKE <-->|"专线互联"| AKS2
EKS <-->|"专线互联"| AKS2
十一、单云 vs 多云 vs 混合云:全面对比
在做最终决策之前,需要从多个维度系统性地对比三种策略的优劣:
| 维度 | 单云 | 多云 | 混合云 |
|---|---|---|---|
| 架构复杂度 | 低。一套 API、一套工具链、一套权限模型 | 高。多套 API 需要抽象层,配置管理和部署流水线翻倍 | 高。公有云和私有基础设施的技术栈差异大 |
| 初始建设成本 | 低 | 高(+50-100% 基线) | 高(IDC 建设 + 公有云对接) |
| 运营成本(年) | 基线 | +50-80% 基线 | +30-60% 基线 |
| 可用性上限 | 99.99%(单区域)/ 99.999%(多区域) | 99.999%+(真正的跨云冗余) | 99.999%(跨公私互备) |
| 故障恢复能力 | 依赖单一云的灾备机制 | 云级别故障免疫(理论上) | 一方故障可切另一方 |
| 弹性扩展 | 云原生弹性 | 跨云弹性,但数据层是瓶颈 | 公有云提供弹性,私有层固定 |
| 人才招聘 | 容易。市场上单云工程师充足 | 困难。多云人才稀缺且昂贵 | 困难。需要同时掌握传统 IDC 和云 |
| 安全合规 | 一套安全基线 | 多套安全基线需统一 | 最复杂。公私环境标准不同 |
| 供应商议价能力 | 弱。依赖单一供应商 | 强。有替代选项 | 中等 |
| 云原生功能利用度 | 高。可使用全部差异化服务 | 低。被抽象层限制在公共子集 | 中等 |
| 适用阶段 | 任何阶段 | 成熟期(年云开支 > 2000 万) | 有自建 IDC 的传统企业 |
这张表的核心信息是:多云在几乎每个维度上都比单云更复杂、更昂贵,它的优势集中在可用性上限和供应商议价能力两个维度。 只有当这两个维度的收益足以覆盖其他维度的成本时,多云才是合理的选择。
十二、结语:务实比正确更重要
回到开头的问题——多云是真需求还是 CTO 的政治正确?
答案是:它取决于你的约束条件,而不是行业趋势。
当你面对硬性的合规要求、不可妥协的可用性 SLA、或者超过 2000 万美元的云开支时,多云是一个需要认真评估的架构选项。当你面对的是”万一某天 AWS 涨价怎么办”或”大厂都在做多云”这类模糊的焦虑时,多云大概率只会让你的工程团队更累、花更多钱、得到更差的用户体验。
工程决策的本质不是追求理论上的最优解,而是在给定约束下找到最合理的取舍。单云 + 深度利用云原生能力,对 80% 的企业来说是更务实的选择。当约束条件发生变化——新的合规要求、业务规模的量变引起质变、并购带来的多云既成事实——再投入多云架构也不迟。
重要的是保持”可移植性意识”而不必”可移植性强迫”。把业务逻辑和云服务 API 之间加一层薄接口(Repository 模式、Adapter 模式),使用容器化和 Kubernetes 作为计算抽象,保持 IaC 的习惯——这些低成本的准备工作可以在真正需要迁移时大幅降低成本,而不需要在当下承担全面多云的复杂度。
参考资料
- Flexera. 2024 State of the Cloud Report. Flexera, 2024.
- Gartner. Cloud Migration Costs and Timelines for Midsize Enterprises. Gartner Research, 2023.
- Google Cloud. Egress Pricing Changes and Free Tier Update. Google Cloud Blog, 2023.
- Crossplane Documentation. Composite Resources. https://docs.crossplane.io/latest/concepts/composite-resources/
- KubeVela Documentation. Multi-Cluster Application Delivery. https://kubevela.io/docs/case-studies/multi-cluster/
- Kubernetes SIG Cluster Lifecycle. Cluster API Book. https://cluster-api.sigs.k8s.io/
- Hashimoto, Mitchell. “Multi-Cloud Is a Trap.” HashiConf 2022 Keynote. HashiCorp, 2022.
- Greenberg, Albert et al. “The Cost of a Cloud: Research Problems in Data Center Networks.” ACM SIGCOMM Computer Communication Review 39, no. 1 (2009): 68-73.
- Cockroach Labs. Multi-Region Architecture Patterns. CockroachDB Documentation, 2024.
- Burns, Brendan et al. “Borg, Omega, and Kubernetes.” ACM Queue 14, no. 1 (2016): 70-93.
上一篇:Service Mesh 下一篇:平台工程
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【系统架构设计百科】架构质量属性:不只是"高可用高性能"
需求评审时写下的'高可用、高性能、高并发',到了架构设计阶段几乎无法落地——因为它们不是可执行的需求。本文从 SEI/CMU 的质量属性理论出发,用 stimulus-response 场景模型把模糊需求变成可量化、可验证的架构约束,并拆解属性之间的冲突与联动关系。
【系统架构设计百科】告警策略:如何避免"狼来了"
大多数团队的告警系统都在制造噪声而不是传递信号。阈值告警看似直观,实则产生大量误报和漏报,值班工程师在凌晨三点被叫醒,却发现只是一次无害的毛刺。本文从告警疲劳的工业数据出发,拆解基于 SLO 的多窗口燃烧率告警算法,深入 Alertmanager 的路由、抑制与分组机制,结合 PagerDuty 的告警疲劳研究和真实工程案例,给出一套可落地的告警策略设计方法。
【系统架构设计百科】复杂性管理:架构的核心战场
系统复杂性是架构腐化的根源——本文从 Brooks 的本质复杂性与偶然复杂性划分出发,结合认知负荷理论与 Parnas 的信息隐藏原则,系统阐述复杂性的来源、度量与控制手段,并给出可操作的架构策略
【系统架构设计百科】微服务架构深度审视:优势、代价与适用边界
微服务不是免费的午餐。本文从分布式系统八大谬误出发,拆解微服务真正解决的问题与引入的代价,梳理服务边界划分的工程方法论,还原 Amazon 和 Netflix 从单体到微服务的真实演进时间线,给出微服务适用与不适用的判断框架。