4. 沙盘环境搭建:基于 Kind/K3s 快速构建多集群沙盘,配置网络与存储基线

在进入 etcd 压测与 K8s 瓶颈定位之前,必须搭建一个可复现、低成本、贴近生产的多集群沙盘环境。本章使用 Kind(Kubernetes in Docker)与 K3s(轻量级 K8s 发行版)作为集群载体,在单台物理机或 VM 上快速拉起 3~5 个独立集群,并统一配置网络插件(CNI)与存储基线(CSI),为后续压测提供一致的底层环境。

4.1 沙盘架构总览

沙盘采用“控制面-工作负载-压测入口”三层拓扑。每个集群独立运行 etcd 实例,通过 Kind 或 K3s 管理节点生命周期。网络层统一使用 Calico(BGP 模式)或 Flannel(VXLAN 模式),存储层使用 Local Path Provisioner 或 OpenEBS 提供动态 PV 能力。

沙盘多集群架构总览 集群 A (Kind) etcd 单节点 / 3 节点 Calico BGP Local Path PV Worker × 2 集群 B (K3s) etcd 单节点 Flannel VXLAN OpenEBS Worker × 3 集群 C (Kind) etcd 3 节点 Calico BGP Local Path PV Worker × 4 压测入口 (Benchmark Runner) etcdctl / ghz / k6-operator 存储基线:Local Path / OpenEBS / NFS

4.2 环境准备与工具链

沙盘运行在 Ubuntu 22.04 LTS 或 Rocky Linux 9 上,最低配置 8 核 CPU、32 GB 内存、200 GB SSD。以下工具必须预先安装:

工具 版本要求 用途
Docker ≥ 24.0 容器运行时,Kind 依赖
Kind ≥ 0.20 多集群快速创建
K3s ≥ 1.28 轻量级集群(嵌入式 etcd)
kubectl ≥ 1.28 集群操作统一入口
Helm ≥ 3.14 CNI/CSI 组件部署
etcdctl ≥ 3.5 etcd 健康检查与压测
基线建议:所有集群使用相同 Linux 内核版本(建议 5.15+)和 Docker 存储驱动(overlay2),避免底层差异干扰压测结果。

4.3 基于 Kind 创建多集群

Kind 通过 YAML 配置文件定义集群拓扑。以下配置创建 3 个独立集群,每个集群包含 1 个控制面节点和 2~4 个 Worker 节点,并显式映射 etcd 数据端口到宿主机,便于后续直接压测 etcd 进程。

# cluster-a.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: cluster-a
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 2379
        hostPort: 12379
  - role: worker
  - role: worker
networking:
  podSubnet: "10.10.0.0/16"
  serviceSubnet: "10.20.0.0/16"
# 创建三个集群
kind create cluster --config cluster-a.yaml
kind create cluster --config cluster-b.yaml
kind create cluster --config cluster-c.yaml

# 验证集群状态
kind get clusters
kubectl cluster-info --context kind-cluster-a

4.4 基于 K3s 创建轻量集群

K3s 使用嵌入式 etcd(默认)或外部 etcd。沙盘采用嵌入式 etcd 模式,减少组件数量,适合快速验证。以下命令在独立命名空间中启动 K3s 集群:

# 安装 K3s 集群 B(嵌入式 etcd)
curl -sfL https://get.k3s.io | \
  INSTALL_K3S_VERSION=v1.28.2+k3s1 \
  K3S_=mysecrettoken \
  INSTALL_K3S_EXEC="--cluster-init --etcd-s3 --etcd-s3-bucket=my-bucket" \
  sh -s - server

# 添加 Worker 节点
curl -sfL https://get.k3s.io | \
  INSTALL_K3S_VERSION=v1.28.2+k3s1 \
  K3S_URL=https://<server-ip>:6443 \
  K3S_=mysecrettoken sh -

# 验证 etcd 成员
kubectl exec -n kube-system etcd-<pod-name> -- etcdctl member list
注意:K3s 嵌入式 etcd 默认使用 /var/lib/rancher/k3s/server/db/etcd 作为数据目录。压测前确保该目录位于 SSD 上,并预留足够空间(建议 ≥ 20 GB)。

4.5 网络基线配置

所有集群统一安装 Calico 作为 CNI,并启用 BGP 模式以模拟生产环境网络行为。K3s 集群需先禁用默认 Flannel,再安装 Calico。

集群类型 CNI 方案 安装方式 关键参数
Kind 集群 Calico (BGP) Helm chart IP_AUTODETECTION_METHOD=interface=eth0
K3s 集群 Calico (BGP) Helm chart + 禁用 Flannel --flannel-backend=none
# 安装 Calico(Kind 集群)
helm repo add projectcalico https://docs.tigera.io/calico/charts
helm install calico projectcalico/tigera-operator \
  --namespace tigera-operator --create-namespace \
  --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16

# K3s 集群:先禁用 Flannel,再安装 Calico
# 在 K3s server 启动参数中添加 --flannel-backend=none
# 然后执行相同 Helm 安装命令

4.6 存储基线配置

沙盘使用 Local Path Provisioner 作为默认存储类,提供动态本地 PV。对于需要跨节点共享的场景,额外部署 OpenEBS(Mayastor 引擎)或 NFS Subdir External Provisioner。

# 安装 Local Path Provisioner
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

# 设置为默认 StorageClass
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

# 验证
kubectl get sc
# 输出示例:
# NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE
# local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer
存储基线检查清单:
  • 所有 Worker 节点挂载独立 SSD(/data/local-path)
  • Local Path 数据目录使用 ext4 或 xfs,noatime 挂载参数
  • IO 调度器设置为 none(nvme)或 mq-deadline(sata)
  • 预创建 10 个 10GB 的 PV 测试卷,验证动态供给延迟

4.7 沙盘验证与连通性测试

完成搭建后,执行以下验证步骤,确保每个集群的网络、存储、etcd 均处于健康状态:

  1. 集群节点状态:kubectl get nodes -o wide — 所有节点 Ready。
  2. etcd 健康:kubectl exec -n kube-system etcd-<pod> -- etcdctl endpoint health — 全部 healthy。
  3. 跨集群网络:在集群 A 创建 Pod,集群 B 创建 Service,验证 Pod 能否通过 ClusterIP 或 NodePort 访问。
  4. 存储动态供给:kubectl apply -f test-pvc.yaml — PVC 自动绑定 PV,Pod 可读写。
  5. 压测工具就绪:etcdctl check perf --load=1M — 确认 etcd 可承受基础负载。
沙盘验证流程 节点状态 etcd 健康 跨集群网络 存储动态供给 压测就绪 验证通过标准 所有节点 Ready | etcd 全部 healthy | 跨集群 Pod ↔ Service 可达 PVC 自动绑定并读写正常 | etcdctl check perf 无错误

4.8 沙盘清理与快照

每次压测前后,建议对沙盘进行快照(VM 级别或 Docker 镜像层快照),以便快速回退到干净状态。Kind 集群可直接删除重建:

# 删除 Kind 集群
kind delete cluster --name cluster-a

# 清理 K3s 集群
/usr/local/bin/k3s-uninstall.sh

# 清理存储数据(谨慎执行)
rm -rf /data/local-path/*