4. KubeFed 实战:跨集群资源分发与调度策略配置
KubeFed(Kubernetes Federation)是社区主推的多集群管理项目,它通过 Federation API 将多个 Kubernetes 集群抽象为一个逻辑控制面。本章聚焦 KubeFed 的核心能力:跨集群资源分发与副本调度策略(ReplicaSchedulingPreference),帮助你在生产环境中实现应用的多集群部署与流量分担。
前置条件:已部署 KubeFed v2 控制平面,并完成集群注册(Join)。本章所有操作基于 KubeFed v2 API(federation.k8s.io/v1beta1)。
4.1 KubeFed 资源分发模型
KubeFed 使用 FederatedDeployment 作为跨集群 Deployment 的抽象。当你在 Host 集群创建 FederatedDeployment 时,KubeFed 控制器会根据 Placement 和 Overrides 策略,将实际 Deployment 分发到指定的 Member 集群。
4.2 创建 FederatedDeployment 并设置 Placement
以下示例展示如何创建一个跨集群的 Nginx 部署,并将其分发到两个 Member 集群。
4.2.1 定义 FederatedDeployment
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: nginx-federated
namespace: default
spec:
template:
metadata:
labels:
app: nginx
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
placement:
clusters:
- name: cluster-a
- name: cluster-b
overrides:
- clusterName: cluster-b
clusterOverrides:
- path: "/spec/replicas"
value: 5
- path: "/spec/template/spec/containers/0/image"
value: nginx:1.26
最佳实践:Overrides 中的
path 使用 JSON 指针格式。建议只对必须差异化的字段进行覆盖,保持模板一致性。
4.2.2 验证分发状态
创建后,使用以下命令查看资源在各集群的同步状态:
# 查看 FederatedDeployment 状态
kubectl get federateddeployment nginx-federated -o yaml
# 查看每个 Member 集群中的实际 Deployment
kubectl --context cluster-a get deployment nginx-federated -n default
kubectl --context cluster-b get deployment nginx-federated -n default
预期输出中,cluster-a 将运行 10 个副本(默认),cluster-b 运行 5 个副本(Overrides 覆盖)。
4.3 ReplicaSchedulingPreference(RSP)详解
RSP 是 KubeFed 提供的 高级副本调度策略,它允许你基于权重、最大/最小副本数、集群可用资源等条件,动态计算每个集群应分配的副本数,而不是手动在 Overrides 中写死。
| 字段 | 类型 | 说明 |
|---|---|---|
totalReplicas |
int32 | 全局期望副本总数 |
clusters |
map[string]ClusterPreferences | 按集群名称定义权重、最小/最大副本数 |
rebalance |
bool | 是否允许重新平衡(默认 false) |
stickyClusters |
bool | 是否保持已有副本不迁移(默认 false) |
4.3.1 RSP 配置示例
apiVersion: scheduling.kubefed.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: nginx-rsp
namespace: default
spec:
targetKind: FederatedDeployment
totalReplicas: 20
clusters:
cluster-a:
minReplicas: 5
maxReplicas: 15
weight: 2
cluster-b:
minReplicas: 3
maxReplicas: 10
weight: 1
rebalance: true
调度计算逻辑:KubeFed 控制器根据权重比例分配副本数,同时受 min/max 约束。若 cluster-a 权重为 2、cluster-b 权重为 1,则默认分配比例为 2:1,即 cluster-a 约 13 副本,cluster-b 约 7 副本。若某集群达到 max,剩余副本自动分配给其他集群。
4.4 RSP 调度流程与动态调整
下图展示 RSP 如何与 FederatedDeployment 协同工作,实现副本的动态调度。
4.5 常见问题与避坑指南
- RSP 不生效:检查
targetKind是否与 FederatedDeployment 的 Kind 匹配(通常为FederatedDeployment)。 - 副本数超出预期:确认 Overrides 中的
replicas是否与 RSP 冲突。RSP 优先级高于 Overrides 中的副本覆盖。 - 集群间副本分布不均:检查各集群的
minReplicas和maxReplicas是否设置合理,避免权重被约束截断。 - 重新平衡导致 Pod 频繁重启:生产环境建议先设置
rebalance: false,手动触发调整。
注意:KubeFed v2 已进入维护模式,新项目建议评估 Karmada 或 OCM。但 KubeFed 的 RSP 设计思想被后续项目广泛借鉴,理解其原理对掌握多集群调度至关重要。
4.6 本章小结
通过本章实战,你应掌握:
- 使用 FederatedDeployment + Placement 实现基础跨集群资源分发。
- 利用 Overrides 对不同集群做差异化配置。
- 配置 ReplicaSchedulingPreference 实现基于权重的动态副本调度。
- 理解 RSP 的约束条件与重新平衡机制。