主题
18 — 多集群与混合云深度教材
多集群管理是企业级 K8s 的必经之路。本章覆盖集群联邦、Karmada/Submariner、跨集群服务、统一管控。
1. 多集群架构模式
三种主流模式:
1. 集群联邦(Cluster Federation)
- 统一控制面管理多个集群
- 代表:Karmada、Open Cluster Management
2. 服务网格跨集群(Mesh Federation)
- Istio 多集群 mesh
- 跨集群服务发现 + 流量管理
3. 网络互联(Network Connectivity)
- Submariner:跨集群 L3 网络打通
- 直接路由 Pod CIDR
选择建议:
统一管控/多环境部署 → Karmada
微服务跨集群调用 → Istio 多集群
纯网络打通 → Submariner2. Karmada(CNCF 孵化项目)
yaml
# Karmada 核心概念
# 1. Cluster:注册的成员集群
# 2. PropagationPolicy:资源传播策略
# 3. ResourceBinding:资源与集群的绑定
# 注册成员集群
karmadactl join cluster-east --cluster-kubeconfig=/etc/karmada/east.kubeconfig
karmadactl join cluster-west --cluster-kubeconfig=/etc/karmada/west.kubeconfig
# 传播策略:将 Deployment 部署到多个集群
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: web-app-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: web-app
placement:
clusterAffinity:
clusterNames:
- cluster-east
- cluster-west
replicaScheduling:
replicaDivisionPreference: Weighted
replicaSchedulingType: Divided
weightPreference:
staticWeightList:
- targetCluster:
clusterNames: [cluster-east]
weight: 3 # 东区 75%
- targetCluster:
clusterNames: [cluster-west]
weight: 1 # 西区 25%3. Submariner(跨集群网络)
Submariner 架构:
集群 A Pod CIDR ←——Submariner Gateway——→ 集群 B Pod CIDR
工作方式:
1. 每个集群部署 Gateway 节点
2. Gateway 之间建立 VPN 隧道
3. Pod 流量通过 Gateway 路由到远端集群
4. 支持 Service Discovery(跨集群 Service 发现)
优势:不修改 CNI,任意 CNI 插件都能用
劣势:Gateway 是瓶颈,需要高可用bash
# 安装 Submariner(通过 subctl)
subctl deploy-broker --kubeconfig cluster-a.kubeconfig
subctl join broker-info.subm --kubeconfig cluster-a.kubeconfig --clusterid cluster-a
subctl join broker-info.subm --kubeconfig cluster-b.kubeconfig --clusterid cluster-b
# 验证连通性
subctl verify --kubecontexts cluster-a,cluster-b
# 跨集群 Service 发现
# 集群 A 的 Service 自动在集群 B 可见
kubectl --context cluster-b get serviceimports4. Istio 多集群 Mesh
yaml
# Istio 多集群配置(共享控制面)
# 1. 共享根 CA(证书互信)
# 2. 共享控制面或东西向互联
# 3. East-West Gateway(集群间流量网关)
# 安装 East-West Gateway
istioctl install --set values.global.meshID=mesh1 \
--set values.global.multiCluster.clusterName=cluster-east
# 暴露服务到其他集群
kubectl label namespace production topology.istio.io/expose=true5. 面试高频问题
Q: 多集群部署如何保证一致性?
1. GitOps 统一仓库:所有集群从同一 Git 仓库拉取
2. ArgoCD ApplicationSet:自动为每个集群创建 Application
3. Karmada PropagationPolicy:统一管理资源传播
4. 配置管理:Helm values 按集群覆盖
5. 密钥同步:External Secrets + Vault 统一密钥源Q: 跨集群 Service 调用的延迟问题?
1. 就近路由:优先调用同集群服务(Istio locality load balancing)
2. 拓扑感知:K8s topology aware hints
3. 数据局部性:将相关服务部署在同一集群
4. 异步通信:跨集群用消息队列代替同步调用