2. 环境准备:多集群 Kubernetes 环境搭建要求、kubeconfig 配置、集群连通性验证

跨集群调度的前提是拥有两个或更多可互相通信的 Kubernetes 集群。本章将明确环境搭建的最低要求、kubeconfig 文件的合并与隔离策略,以及验证集群间连通性的标准方法。

2.1 多集群环境搭建要求

为满足跨集群调度与版本漂移校准的实验需求,建议按以下规格准备集群环境:

集群角色 Kubernetes 版本 节点数 容器运行时 网络插件 备注
Cluster-A(主集群) v1.28.x 3(1 master + 2 worker) containerd 1.7.x Calico v3.27 运行调度器与 Deployment 源
Cluster-B(目标集群) v1.28.x 3(1 master + 2 worker) containerd 1.7.x Calico v3.27 接收跨集群调度的 Pod
Cluster-C(备用集群) v1.27.x 2(1 master + 1 worker) containerd 1.6.x Flannel v0.24 用于版本差异场景测试
版本一致性建议: 主集群与目标集群的 Kubernetes 小版本差异应控制在 ±1 以内,避免因 API 版本不兼容导致调度失败。备用集群可故意使用低一个版本,用于验证版本漂移校准逻辑。

2.2 kubeconfig 配置策略

跨集群操作依赖 kubeconfig 文件管理多个集群的访问凭据。推荐采用 合并式配置 与 上下文切换 的方式,而非维护多个独立文件。

2.2.1 合并 kubeconfig

将三个集群的 kubeconfig 合并到单一文件 ~/.kube/config 中:

# 备份原有配置
cp ~/.kube/config ~/.kube/config.bak

# 合并 Cluster-B 配置
KUBECONFIG=~/.kube/config:/path/to/cluster-b-config.yaml \
  kubectl config view --flatten > ~/.kube/config-new

# 合并 Cluster-C 配置
KUBECONFIG=~/.kube/config-new:/path/to/cluster-c-config.yaml \
  kubectl config view --flatten > ~/.kube/config

# 清理临时文件
rm ~/.kube/config-new

2.2.2 上下文命名规范

合并后需为每个集群设置清晰的上下文名称:

集群 上下文名称 kubectl 切换命令
Cluster-A ctx-cluster-a kubectl config use-context ctx-cluster-a
Cluster-B ctx-cluster-b kubectl config use-context ctx-cluster-b
Cluster-C ctx-cluster-c kubectl config use-context ctx-cluster-c
验证当前上下文: 执行 kubectl config current-context 确认当前操作的集群,避免误操作。

2.3 集群连通性验证

在开始跨集群调度之前,必须验证集群间的网络连通性与 API Server 可达性。以下为验证步骤与预期结果。

2.3.1 验证步骤

  1. API Server 连通性测试:从 Cluster-A 的 master 节点 curl Cluster-B 的 API Server 端点。
  2. Pod 网络互通测试:在 Cluster-A 中创建测试 Pod,尝试 ping Cluster-B 中 Pod 的 IP。
  3. kubeconfig 上下文切换测试:使用 kubectl 切换上下文并获取节点列表。
  4. Service 跨集群访问测试:通过 Cluster-A 中的 Pod 访问 Cluster-B 的 Service ClusterIP。

2.3.2 验证命令与预期输出

# 步骤1:API Server 连通性
curl -k https://<cluster-b-api-server>:6443/healthz
# 预期输出:ok

# 步骤2:Pod 网络互通
kubectl --context ctx-cluster-a run test-pod --image=busybox -- sleep 3600
kubectl --context ctx-cluster-a exec test-pod -- ping -c 3 <cluster-b-pod-ip>
# 预期输出:3 packets transmitted, 3 received, 0% packet loss

# 步骤3:上下文切换
kubectl config use-context ctx-cluster-b
kubectl get nodes
# 预期输出:显示 Cluster-B 的节点列表

# 步骤4:Service 跨集群访问
kubectl --context ctx-cluster-a run curl-pod --image=curlimages/curl -- sleep 3600
kubectl --context ctx-cluster-a exec curl-pod -- curl http://<cluster-b-service-ip>:<port>
# 预期输出:返回 Service 的响应内容
常见连通性故障: 如果 Pod 网络互通失败,请检查集群间防火墙规则、Calico/Flannel 的跨集群 BGP 配置或隧道模式(如 VXLAN/IPIP)是否启用。跨集群 Service 访问通常需要额外配置 CoreDNS 或使用 ExternalName Service。

2.4 多集群网络拓扑示意

下图展示了三个集群之间的网络连接关系与验证路径:

多集群网络拓扑与连通性验证路径 Cluster-A(主集群) API Server: 10.0.1.10:6443 Master 节点 Worker 节点 1 Worker 节点 2 测试 Pod: test-pod Cluster-B(目标集群) API Server: 10.0.2.10:6443 Master 节点 Worker 节点 1 Worker 节点 2 目标 Pod: nginx-pod Cluster-C(备用集群) API Server: 10.0.3.10:6443 Master 节点 Worker 节点 1 Worker 节点 2 备用 Pod: alpine-pod curl /healthz ping Pod IP curl /healthz 备用连通性验证 主集群 目标集群 备用集群 API 验证 Pod 网络验证

2.5 环境验证清单

完成上述配置与验证后,请逐项确认以下清单:

  • kubeconfig 合并:三个集群的上下文均存在于 ~/.kube/config 中,且无重复条目。
  • 上下文切换:kubectl config get-contexts 输出三个上下文,状态均为正常。
  • API Server 健康:每个集群的 /healthz 端点返回 ok。
  • Pod 网络互通:跨集群 Pod 间 ping 成功率 100%,延迟 < 10ms。
  • kubectl 权限:当前用户在每个集群中至少拥有 cluster-admin 或等效的跨命名空间操作权限。
  • 存储与镜像:目标集群已预拉取实验所需的镜像(如 nginx:1.25、busybox),或配置了可访问的镜像仓库。