土法炼钢兴趣小组的算法知识备份

【系统架构设计百科】多云与混合云架构:避免供应商锁定的代价

文章导航

分类入口
architecture
标签入口
#multi-cloud#hybrid-cloud#Crossplane#KubeVela#vendor-lock-in

目录

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 的关键概念包括:

以下是一个 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

通过切换 compositionSelectorprovider 标签,同一个 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 消费者的消费速度。

在实践中,跨云数据同步需要关注几个关键指标:


六、多云网络互联

多云架构的网络互联是基础中的基础。没有稳定、低延迟、高带宽的云间网络连接,上面讨论的一切——应用部署、数据同步、服务发现——都无从谈起。

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 层。

常见方案包括:


七、多云 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-vpc

Rancher。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 运维复杂度成本

这个成本最难量化,但影响最深远。多云环境下:

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 万美元。

推动多云的驱动力有两个硬性需求:

  1. 监管合规。印尼金融监管局(OJK)要求在 2023 年底前,处理印尼用户的支付数据必须存储在印尼境内的数据中心。AWS 在 2022 年才在雅加达开设区域,且部分合规认证尚未完成。GCP 在雅加达的区域更早获得了相关认证。
  2. 灾备 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 名新招)。

成功的方面

付出的代价

9.4 复盘总结

团队的复盘结论是:多云是正确的决策,但代价比预期高 60%。 如果重新做这个项目,他们会做以下调整:

  1. 用 GCP 仅承载合规数据存储和灾备切换,不在 GCP 上跑日常生产流量,减少跨云数据同步的常态化开销
  2. 用 Consul 替代 Istio 做跨集群服务发现,降低运维复杂度
  3. 在项目启动前先建立跨云的统一可观测性平台,而不是事后补建

十、多云决策框架:什么时候应该多云

基于前面的分析,以下是一个实用的决策框架。

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 不该做多云的场景

以下场景中,多云策略的成本几乎必然大于收益:

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 的习惯——这些低成本的准备工作可以在真正需要迁移时大幅降低成本,而不需要在当下承担全面多云的复杂度。


参考资料

  1. Flexera. 2024 State of the Cloud Report. Flexera, 2024.
  2. Gartner. Cloud Migration Costs and Timelines for Midsize Enterprises. Gartner Research, 2023.
  3. Google Cloud. Egress Pricing Changes and Free Tier Update. Google Cloud Blog, 2023.
  4. Crossplane Documentation. Composite Resources. https://docs.crossplane.io/latest/concepts/composite-resources/
  5. KubeVela Documentation. Multi-Cluster Application Delivery. https://kubevela.io/docs/case-studies/multi-cluster/
  6. Kubernetes SIG Cluster Lifecycle. Cluster API Book. https://cluster-api.sigs.k8s.io/
  7. Hashimoto, Mitchell. “Multi-Cloud Is a Trap.” HashiConf 2022 Keynote. HashiCorp, 2022.
  8. 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.
  9. Cockroach Labs. Multi-Region Architecture Patterns. CockroachDB Documentation, 2024.
  10. Burns, Brendan et al. “Borg, Omega, and Kubernetes.” ACM Queue 14, no. 1 (2016): 70-93.

上一篇:Service Mesh 下一篇:平台工程

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-13 · architecture

【系统架构设计百科】架构质量属性:不只是"高可用高性能"

需求评审时写下的'高可用、高性能、高并发',到了架构设计阶段几乎无法落地——因为它们不是可执行的需求。本文从 SEI/CMU 的质量属性理论出发,用 stimulus-response 场景模型把模糊需求变成可量化、可验证的架构约束,并拆解属性之间的冲突与联动关系。

2026-04-13 · architecture

【系统架构设计百科】告警策略:如何避免"狼来了"

大多数团队的告警系统都在制造噪声而不是传递信号。阈值告警看似直观,实则产生大量误报和漏报,值班工程师在凌晨三点被叫醒,却发现只是一次无害的毛刺。本文从告警疲劳的工业数据出发,拆解基于 SLO 的多窗口燃烧率告警算法,深入 Alertmanager 的路由、抑制与分组机制,结合 PagerDuty 的告警疲劳研究和真实工程案例,给出一套可落地的告警策略设计方法。

2026-04-13 · architecture

【系统架构设计百科】复杂性管理:架构的核心战场

系统复杂性是架构腐化的根源——本文从 Brooks 的本质复杂性与偶然复杂性划分出发,结合认知负荷理论与 Parnas 的信息隐藏原则,系统阐述复杂性的来源、度量与控制手段,并给出可操作的架构策略


By .