Prometheus配置文件说明

Prometheus配置文件说明

2023年6月30日发(作者:)

Prometheus配置⽂件说明# Kubernetes的API SERVER会暴露API服务,Promethues集成了对Kubernetes的⾃动发现,它有5种模式:Node、Service# 、Pod、Endpoints、ingress,下⾯是Prometheus官⽅给出的对Kubernetes服务发现的实例。这⾥你会看到⼤量的relabel_configs,# 其实你就是把所有的relabel_configs去掉⼀样可以对kubernetes做服务发现。relabel_configs仅仅是对采集过来的指标做⼆次处理,⽐如# 要什么不要什么以及替换什么等等。⽽以__meta_开头的这些元数据标签都是实例中包含的,⽽relabel则是动态的修改、覆盖、添加删除这些标签# 或者这些标签对应的值。⽽且以__开头的标签通常是系统内部使⽤的,因此这些标签不会被写⼊样本数据中,如果我们要收集这些东西那么则要进⾏# relabel操作。当然reabel操作也不仅限于操作__开头的标签。#

# action的⾏为:# replace:默认⾏为,不配置action的话就采⽤这种⾏为,它会根据regex来去匹配source_labels标签上的值,并将并将匹配到的值写⼊target_label中# labelmap:它会根据regex去匹配标签名称,并将匹配到的内容作为新标签的名称,其值作为新标签的值# keep:仅收集匹配到regex的源标签,⽽会丢弃没有匹配到的所有标签,⽤于选择# drop:丢弃匹配到regex的源标签,⽽会收集没有匹配到的所有标签,⽤于排除# labeldrop:使⽤regex匹配标签,符合regex规则的标签将从target实例中移除,其实也就是不收集不保存# labelkeep:使⽤regex匹配标签,仅收集符合regex规则的标签,不符合的不收集#

global:scrape_interval: 10sevaluation_interval: 30sscrape_configs:# ⽤于发现API SERVER- job_name: 'kubernetes-apiservers'kubernetes_sd_configs:# 发现endpoints,它是从列出的服务端点发现⽬标,这个endpoints来⾃于Kubernetes中的service,每⼀个service都有对应的endpoints,这⾥是⼀个列表# 可以是⼀个IP:PORT也可以是多个,这些IP:PORT就是service通过标签选择器选择的POD的IP和端⼝。所以endpoints⾓⾊就是⽤来发现server对应的pod的IP的# kubernetes会有⼀个默认的service,通过找到这个service的endpoints就找到了api server的IP:PORT,那endpoints有很多,我怎么知道哪个是api server呢# 这个就靠source_labels指定的标签名称了。- role: endpoints# 通过什么形式来连接,默认是httpsscheme: https# 下⾯这个ca_file和token_file的路径都是默认的,你可能默认设置能⽤么?其实可以,因为每⼀个运⾏起来的POD kubernetes都会为其# 创建⼀个serviceaccout的Secret并且挂载到下⾯的⽬录上,⾥⾯就有和token这两个⽂件,你可以⾃⼰启动⼀个POD,然后通过# kubectl describe pods 来查看,⼀定会在Volumes下⾯有⼀个default-token-XXX的东西,并且Mounts⾥⾯有下⾯的⽬录。tls_config:ca_file: /var/run/secrets//serviceaccount/rer_token_file: /var/run/secrets//serviceaccount/token# 下⾯的含义是源标签__meta_kubernetes_namespace等如果其值为default;kubernetes;https标签顺序和值要对应。换句话说就是# 当__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name三者对应的# 值为default、kubernetes、https则进⾏保留,⽽且该endpoints对应的地址为api server的地址。#

# __meta_kubernetes_namespace 端点对象的命名空间,在不同对象上这个标签的含义不同,在⾓⾊是endpoints中这个是端点对象的名称空间# __meta_kubernetes_service_name 端点对象的服务名称# __meta_kubernetes_endpoint_port_name 端点的端⼝名称#

# kubernetes默认在default名称空间有⼀个叫做kubernetes的service,所以这个service的有3个设置对应的就是下⾯三个标签# __meta_kubernetes_namespace 值为default# __meta_kubernetes_service_name 值为kubernetes# __meta_kubernetes_endpoint_port_name 值为httpsrelabel_configs:- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]action: keepregex: default;kubernetes;https# 配置针对kubelet的服务发现以及对标签的处理,是获取kubelet上/metrics接⼝数据来获取node的资源使⽤情况- job_name: 'kubernetes-nodes-kubelet'scheme: httpstls_config:ca_file: /var/run/secrets//serviceaccount/# 跳过CA验证# insecure_skip_verify: truebearer_token_file: /var/run/secrets//serviceaccount/tokenkubernetes_sd_configs:# 使⽤node⾓⾊,它使⽤默认的kubelet提供的http端⼝来发现集群中每个node节点。那具体地址是什么呢?# 地址类型有四种NodeInternalIP, NodeExternalIP, NodeLegacyHostIP 和 NodeHostName,默认为这四个中第⼀个可⽤的地址。# 那么这⾥为什么使⽤node⾓⾊呢?因为node⾓⾊就是⽤来发现kubelet的# __meta_kubernetes_node_name:节点对象的名字# __meta_kubernetes_node_label_:表⽰节点对象上的每⼀个标签# __meta_kubernetes_node_annotation_:表⽰节点对象上的每⼀个annotation# __meta_kubernetes_node_address_:如果存在,那么将是每⼀个节点地址类型的第⼀个地址# Node模式,Prometheus会⾃动发现Kubernetes中所有Node节点的信息并作为监控的⽬标Target。

# ⽽这些Target的访问地址实际上就是Kubelet的访问地址,并且Kubelet实际上直接内置了对Promtheus的⽀持- role: noderelabel_configs:# 保留(.+)匹配到的内容,去掉__meta_kubernetes_node_label_,实际上就是把(.+)当做新标签,然后⽼标签的值给这个新标签,# 这⾥没有设置source_labels,则表⽰匹配所有标签- action: labelmap# 匹配节点对象上的每⼀个标签regex: __meta_kubernetes_node_label_(.+)# 抓取cAdvisor数据,是获取kubelet上/metrics/cadvisor接⼝数据来获取容器的资源使⽤情况- job_name: 'kubernetes-nodes-cadvisor'scheme: httpstls_config:ca_file: /var/run/secrets//serviceaccount/rer_token_file: /var/run/secrets//serviceaccount/tokenkubernetes_sd_configs:# 使⽤⾓⾊为node- role: noderelabel_configs:- action: labelmapregex: __meta_kubernetes_node_label_(.+)# 把__metrics_path__的值替换为/metrics/cadvisor,因为默认是/metrics- target_label: __metrics_path__replacement: /metrics/cadvisor# 抓取服务端点,整个这个任务都是⽤来发现node-exporter和kube-state-metrics-service的,这⾥⽤的是endpoints⾓⾊,这是通过这两者的service来发现# 的后端endpoints。另外需要说明的是如果满⾜采集条件,那么在service、POD中定义的labels也会被采集进去- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:# 重新打标仅抓取到的具有 "/scrape: true" 的annotation的端点,意思是说如果某个service具有/scrape = true annotation声明则抓取# annotation本⾝也是键值结构,所以这⾥的源标签设置为键,⽽regex设置值,当值匹配到regex设定的内容时则执⾏keep动作也就是保留,其余则丢弃.# node-exporter这个POD的service⾥⾯就有⼀个叫做/scrape = true的annotations所以就找到了node-exporter这个POD- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]action: keepregex: true# 应⽤中⾃定义暴露的指标,也许你暴露的API接⼝不是/metrics这个路径,那么你可以在这个POD对应的service中做⼀个# "/path = /mymetrics" 声明,下⾯的意思就是把你声明的这个路径赋值给__metrics_path__# 其实就是让prometheus来获取⾃定义应⽤暴露的metrices的具体路径,不过这⾥写的要和service中做好约定# 如果service中这样写 /app-metrics-path: '/metrics' 那么你这⾥就要# __meta_kubernetes_service_annotation_prometheus_io_app_metrics_path这样写- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.+)# 暴露⾃定义的应⽤的端⼝,就是把地址和你在service中定义的 "/port = " 声明做⼀个拼接# 然后赋值给__address__,这样prometheus就能获取⾃定义应⽤的端⼝,然后通过这个端⼝再结合__metrics_path__来获取# 指标,如果__metrics_path__值不是默认的/metrics那么就要使⽤上⾯的标签替换来获取真正暴露的具体路径- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replaceregex: ([^:]+)(?::d+)?;(d+)replacement: $1:$2target_label: __address__# 重新设置scheme# 匹配源标签__meta_kubernetes_service_annotation_prometheus_io_scheme也就是/scheme annotation# 如果源标签的值匹配到regex则把值替换为__scheme__对应的值- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]action: replacetarget_label: __scheme__regex: (https?)# 下⾯主要是为了给样本添加额外信息- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_label: kubernetes_name# 下⾯是⾃动发现service,不过如果要想监控service则需要安装blackbox-exporter- job_name: 'kubernetes-services-http'metrics_path: /probe# ⽣成__param_module="http_2xx"的label,如果是TCP探测则使⽤ module: [tcp_connect]params:module: [http_2xx]kubernetes_sd_configs:- role: servicerelabel_configs:# 为了让service可以被探测到,那需要在service的annotation中增加 /scrape: true 声明# 也就是只保留/scrape: true的service- action: keepregex: truesource_labels:- __meta_kubernetes_service_annotation_prometheus_io_scrape# ⽤__address__这个label的值创建⼀个名为__param_target的label为blackbox-exporter,值为内部service的访问地址,作为blackbox-exporter采集⽤- source_labels: [__address__]target_label: __param_target# ⽤blackbox-exporter的service地址值”prometheus-blackbox-exporter:9115"替换原__address__的值- target_label: __address__replacement: :9115- source_labels: [__param_target]target_label: instance# 下⾯主要是为了给样本添加额外信息- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]target_label: kubernetes_name# 下⾯是对ingresses监控,不过如果要想监控ingresses则需要安装blackbox-exporter- job_name: 'kubernetes-ingresses'metrics_path: /probe# ⽣成__param_module="http_2xx"的labelparams:module: [http_2xx]kubernetes_sd_configs:- role: ingressrelabel_configs:# Example relabel to probe only some ingresses that have "/should_be_probed = true" annotation# - source_labels: [__meta_kubernetes_ingress_annotation_example_io_should_be_probed]# action: keep# regex: true- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]regex: (.+);(.+);(.+)replacement: ${1}://${2}${3}target_label: __param_target- target_label: __address__replacement: :9115- source_labels: [__param_target]target_label: instance# 下⾯主要是为了给样本添加额外信息- action: labelmapregex: __meta_kubernetes_ingress_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_ingress_name]target_label: kubernetes_name# 抓取POD进⾏监控- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: podrelabel_configs:# POD的 annotation 中含有"/scrape: true" 的则保留,意思就是会被Prometheus抓取,不具有这个的POD则不会被抓取- action: keepregex: truesource_labels:- __meta_kubernetes_pod_annotation_prometheus_io_scrape# 获取POD的 annotation 中定义的"/path: XXX"定义的值,这个值就是你的程序暴露符合prometheus规范的metrics的地址# 如果你的metrics的地址不是 /metrics 的话,通过这个标签说,那么这⾥就会把这个值赋值给 __metrics_path__这个变量,因为prometheus# 是通过这个变量获取路径然后进⾏拼接出来⼀个完整的URL,并通过这个URL来获取metrics值的,因为prometheus默认使⽤的就是 http(s)://X.X.X.X/metrics# 这样⼀个路径来获取的。- action: replaceregex: (.+)source_labels:- __meta_kubernetes_pod_annotation_prometheus_io_pathtarget_label: __metrics_path__# 这⾥是端⼝信息,因为你的程序很有可能在容器中并不是以80端⼝运⾏的,那么就需要做⼀个拼接http(s)://:xx/metrics# __address__在prometheus中代表的就是实例的IP地址,⽽POD中的annotation 中定义的"/port: XX"就是你程序# 被访问到的端⼝,最终在prometheus中将会被显⽰为 instance=X.X.X.X:XX这样- action: replaceregex: ([^:]+)(?::d+)?;(d+)replacement: $1:$2source_labels:- __address__- __meta_kubernetes_pod_annotation_prometheus_io_porttarget_label: __address__- action: labelmapregex: __meta_kubernetes_pod_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_pod_name]action: replacetarget_label: kubernetes_pod_name

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688057639a72525.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信