官方地址:
www.consul.io
二进制部署:
[root ~]# wget https://releases.hashicorp.com/consul/1.10.2/consul_1.10.2_linux_amd64.zip
[root ~]# unzip consul_1.7.2_linux_amd64.zip
[root ~]# mkdir /usr/local/consul
[root ~]# mv consul /usr/local/consul/
[root ~]# mkdir /var/consul/logs -p
[root ~]# mkdir /var/consul/data -p
配置文件:
[root@centos7 consul]# cat consul.json
{
"datacenter": "consul",
"data_dir": "/var/consul/data",
"log_file": "/var/consul/logs/consul.log",
"log_level": "INFO",
"node_name": "consul",
"server": true,
"ui": true,
"bootstrap_expect": 1,
"bind_addr": "192.168.168.155", #本机ip
"client_addr": "0.0.0.0",
"raft_protocol": 3,
"enable_debug": false,
"rejoin_after_leave": true,
"enable_syslog": false
}
systemctl启动
[Unit]
Description=Consul
Documentation=https://www.consul.io/
[Service]
ExecStart=/usr/local/consul/consul agent -config-dir=/usr/local/consul
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
注册服务
使用json方式
{
"id":"node-exporter",
"name":"prometheus-02",
"address":"192.168.168.158",
"port":9100,
"tags":[
"node-export"
],
"meta":{
"instance":"prometheus",
"group":"demo"
},
"checks":[
{
"http":"http://192.168.168.158:9100/metrics",
"interval":"5s"
}
]
}
curl -x -X PUT -d @./node_exporter.json http://192.168.168.156:8500/v1/agent/service/register
#curl方式
curl -X PUT -d '{"id": "node-exporter","name": "prometheus-01","address": "192.168.168.156","port": 9100,"tags": ["node-export"],"meta": {"instance": "prometheus", "group": "demo"}, "checks": [{"http": "http://192.168.168.156:9100/metrics", "interval": "5s"}]}' http://192.168.168.155:8500/v1/agent/service/register
注销掉某个注册的服务
curl -X PUT http://192.168.168.155:8500/v1/agent/service/deregister/${consul 上 services的名称}
示例 prometheus.yaml配置
- job_name: 'consul-node-export' #Targets
consul_sd_configs: #使用consul 服务发现
- server: '192.168.168.155:8500' #consul服务地址
services: [] #
refresh_interval: 3s # 刷新间隔
relabel_configs: #自定义标签及分类
- source_labels: [__meta_consul_tags] #会匹配json里注册的tags数据
regex: .*node-export.* #匹配tags为node-export的
action: keep # 丢弃没有匹配到 regex 正则表达式内容的 Target
- source_labels: [__meta_consul_service_metadata_group] #匹配json注册的数据metadata 下key为group
target_label: 'group' #就使用json里group的value
relabel_configs 官方文档https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
示例 注册到consul的服务
{
"id":"prometheus-01", #唯一可以是ip地址也可以是主机名
"name":"node-export", #最好是和prometheus.yaml 里的job_name 一致好区分
"address":"192.168.168.156", #注册服务的IP地址
"port":9100, #注册服务的端口 node-export的端口其他的export就写其他的端口
"tags":[ #为了进行过滤
"node-export"
],
"meta":{ #自定义元数据
"instance":"prometheus", #这里写了 但是peometheus没有写不会生效还是默认的
"group":"demo" #对应上面的prometheus.yaml的 source_labels
},
"checks":[ #健康检查
{
"http":"http://192.168.168.156:9100/metrics", #就是export暴露的指标
"interval":"5s"
}
]
}
批量注册脚本(exporter的端口还需要完善)
#!/bin/bash
export=$1
if [ $# -lt 1 ];then
echo "please enter; please input [node=node-exporter] [memcached=memcached-exporter]"
exit -1
fi
host=`hostname`
machine_physics_net=$(ls /sys/class/net/ | grep -v "`ls /sys/devices/virtual/net/`")
IP=$(ip addr | grep "$machine_physics_net" | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
put_consul="http://192.168.168.155:8500/v1/agent/service/register"
if [ "$export"x == "node"x ];then
port='9100'
elif [ "$expor"x == "memcached"x ]
port='9150'
fi
curl -X PUT -d '{"id": "'${host}'","name": "'${export}'","address": "'${IP}'","port": '${port}',"tags": ["'${export}'"],"meta": {"node": "nginx-server", "group": "manager"}, "checks": [{"http": "http://'${export}':'${port}'/metrics", "interval": "5s"}]}' ${put_consul} > /dev/null 2>&1 && echo -e "\033[92m $IP 注册成功 \033[0m"