首页 > 其他分享 >011relabel_configs详解

011relabel_configs详解

时间:2022-11-28 21:23:30浏览次数:49  
标签:__ kubernetes 标签 011relabel prometheus 详解 configs kube

写在之前

prometheus 配置文件大体框架有以下几个部分:

data:
  prometheus.yml: | #
    rule_files:
    - etc/prometheus/rules.yml
    alerting:
      alertmanagers:
      - static_configs:
        - targets: ["localhost:9093"]
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      ....

   rules.yml: |
     groups:
     - name: example
       rules:
       - alert: kubernetes-apiserver打开句柄数>1000
         ...
     - name: 物理节点状态-监控告警
       rules:
       - alert: 物理节点cpu使用率
         ...

 

包括两个文件:prometheus配置文件(prometheus.yaml)和 规则文件 (rules.yml)。

Prometheus配置文件,主要配置加载规则文件的路径,报警服务器的连接配置、全局配置、和抓取目标服务器的配置信息,这里会主要讲解抓取规则。

规则文件这里通过分组的形式进行监控,在监控页面也可以很好的展示;

 

prometheus 配置文件中global

Global 含义
scrape_interval: 15s       收集目标数据的时间间隔,可以使用全局配置,也可以基于某个Job_name配置,默认为15秒,
scrape_timeout: 10s      目标采集超时时间,默认为10秒;
evaluation_interval: 1m 报警状态更新间隔时间,默认1分钟;

上面说的报警状态,主要有三个,第一篇文章中有提到,这里加深下理解,再次给出。

告警状态  功能 
pending 警报通知已经被激活,但低于配置的持续时间,这里的持续时间即rule里的FOR字段设置的时间,在此状态下,不发送报警通知
firing 警报通知已经发送,而且超出设置的持续时间,该状态下发送报警通知
inactive 正常状态,既不是pending也不是firing的时候状态即inactive

 

prometheus 服务发现方式

Prometheus 默认是采用Pull的方式拉取指标数据,那么它是如何知道拉取哪些目标服务的指标数据呢?其实就是通过配置 scrape_configs来定义各种Job来实现目标服务发现的,配置一个job_name后,这个指定的名称就会在Prometheus UI界面 Targets中显示出来,那么我们监控的目标有很多,尤其是Pod、Service这些经常变动的,我们又应该如何来配置管理 呢,下面我们来看Prometheus 中服务发现几种方式:

Prometheus 服务发现 含义
dns_sd_configs 基于DNS 服务发现;
file_sd_configs 基于文件服务发现;
static_configs 静态服务发现,这个很好理解,比如我们的kube-apiserver、kube-controller-manager、kube-scheduler、Etcd等这些资源相对固定,不会经常性的发生变化,每当有新的目标需要监控时,需要手动配置监控目标服务;
kubernetes_sd_configs 基于Kubernetes的服务发现,比如Pod、Service,这种也叫基于API的动态服务发现;
consul_sd_configs 使用第三方组件Consul ,完成动态服务发现,Prometheus 一直监视consul服务,当发现在consul中注册的服务有变化,prometheus就会自动把注册到consul中的目标资源的变化同步到Prometheus的Targets中来;

 

基于API的服务发现:kubernetes_sd_configs

Prometheus 集成了 Kubernetes 的自动服务发现,通过 kube-apiserver 提供的5种模式API来动态服务发现,它们分别是:基于 Node、Service、Pod、Endpoints以及基于ingress的服务发现;

下面给出 Kubernetes 服务发现的实例,这里会使用大量的 relabel_configs 标签,它主要是重新修改标签,它仅仅是对采集过来的指标进行二次处理,我们要什么、不要什么、如何替换等,把以__meta__、__address__、__scheme__或者以__metrics_path__开头的这些元数据标签进行动态的修改、更新、添加、删除操作;

 

relabel_configs action动作有如下几种:

relabel_configs action动作 含义
replace 根据regex来去匹配source_labels标签上的值,并将并将匹配到的值写入target_label中,其实就是替换;
keep 只是收集匹配到regex的源标签source_labels,而会丢弃没有匹配到的所有标签,用于选择保留哪些标签;
drop 丢弃匹配到regex的源标签,而会收集没有匹配到的所有标签,用于排除,与keep相反;
labeldrop 使用regex表达式匹配标签,符合规则的标签将从target实例中移除;
labelkeep 使用regex表达式匹配标签,仅收集符合规则的target,不符合匹配规则的不收集;
labelmap 根据regex的定义去匹配Target实例所有标签的名称,并且以匹配到的内容为新的标签名称,其值作为新标签的值;

几种动作中提到的几个术语解析:

source_labels:字面意思是源标签,没有经过relabel处理之前的标签名;

target_label:目标标签,通过action动作处理之后的新的标签名;

regex:正则表达式,用于匹配源标签值使用的;

replacement:replacement指定的替换后的标签(target_label)对应的数值;

scheme: https、http等代表获取指标数据时使用的协议类型;

 

prometheus WebUI  targets中的endpoints组成:

__scheme__://__address__/__metrics__path__

__scheme__,默认是http,不特别指明,就是http;

__address__,不特别说明也是抓取到源标签中的指标值;

__metrics__path__,默认是/metrics,除非特别指明;

 

Node 服务发现

主要监控Node节点的指标数据

- job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

 

job_name 是为监控的目标定义一个标识名称,显示在WebUI界面的Targets中;

kubernetes_sd_configs 代表这是基于kubernetes API进行的动态服务发现方式;

role 指的是使用哪种类型的API,上面已经说过基于5种不同类型API来实现动态服务发现,这里指的是node;

relables_configs 重新修改标签的配置,

 

source_labels:__address__="172.31.117.233:10250";

reges:  正则表达式,用于匹配源标签值使用的,这里源标签值是172.31.117.233:10250,通过正则表达式(.*):10250,匹配出来的结果是172.31.117.233;

replacement:替换后标签对应的值172.31.117.233:9100,其实就是 WebUI中Endpoint的数据;

action:replace即替换动作;

labelmap:__meta_kubernetes_node_label_(.+),根据regex的定义去匹配Target实例所有标签的名称,并且以匹配到的内容为新的标签名称,其值作为新标签的值,其实新的标签值即是 WebUI 界面中显示的;

 

 

API Server服务发现

- job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: var/run/secrets/kubernetes.io/serviceaccount/
token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_
service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

 

job_name 在WebUI中 Targets中显示的名称;

kubernetes_sd_configs 代表这是基于kubernetes API进行的动态服务发现方式;

role,指的是使用哪种类型的API,上面已经说过基于5种不同类型API来实现动态服务发现,这里指的是endpoints,这里也有一些默认的配置;

scheme,抓取数据时使用的协议类型为https;

tls_config和bearer_token_file,都是使用https进行获取数据使用的认证文件;

source_lables,动态服务发现kube-apiserver时,根据源标签进行一次过滤,把符合的target先过滤出来;

reges,根据正则去过滤哪个源标签被匹配出来,再结合keep动作,它能唯一的表示出是我们监控的对象;

action,keep就是保留符合正则表达式的targets,并显示出来;

 

node-cadvisor 动态服务发现

主要是监控容器的指标数据;

- job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: var/run/secrets/kubernetes.io/serviceaccount/
token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

 

job_name,在WebUI中 Targets中显示的名称;

kubernetes_sd_configs 代表这是基于kubernetes API进行的动态服务发现方式;

role 指的是使用哪种类型的API,上面已经说过基于5种不同类型API来实现动态服务发现,这里指的是node;

scheme,抓取数据时使用的协议类型为https;

tls_config和bearer_token_file,都是使用https进行获取数据使用的认证文件;

source_labels,通过regex 匹配出来 master01,把__metrics_path__默认值 metrics 替换成replacement成/api/v1/nodes/${1}/proxy/metrics/cadvisor,这里的$1由master01再次替换,

target_label,__address__它直接replacement 替换成kubernetes.default.svc:443;

 

 

Service 动态服务发现

要想让service自动服务发现,必须在注解中声明prometheus.io/port: "9153"和prometheus.io/scrape: "true",默认是9153端口,可以不声明,但prometheus.io/scrape必须声明,还有一个前提你后面Pod 需要暴露了/metrics接口,否则也监控不到;

- job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name

 

job_name,在WebUI中 Targets中显示的名称;

kubernetes_sd_configs 代表这是基于kubernetes API进行的动态服务发现方式;

role 指的是使用哪种类型的API,上面已经说过基于5种不同类型API来实现动态服务发现,这里指的是node;

__meta_kubernetes_service_annotation_prometheus_io_scrape,这个标签为true的过滤出来;

__meta_kubernetes_service_annotation_prometheus_io_path,如果指定了拉取指标数据的接口,把原来的__metrics_path__ 替换掉;

labelmap,保留哪些标签显示在prometheus WebUI中;

 

 

Pod 动态服务发现

Pod要想动态的服务发现,必须在定义Pod的时候,使用annotations:声明prometheus.io/scrape: 'true',否则创建的Pod不会被自动服务发现,还有一个前提你使用的镜像需要暴露了/metrics接口,否则也监控不到;

- job_name: kubernetes-pods
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - action: keep
        regex: true
        source_labels:
        - __meta_kubernetes_pod_annotation_prometheus_io_scrape
      - action: replace
        regex: (.+)
        source_labels:
        - __meta_kubernetes_pod_annotation_prometheus_io_path
        target_label: __metrics_path__
      - action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        source_labels:
        - __address__
        - __meta_kubernetes_pod_annotation_prometheus_io_port
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: kubernetes_namespace
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_name
        target_label: kubernetes_pod_name

 

这里的规则不作介绍和之前大同小异,要想让 Pod 自动服务发现,就需要暴露metrics接口;


基于静态配置的服务发现:static_configs

kube-scheduler/controller-manager/proxy静态服务发现

- job_name: 'kube-scheduler'
      scrape_interval: 5s
      static_configs:
      - targets: ['172.31.117.233:10251','172.31.117.234:10251','172.31.117.235:10251']
    - job_name: 'kube-controller-manager'
      scrape_interval: 5s
      static_configs:
      - targets: ['172.31.117.233:10252','172.31.117.234:10252','172.31.117.235:10252']
    - job_name: 'kube-proxy'
      scrape_interval: 5s
      static_configs:
      - targets: ['172.31.117.233:10249','1172.31.117.234:10249','1172.31.117.235:10249','1172.31.117.236:10249']

 

静态配置相对简单,直接添加targets即可,以列表的形式,这里需要注意一个问题,由于集群是使用kubeadm安装的,kube-proxy监听的是127.0.0.1:10249,无法正常监控,需要修改

[root@master01 monitor]# kubectl edit cm kube-proxy -n kube-system

 

默认metricsBindAddress : "",监听在127.0.0.1:10249

 

需要先把之前的kube-proxy删除,然后它会自动重建Pod,此时即可监听0.0.0.0:10249

[root@master01 monitor]# kubectl get pods -n kube-system|grep kube-proxy
kube-proxy-5zs9d 1/1     Running 0          33h
kube-proxy-b28fj 1/1     Running 0          33h
kube-proxy-btmlh 1/1     Running 1          33h
kube-proxy-ct7vd 1/1     Running 0          33h
[root@master01 monitor]# kubectl get pods -n kube-system|grep kube-proxy|gawk '{print $1}'
kube-proxy-5zs9d
kube-proxy-b28fj
kube-proxy-btmlh
kube-proxy-ct7vd
[root@master01 monitor]# for i in `kubectl get pods -n kube-system|grep kube-proxy|gawk '{print $1}'`
> do
> kubectl delete pods $i -n kube-system
> done
pod "kube-proxy-5zs9d" deleted
pod "kube-proxy-b28fj" deleted
pod "kube-proxy-btmlh" deleted
pod "kube-proxy-ct7vd" deleted
[root@master01 monitor]# kubectl get pods -n kube-system|grep kube-proxy
kube-proxy-5xh5r 1/1     Running 0          22s
kube-proxy-ccp4w 1/1     Running 0          29s
kube-proxy-swmw9 1/1     Running 0          17s
kube-proxy-vkz78 1/1     Running 0          20s
[root@master01 monitor]#

 

监控情况截图

etcd服务发现

由于集群采用了 https 的方式访问 etcd 集群,如果想监控etcd的话,也需要使用证书,我们这边使用 secret 资源类型,让 Prometheus 挂载此证书;

[root@master01 monitor]# kubectl create secret generic etcd-certs --from-file=/etc/kubernetes/ssl/etcd/etcd.pem --from-file=/etc/kubernetes/ssl/etcd/etcd-key.pem --from-file=/etc/kubernetes/ssl/ca/ca.pem -n monitor
secret/etcd-certs created
[root@master01 monitor]#

 

修改prometheus-alertmanager-deployment.yaml文件添加如下标注配置

 

添加Etcd 静态监控配置

- job_name: 'k8s-etcd'
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/ca.pem
        cert_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/etcd.pem
        key_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/etcd-key.pem
      scrape_interval: 5s
      static_configs:
      - targets: ['172.31.117.233:2379','172.31.117.234:2379','172.31.117.235:2379']

 

监控如图

 

Prometheus常用启动参数

配置参数 说明
- --config.file=/etc/prometheus/prometheus.yml 配置文件路径
- --storage.tsdb.path=/prometheus 存储路径,默认在data目录下
- --storage.tsdb.retention=720h 数据保留时间 
- --web.enable-admin-api 控制对admin HTTP API的访问,其中包括删除时间序列等功能
- --web.enable-lifecycle 热加载 reload操作,如果不生效,删除重建;
- --web.max-connections=512 默认最大连接数
- --alertmanager.timeout=10s 报警信息发送给alertmanager的超时时间
- --query.timeout=2m 查询超时间
- --query.max-concurrency=20 并发查询数,prometheus的默认采集指标中有一项,prometheus_engine_queries_concurrent_max可以拿到最大查询并发数及查询情况

 

总结

主要总结 Prometheus 监控抓取的配置规则,尤其是relabel_configs的使用,这个是Prometheus 配置监控目标的重点,详细说明了node、pod、service、kube-apiserver的动态服务发现方式及配置文件详解,又列举了kube-controller-manager、kube-scheduler和etcd静态配置服务发现的方式,基于文件和DNS的服务发现,用的不多,先不总结,最后总结了Prometheus常用启动参数。

 

标签:__,kubernetes,标签,011relabel,prometheus,详解,configs,kube
From: https://www.cnblogs.com/itcomputer/p/16933648.html

相关文章

  • RHCSA认证部分习题详解
    调试SELinuxSELinux(SecurityEnhancedLinux)介绍SELinux的主要作用是增强Linux系统的安全性,通过安全策略设置系统应用软件及用户程序对系统文件目录的访问限制......
  • Day25:接口详解
    接口1.1什么是接口1.2接口的特点接口的关键字是interface接口语句格式:publicinterface接口名{}publicinterfaceJumpping{voidjump();//接口的方法有且一定......
  • 010Prometheus配置文件中metric_relabel_configs详解
    Prometheus从数据源拉取数据后,会对原始数据进行编辑其中 ​​metric_relabel_configs​​​是Prometheus在保存数据前的最后一步标签重新编辑(relabel_configs)。所以,哪......
  • SQL语句执行顺序,select、from、where、group by、having、order by语句位置及功能详解
    在spl语句中的执行顺序:from→where→groupby→having→select→orderby第一步:from语句,选择要操作的表。第二步:where语句,在from后的表中设置筛选条件,筛选出符合条件的......
  • Cross-Origin Resource Sharing(CORS)详解,CORS详解,CORS原理分析
    Cross-OriginResourceSharing(CORS)详解,CORS详解,CORS原理分析Cross-OriginResourceSharing通常简称为:CORS它是一种机制,这个机制使用了一个额外的HTTP响应头来赋予当前us......
  • Mysql 连接参数 useAffectedRows 详解
    Mysql连接参数useAffectedRows详解Javamysql链接串:jdbc:mysql://mysql安装IP:3306/db_test?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertTo......
  • 日志式文件系统(ext3)详解
    一、概述通常在系统运行中写入文件内容的同时,并没有写入文件的元数据(如权限、所有者及创建和访问时间),如果在写入文件内容之后与写入文件元数据之前的时间差里,系统非正......
  • RecyclerView详解
    RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewh......
  • 数据分析八大模型:详解RFM模型
    一、RFM的基本思路RFM模型由三个基础指标组成:R:最近一次消费至今的时间F:一定时间内重复消费频率M:一定时间内累计消费金额 RFM模型里,三个变量的含义是很具体......
  • 【c++】map用法详解
    【c++】map用法详解LeeMooq已于2022-05-0122:01:43修改21398收藏46分类专栏:c++学习文章标签:c++版权c++学习专栏收录该内容5篇文章3订阅订阅专栏map是c++标准......