3. Kubernetes集群联邦(KubeFed)入门:核心概念与安装配置

在多集群架构中,KubeFed(Kubernetes Federation)是社区主推的“中心式”联邦控制面方案。它允许用户从一个控制端点(Host Cluster)将资源(如 Deployment、Service、ConfigMap)同步到多个成员集群,并提供跨集群的调度与DNS解析能力。本章将深入剖析KubeFed的三大核心概念:Cluster、TypeConfig、Sync,并演示完整的安装与配置流程。

前置条件: 至少准备 2 个 Kubernetes 集群(1 个作为 Host Cluster,1 个以上作为 Member Cluster),所有集群版本 ≥ v1.19,且已配置好 kubeconfig 上下文。

3.1 KubeFed 核心概念

KubeFed 通过 CRD(Custom Resource Definition)扩展 Kubernetes API,其核心模型围绕三个抽象展开:Cluster(集群注册)、TypeConfig(资源类型配置)、Sync(同步策略)。理解这三者的关系是掌握联邦的关键。

KubeFed 核心概念关系图 KubeFed 核心概念关系图 Federation API Cluster 集群注册与凭证 TypeConfig 资源类型模板 Sync 同步策略与状态 工作流程 1. 在 Host Cluster 注册 Member Cluster(Cluster 资源) 2. 定义需要联邦的资源类型(TypeConfig) 3. 创建联邦资源,KubeFed 根据 Sync 策略推送到各集群

3.1.1 Cluster(集群注册)

Cluster 资源用于在 Host Cluster 中注册一个 Member Cluster。每个 Cluster 资源包含集群的 API Server 地址、CA 证书以及 kubeconfig 引用。KubeFed 通过此资源建立与成员集群的通信。

apiVersion: core.kubefed.io/v1beta1
kind: KubeFedCluster
metadata:
  name: member-cluster-1
  namespace: kube-federation-system
spec:
  apiEndpoint: "https://192.168.1.100:6443"
  caBundle: "LS0tLS1CRUdJTiBDRV...=="
  secretRef:
    name: member-cluster-1-secret

3.1.2 TypeConfig(资源类型配置)

TypeConfig 定义了哪些 Kubernetes 原生资源(如 Deployment、Service、Ingress)可以被联邦管理。它告诉 KubeFed 如何解析、校验和分发这些资源。KubeFed 内置了常用资源的 TypeConfig,也支持自定义。

资源类型 内置支持 典型用途
Deployment 是 跨集群分发无状态应用
Service 是 跨集群服务发现与负载均衡
Ingress 是 统一入口网关配置
ConfigMap 是 跨集群共享配置
自定义 CRD 需手动配置 扩展联邦能力

3.1.3 Sync(同步策略与状态)

Sync 是 KubeFed 的核心执行机制。当用户在 Host Cluster 创建联邦资源(如 FederatedDeployment)后,KubeFed 的 Sync Controller 会根据以下策略将资源推送到各 Member Cluster:

  • Placement(放置策略): 指定资源应分发到哪些集群。
  • Overrides(覆盖策略): 允许针对不同集群调整资源参数(如副本数、镜像标签)。
  • Status(状态收集): 从各集群收集资源状态,聚合后更新到联邦资源的状态字段。
关键设计: KubeFed 采用“推模式”(Push Model),Host Cluster 主动向 Member Cluster 同步资源。Member Cluster 无需安装额外组件,只需开放 API Server 访问权限。

3.2 KubeFed 安装与配置

本节将演示使用 kubefedctl 命令行工具完成 KubeFed 的安装、集群注册和资源联邦配置。推荐使用 Helm 或官方 Operator 进行生产部署。

3.2.1 安装 KubeFed 控制面

在 Host Cluster 上执行以下命令安装 KubeFed 控制面组件(包括 Controller Manager、API Server、CRD 等):

# 下载 kubefedctl 工具
curl -LO https://github.com/kubernetes-sigs/kubefed/releases/latest/download/kubefedctl-linux-amd64.tgz
tar -zxvf kubefedctl-linux-amd64.tgz
sudo mv kubefedctl /usr/local/bin/

# 使用 kubefedctl 安装 KubeFed 控制面
kubefedctl install --federation-namespace=kube-federation-system \
  --registry-namespace=kube-federation-system \
  --host-cluster-context=host-cluster

安装完成后,验证 Pod 状态:

kubectl get pods -n kube-federation-system
NAME                                         READY   STATUS    RESTARTS   AGE
kubefed-controller-manager-7d8f9c6b9-abc12   1/1     Running   0          2m
kubefed-api-server-5f4d7c8d9-def34           1/1     Running   0          2m

3.2.2 注册成员集群

将 Member Cluster 的 kubeconfig 导入 Host Cluster,并创建 KubeFedCluster 资源:

# 将成员集群的 kubeconfig 保存为 Secret
kubectl create secret generic member-cluster-1-secret \
  --from-file=kubeconfig=/path/to/member-cluster-1.kubeconfig \
  -n kube-federation-system

# 注册成员集群
kubefedctl join member-cluster-1 \
  --host-cluster-context=host-cluster \
  --host-cluster-namespace=kube-federation-system \
  --v=2

验证集群注册状态:

kubectl get kubefedclusters -n kube-federation-system
NAME               AGE   READY
member-cluster-1   1m    True

3.2.3 启用资源联邦(TypeConfig)

KubeFed 默认只联邦有限的资源类型。使用 kubefedctl enable 命令启用更多资源类型:

# 启用 Deployment 和 Service 的联邦支持
kubefedctl enable deployment
kubefedctl enable service

# 查看已启用的 TypeConfig
kubectl get federatedtypeconfig -n kube-federation-system
NAME                    AGE
deployments.apps        1m
services                1m
KubeFed 安装与集群注册流程 KubeFed 安装与集群注册流程 步骤 1 安装 kubefedctl 步骤 2 安装 KubeFed 控制面 步骤 3 注册成员集群 步骤 4 启用 TypeConfig 步骤 5 创建联邦资源 步骤 6 验证同步状态 完成以上步骤后,Host Cluster 即可将联邦资源推送到所有已注册的 Member Cluster

3.3 验证联邦同步

创建一个 FederatedDeployment 示例,验证资源是否成功同步到 Member Cluster:

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: nginx-federated
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.21
            name: nginx
  placement:
    clusters:
    - name: member-cluster-1
  overrides:
  - clusterName: member-cluster-1
    clusterOverrides:
    - path: "/spec/replicas"
      value: 5

应用后,在 Member Cluster 中查看 Deployment:

kubectl get deployment nginx-federated -n default --context=member-cluster-1
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-federated    5/5     5            5           1m
常见问题: 如果同步失败,请检查:1) Member Cluster 的 API Server 是否可从 Host Cluster 访问;2) Secret 中的 kubeconfig 是否有效;3) 命名空间是否已提前在 Member Cluster 中创建(KubeFed 默认不会自动创建命名空间)。

3.4 本章小结