弹性计算与多云架构
云原生时代的核心能力是"弹性"——按需获取计算资源、按使用付费、自动扩缩容。本文系统讲解弹性计算架构的完整技术栈,从容器编排与 Serverless 到多云策略与云成本优化(FinOps)。
1. 弹性计算基础
1.1 弹性维度
| 维度 | 说明 | 技术实现 |
|---|
| 垂直弹性 | 调整单机资源(CPU/内存) | 热添加、动态调整 VM 规格 |
| 水平弹性 | 增减实例数量 | HPA、VPA、Cluster Autoscaler |
| 时间弹性 | 按时间规律扩缩 | CronHPA、定时任务 |
| 容量弹性 | 存储/网络的动态扩展 | EBS 扩容、弹性带宽 |
1.2 弹性架构核心组件
负载均衡器(ALB/NLB)
│
┌────────────┼────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Pod/VM │ │ Pod/VM │ │ Pod/VM │ ← 可动态增减
│ (运行中)│ │ (运行中)│ │ (运行中)│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ 自动伸缩控制器 │
│ (根据指标决策) │
└─────────────┘
2. Kubernetes 弹性编排
2.1 HPA(Horizontal Pod Autoscaler)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-service
minReplicas: 2
maxReplicas: 100
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15 # 15秒内最多翻倍
scaleDown:
stabilizationWindowSeconds: 300 # 缩容冷却 5 分钟
policies:
- type: Percent
value: 10
periodSeconds: 60 # 每分钟最多缩 10%
2.2 VPA(Vertical Pod Autoscaler)
VPA vs HPA:
HPA:增加/减少 Pod 数量(适合无状态、水平可扩展)
VPA:调整单个 Pod 的资源 request/limit(适合有状态、不可水平分片)
VPA 模式:
- Auto:自动更新 Pod 资源(需重启)
- Recreate:同上,但明确会重启
- Initial:仅对新 Pod 生效
- Off:只提供建议,不自动修改
注意:HPA 和 VPA 不建议同时使用(冲突)
2.3 Cluster Autoscaler
节点级别弹性:
当 Pod 因资源不足无法调度时:
Cluster Autoscaler ──→ 向云厂商 API 申请新节点 ──→ 节点加入集群 ──→ Pod 调度
当节点利用率低且 Pod 可迁移时:
Cluster Autoscaler ──→ 驱逐节点上的 Pod ──→ 缩容节点
支持:AWS ASG、GCP MIG、Azure VMSS、阿里云 ESS
2.4 KEDA(Kubernetes Event-Driven Autoscaling)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: queue-consumer-scaler
spec:
scaleTargetRef:
name: queue-consumer
minReplicaCount: 0 # 可缩容到 0(Serverless 体验)
maxReplicaCount: 100
triggers:
- type: kafka
metadata:
bootstrapServers: kafka:9092
consumerGroup: my-group
topic: orders
lagThreshold: "100" # 消息堆积超过 100 则扩容
KEDA 支持 50+ 事件源:Kafka、RabbitMQ、SQS、Azure Queue、Redis、PostgreSQL…
3. Serverless 架构
3.1 Serverless 的三层含义
| 层级 | 产品 | 开发者管理 | 云服务商管理 |
|---|
| FaaS(函数即服务) | AWS Lambda、Vercel、Cloudflare Workers | 仅代码 | 运行时、扩缩容、基础设施 |
| BaaS(后端即服务) | Firebase、AWS Amplify、Supabase | 业务逻辑 | 数据库、认证、存储 |
| CaaS(容器即服务) | AWS Fargate、Google Cloud Run | 容器镜像 | 编排、节点管理 |
3.2 FaaS 架构模式
触发源 函数执行 输出
│ │ │
├── HTTP 请求 ──→ ┌───────┐ ──→ 业务逻辑 ──→ HTTP 响应
├── 定时触发 ───→ │ Lambda│ ──→ 数据处理 ──→ 数据库
├── 文件上传 ───→ │ 函数 │ ──→ 图片处理 ──→ 对象存储
├── 消息队列 ───→ └───────┘ ──→ 事件处理 ──→ 消息队列
└── 数据库变更 ──→ ──→ 缓存更新 ──→ 缓存
冷启动问题:
- 首次调用或长时间未用后,需初始化运行时(100ms~数秒)
- 缓解:Provisioned Concurrency(预置并发)、Keep-alive 策略
3.3 Serverless 适用场景
| 适合 | 不适合 |
|---|
| 事件处理、Webhook | 长时间运行任务(>15分钟) |
| 定时任务(Cron) | 需要稳定低延迟的服务 |
| 文件处理流水线 | 大规模计算密集型任务 |
| API 后端(中低 QPS) | 需要特定运行时环境的应用 |
| 快速原型/MVP | 已有复杂部署流程的遗留系统 |
4. 多云与混合云架构
4.1 多云策略
| 策略 | 说明 | 适用场景 |
|---|
| 多云灾备 | 主云运行,备用云待命 | 高可用要求极高 |
| 多云并行 | 不同业务跑在不同云 | 避免供应商锁定 |
| 多云联邦 | 多个云同时承载流量 | 性能优化(就近接入) |
| 混合云 | 私有云 + 公有云结合 | 合规、敏感数据本地 |
4.2 混合云架构
┌──────────────────────────────────────────────────────┐
│ 公有云(AWS/阿里云) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Web 服务 │ │ 消息队列 │ │ 大数据/AI 计算 │ │
│ │ (弹性扩展)│ │ (跨区域) │ │ (高计算密度) │ │
│ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │
└───────┼────────────┼─────────────────┼──────────────┘
│ │ │
专线/VPN 专线/VPN 专线/VPN
│ │ │
┌───────┼────────────┼─────────────────┼──────────────┐
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────────▼─────────┐ │
│ │ 核心数据库 │ │ 消息队列 │ │ 文件存储/备份 │ │
│ │ (敏感数据) │ │ (本地缓存)│ │ (归档数据) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
│ 私有云(IDC) │
└──────────────────────────────────────────────────────┘
4.3 跨云容器编排
# Rancher / OpenShift / Karmada 实现跨 K8s 集群管理
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- aws-cluster
- aliyun-cluster
replicaScheduling:
replicaDivisionPreference: Weighted
weightPreference:
staticWeightList:
- targetCluster:
clusterNames:
- aws-cluster
weight: 60
- targetCluster:
clusterNames:
- aliyun-cluster
weight: 40
5. 云成本优化(FinOps)
5.1 云成本构成
计算成本(通常最大)
├── VM / 容器实例
├── Serverless 调用次数
└── Spot / On-Demand / Reserved 定价模式
存储成本
├── 对象存储(S3/OSS)
├── 块存储(EBS)
└── 归档存储
网络成本(容易被忽视)
├── 出站流量费
├── 跨 AZ 流量
├── 跨区域复制
└── CDN 流量
其他
├── 数据库(RDS计费)
├── 负载均衡器
├── 监控/日志
└── licenses
5.2 成本优化策略
| 策略 | 节省幅度 | 实施难度 |
|---|
| Reserved Instances / Savings Plans | 30-72% | 低(需承诺使用量) |
| Spot/Preemptible 实例 | 60-90% | 中(需处理中断) |
| 自动启停(非工作时间关机) | 30-50% | 低 |
| 存储分层(热/温/冷/归档) | 20-60% | 低 |
| 右 sizing(匹配实际用量) | 10-30% | 中 |
| 容器密度优化 | 10-40% | 中 |
| 无服务器替代常驻服务 | 20-70% | 中 |
5.3 FinOps 实践框架
FinOps 三阶段:
1. 通知(Inform)
├── 成本可视化(分团队/项目/环境)
├── 预算告警(超预算 80% 预警)
└── 成本分摊(Showback / Chargeback)
2. 优化(Optimize)
├── 持续右 sizing
├── 预留实例策略
├── 自动化资源清理
└── 架构优化(更省资源的方案)
3. 运营(Operate)
├── 成本纳入 KPI
├── 自动化 FinOps 策略
└── 持续监控和改进
6. 边缘计算
集中式架构: 边缘计算架构:
用户 ━━→ 中心云 用户 ━━→ 边缘节点(就近)
(高延迟) ┃ ┃
┃ ┗━━→ 中心云(重度计算)
┗━━━━━━━━━→ 回源
边缘节点部署:
- CDN 边缘节点(静态内容 + 边缘计算)
- 5G MEC(Multi-access Edge Computing)
- IoT 网关(本地数据预处理)
- 本地数据中心(Factory/Store Edge)
适合场景:
- 低延迟要求(AR/VR、自动驾驶、工业控制)
- 数据合规(数据不出厂/不出国)
- 带宽节约(本地预处理再上传)
7. 总结
弹性计算演进路线:
物理服务器(固定容量)
→ 虚拟机(资源切割)
→ IaaS(按需获取 VM)
→ PaaS / 容器(应用托管)
→ CaaS(容器编排 + 自动扩缩容)
→ FaaS / Serverless(纯函数,极致弹性)
→ 多云 + 边缘(无处不在的计算)
设计建议:
1. 无状态化是水平扩展的前提
2. 自动扩缩容需配置合理的上下限和冷却期
3. Serverless 不是银弹,关注冷启动和厂商锁定
4. 多云策略需权衡管理与成本复杂度
5. FinOps 是持续过程,不是一次性项目
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。