K8s 系列 | 第 29 天:多集群管理:Federation / Cluster API / 多集群服务网格


tags: [Kubernetes, K8s系列, DevOps, 多集群, Federation, Cluster API, 服务网格]

K8s 系列 | 第 29 天:多集群管理:Federation / Cluster API / 多集群服务网格

第 29/30 天

引言

当 Kubernetes 集群从个位数增长到数十甚至上百个时——无论是出于多区域部署、环境隔离(开发/测试/生产)、租户隔离还是灾备需求——多集群管理就从一个可选方案变成了必选项。单个 K8s 集群的最佳规模建议在 5000 节点以内(Kubernetes 社区官方推荐),超越这个规模或者需要跨地域部署时,多集群架构是最佳选择。

今天我们将深入探讨主流的三种多集群管理方案:

  • KubeFed (Kubernetes Federation):传统的联邦控制平面方案
  • Cluster API:声明式集群生命周期管理
  • 多集群服务网格:基于 Istio / Cilium 的统一服务治理

一、为什么需要多集群管理?

1.1 单集群的局限

限制维度 说明
规模瓶颈 etcd 存储上限 ~8GB,单个集群建议 ≤5000 节点
故障域 Control Plane 故障影响所有工作负载
地域延迟 跨地域 Pod 通信延迟不可控
合规需求 数据必须留在特定国家/地区
环境隔离 开发/测试/生产完全隔离

1.2 多集群的核心价值

┌─────────────────────────────────────────┐
│           Federation Control Plane        │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  │
│  │ Cluster │  │ Cluster │  │ Cluster │  │
│  │  US-E1  │  │  EU-W1  │  │  AP-S1  │  │
│  └─────────┘  └─────────┘  └─────────┘  │
│    地区A        地区B         地区C       │
└─────────────────────────────────────────┘

二、KubeFed:传统联邦方案

2.1 架构原理

KubeFed(Kubernetes Federation v2)通过一个联邦控制平面,将多个集群的资源统一编排。核心组件:

  • Federation API:定义 FederatedDeployment、FederatedService 等跨集群资源
  • Placement 策略:控制资源分发到哪些成员集群
  • Override 策略:允许按集群定制资源参数

2.2 安装 KubeFed

# 使用 helm 安装 KubeFed
helm repo add kubefed https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
helm repo update
kubectl create namespace kube-federation-system
helm install kubefed kubefed/kubefed 
  --namespace kube-federation-system 
  --version=0.10.0

2.3 加入成员集群

# 将集群 cluster-b 加入联邦
kubefedctl join cluster-b 
  --cluster-context cluster-b-context 
  --host-cluster-context cluster-a-context 
  --v=2

2.4 创建联邦 Deployment

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: app-frontend
  namespace: production
spec:
  template:
    metadata:
      labels:
        app: frontend
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: frontend
      template:
        metadata:
          labels:
            app: frontend
        spec:
          containers:
          - name: nginx
            image: nginx:1.27
  placement:
    clusters:
    - name: cluster-a
    - name: cluster-b
  overrides:
  - clusterName: cluster-a
    clusterOverrides:
    - path: spec.replicas
      value: 5  # cluster-a 运行 5 副本
  - clusterName: cluster-b
    clusterOverrides:
    - path: spec.replicas
      value: 3  # cluster-b 运行 3 副本

2.5 KubeFed 的局限性

❌ 项目已进入维护模式(社区转向 Cluster API)
❌ 不支持跨集群服务发现(需要额外的 DNS 方案)
❌ 对网络策略和存储资源的联邦支持有限
❌ 配置变更传播有延迟


三、Cluster API:声明式集群生命周期管理

3.1 核心概念

Cluster API 是一个 Kubernetes 子项目,目标是用声明式 API 管理 Kubernetes 集群的完整生命周期——创建、扩缩、升级、销毁。它把集群本身当成 Kubernetes 资源来管理。

核心 CRD:

CRD 作用
Cluster 定义一个集群的拓扑
Machine 代表一个工作节点(物理机/虚拟机)
MachineDeployment 声明式管理 Machine(类似 Deployment 管理 Pod)
MachineSet 一组同质的 Machine
Infrastructure* 基础设施提供商的实现(AWS、Azure、vSphere 等)

3.2 架构示意

┌─────────────────── Management Cluster ──────────────────┐
│                                                          │
│  Cluster API Controller  ────  Provider (AWS/Azure/...) │
│         │                                                 │
│    ┌────┴────────────┐                                   │
│    │ Cluster (prod)  │    │ Cluster (staging) │          │
│    │ MachineDeploy   │    │ MachineDeploy     │          │
│    │    ├ Machine-1  │    │    ├ Machine-1    │          │
│    │    ├ Machine-2  │    │    └ Machine-2    │          │
│    │    └ Machine-3  │    └───────────────────│          │
│    └─────────────────┘                                   │
│                                                          │
└──────────────────────────────────────────────────────────┘
       ↓ 创建               ↓ 升级               ↓ 销毁
   ┌──────────┐      ┌──────────┐      ┌──────────┐
   │  集群 A  │      │  集群 B  │      │  集群 C  │
   └──────────┘      └──────────┘      └──────────┘

3.3 安装 Cluster API

# 使用 clusterctl CLI 安装
clusterctl init 
  --infrastructure docker 
  --addon helm

3.4 声明一个工作负载集群

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: workload-prod
  namespace: default
spec:
  clusterNetwork:
    pods:
      cidrBlocks: ["10.96.0.0/12"]
    services:
      cidrBlocks: ["10.32.0.0/12"]
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DockerCluster
    name: workload-prod
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    name: workload-prod-control-plane
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DockerMachineTemplate
metadata:
  name: workload-prod-worker-mt
  namespace: default
spec:
  template:
    spec:
      extraMounts:
      - containerPath: "/var/run/docker.sock"
        hostPath: "/var/run/docker.sock"
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: workload-prod-worker-md
  namespace: default
spec:
  clusterName: workload-prod
  replicas: 3
  template:
    spec:
      clusterName: workload-prod
      version: v1.29.0
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
          kind: KubeadmConfigTemplate
          name: workload-prod-worker-bootstrap
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: DockerMachineTemplate
        name: workload-prod-worker-mt

3.5 集群升级

# 升级 Control Plane 到 1.30.0
kubectl patch kubeadmcontrolplane workload-prod-control-plane 
  --type merge 
  -p '{"spec":{"version":"v1.30.0"}}'

# 升级 Worker 节点
kubectl patch machinedeployment workload-prod-worker-md 
  --type merge 
  -p '{"spec":{"template":{"spec":{"version":"v1.30.0"}}}}'

3.6 Cluster API 的优势

✅ 声明式、Kubernetes 原生体验
✅ 支持 20+ 基础设施提供商(AWS、Azure、GCP、vSphere、OpenStack)
✅ 内置滚动升级、扩缩容、健康检查
✅ 社区活跃,CNCF 孵化项目
✅ 与 ClusterClass(v1beta1+)实现模板化集群定义


四、多集群服务网格

4.1 为什么需要服务网格?

当应用分布在多个集群中,传统的 Kubernetes Service 只能在一个集群内做服务发现。多集群服务网格提供了:

  • 跨集群透明服务发现:svc-a.cluster-b 无缝访问 svc-b.cluster-a
  • 统一流量治理:灰度发布、故障注入跨集群统一管控
  • 零信任安全:mTLS 加密跨越集群边界
  • 统一观测:分布式追踪、指标聚合

4.2 Istio 多集群架构(Primary-Remote)

# 在 Cluster-A 上安装 Istio 作为 Primary
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-primary
spec:
  profile: demo
  meshConfig:
    accessLogFile: /dev/stdout
  components:
    pilot:
      k8s:
        replicaCount: 2
        env:
        - name: PILOT_ENABLE_CROSS_CLUSTER
          value: "true"
# 导出 Cluster-A 的 istio-ca-root-cert
kubectl get secret istio-ca-root-cert 
  -n istio-system -o yaml > ca-cert.yaml

# 在 Cluster-B 上应用 CA 证书
kubectl apply -f ca-cert.yaml -n istio-system

# 创建跨集群 ServiceEntry
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: cross-cluster-svc
spec:
  hosts:
  - "*.cluster-b.svc.cluster.local"
  resolution: DNS
  location: MESH_INTERNAL
  endpoints:
  - address: <cluster-b-api-server-ip>
    ports:
      http: 80
EOF

4.3 Cilium ClusterMesh

Cilium 的 ClusterMesh 方案更加轻量,基于 eBPF 实现跨集群网络:

# 安装 Cilium 并启用 ClusterMesh
helm upgrade cilium cilium/cilium 
  --namespace kube-system 
  --set cluster.name=cluster-a 
  --set cluster.id=1 
  --set clustermesh.enable=true
# 跨集群 Service 示例
apiVersion: v1
kind: Service
metadata:
  name: global-redis
  annotations:
    io.cilium/global-service: "true"
spec:
  type: ClusterIP
  selector:
    app: redis
  ports:
  - port: 6379

Cilium ClusterMesh 的优势:
无需 Sidecar:eBPF 内核级转发,性能优于 Istio
天然支持:Global Service 声明即可跨集群发现
加密隧道:基于 WireGuard 或 IPsec 的跨集群通信

4.4 三种方案对比

特性 KubeFed Cluster API 服务网格 (Istio/Cilium)
核心目标 资源分发 集群生命周期 跨集群网络与治理
当前状态 维护模式 ✅ 活跃开发 ✅ 活跃开发
安装复杂度 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
跨集群网络 ❌ 无 ❌ 无 ✅ 内置
集群自愈 ✅ 声明式自愈
基础设施无关 ❌ (依赖 Provider)
学习曲线 中等

五、生产最佳实践

5.1 推荐组合方案

Cluster API(管理集群生命周期)
        │
        ▼
多个 Workload 集群(k8s cluster-a, cluster-b, ...)
        │
        ▼
Cilium ClusterMesh(跨集群网络)
  或
Istio Multi-Cluster(跨集群服务网格 + 流量治理)

对于大多数团队,推荐路线:
1. 先用 Cluster API 管理集群生命周期(创建/升级/扩缩)
2. 网络层面使用 Cilium ClusterMesh 实现跨集群通信
3. 如果需要精细化流量治理,加上 Istio 多集群模式

5.2 多集群管理 Checklist

# 生产环境多集群必须考虑:
# 1. 证书管理 — 每个集群独立 PKI,共享信任锚点
# 2. 镜像仓库 — 每个区域部署镜像缓存/代理
# 3. DNS 策略 — 使用 ExternalDNS + 全局负载均衡
# 4. 监控聚合 — Thanos / Grafana Mimir 跨集群指标
# 5. 日志聚合 — Loki 的跨集群租户模式
# 6. 灾备策略 — 主备切换、异地多活

# 示例:跨集群镜像缓存
apiVersion: v1
kind: ConfigMap
metadata:
  name: mirror-config
  namespace: kube-system
data:
  registry-mirror: |
    mirror:
      docker.io:
        endpoints:
        - https://mirror.cluster-a.internal
        - https://docker.mirrors.example.com

5.3 常见坑点

  1. 证书同步:多集群之间 CA 证书不一致会导致 mTLS 握手失败——使用 cert-manager + Trust 管理器统一分发
  2. IP 冲突:各集群的 Pod CIDR / Service CIDR 必须不重叠
  3. DNS 解析:跨集群 DNS 建议使用 CoreDNS 多集群插件或 ExternalDNS
  4. etcd 备份:管理集群的 etcd 也需备份,否则所有集群定义一起丢失

六、总结

今天我们系统学习了三种主流多集群管理方案:

方案 适用场景 一句话总结
KubeFed 遗留系统,需统一资源分发 已进入维护模式,但概念仍有参考价值
Cluster API 需要自动化集群生命周期管理 用 K8s 管理 K8s,声明式集群运维的未来
服务网格 需要跨集群通信与服务治理 eBPF 时代首选 Cilium,精细化治理选 Istio

对于生产环境,建议将 Cluster API(集群管理)与 Cilium ClusterMesh(跨集群网络)组合使用,这是当前社区推荐的最佳实践组合。


下期预告

明天是系列最后一篇——第 30 天:K8s 生产环境踩坑实录。我们将分享生产环境中真实遇到的各种”血泪史”:从节点 NotReady 排查、etcd 性能瓶颈、CNI 网络问题到资源争用事故,每一个案例都来自真实生产环境,让你站在前人的肩膀上避免踩坑。


系列目录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容