Prometheus服务发现机制

Prometheus与服务发现

云原生、容器场景下按需的资源使用方式对于监控系统而言就意味着没有了一个固定的监控目标,所有的监控对象(基础设施、应用、服务)都在动态的变化,这对基于Push模式传统监控软件带来挑战。

对于Prometheus这一类基于Pull模式的监控系统,显然也无法继续使用的static_configs的方式静态的定义监控目标。而对于Prometheus而言其解决方案就是引入一个中间的代理人(服务注册中心),这个代理人掌握着当前所有监控目标的访问信息,Prometheus只需要向这个代理人询问有哪些监控目标控即可, 这种模式被称为服务发现。

通过服务发现的方式,管理员可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息。

Prometheus服务发现机制

Prometheus数据源的配置主要分为静态配置和动态发现,常用的为以下几类:

  • static_configs: #静态服务发现
  • file_sd_configs: #文件服务发现
  • dns_sd_configs: #DNS 服务发现
  • kubernetes_sd_configs: #Kubernetes 服务发现
  • consul_sd_configs: #Consul 服务发现(推荐使用)

static_configs: 静态服务发现

prometheus.yaml配置文件:

1
2
3
4
5
6
7
8
9
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'grafana'
static_configs:
- targets:
- 'grafana-service.ns-monitor:3000'
- job_name: 'kubernetes-apiservers'

file_sd_configs: 文件服务发现

基于文件的服务发现方式不需要依赖其他平台与第三方服务,用户只需要将新的target信息以yamljson文件格式添加到target文件中,Prometheus会定期从指定文件中读取target信息并更新。

target文件:

1
vim targets.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"targets": ["192.168.20.136:9100"],
"labels": {
"instance": "nodeone",
"job": "expor_test1"
}
},
{
"targets": ["192.168.20.137:9100"],
"labels": {
"instance": "nodetwo",
"job": "expor_test2"
}
}
]

prometheus.yaml配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
scrape_configs:
- job_name: 'file_sd' #此处定义自动发现的采集任务
file_sd_configs:
- files:
- targets.json #采集文件名
````

查看web界面`targets`出现`targets.json`所定义的2个job

### dns_sd_configs: DNS服务发现

忽略

### kubernetes_sd_configs: Kubernetes服务发现

#### Kubernetes服务发现配置

对于`Kubernetes`而言,`Promethues`通过与`Kubernetes API`交互,然后轮询资源端点。目前主要支持5种服务发现模式,分别是:

- `Node`
- `Service`
- `Pod`
- `Endpoints`
- `Ingress`

对应配置文件中的`role: node` / `role: service`

动态获取所有节点`node`的信息,可以添加如下配置:

- `role: node`

```yml
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
  • role: endpoints
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name

对应的servicepod也是同样的方式

需要注意的是,为了能够让Prometheus能够访问收到Kubernetes API,我们要对Prometheus进行访问授权,即serviceaccount。否则就算配置了,也没有权限获取。

Prometheus 的relabel_configs配置详解

(1)source_labels:源标签,没有经过relabel处理之前的标签名字
(2)target_label:通过action处理之后的新的标签名字
(3)regex:正则表达式,匹配源标签
(4)replacementreplacement指定替换后的标签(target_label)对应的数值
(5)actionaction定义了relabel的动作,action支持多种,如下:

  • replace: 替换标签值,根据regex正则匹配到源标签的值,并把匹配的值写入到目的标签中
  • keep: 满足regex正则条件的实例进行采集,把source_labels中没有匹配到regex正则内容的Target实例丢掉
  • drop:满足regex正则条件的实例不采集,把source_labels中匹配到regex正则内容的Target实例丢掉
  • labeldrop:对抓取到的符合过滤规则的target标签进行删除
  • labelkeep:对抓取到的符合过滤规则的target标签进行保留
  • labelmap: 会根据regex的定义去匹配Target实例所有标签的名称,并且以匹配到的内容为新的标签名称,其值作为新标签的值
  • hashmod: 设置target_labelmodulus连接的哈希值source_labels

consul_sd_configs: Consul服务发现

Consul是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。
Consul提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。
之前我们通过Prometheus实现监控,当新增一个Target时,需要变更服务器上的配置文件,即使使用file_sd_configs配置,也需要登录服务器修改对应Json文件,会非常麻烦。

prometheus.yml配置:

1
2
3
4
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: '192.168.12.16:8500'
services: []

说明一下:这里需要使用consul_sd_configs来配置使用Consul服务发现类型,serverConsul的服务地址。配置完毕后,重启Prometheus服务