Prometheus03 Prometheus服务发现, 各种exporter, 容器化监控, Federation联邦, VictoriaMetrics远程存储

news/2025/1/16 7:50:48/文章来源:https://www.cnblogs.com/ludingchao/p/18518005

6 服务发现

6.1 服务发现原理

6.2 文件服务发现

#准备主机节点列表文件,可以支持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 文件服务发现案例

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 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.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 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 集群

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824688.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DRF

1.DRF组件 详细文档:见附件 1.1 Web应用模式 在开发web应用中,有两种应用模式: 1.前后端不分离【客户端看到的内容和所有页面效果都是由服务端提供出来的】2.前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,Python服务端只需要返回数据即可)】 前端形成一…

css_repeating-linear-gradient

在不指定背景颜色渲染区间的情况下, repeating-linear-gradient与linear-gradient的没有区别<div class="test test1"></div> <div class="test test2"></div>.test {width: 150px;height: 150px;border: 1px solid #ccc;display:…

Vue组件化-插槽Slot

认识插槽Slot如何使用插槽slot?插槽的默认内容多个插槽的效果具名插槽的使用◼ 事实上,我们希望达到的效果是插槽对应的显示,这个时候我们就可以使用具名插槽:具名插槽顾名思义就是给插槽起一个名字,<slot> 元素有一个特殊的attribute:name;一个不带name 的sl…

柳凯的第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/这个作业的目标 实现一个命令行文本计数统计程序。能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。姓名-学号 柳凯-2022329301149码云地址:一、介绍本程序用于统计纯英文文本文件中的字符数、单词…

Linux服务器上报内存ecc错误怎么解决

​面对Linux服务器上报的内存ECC错误,可以按以下步骤进行处理:1.确认错误并收集相关信息;2.检查硬件和服务器日志;3.重新定位或替换内存模块;4.运行内存测试工具;5.更新硬件固件和操作系统。首先,我们需要确认错误并获取详细的故障描述。1.确认错误并收集相关信息 当服务…

Django-Ajax请求

1.Django-Ajax请求 1.2 介绍 客户端(浏览器)向服务端发起请求的形式:1.地址栏:GET 2.超链接标签:GET 3.form表单:GET或POST 4.Ajax(重要):GET或POST或PUT或DELETEAjax(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与…

ipv6使用上和ipv4有区别吗

IPv6与IPv4在使用上的主要区别包括:1.地址格式不同;2.地址空间更大;3.安全性增强;4.自动配置能力;5.数据包头部结构不同;6.路由选择优化;7.对多播和移动性的支持更好。IPv6的推出旨在解决IPv4地址耗尽问题,同时提高网络效率和安全性。IPv6的地址空间比IPv4大得多,提供…

IDEA 利用groovy脚本生成注释

介绍 本文主要介绍利用IDEA编辑器的活动模板,结合groovy脚本,生成注释模板。目前生成的注释主要适用于java和js文件 推荐此方式,可以根据需要定义groovy脚本,生成不同格式的注释操作点击 File >> Setting 找到 Edtor >> Live Temolates , 建议创建一个模板组…

TYPE-C PD浅谈(三)

由于TYPE-C两头都一样,没有方向性,所以在对接前并不会有电源输出,数据主从也尚未定义。在PD的规范内,针对装置对接,定义了三个电阻来进行对接的识别。 Rp:做为Provider需要在CC脚位上上拉一个Rp电阻。Rp电阻允许有三种阻值(pull high 5V时,10K/22K/56K),这三种阻值也同…

思考能力的提升从把复杂问题简单化开始

在生活中我们会遇到各种各样的问题。有些问题非常简单;有的却非常复杂,让人们无从下手去解决。 但有些看似复杂的问题,只要我们仔细去分析它们,拨开云雾,自然就会见到“青天”。这种分析方法,就是“化繁为简”的思考模式,也就是——简化思考法。当复杂的问题被简化之后,…

异常捕获

异常捕获当你的程序出现例外情况时就会发生异常(Exception)。例如,当你想要读取一个文件时,而那个文件却不存在,怎么办?又或者你在程序执报错了怎么办?这些通过使用异常来进行处理。类似地,如果你的程序中出现了一些无效的语句该怎么办?python 将会对此进行处理,举起…

怎样设置OKR

设置OKR的关键步骤是:一、确定目标(Objectives);二、设定关键结果(Key Results);三、设定优先级和责任人;四、跟踪和评估。明确目标是成功设置OKR的关键,只有在此基础上,才能制定出有意义的关键结果和OKR,从而帮助企业或个人实现目标。一、确定目标(Objectives) 目…