随着 Prom 监控的体量越来越大,每次加入新的监控指标接口,都要手动的在 prometheus.yml
文件中添加内容,每次还要重新加载,维护管理起来也是鸡肋的存在,Prom 有原生支持的监控服务发现
Prom 常见的服务发现分为以下 3 种:
基于文件的服务发现
基于 Consul 的服务发现
基于 Kubernetes 的服务发现
基于文件的服务发现
在 Prom 的配置文件中添加 file_sd_configs
字段配置
$ vim /opt/monitoring/prometheus/prometheus.yml
# 在 scrape_configs: 下添加
- job_name: "file_sd" # 名字可以写一个比较有规则性的
file_sd_configs: # 文件服务发现的配置
- files: ['/opt/monitoring/prometheus/file_sd/*.yml'] # 指定通过哪个文件进行服务发现
refresh_interval: 15s # 每隔多长时间检测一遍文件,自动服务发现全靠这个配置
$ systemctl reload prometheus
编写文件服务发现的内容
$ mkdir /opt/monitoring/prometheus/file_sd
$ cat > /opt/monitoring/prometheus/file_sd/node.yml << EOF
- targets: ['192.168.1.11:9100', '192.168.1.12:9100', '192.168.1.13:9100']
EOF
这种模式我感觉像 ansible 的 playbook 的 task 一样,写一个 main.yml ,剩下的使用 include 的形式。
等待检测文件时长后,进入 prom 的 url 进行查看
基于 Consul 的服务发现
通过使用文件的服务发现可以感觉到,其实只是省去了加载文件的繁琐,手动录入并没有减少多少工作量。
Consul 是个分布式的服务发现和 key/value
存储系统
Prometheus 是通过 Consul 来获取被监控端的 Exporter 的监控数据的,每新起一个服务就会通过配置自动注册到 Consul 中供 Prom 使用
Consul 我不太熟,自己悄悄拿 helm 部署了一个。二进制的部署方式可以参考:Consul 微服务注册
配置 Consul API 到 Exporter 中,自动注册到 Consul
curl -X PUT -d '{"id": "k8s-01","name": "k8s","address": "192.168.1.11","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.11:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register
# "name": "k8s" 分组
# "id": "k8s-01" 组内主机名
curl -X PUT -d '{"id": "k8s-02","name": "k8s","address": "192.168.1.12","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.12:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register
curl -X PUT -d '{"id": "k8s-03","name": "k8s","address": "192.168.1.13","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.13:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register
在 Prom 的配置文件中添加 consul_sd_configs
字段配置
$ vim /opt/monitoring/prometheus/prometheus.yml
# 在 scrape_configs: 下添加
- job_name: "consul_sd"
consul_sd_configs:
- server: 192.168.1.11:32427 # Consul地址
services: ['k8s'] # Consul 服务组
$ systemctl reload prometheus
查看 Prom 界面的 Consul 自动注册效果
基于 Kubernetes 的服务发现
prom 配置
- job_name: 'xxx'
kubernetes_sd_configs:
- role: pod # 自动注册到prom的k8s资源
namespaces:
names:
- prod # 指定命名空间的pod进行自动注册
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] # 识别pod中的注解,用作自动注册
action: keep
regex: "true"
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] # 识别pod中的注解,用作自动注册
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] # 识别pod中的注解,用作自动注册
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
# 以下的label则是一些基于k8s的指标lable
- source_labels: [__meta_kubernetes_pod_name]
separator: ;
regex: (.+)
target_label: pod_name
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_namespace]
separator: ;
regex: (.+)
target_label: namespace
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_label_app]
separator: ;
regex: (.+)
target_label: app
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_label_version]
separator: ;
regex: (.+)
target_label: version
replacement: $1
action: replace
deployment 中配置注解
spec:
template:
metadata:
annotations:
# 以下三项就是上面prom配置中需要识别的内容
prometheus.io/path: /actuator/prometheus # 获取指标的uri路径
prometheus.io/port: '9095' # 指标暴露的端口
prometheus.io/scrape: 'true' # 是否开启prom自动注册
pod 中配置注解
metadata:
annotations:
prometheus.io/path: /actuator/prometheus
prometheus.io/port: '9095'
prometheus.io/scrape: 'true'
配置好重启 prom 即可
自动化监控思路
当有大量服务器需要进行自动化监控,首先需要使用自动化工具批量部署相关 exporter,将部署好的 exporter 所在机器的 ip 和 端口注册到 Consul,Prom 从 Consul 获取 exporter 的 ip 和端口即可