011relabel_configs详解

写在之前

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常用启动参数。

 
posted @ 2022-11-28 21:12  arun_yh  阅读(948)  评论(0编辑  收藏  举报