在上一期文章中,我们介绍了VictoriaMetrics的基础部署方式。许多读者反馈:“直接暴露 vmselect 和 vminsert 服务在生产环境风险太高,任何知晓IP的客户端都能随意读写数据。”
你的担忧是正确的。直接暴露核心服务端口无异于门户大开。
今天,我们带来一套面向生产环境的“完全体”解决方案。本次实战将基于Kubernetes Operator,部署完整的VictoriaMetrics Cluster(集群版),并重点引入VMAuth(认证网关)。VMAuth就像为监控集群加装了一道安全门,无论是Grafana面板还是直接API调用,所有请求都必须通过账号密码认证才能访问后端数据,极大地提升了系统的安全性。
架构与组件预览
本次部署采用 Helm Chart 进行管理,整体架构清晰。如果你正在构建自己的云原生监控体系,理解以下组件拓扑至关重要:
- VMCluster: 核心存储与查询集群,由
vmstorage, vminsert, vmselect 组件构成,负责指标数据的高性能写入、存储与读取。
- VMAuth (本次新增 ⭐): 作为统一的流量入口和安全网关 (NodePort 30080)。所有查询请求必须先经过VMAuth进行Basic Auth鉴权,验证通过后才会被转发至后端的
vmselect 服务。
- VMAgent: 负责采集Kubernetes集群及其上应用的各项指标,并通过Remote Write方式将数据写入集群。
- Grafana: 数据可视化平台 (NodePort 30030),其数据源将配置为通过账号密码连接至VMAuth网关,而非直接连接
vmselect。
环境准备:配置密钥与规则
在通过Helm安装Chart之前,我们需要预先创建必要的Secret配置文件 sc.yaml。这一步定义了系统的访问规则与数据采集方式,是安全与功能的基石。
创建配置文件 sc.yaml
# sc.yaml
---
# 1. 定义 VMAuth 的认证规则
apiVersion: v1
kind: Secret
metadata:
name: vmauth-config-secret
namespace: monitoring
type: Opaque
stringData:
config.yaml: |
users:
- username: "admin"
password: "admin_password_123" # 🔐 访问密码
url_map:
# 兜底规则:所有通过认证的请求,都转发给 vmselect 进行查询
- src_paths:
- ".*"
url_prefix:
- "http://vmselect-vm:8481"
---
# 2. 定义 Grafana 使用的凭证 (用于 Sidecar 自动配置数据源)
apiVersion: v1
kind: Secret
metadata:
name: vmauth-credentials
namespace: monitoring
type: Opaque
stringData:
username: "admin"
password: "admin_password_123"
---
# 3. 补充采集规则 (修正 K8s Node 端口)
apiVersion: v1
kind: Secret
metadata:
name: vmagent-scrape-configs
namespace: monitoring
type: Opaque
stringData:
additional-scrape-configs.yaml: |
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
# 将 Kubelet 的 10250 端口替换为 NodeExporter 的 9100 端口
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
执行准备命令
# 1. 创建命名空间
kubectl create namespace monitoring
# 2. 应用 Secret 配置
kubectl apply -f sc.yaml
核心配置:定制 values.yaml
接下来是部署的核心环节:定制Helm的 values.yaml 文件。与默认配置相比,我们做出了两个关键调整:启用集群模式和启用VMAuth安全网关。
创建配置文件 values.yaml
# values.yaml
# --- 全局配置 ---
fullnameOverride: "vm" # 统一命名前缀,方便服务发现
# --- 核心: VMCluster 集群模式 ---
vmsingle:
enabled: false # 关闭单机版
vmcluster:
enabled: true # 开启集群版
spec:
retentionPeriod: "30d" # 数据保留30天
replicationFactor: 1
vmstorage:
replicaCount: 1
storage:
volumeClaimTemplate:
spec:
storageClassName: "nfs-slow" # ⚠️注意:请修改为你环境真实的 StorageClass
resources: { requests: { storage: 10Gi } }
vmselect:
replicaCount: 1
vminsert:
replicaCount: 1
# --- 重点: VMAuth 认证网关 (本次新增) ---
vmauth:
enabled: true
spec:
replicaCount: 1
configSecret: "vmauth-config-secret" # 引用 sc.yaml 中的配置
serviceSpec:
spec:
type: NodePort
ports:
- name: http
port: 8427
targetPort: 8427
nodePort: 30080 # 🔐 统一对外安全入口
# --- 采集组件 ---
vmagent:
enabled: true
spec:
replicaCount: 1
# 写入地址指向 vminsert
remoteWrite:
- url: "http://vminsert-vm:8480/insert/0/prometheus/api/v1/write"
# 加载额外的采集规则
additionalScrapeConfigs:
name: "vmagent-scrape-configs"
key: "additional-scrape-configs.yaml"
# --- 告警组件 ---
vmalert:
enabled: true
spec:
replicaCount: 1
datasource:
url: "http://vmselect-vm:8481/select/0/prometheus"
notifiers:
- url: "http://alertmanager-vm:9093"
alertmanager:
enabled: true
config:
global: { resolve_timeout: 5m }
route:
group_by: ['alertname']
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/' # 示例 webhook
# --- 展示组件 ---
grafana:
enabled: true
adminPassword: "grafana_admin_password"
service:
type: NodePort
nodePort: 30030
sidecar:
datasources:
enabled: true
# ⚠️ Grafana 必须通过 VMAuth 访问,并带上账号密码
url: "http://vmauth-vm:8427/select/0/prometheus"
basicAuth: true
basicAuthUser: "admin"
basicAuthPassword: "admin_password_123"
执行 Helm 部署
所有配置准备就绪,现在开始安装整个监控栈。
# 1. 添加 VictoriaMetrics 官方仓库
helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update
# 2. 执行安装 (Release 名称为 vm)
helm install vm vm/victoria-metrics-k8s-stack \
-n monitoring \
-f values.yaml
等待几分钟,使用以下命令检查所有Pod的状态,直到它们全部变为 Running :
kubectl get pods -n monitoring
访问与验证 (关键步骤)
部署完成后,验证VMAuth是否真正起到了保护作用是关键。我们将通过三个步骤来测试安全网关的有效性。
验证 1:未授权访问(应失败)
首先,尝试直接访问VMAuth的安全入口(NodePort 30080),但不提供任何认证信息:
curl -I http://<任意NodeIP>:30080/select/0/prometheus/api/v1/query?query=up
预期结果:
HTTP/1.1 401 Unauthorized
说明:安全网关生效!未携带正确凭证的请求被拦截,无法读取任何数据。
验证 2:授权访问(应成功)
现在,使用我们在 sc.yaml 中配置的 admin 账号和密码进行访问:
curl -u admin:admin_password_123 \
http://<任意NodeIP>:30080/select/0/prometheus/api/v1/query?query=up
预期结果:
{"status":"success","data":{...}}
说明:凭证正确,VMAuth成功将查询请求路由至后端的 vmselect 组件并返回了数据。
验证 3:Grafana 访问
最后,通过浏览器验证Grafana的集成情况。访问 http://<任意NodeIP>:30030 。
- 登录 Grafana: 使用用户名
admin 和密码 grafana_admin_password (在 values.yaml 中定义) 登录。
- 查看数据源: 进入
Configuration -> Data Sources。你会看到Operator已自动配置好一个名为 VictoriaMetrics 的数据源。关键点在于其URL指向了 http://vmauth-vm:8427... ,并且已启用Basic Auth,这正是我们配置的运维与监控安全访问模式。
- Explore 查询: 点击左侧菜单的
Explore ,在查询框中输入 up 并执行。如果能看到返回的时序数据图表,则证明从数据采集 (vmagent) -> 安全网关 (vmauth) -> 查询集群 (vmselect) -> 数据展示 (Grafana) 的全链路已成功打通。
常见故障排查 (Troubleshooting)
如果在部署或验证过程中遇到问题,可以参照以下思路进行排查:
Q1: Pod 一直处于 Pending 状态,事件提示 PVC 无法绑定?
- 原因:
values.yaml 中 vmstorage 配置的 storageClassName: “nfs-slow” 在你的Kubernetes集群中并不存在。
- 解决: 执行
kubectl get storageclass 或 kubectl get sc 查看集群中可用的存储类名称。修改 values.yaml 中的 storageClassName 为实际存在的值,然后执行 helm upgrade vm vm/victoria-metrics-k8s-stack -n monitoring -f values.yaml 进行更新。
Q2: Grafana 数据源测试报错 “401 Unauthorized”?
- 原因: Grafana数据源配置中使用的密码与VMAuth的Secret (
sc.yaml) 中定义的密码不一致。
- 解决: 仔细核对
sc.yaml 文件中 vmauth-config-secret 和 vmauth-credentials 两个Secret里定义的 password ,以及 values.yaml 中 grafana.sidecar.datasources.basicAuthPassword 的值。确保三者完全一致。
Q3: 能够登录Grafana,但查询不到任何数据 (Empty result)?
- 原因: 可能是
vmagent 没有成功采集到指标,或者VMAuth的路由配置有误。
- 解决:
- 检查
vmagent Pod的日志,查看是否有采集错误:kubectl logs -l app.kubernetes.io/name=vmagent -n monitoring
- 确认
sc.yaml 中VMAuth配置的 url_prefix 指向的是 http://vmselect-vm:8481 。这是Kubernetes集群内部的Service名称,确保网络可达。
总结
通过本次实战,我们不仅构建了具备高性能和高可扩展性的VictoriaMetrics集群版,更重要的是通过引入 VMAuth 组件,为监控系统补齐了生产环境不可或缺的安全短板。
现在,你的监控体系拥有了:
- 独立且可扩展的存储与计算能力 (VMCluster)
- 统一的安全访问入口与身份认证 (VMAuth + Basic Auth)
- 声明式与自动化的配置管理 (Helm + Operator)
强烈建议在生产环境中部署监控系统时参考此方案,为你的核心数据加上这道可靠的“安全门”。