多集群工具与架构选型
核心问题:什么时候需要多个 Kubernetes 集群?常见的多集群管理工具有哪些?
为什么需要多集群
| 原因 | 说明 |
|---|---|
| 环境隔离 | dev/staging/production 完全隔离,防止测试影响生产 |
| 故障隔离 | 单集群故障不影响其他地区服务 |
| 合规要求 | 数据必须留在特定国家/地区(欧盟 GDPR、中国数据法) |
| 规模限制 | 单集群节点数 < 5000,超过需要拆分 |
| 多云策略 | 分散到 AWS / GCP / Azure 避免云厂商锁定 |
多集群架构模式
graph TB
subgraph "方案 A:独立集群(简单)"
DEV_A["Dev 集群"]
STG_A["Staging 集群"]
PRD_A["Production 集群"]
end
subgraph "方案 B:联邦集群(复杂)"
HUB_B["Hub 集群
(中央管理面)"] SP1_B["Spoke 集群 1
Asia"] SP2_B["Spoke 集群 2
US"] HUB_B --> SP1_B HUB_B --> SP2_B end
(中央管理面)"] SP1_B["Spoke 集群 1
Asia"] SP2_B["Spoke 集群 2
US"] HUB_B --> SP1_B HUB_B --> SP2_B end
工具对比
| 工具 | 定位 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
| Rancher | 完整多集群管理平台 | UI 友好、开箱即用 | 重量级,引入额外组件 | 10+ 集群、非 K8s 原生团队 |
| Cluster API (CAPI) | 声明式集群生命周期管理 | K8s 原生、可扩展 | 学习曲线陡 | 需要标准化创建/升级集群 |
| vCluster | 在 K8s 中运行虚拟 K8s | 成本低、隔离好 | 功能有限制 | 开发/测试环境多租户 |
| Fleet (Rancher) | 大规模 GitOps | 管理 1000+ 集群 | 仅 Rancher 生态 | 超大规模 |
| ArgoCD | GitOps 应用部署 | 专注应用同步 | 不管集群生命周期 | 所有场景(应用层) |
Cluster API:声明式集群管理
Cluster API 把 Kubernetes 集群本身当作 K8s 资源来管理:
# AWS 上创建 EKS 集群(Cluster API + CAPA Provider)
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: prod-cluster
namespace: clusters
spec:
clusterNetwork:
pods:
cidrBlocks: ["192.168.0.0/16"]
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSManagedCluster
name: prod-cluster
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: AWSManagedControlPlane
name: prod-cluster
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: AWSManagedControlPlane
metadata:
name: prod-cluster
namespace: clusters
spec:
region: ap-southeast-1
version: "v1.29"
eksClusterName: prod-cluster
iamAuthenticatorConfig:
mapRoles:
- roleARN: arn:aws:iam::123456789:role/developers
username: developers:{{SessionName}}
groups: [developer]
vCluster:虚拟集群
vCluster 在现有集群的 Namespace 中运行完整的 K8s 控制面,每个虚拟集群完全隔离:
# 安装 vcluster CLI
curl -L -o vcluster \
"https://github.com/loft-sh/vcluster/releases/download/v0.19.0/vcluster-linux-amd64"
chmod +x vcluster && mv vcluster /usr/local/bin/
# 为开发者 alice 创建虚拟集群
vcluster create alice-dev \
--namespace team-alice \
--chart-version 0.19.0
# 连接到虚拟集群
vcluster connect alice-dev -n team-alice
# 虚拟集群内创建资源(完全隔离,不会影响宿主集群)
kubectl create deployment nginx --image=nginx
# 退出虚拟集群连接
vcluster disconnect
适用场景: - 给每个开发者独立的 K8s 环境(CI 并行测试) - 隔离不同客户的工作负载(SaaS 多租户) - 测试 K8s 升级(在 1.28 集群上运行 1.29 vCluster)
Rancher:多集群管理平台
# 使用 Helm 安装 Rancher
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm upgrade --install rancher rancher-stable/rancher \
--namespace cattle-system \
--create-namespace \
--set hostname=rancher.example.com \
--set bootstrapPassword=admin \
--set ingress.tls.source=letsEncrypt \
--set letsEncrypt.email=admin@example.com \
--wait
Rancher 提供: - 统一 UI 管理所有集群(EKS / GKE / AKS / 自建) - 多集群 RBAC(User 跨集群统一身份) - 内置 Fleet(大规模 GitOps) - 集群监控、告警汇总
多集群 kubeconfig 管理
# 合并多个集群的 kubeconfig
KUBECONFIG=~/.kube/prod:~/.kube/staging kubectl config view --merge --flatten \
> ~/.kube/config
# 切换集群上下文
kubectl config get-contexts
kubectl config use-context prod-cluster
kubectl config use-context staging-cluster
# kubectx:更快的上下文切换工具
brew install kubectx
kubectx staging # 切换到 staging
kubens production # 切换到 production namespace
最佳实践
| 实践 | 说明 |
|---|---|
| 生产集群独立 | 绝不与非生产共享,独立网络和账号 |
| 集群 Terraform 化 | 用 CAPI 或 EKS Terraform Module 管理集群生命周期 |
| 统一身份认证 | 接入 OIDC(GitHub / Okta / Keycloak),不用本地 kubeconfig |
| GitOps 统一部署 | 所有集群通过 ArgoCD/Flux 管理,禁止手动 kubectl apply |
| 跨集群服务发现 | 使用 Submariner / Istio 多集群实现跨集群服务互通 |
下一节:环境提升流水线设计