在之前我们的服务发现是通过在prometheus.yml文件中配置以下的ip+端口来抓取的
但这种方法在监控主机较少的情况下还行,但不适合大规模的集群
尤其不适合用于使用容器和基于云的实例的动态集群,这些实例经常会出现变化的,创建或消耗的情况
Prometheus通过使用"服务发现"来通过自动化的机制来检测、分类和试别新的变更的目标。
服务发现分类
#服务发现的方法大致有以下3种
1. file_sd_configs #基于文件列表来服务发现
2. dns_sd_configs #使用dns记录以返回目标列表
3. kubernetes_sd_configs #查询api以获取目标列表(k8s) 后面说
一. 基于文件的服务发现
这些文件是可以yaml的或json格式,包含定义的目标列表,就像我们在静态配置中定义的一样。
我们将现有的环境中的主机迁入到文件中,如下我们先转换node和docker
指定主机文件路径
vi prometheus.yml
- job_name: 'node'
# static_configs: #注释
# - targets: ['192.168.1.21:9100','192.168.1.20:9100'] #注释
#添加
file_sd_configs:
- files:
- targets/nodes/node.json #匹配节点所在的文件
refresh_interval: 5m #5分钟检测一次
- job_name: 'docker'
# static_configs: #注释
# - targets: ['192.168.1.20:8081'] #注释
#添加
file_sd_configs:
- files:
- targets/dockers/docker.json
refresh_interval: 5m
#检查语法
promtool check config /etc/prometheus/prometheus.yml
#重载配置
systemctl restart prometheus
添加主机文件
#创建主机目录
mkdir /etc/prometheus/targets/{nodes,docker} -p
#创建node主机文件
cat > /etc/prometheus/targets/nodes/node.json <<EOF
[
{
"targets": [
"192.168.1.20:9100",
"192.168.1.21:9100"
]
}
]
EOF
#创建docker文件
cat > /etc/prometheus/targets/dockers/docker.json <<EOF
[
{
"targets": [
"192.168.1.20:8081"
]
}
]
EOF
这个是自发现的,添加完主机后无需重启服务
二. 基于dns的服务发现
如果基于文件的服务发现不适合你,或者你的源或服务不支持任何现有的服务发现工具,则可以选择基于DNS的服务发现。
DNS服务发现允许你指定DNS条目列表,然后查询这些条目中的记录以发现目标列表。它依赖于A、AAAA或SRV DNS记录查询
1. 部署dns解析
#拉取阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安装dns
yum -y install bind
#基本配置
vim /etc/named.conf
#修改
12 options {
13 listen-on port 53 { any; }; #修改为作为dns的地址
21 allow-query { any; }; #允许所有节点来解析
添加解析文件
#添加正向解析文件
cat >> /etc/named.rfc1912.zones <<EOF
zone "test.com" IN {
type master;
file "test.com.zone";
};
EOF
#添加区域文件
cat > /var/named/test.com.zone <<EOF
\$TTL 1D
@ IN SOA www.test.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS www.test.com.
A 127.0.0.1
www A 192.168.1.20
EOF
#检查配置
named-checkzone test.com /var/named/test.com.zone
#启动服务
systemctl restart named
#3台主机指定dns服务器(默认应该是有个114的,放他上面)
sed -i "1 i\nameserver 192.168.1.20" /etc/resolv.conf
#测试解析
[root@k8s-master01 named]# nslookup www.test.com
Server: 192.168.1.20
Address: 192.168.1.20#53
Name: www.test.com
Address: 192.168.1.20
2. 测试
vi /etc/prometheus/prometheus.yml
29 - job_name: 'grafana'
30 # static_configs:
31 # - targets: ['192.168.1.20:3000'] #注释掉静态服务发现
32 dns_sd_configs: #改用dns服务发现
33 - names: [ 'www.test.com' ]
34 type: A #正向解析
35 port: 3000
重启服务
systemctl restart prometheus
还有一种是SRV记录的,但是没研究过。这里就不误导了o(* ̄▽ ̄*)o