大规模非容器环境如何丝滑的使用Prometheus

/ cncf / 2 条评论 / 3773浏览

背景

所谓规模大,就意味着尽量少手动,需要有分网段vpc,分prod和dev环境,能自动发现、自动注册的功能。

意味在Node_exporter安装上的那一刻,就开始自动添加到监控节点里面。或者也可以在主机第一次启动的时候,跟随主机镜像模版的去启动,如果你把node_exporter做到镜像里面的话。

Zabbix有Proxy,有自动注册,Prometheus也可以,可以联邦,可以主动注册,需要用到服务注册组件consul,可单点,可集群,采用Raft算法来做分布式一致性,和ETCD一样。

当然,这里得排除zabbix上手动添加的一个个脚本监控指标和站点检测指标,这些完全可以用一些简单的web框架来完成,下次再谈。

环境

Sys:Ubuntu 18.04 & Centos 7.6 (不重要)

Software:每台Supervisor 、每台Node_exporter、Consul 集群、Prometheus server、Grafana

install node_exporter

略,个人建议应该把一些基础性质的app直接装在镜像模版里面自启动,尤其是这种启动后不需要单独配置的

附上一个ansible roles,批量安装node_exporter,需要有supervisor环境,且配置文件需要include /opt/supervisord/etc,可以二改,很简单的几行

https://github.com/lijinghuatongxue/Blog_Example/tree/master/ansible/init_node_exporter

install consul

consul_cluster 安装笔记 简单粗暴型

验证集群状态

$ ./consul catalog nodes -service=consul
Node     ID        Address        DC
agent-1  9a736866  192.168.0.204  dc1
agent-2  eea84047  192.168.0.206  dc1
agent-3  65a43d5e  192.168.0.253  dc1

批量去注册

上一个粗糙的脚本,并发执行去嗅探9100端口是否打开,打开便开始批量注册,会在很短的几秒钟内完成对255个ip完成嗅探和注册,当然ip的获取可以有多种方式,也可以通过api从云平台获取最新的ip列表

代码位置:https://github.com/lijinghuatongxue/Blog_Example/tree/master/consul_prometheus

$ /Blog_Example/consul_prometheus# tree -l
.
├── auto_register.sh
├── dev_consul.json
├── dev_consul.json.tem
├── ip_list
├── prod_consul.json
└── prod_consul.json.tem

灵活使用,也可以把白名单拆出来,可以做成定时任务。

手动通过json+api导入和删除

json

root@paa5-test:~# cat prod_consul.json
{
  "ID": "node-exporter-127.0.0.1",
  "Name": "node-exporter-127.0.0.1",
  "Tags": [
    "prom",
    "prod",
    "node-exporter"
  ],
  "Address": "127.0.0.1",
  "Port": 9100,
  "Meta": {
    "app": "spring-boot",
    "team": "appgroup",
    "project": "bigdata"
  },
  "EnableTagOverride": false,
  "Check": {
    "HTTP": "http://127.0.0.1:9100/metrics",
    "Interval": "10s"
  },
  "Weights": {
    "Passing": 10,
    "Warning": 1
  }
}
curl --request PUT --data @prod_consul.json http://192.168.0.204:8500/v1/agent/service/register?replace-existing-checks=1

命令行导入

$ curl -X PUT -d '{"id": "node_exporter-192.168.0.204","name": "node_exporter-192.168.0.204","address": "192.168.0.204","port": 9100,"tags": ["prom","prod","node"],"checks": [{"http": "http://192.168.0.204:9100/metrics","interval": "35s"}]}' http://192.168.0.204:8500/v1/agent/service/register

命令行删除

curl -X PUT http://192.168.0.204:8500/v1/agent/service/deregister/node_exporter-192.168.0.204

prometheus 配置consul模块

我这里分为 prod 环境 和 dev环境,方便后期根据不同的环境去绑定模版

192.168.0.253是我的conusl ip之一,regex 抓取关键的tag去绑定不同的job,和前面的json对应。

···
- job_name: 'consul-prod'
    consul_sd_configs:
      - server: '192.168.0.253:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_service]
        regex: "consul"
        action: drop
      - source_labels: [__meta_consul_tags]
        regex: .*prom,prod,.*
        action: keep
      - source_labels: [__meta_consul_service]
        target_label: job
  - job_name: 'consul-dev'
    consul_sd_configs:
      - server: '192.168.0.253:8500'
    relabel_configs:
      - source_labels: [__meta_consul_service]
        regex: "consul"
        action: drop
      - source_labels: [__meta_consul_tags]
        regex: .*prom,dev,.*
        action: keep
      - source_labels: [__meta_consul_service]
        target_label: job
···

重启prometheus便可以获取node_exporter节点了

consul 可以使用的元标签:

__meta_consul_address:目标的地址
__meta_consul_dc:目标的数据中心名称
__meta_consul_tagged_address_<key>:每个节点标记目标的地址键值
__meta_consul_metadata_<key>:目标的每个节点元数据键值
__meta_consul_node:为目标定义的节点名称
__meta_consul_service_address:目标的服务地址
__meta_consul_service_id:目标的服务ID
__meta_consul_service_metadata_<key>:目标的每个服务元数据键值
__meta_consul_service_port:目标的服务端口
__meta_consul_service:目标所属服务的名称
__meta_consul_tags:标记分隔符连接的目标的标记列表

Demo

  1. saw

    收获了。谷歌了半天 consul prometheus 自动注册

    回复
  2. 牛逼 大佬

    回复