一、Prometheus(CNCF 毕业项目)
核心特点
架构组件
┌─────────┐ 拉取 ┌─────────────┐ 写入 ┌────────────┐
│ 应用/服务├───────────►│ Prometheus ├───────────►│ 本地TSDB │
└─────────┘ (HTTP) └─────────────┘ └────────────┘
│ │
│ 服务发现 │ 查询/告警
└─────────────────────────┘ │
┌─────▼─────┐
│ Alertmanager │
└────────────┘
存储原理
二、VictoriaMetrics
核心特点
架构组件
单机版: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