4. KubeFed 架构详解:控制平面组件、Federated API 类型与跨集群资源分发机制
KubeFed(Kubernetes Federation)是 CNCF 孵化的开源项目,旨在将多个 Kubernetes 集群抽象为一个统一的控制平面。本章深入剖析 KubeFed 的核心架构,包括控制平面组件、Federated API 类型以及跨集群资源分发的完整机制。
4.1 KubeFed 控制平面组件
KubeFed 的控制平面以一组自定义控制器和 API 服务的形式运行在 Host Cluster(主集群)上。它通过标准的 Kubernetes API 与各个成员集群(Member Cluster)通信,不要求对成员集群的 kube-apiserver 进行任何修改。
下表列出了 KubeFed 控制平面的主要组件及其职责:
| 组件名称 | 部署位置 | 核心职责 |
|---|---|---|
| Federation API Server | Host Cluster | 提供 Federated API 的 CRD 注册与 REST 接口;存储联邦资源模板、调度策略、覆盖策略等。 |
| Federation Controller Manager | Host Cluster | 运行所有联邦控制器(同步控制器、调度控制器、状态控制器等);负责资源分发与状态收集。 |
| DNS Controller | Host Cluster | 管理跨集群的服务发现;根据 Federated Service 自动生成跨集群 DNS 记录(如 mysvc.svc.federation.example.com)。 |
| Ingress DNS Controller | Host Cluster | 管理跨集群的 Ingress DNS 记录;支持全局负载均衡(GLB)场景。 |
| KubeFed Admission Webhook | Host Cluster | 验证和变更 Federated API 对象的创建/更新请求;确保策略合规性。 |
下图展示了 KubeFed 控制平面的组件架构及其与成员集群的通信关系:
4.2 Federated API 类型
KubeFed 通过自定义资源定义(CRD)扩展了 Kubernetes API,引入了一套 Federated API 类型。这些类型是跨集群资源管理的核心抽象。
下表对比了三种核心 Federated API 类型及其用途:
| API 类型 | API 版本(示例) | 核心字段 | 用途说明 |
|---|---|---|---|
| FederatedDeployment | types.kubefed.io/v1beta1 |
template, placement, overrides |
定义跨集群的 Deployment 模板、目标集群选择、以及按集群的覆盖配置。 |
| FederatedService | types.kubefed.io/v1beta1 |
template, placement, overrides |
定义跨集群的 Service 模板,配合 DNS Controller 实现全局服务发现。 |
| FederatedConfigMap | types.kubefed.io/v1beta1 |
template, placement, overrides |
将 ConfigMap 分发到多个集群,确保配置一致性。 |
每个 Federated API 对象都包含三个关键部分:
- template:定义目标资源的标准 Kubernetes 规范(如 Deployment 的
spec)。 - placement:指定资源应该被分发到哪些成员集群(通过集群标签选择器或集群名称列表)。
- overrides:允许针对特定集群修改模板中的字段(如调整副本数、镜像版本、环境变量)。
overrides 机制是幂等的。如果某个集群的覆盖配置与模板冲突,覆盖配置优先。但过度使用 overrides 会导致配置漂移,建议仅在必要时使用。
4.3 跨集群资源分发机制
KubeFed 的资源分发机制基于 Reconciliation Loop(调谐循环)模式。当用户在 Host Cluster 上创建或更新一个 Federated API 对象时,KubeFed 的同步控制器会执行以下步骤:
- 读取 Federated 对象:从 Host Cluster 的 etcd 中获取 FederatedDeployment(或其他类型)的完整定义。
- 解析 Placement 策略:根据
placement字段中的集群选择器或名称列表,确定目标成员集群集合。 - 应用 Overrides:对于每个目标集群,检查是否存在对应的
overrides配置。如果存在,将覆盖配置合并到模板中,生成该集群的最终资源定义。 - 分发资源:通过每个成员集群的 kube-apiserver 的 REST API,创建或更新对应的原生 Kubernetes 资源(如 Deployment)。
- 收集状态:从各成员集群收集资源的状态(如可用副本数、Pod 状态),并聚合回 Federated 对象的
status字段。
下图展示了从 FederatedDeployment 创建到跨集群分发的完整流程:
4.4 调度策略与集群选择
KubeFed 的 placement 字段支持两种集群选择方式:
- 集群名称列表(ClusterNames):显式指定目标集群的名称。适用于已知的、固定的集群集合。
- 集群标签选择器(ClusterSelector):通过标签选择器动态匹配集群。适用于根据集群属性(如地域、可用区、硬件类型)自动分发。
ClusterSelector 而非硬编码集群名称。例如,通过 region: us-east 标签将工作负载分发到所有美国东部集群,当新集群加入联邦时,无需修改 Federated 对象即可自动接收资源。
以下是一个 FederatedDeployment 的 YAML 示例,展示了 placement 和 overrides 的用法:
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: nginx-federated
namespace: default
spec:
template:
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.21
name: nginx
placement:
clusterSelector:
matchLabels:
region: us-east
overrides:
- clusterName: cluster-b
clusterOverrides:
- path: /spec/replicas
value: 5
- path: /spec/template/spec/containers/0/image
value: nginx:1.22
overrides 中的 path 字段使用 JSON Pointer 语法(RFC 6901)。支持对嵌套字段进行精确覆盖。如果多个 override 条目指向同一个路径,最后一个条目生效。
4.5 状态聚合与反馈
KubeFed 的状态控制器负责从所有成员集群收集资源的状态,并将其聚合到 Federated 对象的 status 字段中。聚合后的状态包括:
- clusters:列出所有已分发资源的集群及其对应的资源名称。
- conditions:聚合后的资源条件(如
Ready、Synced)。 - observedGeneration:最近一次调谐的 generation 号,用于检测是否已同步。
这种状态聚合机制使得运维人员可以在 Host Cluster 上通过 kubectl get federateddeployment nginx-federated -o yaml 一目了然地查看所有集群的资源状态,无需逐个登录成员集群。