Skip to content

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 多集群
  纯网络打通     → Submariner

2. 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 serviceimports

4. 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=true

5. 面试高频问题

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. 异步通信:跨集群用消息队列代替同步调用