Vault Enos benchmark 模块:用 k6 + Prometheus + Grafana 搭建 Vault 集群性能基准测试环境
发布时间:2026/9/6 19:28:27 作者:尧图编辑部 阅读量:1,286

Vault Enos benchmark 模块用 k6 Prometheus Grafana 搭建 Vault 集群性能基准测试环境【免费下载链接】vaultA tool for secrets management, encryption as a service, and privileged access management项目地址: https://gitcode.com/GitHub_Trending/va/vault本文以enos/modules/benchmark/模块说明文档为骨架完整讲解该模块的定位与假设前提并结合仓库内的场景定义enos-scenario-benchmark.hcl与各子模块 Terraform 实现说明如何一键拉起三节点 Vault 集群 k6 压测机 Prometheus/Grafana 指标采集机的完整基准测试环境以及如何运行内置的 kvv1/kvv2/approle-login 压测脚本并在 Grafana 中查看结果。一、模块定位基准测试一个 Vault 集群模块说明文档开宗明义地给出了 benchmark 模块的设计目标These benchmark modules are designed to benchmark a Vault cluster using either raft storage or an external Consul cluster for storage. It supports creating an external telemetry collector using a combination of Prometheus and Grafana and supports collecting Vault, Consul, and node metrics.即该模块围绕两条主线被测集群一个 Vault 集群其存储后端可以是 Vault 内置的raft存储也可以是一个外部的Consul 集群——两条路径对应场景中的backend:raft与backend:consul矩阵参数外部遥测采集单独用一台机器组合 Prometheus Grafana 作为指标采集器覆盖三类指标——Vault 指标、Consul 指标、节点node exporter指标。文档同时给出了使用该模块时的两条重要前提假设目前假定Ubuntu 22.04是 k6 压测机k6 runner instance的目标运行系统Vault 集群与 Consul 集群都假定是三节点集群。这两点直接体现在场景定义的 matrix 中enos-scenario-benchmark.hclarch [amd64]、distro [ubuntu]是硬编码的场景注释里解释了原因——Prometheus、Grafana、k6、prometheus node exporter 中有些包无法通过常规包管理器安装需要源码安装为一种架构 一种发行版组合维护安装脚本即可满足需求扩展其他组合时可直接参考 benchmark 模块里的安装脚本进行修改。二、整体拓扑3 个 Vault 节点 1 台指标采集机 1 台 k6 压测机场景文件对整套环境的描述是A three node Vault cluster is created, along with two additional nodes: one to run prometheus and grafana, and one to run k6, the load generation tool.对应到 enos-scenario-benchmark.hcl 中的几个target_ec2_instances步骤步骤机器数量实例类型amd64 默认值集群标签说明create_k6_target1c5d.4xlargebenchmark-k6负载发生器create_metrics_collector_target1m4.largebenchmark-collectorPrometheus Grafanacreate_vault_cluster_targets3i3.4xlargeVault 标签被测 Vault 集群io2 根卷 24GBcreate_vault_cluster_backend_targets3i3.4xlargebackend 标签Consul 后端集群raft 模式下用target_ec2_shim空占位上表实例类型与端口默认值来自 config/main.tf这是 benchmark 模块中配置中枢子模块除实例类型外还固定了以下关键默认值均可作为变量覆盖grafana_version 11.6.0、grafana_http_port 3000prometheus_version 3.3.0、prometheus_http_port 9090prometheus_node_exporter_version 1.9.1、prometheus_exporter_port 9100consul_http_port 8500storage_disk_iops 16000存储卷 IOPS详见下文磁盘 IOPS 与 AWS 配额一节。模块目录结构enos/modules/benchmark/与职责一一对应enos/modules/benchmark/ ├── config/ # 实例类型、版本、端口、IOPS 等默认配置 ├── setup/ # 总装把下面四个子模块串起来 ├── set_up_k6/ # 安装 k6、渲染并下发压测脚本 ├── set_up_telemetry_collector/ # 安装/运行 Prometheus 与 Grafana、下发仪表盘 ├── enable_telemetry_consul/ # 在 Consul 节点上开启遥测 └── enable_telemetry_node_exporter/ # 在所有节点部署 node exporter三、场景编排从构建 Vault 到拉起基准测试环境benchmark场景按依赖顺序执行以下步骤完整定义见 enos-scenario-benchmark.hclbuild_vault按artifact_source选择build_artifactory/build_crt/build_local模块获取被测 Vault 版本benchmark_config引用module.benchmark_config产出实例类型、端口与 IOPS 配置create_vpc创建 VPC支持ip_version矩阵参数read_backend_license/read_vault_license仅在需要时读取许可证backend:raft或consul_edition:ce时跳过前者edition:ce时跳过后者create_seal_key按seal矩阵参数awskms、pkcs11、shamir等创建封套密钥create_k6_target/create_metrics_collector_target/create_vault_cluster_targets/create_vault_cluster_backend_targets拉起上述五台或八台含 Consul 时机器create_backend_clusterbackend_consul或backend_raft模块consul 分支带有一组 verifies 质量校验如consul_ha_leader_election、consul_service_systemd_unit等create_vault_cluster安装并启动 Vault 集群注意其中显式设置了enable_telemetry true让 Prometheus 能采集 Vault 指标、storage_backend matrix.backendwait_for_leader120 秒超时→get_vault_cluster_ips取得 leader 内网 IP→verify_vault_unsealed确认集群选出 leader 并已解封benchmark_setup调用module.benchmark_setup即 setup/main.tf把压测端与采集端装配完成。benchmark_setup步骤传入的关键变量来自上一步的产出leader_addrleader 内网 IP、vault_tokenroot token、vault_hosts/consul_hosts各节点 IP 映射、k6 与 metrics 采集机的主机对象以及k6_host、metrics_host等。setup 子模块如何总装setup/main.tf 内部按依赖顺序调用四个子模块set_up_k6输入k6_host、leader_addr、metrics_host、vault_token、vault_hostsset_up_telemetry_collector输入metrics_host、k6_host、vault_hosts、consul_hosts及各类版本号enable_telemetry_consul输入 Consul 主机列表raft 后端时为空enable_telemetry_node_exporter在local.all_hosts 所有 Vault 主机 所有 Consul 主机 k6 主机主机会被重命名为vault_N/consul_N/k6上部署 node exporter这正是 README 中supports collecting ... node metrics的落地。子模块间共享的重试参数定义在 setup/variables.tfretry_interval默认 2 秒timeout默认 120 秒注释明确说明该超时应用于每一步总超时会更长。最终场景输出dashboard_url即来自采集器子模块。四、如何指定被测 Vault 版本矩阵参数与 artifact_source场景描述enos-scenario-benchmark.hcl强调 Enos 的 matrix 参数本质是过滤器不指定某个参数时该参数取全部可能值。例如不指定backend时场景会对 raft 和 consul 两种后端各跑一遍只指定backend:raft则只跑 raft。所有可能值可参考 enos-globals.hcl。针对对某个具体版本做基准测试的典型诉求文档给出了两种取件方式artifact_source:crt从 Vault 官方发布渠道下载 release 包放进support/子目录该目录可能被 git-ignored需要时手动创建并在enos-local.vars.hcl中登记路径例如vault_artifact_path ./support/vault_1.20.0_linux_amd64.zipartifact_source:local对本地 Vault 分支构建的版本做测试此时get_local_metadata步骤不会被跳过。此外 matrix 中有若干 exclude 规则值得注意L82-L103artifact_source:local只允许artifact_type:bundle本地构建器只产出 bundleseal:pkcs11只能搭配含hsm的 editionent.hsm、ent.hsm.fips1402seal:pkcs11排除 sles 发行版softhsm 包在开发时不可用ip_version:6目前仅对集成 raft 存储实现因此排除backend:consul ip_version:6组合。如果要用企业版 Consul 后端还需在enos-local.vars.hcl的backend_license_path变量下指定 Consul 许可证文件路径。磁盘 IOPS 与 AWS 配额场景文档中一段很实用的运维提示L45-L51默认给底层存储卷配置16k IOPSio2 卷。这低于上限但足以在 AWS 账户 100,000 IOPS 的默认限额内创建全部 6 台机器如果只用 raft 存储可以把 IOPS 提到 24k而 consul 存储除非向 AWS 申请配额提升否则必须停留在 16k。不想专门压测 Consul 原始性能时也可以调整create_vault_cluster_backend_targets中的磁盘参数减少 IOPS、或改用 io1 等。对应的可调变量即 config/main.tf 中的storage_disk_iops默认 16000其变量描述里同样写明了这套 100,000 IOPS 限额逻辑。五、运行基准测试launch 而非 run全程手动文档特别强调截至其撰写时该场景不做自动基准测试与结果收集一切是手动的。因此用enos scenario launch benchmark ...加矩阵参数启动而不是enos scenario run测试结束后必须手动enos scenario destroy销毁基础设施。场景描述中给出了一条单点压测的示例命令它把所有矩阵参数都显式指定了因此只跑 1 个组合enos scenario launch benchmark config_mode:file artifact_source:crt artifact_type:bundle seal:awskms ip_version:4 consul_version:1.20.6 edition:ent consul_edition:ent backend:consul查看结果Grafana场景启动完成、各步骤结束后取metrics 采集节点的公网 IP在浏览器打开3000 端口grafana_http_port默认值与 config/main.tf 中GRAFANA_HTTP端口一致用admin/admin登录 Grafana仪表盘列表里会看到 grafana-dashboards/ 子目录自动上传的四份仪表盘aop-bench-dashboard.jsonconsul-is-benchmarks.jsonConsul/IS 基准测试即文档示例命令提到的 Consul/IS benchmarksvault-write-performance.jsonvault-writes.json从源码结构看仪表盘是由 set_up_telemetry_collector/main.tf 中的enos_file.copy_grafana_dashboards资源通过fileset通配该目录下所有*.json并逐一下发到采集机的/etc/grafana/dashboards/的Prometheus 安装时通过环境变量注入了各被测节点地址VAULT_N_ADDR、CONSUL_N_ADDR、K6_ADDR用于其抓取配置。发起压测k6-run.shSSH 登录k6 节点的公网 IP通过k6-run.sh脚本发起场景./k6-run.sh kvv2传给脚本的参数是 k6 脚本名去掉k6-前缀的部分与 k6-templates/ 目录中文件对应。该目录目前内置三个模板k6-kvv2.js.tplKV v2 写压测k6-kvv1.js.tplKV v1 写压测k6-approle-login.js.tplAppRole 登录压测渲染后的执行脚本 k6-run.sh.tpl 逻辑非常简单script${1:-} # 无参数时打印 Usage: ./k6-run.sh approle-login | kvv1 | kvv2 | lease-revocation K6_PROMETHEUS_RW_SERVER_URLhttp://${metrics_addr}:9090/api/v1/write k6 run -o experimental-prometheus-rw scripts/k6-${script}.js要点有二metrics_addr在模板渲染时已被替换为指标采集机内网 IPk6 通过experimental-prometheus-rw输出把压测指标实时写入 Prometheus 的 remote-write 端点9090 端口与 README 所述collecting Vault, Consul, and node metrics的采集链路合为一体。六、压测脚本内部k6 模板是怎么打流量和上报指标的k6-kvv2对每个 Vault 节点独立压 KV v2 写k6-kvv2.js.tpl 是一个 Go 模板hosts各 Vault 节点的 IP 映射、vault_tokenroot token、leader_addrleader 内网 IP三个变量由 set_up_k6/main.tf 中的templatefile渲染注入后下发到 k6 机的/home/ubuntu/scripts/。其关键设计按节点分场景%{for idx, host in hosts}为每个 Vault 节点生成一个独立 k6 场景每个场景通过环境变量VAULT_ADDR http://节点内网IP:8200定向打到该节点ramping-arrival-rate 执行器preAllocatedVUs: 3000、maxVUs: 6000到达率按阶段爬升——10s 升到 250/s保持 60s再 10s 升到 1000/s保持 120s随后逐步降回 750/s、1000/s 直至 0整体是一个约 6 分钟的写压力曲线setup 阶段用 root token 向 leader 的/v1/sys/mounts/kv2POST 挂载一个 KV v2 引擎force_no_cache: falsedefault_lease_ttl/max_lease_ttl均为 0s压测请求每次迭代生成 8 位随机 keyPUT /v1/kv2/data/key写入{data:{foo:bar}}并用check(res, {put was success: r.status 400})统计成功率请求打上了create-secret标签便于在 Grafana 中按 tag 切分。k6-approle-loginAppRole 登录吞吐k6-approle-login.js.tpl 的 setup 阶段会在 leader 上挂载一个带随机后缀的 AppRole 认证方法auth_name approle- randomString(8)避免与既有挂载冲突循环创建approle0~approle9共 10 个角色policies: default、secret_id_ttl: 0m、token_ttl: 1m并为每个角色写入自定义 role-id 与 custom-secret-id用每套凭据各登录一次做预验证任何一步失败即abort。压测函数approle_login在随机选一个角色后向对应节点的/v1/auth/name/login发起 POST并内置了线性抖动退避重试linearJitterBackoff在 1~5s 间取抖动并按尝试次数放大状态码 ≥400 且非 503 时打印日志check仍按400统计成功率。其压力曲线比 kvv2 更陡10s 冲到 1000/s60s 后 10s 内升到4000/s并保持 120s。k6 环境准备细节install-k6.sh 除了通过官方 apt 源安装 k6 外还做了两件事值得压测环境搭建时借鉴L32-L39sudo sysctl -w net.ipv4.ip_local_port_range1024 65535 sudo sysctl -w net.ipv4.tcp_fin_timeout10 sudo sysctl -w net.ipv4.tcp_tw_reuse1脚本注释直言是tweak some kernel parameters so k6 doesnt barf——即扩大本地端口范围、缩短 FIN 等待时间、允许复用 TIME_WAIT 套接字以支撑数千并发连接的压测流量。整个安装脚本包在重试 超时循环中执行RETRY_INTERVAL/TIMEOUT_SECONDS环境变量失败会每 2 秒重试直到超时。七、遥测链路从 node exporter 到 Grafana 数据流三类指标的来源在代码中都有明确落点节点指标enable_telemetry_node_exporter/main.tf 对hosts做for_each逐台安装默认 v1.9.1并运行 node exporter暴露 9100 端口主机集合覆盖了 Vault 全部节点、Consul 全部节点以及 k6 机本身见 setup/main.tf 的all_hosts构造。Consul 指标enable_telemetry_consul 在 Consul 主机上执行add-consul-telemetry.sh开启 Consul 的 Prometheus 遥测。Vault 指标由场景create_vault_cluster步骤传入enable_telemetry true使 Vault 自身以 Prometheus 格式暴露指标Prometheus 安装脚本通过VAULT_N_ADDR环境变量获知各节点地址进行抓取。采集机上的装配顺序set_up_telemetry_collector/main.tfinstall_prometheus→install_grafana→copy_grafana_dashboards→run_prometheus/run_grafana依赖链保证了服务在组件就绪后才启动最终输出dashboard_url http://采集机公网IP:3000即场景 outputdashboard_url的来源enos-scenario-benchmark.hcl。八、收尾与结果获取完整的操作闭环即场景文档给出的流程# 1. 启动手动型场景用 launch 而非 run enos scenario launch benchmark config_mode:file artifact_source:crt artifact_type:bundle seal:awskms ip_version:4 consul_version:1.20.6 edition:ent consul_edition:ent backend:consul # 2. 浏览器打开 采集机公网IP:3000admin/admin 登录 Grafana选择仪表盘 # 3. SSH 登录 k6 机公网 IP发起压测 ./k6-run.sh kvv2 # 或 kvv1 / approle-login # 4. 在 Grafana 中观察指标曲线取完结果后销毁环境 enos scenario destroy九、边界与前提小结目标运行系统假定 Ubuntu 22.04k6 runner 侧架构固定 amd64Vault 与 Consul 均为三节点集群场景为手动型不做自动结果收集launch启动、destroy收尾Consul 后端压测受 AWS 账户 100,000 IOPS 默认配额约束io2 卷默认 16k需要更高 IOPS 时申请配额或降低磁盘参数IPv6 测试目前仅覆盖集成 raft 存储backend:consul与ip_version:6组合被场景 matrix 显式排除企业版组件Vault ent / Consul ent需按场景要求提供对应许可证路径。以上所有模块文件均位于 enos/modules/benchmark/ 与 enos/enos-scenario-benchmark.hcl可直接按文对照阅读如需扩展其他架构/发行版组合入口是 benchmark 模块内各scripts/安装脚本的适配。【免费下载链接】vaultA tool for secrets management, encryption as a service, and privileged access management项目地址: https://gitcode.com/GitHub_Trending/va/vault创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考