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 架构总览:压测沙盘组件关系

下图展示了压测沙盘的整体组件拓扑与数据流路径:

压测沙盘环境架构图 压测沙盘环境架构图 压测工具 benchmark / etcdctl etcd 单节点 StatefulSet + PVC /var/lib/etcd 宿主机存储 /data/etcd-bench PUT/GET 请求 WAL + Snapshot IO Prometheus scrapeInterval: 15s Grafana etcd Dashboard 告警通道 IO 延迟阈值告警 /metrics 采集 数据源 告警规则 关键数据流说明: 1. 压测工具向 etcd 发送 PUT/GET 请求,触发 WAL 写入与磁盘 IO。 2. etcd 通过 /metrics 端点暴露磁盘 IO 延迟、Raft 提案速率等指标。 3. Prometheus 每 15s 拉取指标,Grafana 渲染 IO 曲线仪表盘。 4. 当 IO 延迟超过预设阈值时,告警通道触发通知。

3.6 验证监控栈连通性

部署完成后,执行以下步骤确认全链路可用:

  1. 检查 Pod 状态: kubectl -n monitoring get pods 确保 prometheus-operator、prometheus、grafana 均为 Running。
  2. 验证 etcd 指标端点: kubectl -n etcd-bench exec etcd-single-0 -- wget -qO- http://localhost:2379/metrics | head -20 应返回 etcd 指标文本。
  3. Grafana 导入仪表盘: 使用 Grafana 官方 etcd 仪表盘 ID 3070(etcd 3.x 监控)或 14036(etcd 3.5+ 详细 IO 面板)。
  4. 快速验证 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 曲线采集与复核流程。