本节介绍了 NSX Advanced Load Balancer 与 Prometheus 的集成,以及如何对 Prometheus 抓取请求进行身份验证。

Prometheus 是一个开源系统监控和警示工具包,于 2016 年加入了云原生计算基金会 (CNCF)。与其他常见的监控解决方案不同,Prometheus 衡量指标收集使用 HTTP 的提取方法。有关 Prometheus 的详细信息,请参见 Prometheus 主页

Prometheus API 规范

NSX Advanced Load Balancer 控制器 提供了第一类 REST API,用于为以下项提取衡量指标(Prometheus 可以载入的格式的数据):

  • 控制器集群

  • 虚拟服务

  • 服务引擎

用于获取 Prometheus 衡量指标的 GET API

用于获取 Prometheus 衡量指标的 GET API 如下:

GET /api/analytics/prometheus-metrics/{entity_type}/?{query_params}

在这里,entity_type 是控制器、虚拟服务、服务引擎或池。

有效的查询参数如下:

entity_id

根据实体类型,它可以是控制器节点 ID、池 UUID、服务引擎 UUID、虚拟服务 UUID 的逗号分隔列表。

entity_name

根据 entity_type,entity_name 是有效池、虚拟服务或服务引擎对象名称的逗号分隔列表。

metric_id

以逗号分隔的有效衡量指标 ID 列表默认为所有可能的衡量指标 ID,除非实时参数为 true,此时将返回衡量指标的子集。使用 API GET/api/analytics/metric_id 查找有效的衡量指标 ID。此处提供了完整的衡量指标集。

tenant

以逗号分隔的租户名称列表,默认设置为 admin

description

在每个衡量指标之前附加一行描述作为注释。默认情况下,此参数设置为 false

realtime

以 5 秒平均值检索实体衡量指标,需要在对象上启用实时衡量指标。默认情况下,此参数设置为 false。

将此 API 与 Prometheus 结合使用

Prometheus 使用利用 HTTP 进行衡量指标收集的提取方法。用户提供 HTTP 端点以从中提取数据以及其他参数,如抓取时间间隔、其他查询参数、端口、授权详细信息等。

Prometheus 提供了两种授权 HTTP 抓取请求的方法:

  • 基本授权

  • 持有者令牌/持有者令牌文件

从控制器公开为 API 的 Prometheus 端点需要身份验证,这与所有其他现有控制器 API 类似。NSX Advanced Load Balancer 提供了两种对控制器的 Prometheus 抓取请求进行身份验证的方法:

  1. 为控制器 API 设置基本身份验证:

    1. 可以将从客户端到 NSX Advanced Load Balancer 控制器 的 API 调用设置为使用基本身份验证作为控制器 API 的身份验证机制。要了解如何在控制器上启用基本身份验证,请参见《VMware NSX Advanced Load Balancer 配置指南》中的 HTTP API 查询基本身份验证主题。

    2. 使用 scrape_config 下的 basic_auth 参数为 prometheus.yml 文件中的 prometheus 抓取请求设置基本身份验证。下面显示了一个使用启用了 basic_auth 的控制器设置的 prometheus.yml 作业配置示例。

       job_name: 'avi_vs'
          scrape_interval: 60s
          metrics_path: '/api/analytics/prometheus-metrics/virtualservice'
          params:
            entity_name: ['prod-vs1,prod-vs2']
            tenant: ['admin,tenant1']
          scheme: 'https'
          tls_config:
            insecure_skip_verify: true
          basic_auth:
            username: '[username]'
            password: '[password]'
          static_configs:
            - targets: ['[avi_controller_cluster]']
      注:

      Prometheus 允许用户在 tls_config 参数下传递 TLS 配置的 CA 文件路径、客户端证书和密钥文件。在示例配置中,已使用 insecure_skip_verify 跳过证书检查。

  2. 使用 avi-api-proxy

    avi-api-proxy 是一个基于 NSX Advanced Load Balancer 的 SDK 构建的 Docker 化代理容器,它负责处理 NSX Advanced Load Balancer 控制器 的 API 服务器的身份验证和会话管理。对 avi-api-proxy 的所有 HTTP REST API 调用(GET、POST、PUT、DELETE)都将使用有效的授权标头和 Cookie 转发到控制器 API 服务器。控制器的响应将返回到请求客户端应用程序,在本例中为 Prometheus 设置。

    下面显示了一个使用 avi-api-proxyprometheus.yml 作业配置示例。

    - job_name: 'avi_vs'
        scrape_interval: 60s
        metrics_path: '/api/analytics/prometheus-metrics/virtualservice'
        scheme: 'http'
        params:
          entity_name: ['prod-vs1,prod-vs2']
          tenant: ['admin,tenant1']
        static_configs:
          - targets: ['127.0.0.1:8080']
    

    avi-api-proxy 启动并运行后,不会向 Prometheus 配置文件提供 API 身份验证详细信息(请参阅使用 avi-api-proxyprometheus.yml 作业配置示例)。NSX Advanced Load Balancer 控制器 API 服务器的身份验证完全由 avi-api-proxy 管理。

    注:

    此处指定的抓取请求目标是运行 avi-api-proxy 的地址和端口。在提供的示例中,avi-api-proxy 在与 Prometheus 设置相同的网络命名空间上和端口 8080 上运行,因此目标为 127.0.0.1:8080



有关更多信息,请参见 avi-api-proxy Docker 容器

注:

容器需要 NSX Advanced Load Balancer 控制器 集群地址、用户名和密码才能启动。

使用参数筛选衡量指标

可使用以下任一方法在 prometheus 配置 yaml 中添加 API 端点的查询参数:

  • metrics_pathfield:例如,可以使用查询参数指定 metrics_path,如下所示:

    /api/analytics/prometheus-metrics/pool/?tenant=admin,default&metric_id=l4_server.avg_bandwidth,l4_server.avg_connections_dropped
  • params key:以键值 yaml 格式提供的查询参数的更具可读性的替代方法。

要最大限度缩短 API 的响应时间,建议使用提供的筛选器。如果未提供参数,API 将获取属于管理员租户的所有实体对象的数据,其中包含所有衡量指标 ID,不包含描述字符串。

下面显示了一个 Prometheus 作业配置示例,说明如何使用查询参数。以下作业配置提取管理员和默认租户命名空间中所有池对象的 l4_server.avg_bandwidthl4_server.avg_connections_dropped 衡量指标,衡量指标数据前面有一个衡量指标描述行。

- job_name: 'avi_pool'
    scrape_interval: 60s
    metrics_path: '/api/analytics/prometheus-metrics/pool'
    scheme: 'http'
    params:
      tenant: ['admin,default']
      metric_id: ['l4_server.avg_bandwidth,l4_server.avg_connections_dropped']      
      description: 'true'
    static_configs: 
      - targets: ['127.0.0.1:8080']

此外,要获取管理员和默认租户中特定池对象的衡量指标,请使用 entity_nameentity_id 参数,如下所示:

params:
      entity_name: ['vs1-pool1,vs1-pool2,vs2-pool1']
      tenant: ['admin,default']
      metric_id: ['l4_server.avg_bandwidth,l4_server.avg_connections_dropped']      
      description: 'true'
注:

NSX Advanced Load Balancer 提供了一组与虚拟服务、池和 SE 对象相关的全面衡量指标。当此类对象数量很大时,NSX Advanced Load Balancer 控制器 可能需要一些时间才能计算分析数据并返回响应。设置较低的 scrape_interval 值可能会导致 API 超时。在这种情况下,请使用筛选器参数获取相关数据,并在 Prometheus 配置 yaml 中将 scrape_interval 值设置为最小值 60 秒。

代理的优势

将系统设置更改为允许基本身份验证后,将启用所有控制器 API 上的基本身份验证。在某些情况下,这可能不是预期行为。应用程序通过标准 HTTP REST 协议与代理通信,与 NSX Advanced Load Balancer 控制器 提供的协议相似。代理与 NSX Advanced Load Balancer 的 GO SDK 集成,以提供基于 Cookie 的身份验证和会话管理。代理是使用 NSX Advanced Load Balancer 控制器 凭据和运行代理的任何应用程序(最好在同一网络命名空间中)实例化的,并且应该能够通过 avi-api-proxyNSX Advanced Load Balancer 控制器 进行通信。

代理具有以下优势:

  • 会话管理 - 代理使用 NSX Advanced Load Balancer 的 GO SDK 来管理会话 Cookie、设置身份验证标头、刷新令牌,以及重用 TLS 连接以减少 TLS 握手。

  • 重试请求 - 如果出现服务器错误,SDK 会尝试重试失败的请求。

  • 易于使用 - 无需更改系统设置。

avi-api-proxy 与应用程序(在本例中为 Prometheus)之间的连接是一个打开的连接。因此,建议在与应用程序相同的网络命名空间中运行 avi-api-proxy,以便通过 localhost 进行通信。