3. 压测沙盘环境搭建:使用 kind/minikube 部署单节点 etcd、配置 Prometheus + Grafana 监控栈
压测沙盘环境是进行 IO 曲线复核与风险控制的基础设施。本章将指导你使用 kind(Kubernetes in Docker)或 minikube 快速搭建一个轻量级单节点 etcd 集群,并部署 Prometheus + Grafana 监控栈,实现对 etcd 关键 IO 指标的实时采集与可视化。
3.1 环境选型对比:kind vs minikube
两种工具均可用于本地开发与测试,但在资源占用、网络模型与存储卷挂载方面存在差异。下表从压测沙盘场景出发进行对比:
| 特性 | kind | minikube |
|---|---|---|
| 底层实现 | 将 K8s 组件运行在 Docker 容器中 | 通过虚拟机或 Docker 驱动运行单节点集群 |
| 资源占用 | 较低(仅容器开销) | 较高(VM 模式需额外内存) |
| etcd 存储卷挂载 | 需通过 hostPath 或 PVC 映射到宿主机 | 支持 hostPath、PV、以及 minikube mount |
| 网络延迟模拟 | 可通过 tc 命令在容器内注入延迟 | 可通过 minikube ssh 进入 VM 操作 |
| IO 压测友好度 | 适合快速迭代、CI 集成 | 适合需要持久化存储与网络隔离的场景 |
| 推荐场景 | 短期压测、功能验证 | 需要稳定 IO 路径的长期压测 |
选型建议: 如果你的宿主机内存 ≥ 16GB,推荐使用 minikube(Docker 驱动)以获得更真实的存储 IO 路径;若资源受限或仅做快速原型验证,kind 是更轻量的选择。
3.2 使用 kind 部署单节点 etcd
以下步骤基于 kind v0.20+ 与 K8s v1.28。我们将创建一个包含 etcd 单实例的命名空间,并配置 hostPath 持久化数据目录。
3.2.1 创建 kind 集群配置文件
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraMounts:
- hostPath: /data/etcd-bench
containerPath: /var/lib/etcd-bench
kubeadmConfigPatches:
- |
kind: ClusterConfiguration
etcd:
local:
dataDir: /var/lib/etcd-bench
EOF
kind create cluster --config kind-config.yaml --name etcd-bench
3.2.2 部署 etcd 单节点 StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: etcd-single
namespace: etcd-bench
spec:
serviceName: etcd-single
replicas: 1
selector:
matchLabels:
app: etcd-single
template:
metadata:
labels:
app: etcd-single
spec:
containers:
- name: etcd
image: quay.io/coreos/etcd:v3.5.12
command:
- etcd
- --name=etcd0
- --data-dir=/var/lib/etcd
- --advertise-client-urls=http://etcd-single:2379
- --listen-client-urls=http://0.0.0.0:2379
- --listen-peer-urls=http://0.0.0.0:2380
- --initial-advertise-peer-urls=http://etcd-single:2380
- --initial-cluster=etcd0=http://etcd-single:2380
- --initial-cluster-=etcd-bench-
- --initial-cluster-state=new
ports:
- containerPort: 2379
name: client
- containerPort: 2380
name: peer
volumeMounts:
- name: etcd-data
mountPath: /var/lib/etcd
volumeClaimTemplates:
- metadata:
name: etcd-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 10Gi
注意: 单节点 etcd 不具备高可用能力,压测期间若节点故障将导致数据丢失。本沙盘仅用于 IO 曲线复核,生产环境必须部署 3 或 5 节点集群。
3.3 使用 minikube 部署单节点 etcd(备选方案)
若选择 minikube,建议使用 Docker 驱动并显式挂载数据目录:
minikube start --driver=docker \
--cpus=4 \
--memory=8192 \
--disk-size=20g \
--mount-string="/data/etcd-bench:/var/lib/etcd-bench" \
--mount
kubectl create ns etcd-bench
# 使用与 3.2.2 相同的 StatefulSet 部署,但需将 storageClassName 改为 minikube 默认的 standard
3.4 配置 Prometheus + Grafana 监控栈
监控栈用于采集 etcd 的磁盘 IO、Raft 提案延迟、WAL 写入速率等关键指标。我们使用 kube-prometheus-stack Helm Chart 进行一键部署。
3.4.1 安装 Helm 并添加仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
3.4.2 自定义 values 文件(关键参数)
cat <<EOF > prom-values.yaml
prometheus:
prometheusSpec:
scrapeInterval: 15s
evaluationInterval: 15s
additionalScrapeConfigs:
- job_name: 'etcd'
static_configs:
- targets: ['etcd-single.etcd-bench.svc.cluster.local:2379']
metrics_path: /metrics
scheme: http
grafana:
adminPassword: "admin123"
defaultDashboardsEnabled: true
additionalDataSources:
- name: Prometheus
type: prometheus
url: http://prometheus-operated:9090
access: proxy
isDefault: true
EOF
helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
-f prom-values.yaml
3.4.3 验证 etcd 指标采集
kubectl -n monitoring port-forward svc/kube-prometheus-stack-prometheus 9090:9090
# 浏览器访问 http://localhost:9090/targets,确认 etcd 目标为 UP 状态
3.5 架构总览:压测沙盘组件关系
下图展示了压测沙盘的整体组件拓扑与数据流路径:
3.6 验证监控栈连通性
部署完成后,执行以下步骤确认全链路可用:
- 检查 Pod 状态:
kubectl -n monitoring get pods确保 prometheus-operator、prometheus、grafana 均为 Running。 - 验证 etcd 指标端点:
kubectl -n etcd-bench exec etcd-single-0 -- wget -qO- http://localhost:2379/metrics | head -20应返回 etcd 指标文本。 - Grafana 导入仪表盘: 使用 Grafana 官方 etcd 仪表盘 ID 3070(etcd 3.x 监控)或 14036(etcd 3.5+ 详细 IO 面板)。
- 快速验证 IO 曲线: 在 Grafana 中执行一次简单的 etcd 写入压测,观察
etcd_disk_wal_fsync_duration_seconds_bucket与etcd_disk_backend_commit_duration_seconds_bucket曲线是否出现。
关键指标速查: 后续章节将重点复核以下 IO 相关指标:
-
-
-
-
etcd_disk_wal_fsync_duration_seconds:WAL 刷盘延迟,反映磁盘写入性能。-
etcd_disk_backend_commit_duration_seconds:后端事务提交延迟,影响写入吞吐。-
etcd_server_proposals_failed_total:Raft 提案失败数,间接反映 IO 超时风险。
3.7 环境清理与注意事项
- 清理 kind 集群:
kind delete cluster --name etcd-bench - 清理 minikube:
minikube delete - 数据持久化: 宿主机
/data/etcd-bench目录需手动删除以释放空间。 - 资源限制: 建议为 etcd 容器设置 CPU 限制(如 2 核)与内存限制(如 4Gi),避免压测时宿主机 OOM。
至此,压测沙盘环境搭建完成。下一阶段将基于此环境执行 IO 曲线采集与复核流程。