1. Consul

consul是hashicorp公司的产品,是比较知名的服务注册中心。早期的kubernetes,service mesh的解决方案之一,consul template就是基于consul的。目前他和etcd,zookeeper一起作为三种最流行的服务注册中心的解决方案。

Prometheus可以通过拉取consul中的服务信息,从而把要监控的endpoint信息拿到prometheus当中。省去了我们手动修改prometheus的静态配置文件的麻烦,实现了服务动态注册服务,而不需要重新启动prometheus来更改被监控端。

Prometheus天生支持service discovery的模式,我们要用到的是consul_sd模块。通过consul来探测exporter是不是正常工作,而不是由prometheus来直接探测。consul集群架构如下

consul_ha

由于consul天生支持内网和外网探测两种方式,还自带集群模式,可以说是DC中prometheus的最好搭档。当然,还有一种模式也非常不错,就是通过DNS。

2. 搭建Consul集群

下载consul二进制包

wget https://releases.hashicorp.com/consul/1.12.2/consul_1.12.2_linux_amd64.zip
unzip consul_1.12.2_linux_amd64.zip
mv consul /usr/local/sbin/

初始化目录

mkdir -p /app/consul/{data,log}
mkdir /etc/consul

编辑/etc/systemd/system/consul-server.service

[Unit]
Description=Consul service
Documentation=https://www.consul.io/docs/
After=network.target
    
[Service]
ExecStart=/usr/local/sbin/consul agent -config-dir /etc/consul
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
LimitNOFILE=20480000
    
[Install]
WantedBy=multi-user.target

编辑/etc/consul/server.json

{
  "data_dir": "/app/consul/data",
  "log_file": "/app/consul/log/consul.log",
  "log_level": "INFO",
  "log_rotate_duration": "24h",
  "node_name": "node1",
  "server": true,
  "bootstrap_expect": 3,
  "client_addr": "0.0.0.0",
  "advertise_addr": "10.0.1.11",
  "bind_addr": "0.0.0.0",
  "start_join": ["10.0.1.11"],
  "datacenter": "internal",
  "ui": true,
  "limits":
  {
    "rpc_max_conns_per_client": 1000,
    "http_max_conns_per_client": 1000
  },
  "telemetry":
  {
    "prometheus_retention_time": "60s"
  }
}

在实际的生产上,我们还会考虑到安全的问题,比如通讯加密,认证token等等,有兴趣的同学可以参考这个https://learn.hashicorp.com/collections/consul/security,我们后面有时间会详细说。

3. 注册endpoint的信息

consul是使用api来进行管理的,虽然consul命令本身可以实现管理,但是本质依然是调用API,这个和kubernetes有一点像。我们就使用直接调用api的方式来把需要注册的信息传入consul中。

我们来注册一个node_exporter的信息curl --request PUT --data @node2.json http://10.0.1.12:8500/v1/agent/service/register

{
      "id": "node_exporter-node2",
      "name": "node_exporter-node2",
      "address": "10.0.1.12",
      "port": 9100,
      "tags": ["node_exporter"],
      "meta": {
      	"project": "monitoring"
      },
      "checks": [{
        "http": "http://10.0.1.12:9100/metrics",
        "interval": "5s"
      }]
}

4. 配置Prometheus读取Consul的信息

Consul和Prometheus的结合方式是通过consul_sd来实现的。

global:
  scrape_interval:     1m
  evaluation_interval: 1m
  external_labels:
    monitor: APSI
    replica: A
    
scrape_configs:
  - job_name: 'prometheus'
    file_sd_configs:
    - files:
      - /etc/prometheus/targets/prometheus/*.yml
      
  - job_name: 'consul-node-exporter'
    consul_sd_configs:
      - server: '10.0.1.11:8500'
        services: []
      - server: '10.0.1.12:8500'
        services: []
      - server: '10.0.1.13:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*node_exporter.*
        action: keep
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap