Prometheus中动态发现Target和Relabel的应用

本文详细介绍了在Prometheus监控系统中如何实现Target的动态发现,并探讨了Relabel配置的使用,以实现对目标服务的灵活管理和监控。
摘要由CSDN通过智能技术生成


本文以Consul为例介绍了Prometheus的服务发现能力,适用于在云平台/容器平台的监控场景动态发现Target。同时通过Prometheus的relabel实现多数据中心的监控数据聚合,以及选择和过滤监控Target。
Prometheus中的Job和Instance


Prometheus主要由一下几个部分组成:

  • Prometheus Server:负责采集监控数据,并且对外提供PromQL实现监控数据的查询以及聚合分析;

  • Exporters:用于向Prometheus Server暴露数据采集的endpoint,Prometheus轮训这些Exporter采集并且保存数据;

  • AlertManager以及其它组件(……和本文无关就不说这些)


在Prometheus Server的配置文件中我们使用scrape_configs来定义:

scrape_configs:
- job_name: prometheus
 metrics_path: /metrics
 scheme: http
 static_configs:
 - targets:
   - localhost:9090

其中每一个scrape_config对象对应一个数据采集的Job,每一个Job可以对应多个Instance,即配置文件中的targets。通过Prometheus UI可以更直观的看到其中的关系。


Pull vs Push


对于Zabbix以及Nagios这类Push系统而言,通常由采集的Agent来决定和哪一个监控服务进行通讯。而对于Prometheus这类基于Pull的监控平台而言,则由server侧决定采集的目标有哪些。


相比于Push System而言,Pull System:

  • 只要Exporter在运行,你可以在任何地方(比如在本地),搭建你的监控系统

  • 你可以更容器的去定位Instance实例的健康状态以及故障定位


当然对于我个人的角度来看,Pull System更利于DevOps的实施。每一个团队可以搭建自己的监控系统,并关注自己关心的监控指标,并构建自己的DevOps Dashboard。

在小规模监控或者本地测试中_static_configs_是我们最常用的用于配置监控目标服务,但是在IaaS平台(如Openstack)或者CaaS平台(如Kubernetes)中:基础设施、容器、应用程序的创建和销毁会更加频繁。

那对于Prometheus这样的Pull System而言,如何动态的发现这些监控目标?
服务发现 Service Discovery



Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes、OpenStack、EC2等等。基于服务发现的过程并不复杂,通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮训这些Target获取监控数据。

这里为了验证Prometheus的服务发现能力,我们使用Docker Compose在本地搭建我们的测试环境。我们使用gliderlabs/registrator监听Docker进程,对于暴露了端口的容器,registrator会自动将该容器暴露的服务地址注册到Consul中。

这里使用Node Exporter采集当前主机数据,使用cAdvisor采集容器相关数据。

完整的Docker Compose文件如下:

version: '2'
services:
 consul:
   image: consul
   ports:
     - 8400:8400
     - 8500:8500
     - 8600:53/udp
   command: agent -server -client=0.0.0.0 -dev -node=node0 -bootstrap-expect=
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
A:在 Kubernetes 部署 Prometheus,可以按照以下步骤进行操作: 1. 创建一个 Kubernetes Namespace,可以使用以下命令: ``` kubectl create ns monitoring ``` 2. 创建一个 Prometheus 配置文件 prometheus.yml,可以使用以下命令: ``` vi prometheus.yml ``` 将以下内容复制到文件: ``` global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - api_server: null role: endpoints namespaces: names: ['default'] relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - api_server: null role: node 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 ``` 这个配置文件将监控使用 `https` 端口的 Kubernetes API Server、Kubernetes Node 的 CPU、内存和磁盘利用率等信息,以及已经部署的 Prometheus 本身。 3. 创建一个 ConfigMap,将以上配置文件导入 Kubernetes 集群,可以使用以下命令: ``` kubectl create configmap prometheus-cm --from-file=prometheus.yml -n monitoring ``` 4. 创建一个 Prometheus Deployment 并暴露一个 Service,可以使用以下 YAML 文件: ``` apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: monitoring spec: replicas: 1 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:v2.22.2 args: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus/data - --storage.tsdb.retention.time=7d volumeMounts: - name: prometheus-data mountPath: /prometheus - name: prometheus-config mountPath: /etc/prometheus volumes: - name: prometheus-data emptyDir: {} - name: prometheus-config configMap: name: prometheus-cm items: - key: prometheus.yml path: prometheus.yml --- apiVersion: v1 kind: Service metadata: name: prometheus namespace: monitoring spec: selector: app: prometheus ports: - name: prometheus-web port: 9090 protocol: TCP targetPort: 9090 ``` 以上 YAML 文件,我们创建了一个名称为 prometheus 的 Deployment,副本数为 1,使用了 prom/prometheus:v2.22.2 镜像。然后创建了一个名称为 prometheus 的 Service,并将 targetPort 设置为 9090。 5. 使用以下命令,将以上 YAML 文件部署到 K8s 集群: ``` kubectl apply -f prometheus.yaml ``` 等待几分钟后,可以执行以下命令验证 Prometheus 是否正常运行: ``` kubectl get pods -n monitoring ``` 以上命令输出的结果应该类似于以下内容: ``` NAME READY STATUS RESTARTS AGE prometheus-7b447fcfbc-wq2xn 1/1 Running 0 8h ``` 此外,还可以使用以下命令获取 Prometheus 的 Service 的 ClusterIP: ``` kubectl get svc prometheus -n monitoring ``` 以上命令输出的结果应该类似于以下内容: ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.100.82.214 <none> 9090/TCP 8h ``` 通过以上输出的 ClusterIP 和 9090/TCP,就可以在 K8s 集群内部访问 Prometheus 了,比如可以使用以下命令: ``` curl http://10.100.82.214:9090/ ``` 以上命令输出的内容应该是 HTML 格式的 Prometheus 首页。 至此,在 Kubernets 部署 Prometheus 完成。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值