6 服务发现
6.1 服务发现原理
#准备主机节点列表文件,可以支持yaml格式和json格式 #注意:此文件不建议就地编写生成,可能出现加载一部分的情况 cat targets/prometheus*.yaml - targets:- master1:9100labels:app: prometheus#修改prometheus配置文件自动加载实现自动发现 cat prometheus.yml ......- job_name: 'file_sd_prometheus'scrape_interval: 10s #指定抓取数据的时间间隔,默认继取全局的配置15s file_sd_configs:- files: #指定要加载的文件列表- targets/prometheus*.yaml #要加载的yml或json文件路径,支持glob通配符,相对路径是相对于prometheus.yml配置文件路径refresh_interval: 2m #每隔2分钟重新加载一次文件中定义的Targets,默认为5m#注意:文件格式都是yaml或json格式
6.2.2.1 案例: YAML 格式
范例: 通过yaml格式的文件发现,将所有的节点都采用自动发现机制
#创建目标目录 ]#mkdir /usr/local/prometheus/conf/targets ]#cd /usr/local/prometheus/conf/targets#创建prometheus的服务配置 ]#vim prometheus-server.yml - targets:- 10.0.0.151:9090labels:app: prometheus-serverjob: prometheus-server]#vim prometheus-node.yml - targets:- 10.0.0.151:9100labels:app: prometheusjob: prometheus - targets:- 10.0.0.152:9100- 10.0.0.153:9100- 10.0.0.154:9100labels:app: node-exporterjob: node#编辑配置文件 ]#vim /usr/local/prometheus/conf/prometheus.yml rule_files: scrape_configs:...- job_name: 'prometheues-file-sd'file_sd_configs:- files:- targets/prometheus-server.yml #相对prometheus.yml的路径(可以写绝对路径)refresh_interval: 10s #10秒会去检查是否发生变化- job_name: 'nodeexporter-file-sd'file_sd_configs:- files:- targets/prometheus-node.ymlrefresh_interval: 10s#检查语法 ]#promtool check config /usr/local/prometheus/conf/prometheus.yml [root@prometheus targets]#systemctl reload prometheus.service#修改配置(测试动态更新的功能) ]#vim prometheus-node.yml - targets:- 10.0.0.151:9100labels:app: prometheusjob: prometheus - targets:- 10.0.0.152:9100 #删除10.0.0.154:9100- 10.0.0.153:9100labels:app: node-exporterjob: node #10秒后在Prometheus网页http://10.0.0.151:9090/能看到对应监控少了一个
6.2.2.2 案例: JSON 格式
#可以利用工具或者网站将前面的YAML格式转换为JSON格式 #安装工具 yaml2json #网站 http://www.json2yaml.com/#其他配置方法和上面yaml一样
6.3.2 DNS服务发现案例
6.3.2.1 部署和配置 DNS
#通过脚本部署 ]#vim install_dns.sh HOST_LIST=" prometheus 10.0.0.151 node1 10.0.0.152 node2 10.0.0.153 node3 10.0.0.154" ... #安装dns服务 [root@prometheus ~]#bash install_dns.sh#修改Prometheus的dns地址为配置的dns服务地址 ]#vim /etc/netplan/00-installer-config.yaml network:ethernets:ens33:addresses: [10.0.0.151/24]gateway4: 10.0.0.2nameservers:#addresses: [223.6.6.6,223.5.5.5]addresses: [127.0.0.1]version: 2[root@prometheus bind]#netplan apply #确认dns解析效果 dig master.wang.org host master.wang.org
6.3.2.2 配置 DNS服务支持 SRV 记录
#添加SRV记录 (靠SRV记录做服务发现的) [root@prometheus bind]#vim /etc/bind/wang.org.zone ... node1 A 10.0.0.152 node2 A 10.0.0.153 node3 A 10.0.0.154 flask A 10.0.0.151 #直接添加一个a记录 #添加下面的SRV记录,对应上面的三条A记录 #wang.org.是域名,可以省略不写;1H是有效期;10:有效期;10:权重;9100端口;node1.wang.org:目标 _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node1.wang.org. _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node2.wang.org. _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node3.wang.org.#格式: #RFC2782中对于SRV的定义格式是: #_Service._Proto.Name TTL Class SRV Priority Weight Port Target#bind服务重新生效 [root@prometheus bind]#rndc reload
6.3.2.3 配置 Prometheus 使用 DNS
# vim /usr/local/prometheus/conf/prometheus.yml scrape_configs:- job_name: "prometheus".......#添加下面所有行- job_name: 'dns_sd_flask' #实现单个主机定制的信息解析,也支持DNS或/etc/hosts文件实现解析 dns_sd_configs:- names: ['flask.wang.org']type: A #指定记录类型,默认SRVport: 8000 #不是SRV时,需要指定Port号 refresh_interval: 10s- job_name: 'dns_sd_node_exporter' #实现批量主机解析 dns_sd_configs:- names: ['_prometheus._tcp.wang.org'] #SRV记录必须通过DNS的实现refresh_interval: 10s #指定DNS资源记录的刷新间隔,默认30s#检查语法 ]#promtool check config /usr/local/prometheus/conf/prometheus.yml [root@prometheus bind]#systemctl reload prometheus.service#prometheus网页上就能看到dns发现的服务#修改看看是否自动更新 [root@prometheus bind]#vim /etc/bind/wang.org.zone ... node1 A 10.0.0.152 #node2 A 10.0.0.153 #删掉该记录 node4 A 10.0.0.156 #改成node4 flask A 10.0.0.100 #修改值 _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node1.wang.org. _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node2.wang.org. _prometheus._tcp.wang.org. 1H IN SRV 10 10 9100 node4.wang.org. #改成node4#bind服务重新生效,让dns配置生效 [root@prometheus bind]#rndc reload#在Prometheus网页http://10.0.0.151:9090/能看到对应监控已经变更
6.4.1 Consul 介绍
微服务下做服务发现(也能健康性检查)和配置管理(nacos是针对java微服务,consul针对所有语言微服务)
Consul自带一个Web UI管理系统
consul支持单机和高可用部署
Prometheus 基于的Consul服务发现过程:
6.4.2 Consul 部署
6.4.2.1 部署 Consul 单机
范例: Ubuntu 包安装 Consul
#Ubuntu2204内置consul源,直接安装 [root@ubuntu2204 ~]#apt list consul consul/jammy 1.8.7+dfsg1-3 amd64
6.4.2.1.2 二进制安装 Consul
#下载链接 https://releases.hashicorp.com/consul/[root@ubuntu2204 ~]#wget https://releases.hashicorp.com/consul/1.13.3/consul_1.13.3_linux_amd64.zip [root@ubuntu2204 ~]#unzip consul_1.13.3_linux_amd64.zip -d /usr/local/bin/ [root@ubuntu2204 ~]#ls /usr/local/bin/ consul#查看consul帮助 [root@ubuntu2204 ~]#consul#实现consul命令自动补全 [root@ubuntu2204 ~]#consul -autocomplete-install #重新登录生效 [root@ubuntu2204 ~]#exit [root@ubuntu2004 ~]#consul <TAB>#创建用户 [root@ubuntu2204 ~]#useradd -s /sbin/nologin consul #创建目录 [root@ubuntu2204 ~]#mkdir -p /data/consul /etc/consul.d [root@ubuntu2204 ~]#chown -R consul.consul /data/consul /etc/consul.d#以server模式启动服务cosnul agent [root@ubuntu2204 ~]#/usr/local/bin/consul agent -server -ui -bootstrap-expect=1 -data-dir=/data/consul -node=consul -client=0.0.0.0 -config-dir=/etc/consul.d -server #定义agent运行在server模式 -bootstrap-expect #在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用 -bind:#该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 -node:#节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名 -ui #提供web ui的http功能 -rejoin #使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。 -config-dir #配置文件目录,里面所有以.json结尾的文件都会被加载 -client #consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,要对外提供服务改成0.0.0.0#创建service文件 [root@ubuntu2204 ~]#cat > /lib/systemd/system/consul.service <<EOF [Unit] Description="HashiCorp Consul - A service mesh solution" Documentation=https://www.consul.io/ Requires=network-online.target After=network-online.target[Service] Type=simple User=consul Group=consul ExecStart=/usr/local/bin/consul agent -server -bind=10.0.0.100 -ui -bootstrap-expect=1 -data-dir=/data/consul -node=consul -client=0.0.0.0 -config-dir=/etc/consul.d #ExecReload=/bin/kill --signal HUP \$MAINPID KillMode=process KillSignal=SIGTERM Restart=on-failure LimitNOFILE=65536[Install] WantedBy=multi-user.target EOF[root@ubuntu2204 ~]#systemctl daemon-reload [root@ubuntu2204 ~]#systemctl enable --now consul.service#启动成功后,可以访问下面链接 http://10.0.0.153:8500
6.4.3.1 Consul常用API接口
#列出数据中心 curl http://10.0.0.153:8500/v1/catalog/datacenters #列出节点 curl http://10.0.0.153:8500/v1/catalog/nodes #列出服务 curl http://10.0.0.153:8500/v1/catalog/services #指定节点状态 curl http://consul.wang.org:8500/v1/health/node/node2 #列出服务节点 curl http://consul.wang.org:8500/v1/catalog/service/<service_id> #提交Json格式的数据进行注册服务 curl -X PUT -d '{"id": "myservice-id","name": "myservice","address": "10.0.0.151","port": 9100,"tags": ["service"],"checks": [{"http": "http://10.0.0.151:9100/","interval": "5s"}]}' http://10.0.0.153:8500/v1/agent/service/register#也可以将注册信息保存在json格式的文件中,再执行下面命令注册 cat nodes.json {"id": "myservice-id","name": "myservice","address": "10.0.0.151","port": 9100,"tags": ["service"],"checks": [{"http": "http://10.0.0.151:9100/","interval": "5s"}] } curl -X PUT --data @nodes.json http://10.0.0.153:8500/v1/agent/service/register#查询指定节点以及指定的服务信息 curl http://10.0.0.153:8500/v1/catalog/service/<service_name> #删除服务,注意:集群模式下需要在service_id所有在主机节点上执行才能删除该service curl -X PUT http://10.0.0.153:8500/v1/agent/service/deregister/<service_id>
consul services register命令也可用于进行服务注册,只是其使用的配置格式与直接请求HTTP API有所 不同。
#注册服务 consul services register /path/file.json#/path/file.json文件内容 #示例: 定义了单个要注册的服务。 {"service": {"id": "myservice-id","name": "myservice","address": "node1.wang.org","port": 9100,"tags": ["node_exporter"],"checks": [{"http": "http://node1.wang.org:9100/metrics","interval": "5s"}]} } #示例: 以多个的服务的格式给出了定义 {"services": [{"id": "myservice1-id","name": "myservice1","address": "node1.wang.org","port": 9100,"tags": ["node_exporter"],"checks": [{"http": "http://node1.wang.org:8080/metrics","interval": "5s"}]},{"id": "myservice1-id","name": "myservice2","address": "node2.wang.org","port": 9100,"tags": ["node_exporter"],"checks": [{"http": "http://node2.wang.org:8080/metrics","interval": "5s"}]},{.......}] }#注销服务 consul services deregister -id <SERVICE_ID>
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml ......- job_name: 'consul'honor_labels: true #如果标签冲突,覆盖Prometheus添加的标签,保留原标签 consul_sd_configs:- server: '10.0.0.153:8500' #consul服务地址services: [] #指定需要发现的service名称,默认为空表示要所有service#tags: #可以过滤具有指定的tag的service#- "service" #refresh_interval: 2m #刷新时间间隔,默认30s#- server: 'consul-node2.wang.org:8500' #如果是集群,添加其它两个节点实现冗余#- server: 'consul-node3.wang.org:8500' relabel_configs: #通过Consul动态发现带的源标签生成新的标签方便以后使用- source_labels: ['__meta_consul_service'] #生成新的标签名target_label: 'consul_service'- source_labels: ['__meta_consul_dc'] #生成新的标签名target_label: 'datacenter' - source_labels: ['__meta_consul_tags'] #生成新的标签名target_label: 'app'- source_labels: ['__meta_consul_service'] #删除consul的service,此service是consul内置,但并不提供metrics数据regex: "consul"action: drop#--------------------------------------------------------------------------------- #通过Consul动态发现的服务实例还会包含以下Metadata标签信息: __meta_consul_address #consul地址 __meta_consul_dc #consul中服务所在的数据中心 __meta_consulmetadata #服务的metadata __meta_consul_node #服务所在consul节点的信息 __meta_consul_service_address #服务访问地址 __meta_consul_service_id #服务ID __meta_consul_service_port #服务端口 __meta_consul_service #服务名称 __meta_consul_tags #服务包含的标签信息 #---------------------------------------------------------------------------------#检查语法 ]#promtool check config /usr/local/prometheus/conf/prometheus.yml [root@prometheus ~]#systemctl reload prometheus.service #在Prometheus网页上可以看到监控的consul组#Consul变更,Prometheus网页上也可以看到变更
Consul 集群架构
起步3个节点
6.4.2.2.2 Consul 部署
6.4.2.2.2.1 二进制部署 Consul 集群