K8S VictoriaMetrics 和 Prometheus

 

 

一、Prometheus(CNCF 毕业项目)

核心特点

  • 拉取模型:主动从目标(HTTP端点)拉取指标

  • 多维数据模型:使用 metric + 标签键值对标识时间序列

  • PromQL:强大的查询语言

  • 单机架构:默认单节点运行,依赖社区方案扩展

架构组件

┌─────────┐    拉取     ┌─────────────┐    写入     ┌────────────┐
│ 应用/服务├───────────►│ Prometheus  ├───────────►│ 本地TSDB   │
└─────────┘   (HTTP)    └─────────────┘            └────────────┘
     │                         │
     │          服务发现        │ 查询/告警
     └─────────────────────────┘    │
                               ┌─────▼─────┐
                               │ Alertmanager │
                               └────────────┘

存储原理

  • 本地分片存储(默认15天)

  • 数据按2小时块存储,定期压缩

  • 不支持真正的集群模式(需通过Thanos/Cortex扩展)

二、VictoriaMetrics

核心特点

  • 兼容Prometheus:支持PromQL、数据格式、拉取协议

  • 推拉结合:既支持Prometheus的拉取,也支持直接推送(如InfluxDB格式)

  • 高性能存储:针对SSD和HDD优化的列式存储

  • 原生集群方案:单机和集群版都由官方支持

架构组件

单机版:All-in-one设计
集群版(三个核心组件):

┌─────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ vmagent ├───►│ vminsert     ├───►│ vmstorage    │◄───┤ vmselect     │
└─────────┘    └──────────────┘    └──────────────┘    └──────────────┘
(数据采集)      (路由分发)        (分布式存储)       (查询聚合)


三、vmagent支持的监控发现类型

selectAllByDefault: true自动发现所有监控类型,这意味着 VMAgent 会自动发现并监控所有命名空间中的:

  • VMServiceScrape

  • VMPodScrape

  • VMProbe

  • VMRule

但是不会自动发现 Prometheus 原生的 PodMonitor 和 ServiceMonitor

 

1. ServiceMonitor

# Prometheus Operator风格的监控
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
# vmagent通过 selectAllByDefault: true 自动发现

2. PodMonitor(另一个Prometheus Operator资源)

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: example-podmonitor
spec:
  selector:
    matchLabels:
      app: myapp
  podMetricsEndpoints:
  - port: metrics
    interval: 30s

3. VictoriaMetrics原生CRDs(更强大的功能)

这是VictoriaMetrics特有的,比Prometheus Operator更丰富:

a) VMServiceScrape(类似ServiceMonitor但功能更强)(店j的)

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMServiceScrape
metadata:
  name: kafka-exporter-vm
spec:
  endpoints:
  - port: metrics
    interval: 30s
    params:
      extra_param: ["value"]  # 可以传递额外参数!
  selector:
    matchLabels:
      app: kafka-exporter

b) VMPodScrape(类似PodMonitor)

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
  name: myapp-pods
spec:
  podMetricsEndpoints:
  - port: metrics
    interval: 15s
    relabelConfigs:  # 支持重标记
    - action: replace
      targetLabel: cluster
      replacement: production
  selector:
    matchLabels:
      app: myapp

c) VMProbe(主动探测监控)

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMProbe
metadata:
  name: website-probe
spec:
  module: http_2xx  # 使用预定义的检查模块
  targets:
    staticConfig:
      static:
      - https://example.com
      - https://api.example.com
  interval: 60s

d) VMNodeScrape(节点监控)

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMNodeScrape
metadata:
  name: node-metrics
spec:
  scrapeInterval: 60s
  selector: {}  # 选择所有节点
  port: "9100"  # node-exporter端口
  path: /metrics

 

e) VMStaticScrape(静态目标监控)

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMStaticScrape
metadata:
  name: external-services
spec:
  targets:
  - https://api.external-service.com:9090/metrics
  - https://another-service.com:8080/actuator/prometheus
  scrapeInterval: 30s
  bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token

 

 

四、Prometheus的监控发现方式

1. ServiceMonitor方式(Operator风格)

# 这是您集群中使用的方式
# 但需要ServiceMonitor有特定标签(如 release: prometheus)
# 您的kafka-exporter ServiceMonitor缺少这个标签,所以可能不被采集

2. Pod注解方式(传统方式)

# 这是最传统的方式,直接在Pod/Service上加注解
# 您的redis-exporter Service就有这些注解:
annotations:
  prometheus.io/scrape: "true"
  prometheus.io/port: "9121"
  prometheus.io/path: "/metrics"

 

3. 静态配置方式

# 在Prometheus配置文件中直接写死目标
scrape_configs:
- job_name: 'static-targets'
  static_configs:
  - targets: ['server1:9100', 'server2:9100']

 

4. 文件服务发现

# 从文件动态加载目标
scrape_configs:
- job_name: 'file-sd'
  file_sd_configs:
  - files:
    - /etc/prometheus/targets/*.yaml

 

5. Kubernetes自动发现(原生Prometheus功能)

# Prometheus原生支持K8s服务发现
scrape_configs:
- job_name: 'kubernetes-pods'
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true

 












posted @ 2026-04-22 16:42  苦逼yw  阅读(13)  评论(0)    收藏  举报