第7章 Prometheus服务发现

7.1 Prometheus与服务发现

在基于云(IaaS或者CaaS)的基础设施环境中用户可以像使用水、电一样按需使用各种资源(计算、网络、存储)。按需使用就意味着资源的动态性,这些资源可以随着需求规模的变化而变化。例如在AWS中就提供了专门的AutoScall服务,可以根据用户定义的规则动态地创建或者销毁EC2实例,从而使用户部署在AWS上的应用可以自动的适应访问规模的变化。

这种按需的资源使用方式对于监控系统而言就意味着没有了一个固定的监控目标,所有的监控对象(基础设施、应用、服务)都在动态的变化。对于Nagias这类基于Push模式传统监控软件就意味着必须在每一个节点上安装相应的Agent程序,并且通过配置指向中心的Nagias服务,受监控的资源与中心监控服务器之间是一个强耦合的关系,要么直接将Agent构建到基础设施镜像当中,要么使用一些自动化配置管理工具(如Ansible、Chef)动态的配置这些节点。当然实际场景下除了基础设施的监控需求以外,我们还需要监控在云上部署的应用,中间件等等各种各样的服务。要搭建起这样一套中心化的监控系统实施成本和难度是显而易见的。

而对于Prometheus这一类基于Pull模式的监控系统,显然也无法继续使用的static_configs的方式静态的定义监控目标。而对于Prometheus而言其解决方案就是引入一个中间的代理人(服务注册中心),这个代理人掌握着当前所有监控目标的访问信息,Prometheus只需要向这个代理人询问有哪些监控目标控即可, 这种模式被称为服务发现。

基于服务发现与注册中心动态发现监控目标

在不同的场景下,会有不同的东西扮演者代理人(服务发现与注册中心)这一角色。比如在AWS公有云平台或者OpenStack的私有云平台中,由于这些平台自身掌握着所有资源的信息,此时这些云平台自身就扮演了代理人的角色。Prometheus通过使用平台提供的API就可以找到所有需要监控的云主机。在Kubernetes这类容器管理平台中,Kubernetes掌握并管理着所有的容器以及服务信息,那此时Prometheus只需要与Kubernetes打交道就可以找到所有需要监控的容器以及服务对象。Prometheus还可以直接与一些开源的服务发现工具进行集成,例如在微服务架构的应用程序中,经常会使用到例如Consul这样的服务发现注册软件,Promethues也可以与其集成从而动态的发现需要监控的应用服务实例。除了与这些平台级的公有云、私有云、容器云以及专门的服务发现注册中心集成以外,Prometheus还支持基于DNS以及文件的方式动态发现监控目标,从而大大的减少了在云原生,微服务以及云模式下监控实施难度。

Push系统 vs Pull系统

如上所示,展示了Push系统和Pull系统的核心差异。相较于Push模式,Pull模式的优点可以简单总结为以下几点:

  • 只要Exporter在运行,你可以在任何地方(比如在本地),搭建你的监控系统;
  • 你可以更容易的查看监控目标实例的健康状态,并且可以快速定位故障;
  • 更利于构建DevOps文化的团队;
  • 松耦合的架构模式更适合于云原生的部署环境。

7.2 基于文件的服务发现

前面我们配置监控任务都是直接在Prometheus的配置文件中添加配置信息,然后重启Prometheus。这里有两个问题,一是有大量的任务的时候,一个Prometheus的配置文件变得很大,难以维护;二是每次的修改都要重启Prometheus,非常麻烦。基于文件的服务发现就是解决这两个问题的。

在Prometheus支持的众多服务发现的实现方式中,基于文件的服务发现是最通用的方式。这种方式不需要依赖于任何的平台或者第三方服务。对于Prometheus而言也不可能支持所有的平台或者环境。通过基于文件的服务发现方式下,Prometheus会定时从文件(json或者yaml格式)中读取最新的Target信息,因此,你可以通过任意的方式将监控Target的信息写入即可。

要定义文件发现服务非常简单,只需要在配置文件中添加对应的标签:

 file_sd_configs:
  - files:
    - yourfile.yml

比如,我要把我之前监控的node exporter独立到一个配置文件里面,我这么配置:

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['192.168.113.52:9090']

  #采集node exporter监控数据
  - job_name: node_exporter
    file_sd_configs:
      - files: ['/usr/local/prometheus/sd_config/node_exporter.yml']

上面我们定义了自动发现的配置,node_exporter这个任务的具体配置会从定义的文件中读取,默认每5分钟读取一次。我们新建这样的一个文件。

mkdir /usr/local/prometheus/sd_config
vim /usr/local/prometheus/sd_config/node_exporter.yml

yml文件里面定义了三个监控目标

- targets: ['192.168.113.52:9100']
- targets: ['192.168.113.70:9100']
- targets: ['192.168.1.174:9100']

然后重启Prometheus,让配置生效。在web页面上我们可以看到这个监控任务

然后,我们修改下node_exporter.yml,给两个目标增加标签,5分钟后查看Prometheus有没有自动更新这些配置:

- targets: ['192.168.113.52:9100']
  labels:
    instance: prometheus02-192.168.113.52
- targets: ['192.168.113.70:9100']
  labels:
    instance: docker01-192.168.113.70
- targets: ['192.168.1.174:9100']

5分钟后,我们看到 Labels 这一栏,明显发生了变化,也就是说我们的配置被自动加载进去了,如果要加快刷新的频率,可以修改Prometheus的配置文件:

scrape_configs:
  #采集node exporter监控数据
  - job_name: node_exporter
  - refresh_interval: 1m
    file_sd_configs:
      - files: ['/usr/local/prometheus/sd_config/node_exporter.yml']

7.3 基于Consul的服务发现

上面介绍的服务发现是基于文件的,如果我有多个Prometheus那就是要维护多套的配置文件了,这样似乎不够智能。有没有一种像,zookeeper那样的注册中心呢?Prometheus只要定期从注册中心获取信息即可。

在Prometheus技术栈里面,使用的工具是Consul。具体使用不做介绍,可以查看原文点我

7.4 服务发现与Relabel

在上面的基础上有个更加难搞的需求,那就是线上环境有多套的集群比如:dev, stage, prod。不同的团队要采集的集群是不一样的,有没有什么方法可以过滤这些不同的信息么?或者说有什么方法可以给这些集群打标签呢?

这里使用的是 Prometheus的Relabeling机制,具体的介绍和使用参考原文点我

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 公司的监控系统有Zabbix和Prometheus+Grafana,对于Prometheus这一块本人不大熟悉。挂...
    super_pcm阅读 852评论 0 0
  • 在第1章中为了采集主机的监控样本数据,我们在主机上安装了一个Node Exporter程序,该程序对外暴露了一个用...
    super_pcm阅读 1,507评论 0 0
  • 监控的目标 在《SRE: Google运维解密》一书中指出,监控系统需要能够有效的支持白盒监控和黑盒监控。通过白盒...
    逗比的一生阅读 547评论 0 1
  • 什么是 Prometheus Prometheus[https://prometheus.io/] 是开源监控告警...
    华阳_3bcf阅读 2,305评论 1 1
  • 文章目的: 1、向没听过或者刚听过但是还对这个监控系统没有任何概念的开发者介绍Prometheus的应用场景。2、...
    whaike阅读 39,626评论 15 59