6 服务发现
6.1 服务发现原理
6.2 文件服务发现
#准备主机节点列表文件,可以支持yaml格式和json格式 #注意:此文件不建议就地编写生成,可能出现加载一部分的情况 cat targets/prometheus*.yaml - targets: - master1:9100 labels: 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 文件服务发现案例
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:9090 labels: app: prometheus-server job: prometheus-server ]#vim prometheus-node.yml - targets: - 10.0.0.151:9100 labels: app: prometheus job: prometheus - targets: - 10.0.0.152:9100 - 10.0.0.153:9100 - 10.0.0.154:9100 labels: app: node-exporter job: 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.yml refresh_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:9100 labels: app: prometheus job: prometheus - targets: - 10.0.0.152:9100 #删除10.0.0.154:9100 - 10.0.0.153:9100 labels: app: node-exporter job: node #10秒后在Prometheus网页http://10.0.0.151:9090/能看到对应监控少了一个
6.2.2.2 案例: JSON 格式
#可以利用工具或者网站将前面的YAML格式转换为JSON格式 #安装工具 yaml2json #网站 http://www.json2yaml.com/ #其他配置方法和上面yaml一样
6.3 DNS 服务发现
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.2 nameservers: #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 #指定记录类型,默认SRV port: 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 Consul 服务发现
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 Consul 自动注册和删除服务
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>
6.4.3.2 使用consul services命令注册和注销服务
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>
6.4.4 配置 Prometheus 使用 Consul 服务发现
[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网页上也可以看到变更
6.4.2.2 部署 Consul 集群
Consul 集群架构
起步3个节点
6.4.2.2.2 Consul 部署
6.4.2.2.2.1 二进制部署 Consul 集群