8-4 Prometheus服务发现

文章目录

  • 前言
  • 静态配置
    • 弊端
  • 服务发现
    • 优点
    • 原理
  • 服务发现类型
    • 基于K8S的服务发现
    • 基于File的服务发现
    • 基于Consul的服务发现
    • 基于DNS的服务发现

前言

服务发现(Service Discovery)经常用在微服务治理以及配置管理上,在负载且动态变化的环境下如果没有服务发现就无法可靠的感知服务的新增、变更、删除等。服务发现可以说是基础设施服务的基石之一。



静态配置

项目中部署prometheus的时候,最开始如果需要额外添加一台机器,需要手动更新prometheus的配置文件,再重新启动。对于一组比较少的服务器的测试环境中,这种手动方式添加配置信息是最简单的方法。

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

对于小型的系统环境,使用 static_configs 指定各 target 即可解决问题,但是在中大型的系统环境或具有较强动态性的云计算环境来说,静态配置有很多弊端。


弊端

但是实际生产环境中,对于成百上千的节点组成的大型集群又或者Kubernetes这样的大型集群,很明显,手动方式捉襟见肘,也带来很大的运维成本。

手动配置的方式不适用于生产环境,考虑被监控的主机、应用的规模以及动态调整的特点,在云环境下,特别是容器环境下,抓取目标地址是经常变动的,所以用静态的方式就不能满足这些场景了。



服务发现

为此,Prometheus设计了一套服务发现功能。Prometheus通过使用"服务发现"来通过自动化的机制来检测、分类和试别新的变更的目标。

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


优点

通过服务发现的方式,管理员可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息。

动态服务发现能够自动发现集群中的新端点,并加入到配置中,通过服务发现,Prometheus能查询到需要监控的Target列表,然后轮询这些Target获取监控数据。

Prometheus 服务发现能够自动检测分类,并且能够识别新节点和变更节点。也就是说,可以在容器或者云平台中,自动发现并监控节点或更新节点,动态的进行数据采集和处理。

Prometheus 可以集成到多种不同的开源服务发现工具上,以便动态发现需要监控的目标。Prometheus 可以很好的集成到 Kubernetes 平台上,通过其 API Server 动态发现各类被监控的 Pod、Service、Endpoint、Ingress 及 Node 对象,还支持基于文件实现的动态发现。


原理

Prometheus默认是采用pull方式拉取监控数据的,也就是定时去目标主机上抓取metrics数据,每一个抓取的目标需要暴露一个HTTP接口,Prometheus通过这个暴露的接口就可以获取到相应的指标数据,这种方式需要由目标服务决定采集的目标有哪些,通过配置在scrape_configs中的各种job来实现,无法动态感知新服务,如果后面增加了节点或者组件信息,就得手动修改配置文件,并重启Prometheus,很不友好,对于Prometheus这一类基于Pull模式的监控系统,显然也无法继续使用的static_configs的方式静态的定义监控目标。

Prometheus Server 的数据抓取工作基于 Pull 模型,因而,它必须要事先知道各 target 的位置,然后才能从相应的 Exporter 或 Instrumentation 中抓取数据。Prometheus 为此专门设计了一组服务发现机制,以便于能够基于服务注册中心自动发现、检测、分类可被监控的各 target ,以及更新发生了变动的 target。

在不同的场景下,会有不同的东西扮演者代理人(服务发现与注册中心)这一角色。比如在AWS公有云平台或者OpenStack的私有云平台中,由于这些平台自身掌握着所有资源的信息,此时这些云平台自身就扮演了代理人的角色。Prometheus通过使用平台提供的API就可以找到所有需要监控的云主机。在Kubernetes这类容器管理平台中,Kubernetes掌握并管理着所有的容器以及服务信息,那此时Prometheus只需要与Kubernetes打交道就可以找到所有需要监控的容器以及服务对象。



服务发现类型

Prometheus可以直接与一些开源的服务发现工具进行集成,例如在微服务架构的应用程序中,经常会使用到例如Consul这样的服务发现注册软件,Promethues也可以与其集成从而动态的发现需要监控的应用服务实例。除了与这些平台级的公有云、私有云、容器云以及专门的服务发现注册中心集成以外,Prometheus还支持基于DNS以及文件的方式动态发现监控目标,从而大大的减少了在云原生,微服务以及云模式下监控实施难度。

8-4 Prometheus服务发现_第1张图片

Prometheus数据源配置动态发现, 常用的为以下几类:

  1. kubernetes_sd_configs: Kubernetes 服务发现
  2. file_sd_configs: 文件服务发现
  3. consul_sd_configs: Consul 服务发现
  4. dns_sd_configs: DNS 服务发现

目前 Prometheus 已经支持了很多常见的自动发现服务,比如 consul ec2 gce serverset_sd_config openStack kubernetes 等等。
我们常用的就是sd_config、DNS、kubernetes、consul这些足够了。


基于K8S的服务发现

基于kubernetes服务发现,prometheus通过api-server交互,动态发现kubernetes中被监控的目标,目前主要支持5种服务发现模式

1: Node
2 :Service
3 :Pod
4 :Endpoints
5 :Ingress

对应配置文件 role:node,role:service 等等。

基于kubernetes_sd_configs服务发现的配置文件:

    - job_name: 'kubernetes-apiserver' # job名称
      kubernetes_sd_configs: # 基于kubernetes_sd_configs实现服务发现
      - role: endpoints # 发现endpoints
      scheme: https # 当前job使用的发现协议
      tls_config: # 证书配置
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt # 容器里的token路径
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs: # 重新re修改标签lebel配置configs
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] # 源标签
        action: keep # action定义了relabel的具体动作,action支持多种
        regex: default;kubernetes;https # 发现default命名空间的kubernetes服务是https协议

基于File的服务发现

用户可以通过JSON或者YAML格式的文件,定义所有的监控目标。

[  
  {
    "targets": [ "localhost:9100"],
    "labels": {
      "env": "prod",
      "job": "node"
    }
]

在Prometheus配置文件引用该文件即可。

scrape_configs:
      - job_name: 'file_ds'
      file_sd_configs:
       - files:
        - /data/prod_node.json

基于Consul的服务发现

Consul是由HashiCorp开发的一个支持多数据中心的分布式服务发现和键值对存储服务的开源软件,被大量应用于基于微服务的软件架构当中。

Consul作为一个通用的服务发现和注册中心,记录并且管理了环境中所有服务的信息。Prometheus通过与Consul的交互可以获取到相应Exporter实例的访问信息。在Prometheus的配置文件当可以通过以下方式与Consul进行集成。

consul_sd_configs:
      - server: localhost:8500 # 指定了consul的访问地址
        services:   # 注册到consul中的实例信息
          - node_exporter

基于DNS的服务发现

DNS服务发现可通过A记录或者SRV。A记录是域名到IP的记录,而SRV 是 DNS 资源记录中的一种记录类型,用来指定服务地址和端口。

# A
dns_sd_configs:
  - names: ['example.com']
    type: A
    port: 9100
# SRV
dns_sd_configs:
  - names: ['_prometheus._tcp.example.com']


你可能感兴趣的:(Prometheus,prometheus,服务发现,云计算)