多云混合部署实战
问题
企业需要在多个云厂商之间部署服务,如何设计多云架构?如何避免厂商锁定?
答案
多云架构设计
Terraform 多云编排
# main.tf — 多云资源统一管理
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.210"
}
}
}
# AWS 资源
provider "aws" {
region = "ap-southeast-1"
}
resource "aws_eks_cluster" "primary" {
name = "prod-primary"
role_arn = aws_iam_role.eks.arn
version = "1.29"
# ...
}
# 阿里云资源
provider "alicloud" {
region = "cn-hangzhou"
}
resource "alicloud_cs_managed_kubernetes" "secondary" {
name = "prod-secondary"
version = "1.28"
# ...
}
网络互通方案
| 方案 | 延迟 | 带宽 | 成本 | 适用场景 |
|---|---|---|---|---|
| IPsec VPN | 不稳定 | <1Gbps | 低 | 测试/非核心 |
| SD-WAN | 较低 | 灵活 | 中 | 多分支互联 |
| 云专线 + 对等互联 | 最低 | >1Gbps | 高 | 核心业务 |
| 应用层 API 调用 | 中等 | N/A | 低 | 松耦合服务 |
避免厂商锁定的策略
| 层面 | 锁定风险 | 解耦策略 |
|---|---|---|
| 计算 | ECS/EC2 实例规格差异 | K8s 统一编排,应用容器化 |
| 存储 | 对象存储 API 差异 | S3 兼容 API(MinIO)或抽象层 |
| 数据库 | 云托管数据库(RDS) | 使用开源数据库(MySQL/PG),自建或用兼容服务 |
| 消息队列 | 云专属 MQ | 使用 Kafka / RabbitMQ |
| 监控 | 云监控平台 | Prometheus + Grafana |
| CI/CD | 云厂商 CI 服务 | GitHub Actions / GitLab CI |
| IaC | CloudFormation 等 | Terraform(多云通用) |
务实看待厂商锁定
完全消除厂商锁定既不现实也不经济。应关注核心组件的可迁移性(数据库、消息队列),而非每个服务都做抽象。适度使用云厂商托管服务可以显著降低运维成本。
统一监控与日志
# Prometheus 联邦集群 — 全局 Prometheus 从各云采集
# global-prometheus.yml
scrape_configs:
- job_name: 'cloud-a-federation'
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job=~".+"}'
static_configs:
- targets: ['prometheus-cloud-a.internal:9090']
labels:
cloud: 'aws'
- job_name: 'cloud-b-federation'
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job=~".+"}'
static_configs:
- targets: ['prometheus-cloud-b.internal:9090']
labels:
cloud: 'alicloud'
常见面试问题
Q1: 什么场景下应该选择多云部署?
答案:
| 场景 | 动机 | 示例 |
|---|---|---|
| 合规要求 | 数据必须存放在特定地区 | 中国用阿里云,海外用 AWS |
| 容灾 | 避免单一厂商故障 | 主 AWS + 灾备阿里云 |
| 成本优化 | 利用不同厂商优势 | GPU 用 A 厂商,存储用 B 厂商 |
| 避免绑定 | 保持议价能力 | 核心服务多云部署 |
| 并购整合 | 不同团队用不同云 | 逐步统一或长期共存 |
不建议纯粹为了"多云"而多云——多云带来的复杂度(网络、数据同步、运维)是实实在在的成本。