首页 > 其他分享 >Prometheus服务发现

Prometheus服务发现

时间:2023-10-03 20:01:54浏览次数:35  
标签:__ 发现 服务 kubernetes 标签 consul Prometheus meta pod

一、Prometheus为何要进行服务发现       

Prometheus Server的数据抓取模型为Pull,因而,它必须事先知道各Target的位置,然后才能从相应的Exporter或Instrumentation中抓取数据。对于小型的系统环境而言,通过static_configs指定各Target即可解决问题,每个Target用一个网络端点(ip:port)进行标识;但对于中大型系统环境或具有较强动态性的云计算环境来说,静态配置显然难以使用。因此,Prometheus为此专门设计了一组服务发现机制,以便于能够基于服务注册中心(服务总线)自动发现、检测、分类可被监控的各Target,以及更新发生了变动的Target。

二、指标抓取的生命周期

在每个scrape_interval期间,Prometheus都会检查执行的作业(Job),这些作业会根据Job上指定的发现配置生成target列表,此为服务发现过程。具体可描述为:

(1)服务发现会返回一个Target列表,其中包含一组称为元数据的标签,这些标签都以”__meta_”为前缀;

(2)服务发现还会根据目标配置来设置其它标签,这些标签带有”__”前缀和后缀,包括”__scheme__”、”__address__”和”__metrics_path__”,分别保存target支持使用的协议(http或https,默认使用http)、target的地址及指标的URI路径(默认为/metrics);

(3)若URI路径中存在任何参数,则它们的前缀会设置为”__param_”;

(4)这些目标列表和标签会返回给Prometheus,其中一些标签也可以在配置中被覆盖。

下图介绍了Prometheus进行指标抓取的简单生命周期

Prometheus服务发现_Prometheus

       prometheus的relabeling(标签重写)功能,它允许用户重写这些标签或根据标签做一些过滤操作。目前支持的relabel配置主要有以下4种,它的应用范围和生效时间不一样:

  • relabel_configs:在对target进行数据采集之前,可以使用relabel_configs添加、修改或删除一些标签,也可以用来配置只采集特定目标或过滤目标,针对的是target,监控目标(较为常用)。
  • metric_relabel_configs:在对target采集数据之后,数据写入TSDB之前,可以使用metric_relabel_configs做重新标记和过滤,针对的是metric,指标。
  • alert_relabel_configs:在被发送到alertmanager之前,对标签进行处理,针对的是alert。
  • write_relabel_configs:写入远端存储之前进行标签处理。

三、基于文件的服务发现

此方式不依赖于任何平台或第三方服务,简单通用。Prometheus Server定期从文件中加载Target信息,文件可使用json或yaml格式,包含定义的Target列表以及可选的标签信息。这些文件也可由其它系统生成(eg:Ansible)。

发现Target的配置,定义在配置文件的job之中。

新建一个/usr/local/Prometheus/file_sd/node_exporter.yml,添加如下内容:

- targets:
  - 192.168.131.11:9100
  labels:
    app: node_exporter
    job: node

在Prometheus配置文件添加如下内容:

- job_name: node_exporter
  file_sd_configs:
  - files:	#指定保存targets文件的位置,可以指定多个
    - file_sd/*.yml  #文件加载支持通配符
    refresh_interval: 10s	#每隔多长时间从指定的文件中加载一次targets

Prometheus服务发现_Prometheus_02

执行curl -XPOST http://192.168.131.11:9090/-/reload命令去热加载。此时查看Prometheus Web UI的Targets,发现在新添加的Target中的app: node_exporter和job: node已经添加进来了。

Prometheus服务发现_服务发现_03

此外,将鼠标悬浮在端点对应的Labels时还能看到多了一个元标签__meta_filepath。此标签在静态配置时是没有的。当然,这些标签信息也可以在Prometheus Web UI的Service Discovery中也能看到。

Prometheus服务发现_服务发现_04

四、基于DNS的服务发现

基于DNS的服务发现针对一组DNS域名进行定期查询,以发现待监控的目标。此发现机制依赖于A、AAAA和SRV资源记录,且仅支持该类方法,尚不支持RFC6763中的高级DNS发现方式。

五、基于Consul的服务发现

5.1 Consul简介

Consul是一款基于golang开发的开源工具,主要面向分布式、服务化的系统提供服务注册、服务发现和配置管理的功能,提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。

5.2 部署Consul

下载地址:https://developer.hashicorp.com/consul/downloads?product_intent=consul

wget https://releases.hashicorp.com/consul/1.16.1/consul_1.16.1_linux_386.zip
unzip consul_1.16.1_linux_386.zip
mv consul /usr/local/bin
#启动开发者模式。先创建数据存储目录和配置文件目录,便于后续使用
mkdir -p /consul/data /etc/consul
nohup consul agent -dev -ui -data-dir=/consul/data -config-dir=/etc/consul -client=0.0.0.0 &

       访问http://Consul IP:8500,就能看到Consul自带的Web UI界面,consul本身也被注册进来。

Prometheus服务发现_服务发现_05

5.3 在Consul上注册Service

#在配置目录下操作
vim /etc/consul/nodes.json
{
 "services": [{
  "id": "node_exporter_node1",
  "name": "node1",
  "address": "192.168.131.11",
  "port": 9100,
  "tags": ["nodes"],
  "checks": [{
   "http": "http://192.168.131.11:9100/metrics",
   "interval": "10s"
  }]
 },
  {
   "id": "node_exporter_node2",
   "name": "node2",
   "address": "192.168.131.12",
   "port": 9100,
   "tags": ["nodes"],
   "checks": [{
    "http": "http://192.168.131.12:9100/metrics",
    "interval": "10s"
  }]
 }]
}

      之后运行consul reload命令,让consul重新加载配置信息。也可以直接基于HTTP API提交注册的服务信息。

curl -X PUT [email protected] http://192.168.131.11:8500/v1/agent/service/register

      要想注销Service,执行consul service deregister命令,或通过deregister API完成。

Prometheus服务发现_Prometheus_06

5.4 为Consul设置systemd开机自启

vim /usr/lib/systemd/system/consul.service
[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
[Service]
EnvironmentFile=-/etc/consul.d/consul.env
ExecStart=/usr/local/bin/consul agent -dev -bootstrap \
            -config-dir /etc/consul \
            -data-dir /consul/data \
            -ui \
            -log-level INFO \
            -bind 192.168.131.11 \
            -client 0.0.0.0
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

systemctl enable --now consul

5.5 Prometheus定义consul_sd_configs

在Prometheus配置文件添加如下内容:

- job_name: "node_exporter"
  consul_sd_configs:
  - server: "192.168.131.11:8500"
    tags:
    - "nodes"
    refresh_interval: 10s

Prometheus服务发现_服务发现_07

执行完热加载命令后,同样在Targets也能看到发现的目标节点。此时将鼠标悬浮在端点对应的Labels时,就会发现有许多以”_meta_consul”为前缀的元标签。

Prometheus服务发现_Prometheus_08

六、基于Kubernetes  API的服务发现    

基于Kubernetes API的服务发现机制,支持将API Server中的Node、Service、Endpoint、Pod和Ingress等资源类型下相应的各资源对象视为target,并持续监视相关资源的变动。

  • Node、Service、Endpoint、Pod和Ingress资源分别由各自的发现机制进行定义
  • 负责发现每种资源对象的组件,在Prometheus中称为一个”role”
  • 同时支持在集群上基于DaemonSet控制器部署node-exporter后发现各节点

6.1 Node

       Node角色将Kubernetes集群内的每个节点均视为一个target,同时监听Kubelet的HTTP端口(10250)。Node Role依次检索节点规范上的NodeInternalIP、NodeExternalIP、NodeLegacyHostIP和NodeHostName,并将发现的第一个地址作为目标地址(__address__)。主要用于监控Kubernetes的Node节点的服务器相关的指标数据。

可用标签列举如下:

  • __meta_kubernetes_node_name:Node节点的名称
  • __meta_kubernetes_node_label:Kubernetes中Node节点的标签。<labelname>代表标签名称
  • __meta_kubernetes_node_labelpresent:标签存在则为true。<labelname>代表标签名称
  • __meta_kubernetes_node_annotation:Kubernetes中Node节点的注解。<annotationname>代表注解名称
  • __meta_kubernetes_node_annotationpresent:注解存在则为true。<annotationname>代表注解名称
  • __meta_kubernetes_node_address<address_type>:不同类型的Node节点地址。例如: __meta_kubernetes_node_address_Hostname="test-k8s-node1;__meta_kubernetes_node_address_InternalIP="10.0.0.11"
  • instance:从apiserver获取到的节点名称

6.2 Pod

Pod角色可以发现Kubernetes集群上的所有pod并将其中的pod ip作为target,它会将Pod上声明的每个端口都视作一个target。如果容器没有指定的端口,则会为每个容器创建一个无端口target,以便通过relabel手动添加端口。

可用标签列举如下:

  • __meta_kubernetes_namespace:pod所在的命名空间
  • __meta_kubernetes_pod_name:pod的名称
  • __meta_kubernetes_pod_ip:pod的ip
  • __meta_kubernetes_pod_label_<labelname>:pod的标签
  • __meta_kubernetes_pod_labelpresent_<labelname>:标签存在则为true
  • __meta_kubernetes_pod_annotation_<annotationname>:pod的注解
  • __meta_kubernetes_pod_annotationpresent_<annotationname>:注解存在则为true
  • __meta_kubernetes_pod_container_init:如果容器是InitContainer,则为true
  • __meta_kubernetes_pod_container_name:容器的名称
  • __meta_kubernetes_pod_container_port_name:容器的端口名称
  • __meta_kubernetes_pod_container_port_number:容器的端口号
  • __meta_kubernetes_pod_container_port_protocol:容器的端口协议
  • __meta_kubernetes_pod_ready:pod的就绪状态,true或false
  • __meta_kubernetes_pod_phase:pod的生命周期状态,Pending, Running, Succeeded, Failed or Unknown
  • __meta_kubernetes_pod_node_name:Pod所在Node节点的名称
  • __meta_kubernetes_pod_host_ip:Pod所在Node节点的ip
  • __meta_kubernetes_pod_uid:Pod的uid
  • __meta_kubernetes_pod_controller_kind:Pod控制器的类型,ReplicaSet,DaemonSet,Job,StatefulSet…
  • __meta_kubernetes_pod_controller_name:Pod控制器的名称

6.3 Service

Service角色可以发现每个Service的ip和port,将其作为target。这对于黑盒监控(blackbox)很有用。即一个Service访问到哪个pod,就把哪个pod的数据传上来。使用的场景很少。只是看Service对应业务是否健康的时候可以使用。

可用标签列举如下:

  • __meta_kubernetes_namespace:Service所在的命名空间
  • __meta_kubernetes_service_annotation_<annotationname>:Kubernetes中Service的注解
  • __meta_kubernetes_service_annotationpresent_<annotationname>:注解存在则为true
  • __meta_kubernetes_service_cluster_ip:Kubernetes中Service的ClusterIP
  • __meta_kubernetes_service_external_name:Kubernetes中Service的external_name
  • __meta_kubernetes_service_label_<labelname>:Kubernetes中Service的标签
  • __meta_kubernetes_service_labelpresent_<labelname>:标签存在则为true
  • __meta_kubernetes_service_name:Kuberentes中Service的名称
  • __meta_kubernetes_service_port_name:Kubernetes中Service的端口
  • __meta_kubernetes_service_port_protocol:Kubernetes中Service的端口协议
  • __meta_kubernetes_service_type:Kubernetes中Service的类型

6.4 Endpoint

       Endpoint role从各Endpoint资源中发现目标。如果ep是属于service的话,则会附加Service角色的所有标签。如果ep的后端节点是pod,则会附加pod角色的所有标签。

可用标签列举如下:

(1)__meta_kubernetes_namespace:ep对象所在的命名空间

(2)__meta_kubernetes_endpoints_name:ep的名称

(3)直接从ep对象的列表中获取的所有target,下面的标签将会被附加上

   ①__meta_kubernetes_endpoint_hostname:ep的主机名

   ②__meta_kubernetes_endpoint_node_name:ep所在的node节点名

   ③__meta_kubernetes_endpoint_ready:ep的就绪状态,true或false

   ④__meta_kubernetes_endpoint_port_name:ep的端口名称

   ⑤__meta_kubernetes_endpoint_port_protocol:ep的端口协议

   ⑥__meta_kubernetes_endpoint_address_target_kind:ep对象的目标类型,比如Pod

   ⑦__meta_kubernetes_endpoint_address_target_name:ep对象的目标名称,比如pod名称

6.5 Ingress

ingress角色负责从API Server中发现ingress资源,它将ingress资源上的每个路径视为一个target。这通常对黑盒监控很有用。该地址将设置为ingress资源中指定的host字段的值。

可用标签列举如下:

  • __meta_kubernetes_namespace:ingress所在的命名空间
  • __meta_kubernetes_ingress_name:ingress的名称
  • __meta_kubernetes_ingress_label_<labelname>:ingress的标签
  • __meta_kubernetes_ingress_labelpresent_<labelname>:标签存在则为true
  • __meta_kubernetes_ingress_annotation_<annotationname>:ingress的注解
  • __meta_kubernetes_ingress_annotationpresent_<annotationname>:注解存在则为true
  • __meta_kubernetes_ingress_scheme:ingress的协议,如果设置了tls则是https。默认http
  • __meta_kubernetes_ingress_path:ingress中指定的路径。默认为/

标签:__,发现,服务,kubernetes,标签,consul,Prometheus,meta,pod
From: https://blog.51cto.com/u_15796303/7694375

相关文章

  • 视频融合/监控汇聚平台EasyCVR在数字化民生服务中可起到的重要作用
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 什么是 Angular 应用服务器端的预渲染技术 - prerendering
    Angular服务器端预渲染(ServerPrerendering):构建更快速、更友好的Web应用Angular是一种强大的前端框架,用于构建现代Web应用程序。然而,随着应用规模的增长,性能问题也可能随之而来。为了提高Angular应用的性能和用户体验,开发人员可以采用各种技术和方法。其中之一就是服务器端预渲......
  • 微服务17:微服务治理之异常驱逐
    ★微服务系列微服务1:微服务及其演进史微服务2:微服务全景架构微服务3:微服务拆分策略微服务4:服务注册与发现微服务5:服务注册与发现(实践篇)微服务6:通信之网关微服务7:通信之RPC微服务8:通信之RPC实践篇(附源码)微服务9:服务治理来保证高可用微服务10:系统服务熔断、限流微服务11......
  • 在linux服务器上安装scvi后无法调用GPU
    问题描述:WARNING-NoGPU/TPUfound,fallingbacktoCPU.(SetTF_CPP_MIN_LOG_LEVEL=0andrerunformoreinfo.) 解决方案: 测试如下代码,如果为True则执行第二步。importtorchprint(torch.cuda.is_available())测试如下代码importjaxprint(jax.devices......
  • 【VMware】2-VMware虚拟化篇-Dell服务器的入门
    第1章 前言本文主要介绍Dell服务器如何使用DelliDRAC、做磁盘Raid。1.   IntegratedDellRemoteAccessController(iDRAC)用于提高系统管理员的工作效率,并改善戴尔系统的整体可用性。该iDRAC会向管理员提醒系统问题,允许远程系统管理,减少对系统的物理访问需求。2.   Re......
  • 前端利用fetch实现服务器健康检查
    最近公司赛事较多,一些大型赛事部署了多台服务器,为了实时了解的运行状态,保障服务器正常运行,我用前端实现了一个服务器健康检查程序,可设置自动轮询检查或手动检查。使用fetch发送ajax请求(服务器需要设置允许跨域),判断请求状态和结果来得出正常、超时、连接失败状态。代码使用vue3了......
  • 代理服务
    1.代理的常用功能?1.突破自身IP访问限制,访问国外站点。2.访问一些单位或团体内部资源扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。3.提高访问速度扩展......
  • 服务器阿贝云使用体验
    先稍微介绍一下this服务器在网上找了很久的云服务器,真正免费且安全的有阿里云和腾讯的体验服务器,阿里云还有高校学生专属体验服务器,只要通过高校身份验证即可申请创建服务器实例不过这一次谈到,是一个不完全免费的服务器:阿贝云服务器勉强能用的配置带上略微拘谨的带宽,用来挂着(......
  • 互联网医院App开发:构建医疗服务的技术指南
    互联网医院App的开发是一个复杂而具有挑战性的任务,但它也是一个充满潜力的领域,可以为患者和医疗专业人员提供更便捷的医疗服务。本文将引导您通过一些常见的技术步骤来构建一个简单的互联网医院App原型,以了解该过程的基本概念。技术栈选择在开始之前,您需要选择适合互联网医院App开......
  • Prometheus+Grafana+Jmeter监控服务器资源及中间件(超详细)
    一、Prometheus&node_exporter&Grafana的原理Prometheus:Prometheus是一个开源的系统监控和报警工具包,它负责定时从各种数据源(如NodeExporter)中获取指标数据,并将其存储在自己的时间序列数据库中。Prometheus支持灵活的查询和报警功能,用户可以方便地对这些指标数据进行查询......