Prometheus 标签动作|action: keep 设置哪些对象需要抓取,针对服务发现service

文章讲述了在Kubernetes环境中,如何使用Prometheus的relabel_configs功能来管理标签,包括过滤目标、仅抓取带有特定注解的服务和Pod,以及控制指标抓取。着重介绍了keep和drop操作在服务发现过程中的应用,以实现精细化的监控策略。
摘要由CSDN通过智能技术生成

标签的作用:

  • 可以基于已有的标签,生成一个标签
  • 也可以创建新的标签
  • 还可以过滤标签,不想采集哪些
  • 哪些标签不要了也可以将其删除

 保留或丢弃对象、哪些对象需要抓取


Relabeling 另一个常见的用例就是过滤有标签的对象,keep 或 drop 这两个动作可以来完成,使用这两个操作,可以帮助我们完成如下的一些操作:

  • 来自服务发现的哪些目标应该被抓取
  • 从目标中抓取哪些指定的序列样本,或将其发送到远程存储
  • 哪些报警要发送到 Alertmanager

一个 keep 动作的配置规则如下所示:

action: keep
source_labels: [<source label name list>]
separator: <source labels separator> # 默认为 ';'
regex: <regular expression> # 默认为 '(.*)' (匹配任何值)

keep 操作同样按顺序执行如下步骤:

  • 使用 separator 分隔符将 source_labels 中列出的标签值连接起来,多个label用分隔符分开
  • 测试 regex 中的正则表达式是否与上一步的连接字符串匹配
  • 如果不匹配,该对象将从最终输出列表中删除,如果匹配,则保留该对象

drop 动作和 keep 类似,只是它是删除一个对象而不是保留。同样接下来看一看 keep 和 drop 的示例。

只抓取具有注解的目标

在服务发现的时候,我们可能只想抓取那些具有特定元数据标签的目标,例如,下面的配置让我们只抓取 Kubernetes 中具有 example.io/should_be_scraped=true 这个 annotation 的目标。

- action: keep
  source_labels:
  [_meta_kubernetes_service_annotation_example_io_should_be_scraped]
  regex: true

kind: Service
apiVersion: v1
metadata:
  name: redis
  namespace: monitor
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9121"

--------------------------------------------------------------------------------
    - 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
​      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

下面是完整的操作:

[root@k8s-uat-m01 manifests]# curl -k https://10.202.17.17:10259/metrics
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",
  "reason": "Forbidden",
  "details": {},
  "code": 403
}


[apps@prometheus-uat prometheus]$ curl -k --location 'https://10.202.17.17:10259/metrics' --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh0dERyYXVnRHJ4ZS1YYzBwNlpRbGg5NFVnZ3Z1QWwzWWRWZndka29laWsifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQ3MjE0MTIyLCJpYXQiOjE3MTU2NzgxMjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtIiwicG9kIjp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cy0wIiwidWlkIjoiZTY1MTFkNTItODViMy00MGVhLWI1MGYtMGY5Nzk1ZTMzNWFiIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cyIsInVpZCI6ImYwZjdiOTkxLTAwYzItNDhjNC05OGFiLWE1Mzk4NGRmMThlMiJ9LCJ3YXJuYWZ0ZXIiOjE3MTU2ODE3Mjl9LCJuYmYiOjE3MTU2NzgxMjIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtOnByb21ldGhldXMtazhzIn0.TuvVbdbQ3s7kXlGwTGpzxIA7M46EW66r-yQIoV7-DdjLe10CjNyI4Wn28sHdaK0QTaagpcgzQXkb6j1ITZPawvo3hGtPq_ZlKrs1lCYdolMjEdzQJ0ayxwUFaSrJAQP5NI_HPv0k8iqQDUYhmrnmy6zF7gyQUXiFMaXBTetT5BfNreir550Z2j5Vb2qZFWrfM4PVdXV9KADfk0m5kwU5ER2uXbXPo-gABU6CCWVaGOVYZI8wMK25L3H-3V4KQYf0NNXf53AhyojH-B0S7acQ-xXvHHC5tDcBBd1PIsLyWfxdShxfDQBqHImenSAyvHauJWbXY0HSH6jyh-Wyxv2oKA'

scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0001"} 63
scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0002"} 63
scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue"


[root@k8s-uat-m01 manifests]# kubectl get svc -n kube-system | grep kube-scheduler
kube-scheduler-svc            ClusterIP   None             <none>        10259/TCP                      79d

[root@k8s-uat-m01 manifests]# kubectl describe svc kube-scheduler-svc   -n kube-system
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"kube-scheduler"},"name":"kube-scheduler-svc","namespace":"kube-system"},"spec":{"clusterIP":"None","ports":[{"name":"https-metrics","port":10259,"targetPort":10259}],"selector":{"component":"kube-scheduler"}}}
    prometheus.io/port: "10259"   ######添加#######
    prometheus.io/scrape: "true"  ######添加#######
  labels:
    app.kubernetes.io/name: kube-scheduler
  name: kube-scheduler-svc




  - job_name: "k8s-kube-scheduler"
    honor_timestamps: true
    metrics_path: /metrics
    scheme: https
    kubernetes_sd_configs:
      - api_server: https://k8s-uat-api.ztoky.cn:6443
        role: endpoints
        bearer_token_file: /apps/svr/prometheus/k8s_cert/token
        tls_config:
          insecure_skip_verify: true
    bearer_token_file: /apps/svr/prometheus/k8s_cert/token
    tls_config:
      insecure_skip_verify: true
    relabel_configs:
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape,__meta_kubernetes_namespace,__meta_kubernetes_endpoints_name,__meta_kubernetes_endpoint_port_name]
      action: keep
      regex: true;kube-system;kube-scheduler-svc;https-metrics

keep下面这些标签是否正确,以及标签值是否正确,每个人的环境是不一样的,得确认!!!!

[__meta_kubernetes_service_annotation_prometheus_io_scrape,__meta_kubernetes_namespace,__meta_kubernetes_endpoints_name,__meta_kubernetes_endpoint_port_name]
      action: keep
      regex: true;kube-system;kube-scheduler-svc;https-metrics 

 Kubernetes 服务发现机制下面会将 labels 标签与 annotation 作为元信息输出到 Prometheus,这些元信息都包含 __meta_ 前缀,这里我们的配置就是保留具有 example.io/should_be_scraped 这个 annotation 标签,且值为 true 的目标。

只存储特定的指标

当使用 metric_relabel_configs(抓取数据之后的,也就是说要存储了,只会去存储这样的指标,relabel_configs是抓取之前) 来控制目标的抓取方式时,我们可以使用下面的规则来只存储指标名称以 api_ 或 http_ 开头的指标。

action: keep
source_labels: [__name__]
regex: "(api_|http_).*"

只抓取特定目标的Service

Keep只有匹配的才会去采集数据,不匹配的就不采集。下面意思就是pod当中有些注解中声明了prometheus_io_scrape这个字段,那么就会把你纳入监控,如果没有声明就不会纳入监控。也就是k8s当中部署了这么多pod,谁要监控,谁不要被监控,在部署service可以指定是否需要采集,如果需要采集需要在注解当中声明prometheus_io_scrape: true

在service 和pod里面声明配置注解,那么就会采集注解里面含有这个值的

annotations:
  prometheus.io/scrape: 'true'

 # Service没配置注解prometheus.io/scrape的不采集
- action: keep
  regex: true
  source_labels:
  - __meta_kubernetes_service_annotation_prometheus_io_scrape

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值