4. Federation 安装与配置:Helm 安装 KubeFed、配置成员集群、验证联邦状态
本章进入实战环节,目标是在多集群环境中部署 KubeFed 控制平面,并将两个独立的 Kubernetes 集群注册为成员集群。通过 Helm 完成安装后,我们将验证联邦 API 资源的可用性以及集群间的状态同步。
4.1 环境准备与 Helm 仓库配置
在安装 KubeFed 之前,确保满足以下前提条件:
- Kubernetes 集群:至少两个集群(如
cluster-1和cluster-2),版本 ≥ 1.21。 - kubectl 上下文:已配置好两个集群的 kubeconfig 上下文,并能通过
kubectl config use-context切换。 - Helm 3:已安装并初始化。
- CoreDNS:集群内 DNS 正常工作。
首先添加 KubeFed 官方 Helm 仓库:
helm repo add kubefed https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
helm repo update
提示:如果网络受限,可提前将 charts 下载到本地,使用
helm install --chart-path 离线安装。
4.2 Helm 安装 KubeFed 控制平面
KubeFed 控制平面以一组 CRD 和控制器的方式部署在 host 集群(即联邦控制面所在集群)中。我们选择 cluster-1 作为 host 集群。
执行以下命令安装 KubeFed:
kubectl config use-context cluster-1
helm install kubefed kubefed/kubefed \
--namespace kube-federation-system \
--create-namespace \
--version 0.10.0 \
--set controllermanager.replicas=1 \
--set controllermanager.featureGates.PushReconciler=true \
--set controllermanager.featureGates.SchedulerPreferences=true
安装完成后,检查 Pod 状态:
kubectl get pods -n kube-federation-system
预期输出类似:
NAME READY STATUS RESTARTS AGE
kubefed-controller-manager-7d8f9c6b9f-abcde 1/1 Running 0 2m
kubefed-controller-manager-7d8f9c6b9f-fghij 1/1 Running 0 2m
关键参数说明:
PushReconciler 启用推送模式,使联邦控制器主动将资源推送到成员集群;SchedulerPreferences 允许基于调度偏好分发工作负载。
4.3 配置成员集群
成员集群通过 KubeFedCluster 和 KubeFedConfig 资源注册。KubeFed 提供了 kubefedctl 命令行工具简化此过程。
4.3.1 安装 kubefedctl
# Linux amd64
curl -LO https://github.com/kubernetes-sigs/kubefed/releases/download/v0.10.0/kubefedctl-0.10.0-linux-amd64.tgz
tar -xzf kubefedctl-0.10.0-linux-amd64.tgz
sudo mv kubefedctl /usr/local/bin/
4.3.2 加入成员集群
将 cluster-2 注册为成员集群:
kubefedctl join cluster-2 \
--host-cluster-context cluster-1 \
--cluster-context cluster-2 \
--host-cluster kubefed \
--v=2
参数含义:
| 参数 | 说明 |
|---|---|
--host-cluster-context |
Host 集群的 kubeconfig 上下文名称 |
--cluster-context |
成员集群的 kubeconfig 上下文名称 |
--host-cluster |
KubeFed 控制面所在的命名空间(通常为 kubefed) |
执行成功后,KubeFed 会在 host 集群中创建 KubeFedCluster 资源,并自动生成用于访问成员集群的 Secret。
4.4 验证联邦状态
验证分为三个层面:CRD 可用性、集群健康状态、联邦资源同步。
4.4.1 检查联邦 CRD
kubectl get crd | grep kubefed
应看到类似以下 CRD:
kubefedclusters.core.kubefed.iokubefedconfigs.core.kubefed.iofederateddeployments.types.kubefed.iofederatednamespaces.types.kubefed.ioclusterpropagatedversions.core.kubefed.io
4.4.2 查看成员集群状态
kubectl get kubefedclusters -n kube-federation-system
输出示例:
NAME AGE READY
cluster-2 1m True
如果 READY 列为 True,表示 host 集群与成员集群之间的连接正常。
4.4.3 验证联邦资源分发
创建一个简单的 FederatedNamespace 测试:
cat <<EOF | kubectl apply -f -
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
name: test-ns
namespace: test-ns
spec:
placement:
clusters:
- name: cluster-2
EOF
检查 namespace 是否在成员集群中创建:
kubectl config use-context cluster-2
kubectl get ns test-ns
若返回 test-ns 且状态为 Active,则联邦同步成功。
常见问题:如果成员集群状态显示
False,请检查 host 集群中生成的 Secret 是否正确,以及成员集群的 API Server 是否可达。可使用 kubectl describe kubefedcluster cluster-2 -n kube-federation-system 查看详细错误。
4.5 联邦架构与数据流
下图展示了 KubeFed 安装后的核心组件与数据流向:
4.6 安装后检查清单
使用下表快速确认安装配置是否完整:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 控制面 Pod | kubectl get pods -n kube-federation-system |
2 个 controller-manager 均为 Running |
| 联邦 CRD | kubectl get crd | grep kubefed |
至少 10 个 CRD |
| 成员集群注册 | kubectl get kubefedclusters -n kube-federation-system |
READY 列为 True |
| 资源同步 | kubectl --context cluster-2 get ns test-ns |
Namespace 存在且 Active |
最佳实践:建议将 KubeFed 控制面部署在独立的 host 集群中,避免与业务负载竞争资源。同时,为每个成员集群配置独立的 ServiceAccount 和 RBAC 权限,遵循最小权限原则。
至此,KubeFed 的安装与配置已完成。下一阶段我们将基于此联邦环境,引入 Kyverno 策略引擎,实现对版本漂移的联合治理。