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 能力。
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 健康检查与压测 |
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
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 均处于健康状态:
- 集群节点状态:
kubectl get nodes -o wide— 所有节点 Ready。 - etcd 健康:
kubectl exec -n kube-system etcd-<pod> -- etcdctl endpoint health— 全部 healthy。 - 跨集群网络:在集群 A 创建 Pod,集群 B 创建 Service,验证 Pod 能否通过 ClusterIP 或 NodePort 访问。
- 存储动态供给:
kubectl apply -f test-pvc.yaml— PVC 自动绑定 PV,Pod 可读写。 - 压测工具就绪:
etcdctl check perf --load=1M— 确认 etcd 可承受基础负载。
4.8 沙盘清理与快照
每次压测前后,建议对沙盘进行快照(VM 级别或 Docker 镜像层快照),以便快速回退到干净状态。Kind 集群可直接删除重建:
# 删除 Kind 集群
kind delete cluster --name cluster-a
# 清理 K3s 集群
/usr/local/bin/k3s-uninstall.sh
# 清理存储数据(谨慎执行)
rm -rf /data/local-path/*