找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2298

积分

0

好友

321

主题
发表于 前天 10:14 | 查看: 7| 回复: 0

在上一期文章中,我们介绍了VictoriaMetrics的基础部署方式。许多读者反馈:“直接暴露 vmselectvminsert 服务在生产环境风险太高,任何知晓IP的客户端都能随意读写数据。”

你的担忧是正确的。直接暴露核心服务端口无异于门户大开。

今天,我们带来一套面向生产环境的“完全体”解决方案。本次实战将基于Kubernetes Operator,部署完整的VictoriaMetrics Cluster(集群版),并重点引入VMAuth(认证网关)。VMAuth就像为监控集群加装了一道安全门,无论是Grafana面板还是直接API调用,所有请求都必须通过账号密码认证才能访问后端数据,极大地提升了系统的安全性。

架构与组件预览

本次部署采用 Helm Chart 进行管理,整体架构清晰。如果你正在构建自己的云原生监控体系,理解以下组件拓扑至关重要:

  1. VMCluster: 核心存储与查询集群,由 vmstorage, vminsert, vmselect 组件构成,负责指标数据的高性能写入、存储与读取。
  2. VMAuth (本次新增 ⭐): 作为统一的流量入口和安全网关 (NodePort 30080)。所有查询请求必须先经过VMAuth进行Basic Auth鉴权,验证通过后才会被转发至后端的 vmselect 服务。
  3. VMAgent: 负责采集Kubernetes集群及其上应用的各项指标,并通过Remote Write方式将数据写入集群。
  4. 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.yamlvmstorage 配置的 storageClassName: “nfs-slow” 在你的Kubernetes集群中并不存在。
  • 解决: 执行 kubectl get storageclasskubectl 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-secretvmauth-credentials 两个Secret里定义的 password ,以及 values.yamlgrafana.sidecar.datasources.basicAuthPassword 的值。确保三者完全一致。

Q3: 能够登录Grafana,但查询不到任何数据 (Empty result)?

  • 原因: 可能是 vmagent 没有成功采集到指标,或者VMAuth的路由配置有误。
  • 解决:
    1. 检查 vmagent Pod的日志,查看是否有采集错误:kubectl logs -l app.kubernetes.io/name=vmagent -n monitoring
    2. 确认 sc.yaml 中VMAuth配置的 url_prefix 指向的是 http://vmselect-vm:8481 。这是Kubernetes集群内部的Service名称,确保网络可达。

总结

通过本次实战,我们不仅构建了具备高性能和高可扩展性的VictoriaMetrics集群版,更重要的是通过引入 VMAuth 组件,为监控系统补齐了生产环境不可或缺的安全短板。

现在,你的监控体系拥有了:

  • 独立且可扩展的存储与计算能力 (VMCluster)
  • 统一的安全访问入口与身份认证 (VMAuth + Basic Auth)
  • 声明式与自动化的配置管理 (Helm + Operator)

强烈建议在生产环境中部署监控系统时参考此方案,为你的核心数据加上这道可靠的“安全门”。




上一篇:五步用AI生成游戏多语言本地化工具:从原型到可交付HTML文件
下一篇:如何部署MongoDB分片集群?从架构原理到实战运维完整指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-14 14:15 , Processed in 0.266361 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表