出海企业多云Kubernetes联邦与跨集群服务发现实战:一套代码管多朵云(2026最新版)

📅 · 企业出海多云架构实战 - ChengziCloud

一句话结论

Meta Description: 多云Kubernetes联邦部署完整指南:KubeFed v2、Cilium Cluster Mesh、Submariner跨云网络、ArgoCD多集群GitOps、Prometheus+Thanos统一可观测性,从架构到命令一篇搞定。

本文要点
  • 前言
  • 为什么需要多云Kubernetes联邦?
  • 多云K8s联邦五层架构全景图
  • 网络互通:Submariner vs Cilium Cluster Mesh
  • 跨集群服务发现:三种模式详解
  • ArgoCD 多集群GitOps编排
  • 跨云可观测性:Prometheus + Thanos统一指标
  • 三云厂商K8s联邦能力对比表

Meta Description: 多云Kubernetes联邦部署完整指南:KubeFed v2、Cilium Cluster Mesh、Submariner跨云网络、ArgoCD多集群GitOps、Prometheus+Thanos统一可观测性,从架构到命令一篇搞定。

关键词: 多云Kubernetes、K8s联邦、跨集群服务发现、Cilium Cluster Mesh、Submariner、多云容器编排

前言

企业出海后,业务往往同时运行在阿里云ACK、AWS EKS、腾讯云TKE三朵云上。每个集群独立部署简单,但跨集群流量调度、统一服务发现、全局故障转移却成了真正的难题。本文从实战角度出发,覆盖多云K8s联邦的五层架构——网络互通、服务发现、工作负载编排、可观测性、灾备切换,提供完整的架构图、配置命令和厂商对比,帮助企业在30分钟内搭建起跨云Kubernetes联邦体系。

一、为什么需要多云Kubernetes联邦?

当企业同时使用三朵云时,最常见的问题是:A云的Pod想调用B云的Service,DNS解析不到;A云宕机后流量无法自动切到B云;运维团队要登录三个集群分别操作,效率极低。多云K8s联邦解决的正是这三个核心痛点。

典型场景:

场景痛点联邦方案
跨云服务调用A云Pod无法发现B云ServiceCilium Cluster Mesh / Submariner
跨云故障转移A云全挂,流量无法自动切走GSLB + 多集群Deployment
统一运维登录三个集群分别操作ArgoCD多集群 + Lens/Rancher
跨云负载均衡无法跨云分配流量Istio VirtualService / DNS轮询
数据同步跨云数据库延迟高DTS/DMS + 本地缓存降级

二、多云K8s联邦五层架构全景图


graph TB
    subgraph 用户层
        U[用户/客户端]
    end

    subgraph 调度层
        GSLB[全局负载均衡 GSLB/Cloudflare]
    end

    subgraph 联邦控制层
        ARGO[ArgoCD 多集群GitOps]
        KUBEFED[KubeFed v2 / Admiralty]
    end

    subgraph 集群层
        ACK[阿里云ACK<br/>ap-southeast-1]
        EKS[AWS EKS<br/>ap-southeast-1]
        TKE[腾讯云TKE<br/>ap-southeast-1]
    end

    subgraph 网络互通层
        SUB[Submariner VPN隧道]
        CILIUM[Cilium Cluster Mesh]
    end

    U --> GSLB
    GSLB --> ACK
    GSLB --> EKS
    GSLB --> TKE
    ARGO --> ACK
    ARGO --> EKS
    ARGO --> TKE
    KUBEFED --> ACK
    KUBEFED --> EKS
    KUBEFED --> TKE
    SUB --- ACK
    SUB --- EKS
    SUB --- TKE
    CILIUM --- ACK
    CILIUM --- EKS
    CILIUM --- TKE

ASCII 全景图:


┌─────────────────────────────────────────────────────────────────────┐
│                        全局负载均衡层                                │
│          Cloudflare DNS / AWS Route53 / 阿里云云解析DNS              │
├─────────────┬───────────────────┬───────────────────────────────────┤
│   联邦控制层 │                   │                                   │
│  ArgoCD     │  KubeFed v2       │  Admiralty (可选)                  │
│  多集群同步  │  资源分发          │  虚拟集群联邦                      │
├─────────────┼───────────────────┼───────────────────────────────────┤
│             │    网络互通层      │                                   │
│  Submariner │  Cilium Cluster   │  WireGuard (轻量级)               │
│  SiteMesh   │  Mesh             │                                   │
├─────────────┼───────────────────┼───────────────────────────────────┤
│             │    集群层          │                                   │
│  阿里云ACK  │  AWS EKS          │  腾讯云TKE                        │
│  sg.1       │  ap-southeast-1   │  ap-singapore                    │
│  v1.28+     │  v1.29+           │  v1.28+                          │
└─────────────┴───────────────────┴───────────────────────────────────┘

三、网络互通:Submariner vs Cilium Cluster Mesh

跨云K8s联邦的第一步是让不同集群的Pod能互相通信。目前主流方案有两种:Submariner(基于VPN隧道)和 Cilium Cluster Mesh(基于eBPF)。

方案对比

特性SubmarinerCilium Cluster Mesh
原理IPsec/WireGuard VPN隧道eBPF XDP + 全局服务路由
性能中等(加密开销~15%)高(eBPF零拷贝,开销<5%)
服务发现需配合Lighthouse内置全局DNS + ServiceAffinity
网络策略不支持跨云NetworkPolicy支持跨云CiliumNetworkPolicy
安装复杂度中等(需Broker组件)低(Helm一键安装)
兼容性任意CNI(Calico/Flannel等)要求Cilium CNI(可原地升级)
生产验证成熟(AWS/Azure原生支持)成熟(Cilium已入CNCF毕业)
适用场景多厂商CNI混合环境统一Cilium CNI的新建集群

Submariner 部署命令


// 安装 Subctl 命令行工具
curl -Ls https://get.submariner.io | VERSION=v0.18.0 bash
export PATH=$PATH:$(pwd)/bin

// 在 Hub 集群安装 Broker
subctl deploy-broker --natt=false --globalnet

// 将阿里云ACK加入联邦
subctl join broker-info.subm --clusterid ack-sg \
  --serviceaccount --ikeport 4500

// 将AWS EKS加入联邦
subctl join broker-info.subm --clusterid eks-sg \
  --serviceaccount --ikeport 4500

// 将腾讯云TKE加入联邦
subctl join broker-info.subm --clusterid tke-sg \
  --serviceaccount --ikeport 4500

// 验证连通性
subctl show connections
subctl show endpoints

Cilium Cluster Mesh 部署命令


// 确保三朵云集群都安装了Cilium(版本>=1.14)
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.15.0 \
  --namespace kube-system \
  --set cluster.name=ack-sg \
  --set cluster.id=1 \
  --set clustermesh.enable=true

// 导出每个集群的CA证书和Endpoint
cilium clustermesh status --wait

// 连接集群(在Hub集群执行)
cilium clustermesh connect --destination-context ack-sg \
  --destination-context eks-sg
cilium clustermesh connect --destination-context ack-sg \
  --destination-context tke-sg

// 等待所有服务同步完成
cilium clustermesh status --wait

// 验证:从ACK集群Pod中访问EKS集群Service
kubectl exec -it test-pod -- curl eks-service.eks-sg.svc.mesh.cilium.io

四、跨集群服务发现:三种模式详解

跨集群服务发现是联邦的核心能力。根据业务需求,可以选择三种不同粒度的模式。

模式一:Cilium Cluster Mesh 全局服务(推荐)

Cilium Cluster Mesh 将多个集群的同名Service合并为一个全局服务,Pod可以像访问本地服务一样访问跨云Service。


// 部署示例:三朵云部署同一个API服务
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-server
  template:
    metadata:
      labels:
        app: api-server
    spec:
      containers:
      - name: api
        image: registry.cn-hangzhou.aliyuncs.com/myorg/api:v2.1
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: api-server
  namespace: production
  annotations:
    // 关键:声明为全局服务
    service.cilium.io/global: "true"
    // 服务亲和性:优先访问同集群
    service.cilium.io/affinity: "local"
spec:
  selector:
    app: api-server
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

模式二:Submariner Lighthouse DNS

Submariner的Lighthouse组件为跨集群Service提供DNS解析,将 <service>.<namespace>.svc.clusterset.local 解析到远端集群的Endpoint。


// 在每个集群安装Lighthouse
helm install submariner-lighthouse \
  submariner-lighthouse/submariner-lighthouse \
  --namespace submariner-operator \
  --create-namespace

// 验证跨集群DNS解析
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- \
  nslookup api-server.production.svc.clusterset.local
// 应返回多个集群的Endpoint IP

模式三:Istio 多集群ServiceEntry

对于使用Istio服务网格的环境,可以通过ServiceEntry将远端集群的服务注册到本地网格中。


apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: eks-api-server
  namespace: production
spec:
  hosts:
  - api-server.eks-production.svc.cluster.local
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  endpoints:
  - address: eks-api.eks-sg.svc.cluster.local
    ports:
      http: 80

五、ArgoCD 多集群GitOps编排

ArgoCD是多云K8s联邦的控制平面核心。通过一个ArgoCD实例管理三朵云的Kubernetes集群,实现"一份代码、三朵云部署"。

安装ArgoCD并注册三朵云集群


// 在Hub集群安装ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

// 注册阿里云ACK
argocd cluster add ack-sg-admin --name ack-sg --server https://api.ack-sg.cn-hangzhou.ack.aliyuncs.com:6443

// 注册AWS EKS
argocd cluster add eks-sg-admin --name eks-sg --server https://XXXXX.eks.amazonaws.com

// 注册腾讯云TKE
argocd cluster add tke-sg-admin --name tke-sg --server https://api.tke-sg.tencentcloud.local:6443

// 验证集群连接状态
argocd cluster list

多集群ApplicationSet模板

使用ApplicationSet可以一份配置同时部署到三朵云,每个集群可以有差异化参数:


apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: api-server-multicloud
  namespace: argocd
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
  template:
    metadata:
      name: 'api-server-{{name}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/myorg/k8s-manifests.git
        targetRevision: main
        path: 'overlays/{{metadata.labels.cloud}}'
      destination:
        server: '{{server}}'
        namespace: production
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
        - CreateNamespace=true

六、跨云可观测性:Prometheus + Thanos统一指标

多云K8s联邦的可观测性需要将三个集群的指标汇聚到一个统一的Grafana仪表盘。Thanos是目前最成熟的方案。


graph LR
    subgraph 阿里云ACK
        PROM_A[Prometheus<br/>本地15天]
    end

    subgraph AWS EKS
        PROM_B[Prometheus<br/>本地15天]
    end

    subgraph 腾讯云TKE
        PROM_C[Prometheus<br/>本地15天]
    end

    subgraph 汇聚层
        THANOS_S[Thanos Sidecar<br/>上传ObjectStore]
        THANOS_Q[Thanos Query<br/>全局查询入口]
    end

    subgraph 存储层
        OBJ[ObjectStore<br/>S3/OSS/COS]
    end

    PROM_A --> THANOS_S
    PROM_B --> THANOS_S
    PROM_C --> THANOS_S
    THANOS_S --> OBJ
    OBJ --> THANOS_Q
    THANOS_Q --> GRAFANA[Grafana<br/>统一仪表盘]

Thanos 部署关键配置


// Prometheus Helm values(三朵云共用,改cluster标签)
prometheus:
  retention: 15d
  thanosService:
    enabled: true
  thanos:
    objectStorageConfig:
      secret:
        name: thanos-objstore-secret
        key: objstore.yml
    sidecar:
      // 每个集群上传到自己的Bucket
      objstoreConfig:
        type: S3
        config:
          bucket: thanos-metrics-${CLUSTER_NAME}
          endpoint: s3.${REGION}.amazonaws.com

// Thanos Query 部署在Hub集群
// 同时查询三个集群的Thanos Sidecar
thanos query:
  endpoints:
  - ack-sg-prometheus-thanos:10901
  - eks-sg-prometheus-thanos:10901
  - tke-sg-prometheus-thanos:10901
  // 按cluster标签区分
  query.auto-downsampling: true

七、三云厂商K8s联邦能力对比表

能力阿里云ACKAWS EKS腾讯云TKE
多集群管理ASCluster(控制台聚合)EKS Console + LensTKE Console多集群视图
原生联邦方案无(推荐KubeFed/ArgoCD)无(推荐ArgoCD)无(推荐ArgoCD)
跨集群网络CEN云企业网+VPC对等VPC Peering+Transit GW对等连接+CDC
Cilium支持ACK Pro集群原生支持EKS Add-on支持需手动安装
Submarener兼容支持(Calico CNI)原生支持支持(Calico CNI)
GitOps生态阿里云云效+ArgoCDCodePipeline+ArgoCD腾讯云CODING+ArgoCD
多集群监控ARMS Prometheus(托管)AMP Managed PrometheusTPS Prometheus(托管)
跨集群弹性多伸缩组+ESSNode Auto Scaling多伸缩组+GPA
容器镜像跨云同步ACR跨区域复制ECR跨区域复制TCR跨区域复制
最低集群版本1.26+1.25+1.24+

八、跨云部署成本参考(新加坡区域)

配置阿里云ACK Pro(新加坡)AWS EKS(新加坡)腾讯云TKE(新加坡)
集群管理费¥0/小时(Pro版含免费额度)$0.10/小时($73/月)免费(标准版)
3节点Worker(4C8G)¥1,200/月$180/月(m5.xlarge×3)¥1,100/月
SLB负载均衡¥300/月$22/月(ALB)¥280/月
容器镜像仓库(50GB)¥100/月$10/月(ECR 50GB)¥90/月
监控(Prometheus托管)¥500/月$150/月(AMP)¥450/月
月度合计(单集群)¥2,100/月$435/月(约¥3,100)¥1,920/月
三朵云月度合计¥7,120/月(约$980)——

实际以各云官网实时报价为准,以上为参考估算。

九、30分钟快速搭建多云K8s联邦路线图


graph LR
    A[0-5min<br/>环境准备] --> B[5-10min<br/>安装Cilium]
    B --> C[10-15min<br/>开启Cluster Mesh]
    C --> D[15-20min<br/>安装ArgoCD]
    D --> E[20-25min<br/>部署ApplicationSet]
    E --> F[25-30min<br/>验证跨云调用]

Step 1(0-5min):环境准备


// 确认三朵云kubectl配置正确
kubectl config use-context ack-sg && kubectl get nodes
kubectl config use-context eks-sg && kubectl get nodes
kubectl config use-context tke-sg && kubectl get nodes

Step 2(5-15min):安装Cilium + 开启Cluster Mesh


// 三朵云分别安装Cilium(改cluster.name和cluster.id)
for ctx in ack-sg eks-sg tke-sg; do
  kubectl config use-context $ctx
  helm upgrade --install cilium cilium/cilium \
    --version 1.15.0 --namespace kube-system \
    --set cluster.name=$ctx --set cluster.id=$(echo $ctx | md5sum | cut -c1-2) \
    --set clustermesh.enable=true
done

// 连接三朵云
cilium clustermesh connect --destination-context ack-sg --destination-context eks-sg
cilium clustermesh connect --destination-context ack-sg --destination-context tke-sg
cilium clustermesh status --wait

Step 3(15-25min):安装ArgoCD + 注册集群 + 部署应用


// Hub集群安装ArgoCD
kubectl config use-context ack-sg
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

// 注册EKS和TKE
argocd cluster add eks-sg-admin --name eks-sg
argocd cluster add tke-sg-admin --name tke-sg

// 创建ApplicationSet(参考第六节YAML)
kubectl apply -f applicationset.yaml

Step 4(25-30min):验证跨云服务调用


// 在ACK集群部署测试Pod
kubectl run curl-test --image=curlimages/curl --rm -it --restart=Never -- \
  curl api-server.production.svc.cluster.local

// 应能看到来自EKS或TKE的响应(通过Cluster Mesh路由)
// 预期输出:{"status":"ok","cluster":"eks-sg","pod":"api-server-xxxxx"}

十、常见问题 FAQ

Q1: 多云K8s联邦对集群版本有要求吗?

Cilium Cluster Mesh 要求 Cilium >= 1.14,底层 K8s >= 1.21。ArgoCD 支持 K8s >= 1.21。建议三朵云统一到 1.28+,避免版本差异导致的 API 兼容问题。Submariner 要求 K8s >= 1.19,对版本宽容度更高。

Q2: 跨云延迟会影响服务调用吗?

新加坡区域内三朵云之间的网络延迟通常在 2-5ms(同Region),对大多数业务影响可忽略。跨Region(如新加坡→东京)延迟约 60-80ms,需要在应用层做好超时和重试。Cilium Cluster Mesh 支持 service.cilium.io/affinity: "local" 优先本地调用,减少跨云延迟。

Q3: Cilium Cluster Mesh 和 Submariner 能同时用吗?

技术上可以但不推荐。两者同时运行会导致路由冲突和双隧道开销。选择原则:新建集群统一用 Cilium(性能更好、功能更全),存量 Calico/Flannel 集群用 Submariner(兼容性好)。渐进迁移路径:先 Submariner 打通,再逐集群升级到 Cilium,最后关闭 Submariner。

Q4: 跨云服务调用的流量费用怎么算?

三朵云同Region内跨云通信通常走VPC对等连接或云企业网,费用约 ¥0.01-0.03/GB。如果走公网(Submariner IPsec隧道),费用按各云出站流量计费,约 ¥0.5-0.8/GB。建议优先使用云企业网(CEN)或VPC Peering,避免公网隧道的高额流量费。

Q5: 多云K8s联邦的故障转移是自动的吗?

不是完全自动的。需要配合两层机制:① DNS层:Cloudflare或Route53健康检查发现集群故障后自动切换DNS解析;② 应用层:ArgoCD的selfHeal确保故障恢复后自动同步状态。真正的"秒级自动切换"需要 GSLB + 有状态应用的跨云数据同步(参考 多云灾备编排文章)。

Q6: 腾讯云TKE的Cilium支持情况如何?

腾讯云TKE标准版支持通过自定义模式安装Cilium CNI。TKE Serverless版暂不支持Cilium。如果使用TKE托管版(非Serverless),可以通过Helm手动安装Cilium 1.15+,开启Cluster Mesh功能。建议在TKE创建集群时选择"自定义"网络模式,预留Cilium升级空间。

Q7: ArgoCD管理多集群时,权限怎么隔离?

ArgoCD支持通过Project实现权限隔离。可以为每个云厂商创建独立的Project,限制只能部署到对应的集群和Namespace。生产环境建议开启SSO集成(Keycloak/Azure AD),通过OIDC组映射ArgoCD的RBAC角色。详细方案参考 多云零信任网络架构文章。

Q8: 多云K8s联邦适合什么规模的企业?

建议同时管理3个以上Kubernetes集群的企业采用联邦方案。如果只有1-2个集群,ArgoCD多集群管理已经足够,不需要引入Cilium Cluster Mesh。联邦方案的运维复杂度与集群数量正相关——3个集群是联邦的甜蜜点,超过5个建议考虑Karmada或KubeFed v2进行更精细的资源分发。

十一、总结

多云Kubernetes联邦是出海企业容器化架构的必经之路。核心方案是 Cilium Cluster Mesh 打通跨云网络 + ArgoCD ApplicationSet 统一部署 + Thanos 统一可观测性。三个组件分别解决网络互通、工作负载编排、监控告警三大痛点,形成完整的多云容器编排闭环。

对于刚开始探索多云的企业,建议从"ArgoCD多集群管理"起步,验证跨云部署流程后再引入Cilium Cluster Mesh打通网络。渐进式演进比一步到位更安全、成本更低。

🚀 企业出海需要云架构咨询?通过 7.chengzicloud.cloud 联系我们,获取专属的多云K8s联邦方案,涵盖架构设计、部署实施、安全加固全流程服务。

相关阅读

本文由 7.chengzicloud.cloud 提供,点击访问首页了解更多