4. 部署Federation v2

任务目标

在三个已就绪的Kubernetes集群(host集群 + 两个member集群)上部署Federation v2,并将member集群成功注册到host集群的联邦控制平面中,最终通过kubefedctl命令验证集群注册状态。

环境准备

  • 三个Kubernetes集群,版本≥1.13,且已配置好kubeconfig,分别使用context名称:host、member1、member2
  • 已安装kubectl和helm(v3)
  • 下载kubefedctl二进制并加入PATH:curl -Ls https://github.com/kubernetes-sigs/kubefed/releases/download/v0.1.0-rc6/kubefedctl-0.1.0-rc6-linux-amd64.tgz | tar xz

部署Federation v2控制平面

在host集群上使用Helm部署Federation v2控制平面。核心操作如下:

# 切换至host集群
kubectl config use-context host

# 添加repo并安装
helm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
helm install kubefed kubefed-charts/kubefed --version=0.1.0-rc6 --namespace kube-federation-system --create-namespace

# 等待控制平面就绪
kubectl -n kube-federation-system rollout status deploy/kubefed-controller-manager --timeout=120s

注册member集群

使用kubefedctl将两个member集群注册到联邦中。注册操作会在host集群创建KubeFedCluster资源,并建立与member集群的连接。

# 注册member1
kubefedctl join member1 --host-cluster-context host --kubefed-namespace kube-federation-system --v=2

# 注册member2
kubefedctl join member2 --host-cluster-context host --kubefed-namespace kube-federation-system --v=2

验证集群注册状态

检查联邦控制平面中已注册的集群及其健康状态:

# 查看已注册集群列表
kubectl -n kube-federation-system get kubefedclusters.core.kubefed.io

# 查看详细状态(确认Ready条件为True)
kubectl -n kube-federation-system get kubefedclusters.core.kubefed.io member1 -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}{"\n"}'
kubectl -n kube-federation-system get kubefedclusters.core.kubefed.io member2 -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}{"\n"}'

判定标准

  • kubefedctl join命令执行无报错,返回cluster "member1" created类似信息
  • 上述get kubefedclusters命令输出包含member1和member2两行记录
  • 两个member集群的Ready条件状态均为True,表示联邦控制平面与member集群的API通信正常

常见问题

  • join时报context deadline exceeded:检查host集群到member集群的网络连通性,确认member集群的kubeconfig中server地址可从host集群访问
  • 注册后Ready为False:执行kubectl -n kube-federation-system describe kubefedcluster member1查看事件,通常为RBAC权限或endpoint不可达问题
  • Helm安装失败:确认host集群有足够权限创建CRD和namespace,必要时使用--set global.scope=Namespaced缩小部署范围