本章节次要讲主动发现应用场景介绍与Prometheus基于文件、DNS的主动发现配置

当咱们应用各类exporter别离对系统、数据库和HTTP服务进行监控指标采集,对于所有监控指标对应的Target的运行状态和资源应用状况,都是用Prometheus的动态配置性能 static_configs
手动增加主机IP和端口,而后重载服务让Prometheus发现。

对于一组比拟少的服务器的测试环境中,这种手动形式增加配置信息是最简略的办法。然而理论生产环境中,对于成千盈百的节点组成的大型集群又或者Kubernetes这样的大型集群,很显著,手动形式顾此失彼了。
为此,Prometheus提前曾经设计了一套服务发现性能。

Prometheus 服务发现可能自动检测分类,并且可能辨认新节点和变更节点。也就是说,能够在容器或者云平台中,主动发现并监控节点或更新节点,动静的进行数据采集和解决。
目前 Prometheus 曾经反对了很多常见的主动发现服务,比方 consul ec2 gce serverset_sd_config openStack kubernetes 等等。
咱们罕用的就是sd_config、DNS、kubernetes、consul这些足够了。如果有须要其余配置的探讨,能够与我交换,我能够补上来。

本章节中会对Prometheus主动发现中的基于文件、DNS进行发现解说,consul 在前面会独自开展来讲,如何能够使其完满的解决以后场景下常见的各类服务发现监控。

为什么要用主动发现?

在基于云(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零碎和Pull零碎的外围差别。相较于Push模式,Pull模式的长处能够简略总结为以下几点:

  • 只有Exporter在运行,你能够在任何中央(比方在本地),搭建你的监控零碎;
  • 你能够更容易的查看监控指标实例的衰弱状态,并且能够疾速定位故障;
  • 更利于构建DevOps文化的团队;
  • 松耦合的架构模式更适宜于云原生的部署环境。

基于文件的服务发现

在Prometheus反对的泛滥服务发现的实现形式中,基于文件的服务发现是最通用的形式。这种形式不须要依赖于任何的平台或者第三方服务。对于Prometheus而言也不可能反对所有的平台或者环境。通过基于文件的服务发现形式下,Prometheus会定时从文件中读取最新的Target信息,因而,你能够通过任意的形式将监控Target的信息写入即可。
用户能够通过JSON或者YAML格局的文件,定义所有的监控指标。例如,在上面的yaml文件中别离定义了2个采集工作,以及每个工作对应的Target列表:

yaml格局

- targets: ['192.168.1.220:9100']  labels:    app:    'app1'    env:   'game1'    region: 'us-west-2'- targets: ['192.168.1.221:9100']  labels:    app:    'app2'    env:   'game2'    region: 'ap-southeast-1'

json格局

[  {    "targets": [ "192.168.1.221:29090"],    "labels": {      "app": "app1",      "env": "game1",      "region": "us-west-2"    }  },  {    "targets": [ "192.168.1.222:29090" ],    "labels": {      "app": "app2",      "env": "game2",      "region": "ap-southeast-1"    }  }]

同时还能够通过为这些实例增加一些额定的标签信息,例如应用env标签标示以后节点所在的环境,这样从这些实例中采集到的样本信息将蕴含这些标签信息,从而能够通过该标签依照环境对数据进行统计。

创立Prometheus配置文件/data/prometheus/conf/prometheus-file-sd.yml,并增加以下内容:

  - job_name: 'file_sd_test'    scrape_interval: 10s    file_sd_configs:    - files:       - /data/prometheus/static_conf/*.yml       - /data/prometheus/static_conf/*.json

这里定义了一个基于file_sd_configs的监控采集test工作,其中模式的工作名称为file_sd_test。在yml文件中能够应用yaml标签笼罩默认的job名称,而后重载Prometheus服务。

service prometheus restat

在Prometheus UI的Targets下就能够看到以后从targets.json文件中动静获取到的Target实例信息以及监控工作的采集状态,同时在Labels列下会蕴含用户增加的自定义标签:

Prometheus默认每5m从新读取一次文件内容,当须要批改时,能够通过refresh_interval进行设置,例如:

  - job_name: 'file_sd_test'    scrape_interval: 10s    file_sd_configs:    - refresh_interval: 30s # 30s重载配置文件      files:      - /data/prometheus/static_conf/*.yml      - /data/prometheus/static_conf/*.json

通过这种形式,Prometheus会主动的周期性读取文件中的内容。当文件中定义的内容发生变化时,不须要对Prometheus进行任何的重启操作。

这种通用的形式能够衍生了很多不同的玩法,比方与自动化配置管理工具(Ansible)联合、与Cron Job联合等等。 对于一些Prometheus还不反对的云环境,比方国内的阿里云、腾讯云等也能够应用这种形式通过一些自定义程序与平台进行交互主动生成监控Target文件,从而实现对这些云环境中基础设施的自动化监控反对。

基于DNS的发现

对于一些环境,可能基于文件与consul服务发现曾经无奈满足的时候,咱们可能就须要DNS来做服务发现了。在互联网架构中,咱们应用主机节点或者Kubernetes集群通常是不对外裸露IP的,这就要求咱们在一个外部局域网或者专用的网络中部署DNS服务器,应用DNS服务来实现外部网络中的域名解析工作。
这个时候咱们就能够应用Prometheus的DNS服务发现,Prometheus的DNS服务发现有俩种办法,第一种是应用DNA A记录来做主动发现,第二种办法是DNS SRV,第一种显然没有没有SRV资源记录更为便捷,在这里就把俩种配置全副做一遍,对于取决用什么,依据你本人的环境来抉择。

DNA A记录发现配置,首先你内网须要有一个DNS服务器,或者间接自行配置解析记录即可,我这里应用的dnsmasq服务在内网测试

# 验证 test1 DNS记录nslookup test1.example.comServer:        127.0.0.53Address:    127.0.0.53#53Non-authoritative answer:Name:    test1.example.comAddress: 192.168.1.221# 验证 test2 DNS记录nslookup test2.example.comServer:        127.0.0.53Address:    127.0.0.53#53Non-authoritative answer:Name:    test2.example.comAddress: 192.168.1.222

Prometheus配置

  # 基于DNS A记录发现  - job_name: 'DNS-A'                  # job 名称    metrics_path: "/metrics"            # 门路    dns_sd_configs:    - names: ["test1.example.com", "test2.example.com"]   # A记录      type: A                                   # 解析类型      port: 29100                     # 端口

重启Prometheus 在targets中能够看到dns-a记录

DNS SRV是DNS资源记录中的一种记录类型,用来指定服务器地址与端口,并且能够设置每个服务器的优先级和权重。拜访到服务的时候,本地的DNS resolver 从DNS服务器获取一个地址列表,而后依据优先级和权重来抉择一个地址作为本次申请的指标地址。

SRV的记录格局:

_service._proto.name. TTL class SRV priority weight port target

| 参数 | 阐明 |
| :-----: | :----: |
| _service | 服务名称,前缀 _ 是为了避免与DNS 标签(域名)抵触|
| proto | 服务应用的通信协定 通常是 tcp udp |
| name | 此记录无效域名 |
| TTL | 规范DNS class 字段 如 IN |
| priority | 记录优先级,数值越小,优先级越高。 [0-65535] |
| weight | 记录权重,数值越大,权重越高。[0-65535] |
| port | 服务应用端口 |
| target | 应用服务的主机地址名称 |

这里没有应用named,而是应用的dnsmasq来做的测试,增加SRV记录实现后,须要重启dnsmasq服务使其失效。

# 配置dns解析cat /etc/dnsmasq.d/localdomain.confaddress=/test1.example.com/192.168.1.221address=/test2.example.com/192.168.1.222# 增加 SRV 记录cat /etc/dnsmasq.confsrv-host =_prometheus._tcp.example.com,test1.example.com,29100srv-host =_prometheus._tcp.example.com,test2.example.com,29100# 验证srv服务是否正确,192.168.1.123 是外部DNS服务器,dig @192.168.1.123 +noall +answer SRV _prometheus._tcp.example.comoutput..._prometheus._tcp.example.com. 0    IN    SRV    0 0 9100 test1.example.com._prometheus._tcp.example.com. 0    IN    SRV    0 0 9100 test2.example.com.

Prometheus配置实现当前,重载Prometheus服务。

  - job_name: 'DNS-SRV'                # 名称    metrics_path: "/metrics"            # 获取数据的门路    dns_sd_configs:                     # 配置应用DNS解析    - names: ['_prometheus._tcp.example.com']   # 配置SRV对应的解析地址

这个时候在targets中能够看到DNS主动发现的记录了。

这个时候,咱们在新加一个记录,用来做主动发现。

# 增加test0解析cat /etc/dnsmasq.d/localdomain.confaddress=/test1.example.com/192.168.1.221address=/test2.example.com/192.168.1.222address=/test0.example.com/192.168.1.220# 增加 test0 SRV 记录cat /etc/dnsmasq.confsrv-host =_prometheus._tcp.example.com,test1.example.com,29100srv-host =_prometheus._tcp.example.com,test2.example.com,29100srv-host =_prometheus._tcp.example.com,test0.example.com,19100# 验证dns SRV记录是否胜利dig @192.168.1.123 +noall +answer SRV _prometheus._tcp.example.com_prometheus._tcp.example.com. 0    IN    SRV    0 0 19100 test0.example.com._prometheus._tcp.example.com. 0    IN    SRV    0 0 29100 test2.example.com._prometheus._tcp.example.com. 0    IN    SRV    0 0 29100 test1.example.com.

这个时候在去察看targets就发现曾经能够主动发现test0了。