You need to enable JavaScript to run this app.
导航

服务发现

最近更新时间2024.04.12 10:33:56

首次发布时间2023.02.28 17:57:43

除了采集组件默认的采集规则,您可能还需要配置面向自定义目标的服务发现。本文介绍如何配置服务发现。

概述

Prometheus 主要通过 Pull 的方式来抓取目标服务暴露的监控接口。因此,您需要在集群中配置对应的服务发现规则,指定采集对象,才能完成数据采集,并写入到托管 Prometheus 服务的工作区中。

托管 Prometheus 服务支持的服务发现类型,如下表所示。

服务发现方式说明
ServiceMonitor在 Kubernetes 集群中,使用 NameSpace 和 Label 指定需要进行监控的 Service。
PodMonitor在 Kubernetes 集群中,使用 NameSpace 和 Label 指定需要进行监控的 Pod。
Service/Pod annotation在 Kubernetes 集群中,通过给 Service 或 Pod 配置指定的 annotation,实现服务发现。

前提条件

通过 ServiceMonitor 实现服务发现

创建 ServiceMonitor

您可以通过 ServiceMonitor 配置自定义目标的服务发现,实现对自定义目标的指标采集。

操作步骤如下:

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 对象浏览器。 单击 使用 Yaml 创建 ,通过 ServiceMonitor 配置服务发现。
    • 类型 下拉菜单中选择 自定义
    • Yaml 配置框内输入 Yaml 配置。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: service-discover # 配置服务发现的名称
  namespace: volcano-metrics # 配置服务发现的命名空间
  labels: 
    volcengine.vmp: "true" # 配置服务发现的标签,允许被 Agent 发现
spec:
  endpoints:
  - interval: 15s # 配置采集的时间间隔,默认为 30 秒
    scrapeTimeout: 30s # 配置采集超时时间,默认为 30 秒
    port: metrics # 填写服务端口名称,该端口名称必须在容器的配置中显示声明
    path: /metrics # 填写指标暴露的 URI 路径,默认为 /metrics
    scheme: http # 配置采集协议,支持 HTTP 和 HTTPS ,默认为 HTTP
    relabelings: # 配置指标的 relabel。如没有需求,可省略
    - targetLabel: environment 
      action: replacelabel:environment="Production"
      replacement: Production
  namespaceSelector: # 配置为采集对象所在的命名空间,不填写表示选择当前命名空间
    matchNames:
    - volcano-metrics 
  selector: # 配置 Service 的 Label 值,以定位和选择目标 Service
    matchLabels:
      app.kubernetes.io/name: ek8s-gpu-exporter 

说明

更多配置项说明,请参见 官方文档

  1. 单击 确定,完成配置。

更多操作

在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 对象浏览器,在 分类 下拉菜单中选择 CRD,即可查看创建的 CRD 资源。
    alt
  5. 单击 ServiceMonitor,进入详情页。
  6. 选择需要编辑或删除的配置项,单击 操作 栏的...,选择 编辑 Yaml删除,即可编辑或删除该配置。
    alt

通过 PodMonitor 实现服务发现

创建 PodMonitor

您可以通过 PodMonitor 配置服务发现,实现对自定义目标的指标采集。

操作步骤如下:

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 对象浏览器。 单击 使用 Yaml 创建 ,通过 PodMonitor 配置服务发现。
    • 类型 下拉菜单中选择 自定义
    • Yaml 配置框内输入 Yaml 配置。
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: pod-discover # 配置服务发现的名称
  namespace: volcano-metrics # 配置服务发现的命名空间
  labels: 
    volcengine.vmp: "true" # 配置服务发现的标签,允许被 Agent 发现
spec: # 描述采集目标 Pod 的特征和采集任务的配置
  podMetricsEndpoints: # 配置需要监控对象的 Prometheus HTTP 接口,可以配置多个 Endpoint 
  - interval: 15s # 配置采集的时间间隔,默认为 30 秒
    scrapeTimeout: 30s # 配置采集超时时间,默认为 30 秒
    port: metric-port # 填写容器端口名称,该端口名称必须在容器的配置中显示声明
    path: /metrics # 填写指标暴露的 URI 路径,默认为 /metrics
    scheme: http # 配置采集协议,支持 HTTP 和 HTTPS ,默认为 HTTP
    relabelings: # 配置指标的标签改写功能,允许配置多个改写规则,按照顺序执行
    - action: replace # 标签匹配后的操作,包括:replace(替换)、keep、drop
      sourceLabels: # 从原始 labels 中取哪些 label 的值进行 relabel
      - instance
      regex: (.*) # 对 source labels 对应值进行正则匹配的表达式
      targetLabel: instance # 当 action 为 replace 时,通过 target_label 来指定对应 label name
      replacement: 'kafka-xxxxxx' # 当 action 为 replace 时,通过 replacement 来定义当 regex 匹配之后需要替换的表达式
  namespaceSelector: # 配置为采集对象所在的命名空间,不填写表示选择当前命名空间
    matchNames: 
    - volcano-metrics 
  selector: # 配置采集对象的 Label 值,以定位和选择目标 Pod
    matchLabels:
      app-name: kafka-exporter

说明

更多配置项说明,请参见 官方文档

  1. 单击 确定,完成配置。

更多操作

在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 对象浏览器,在 分类 下拉菜单中选择 CRD,即可查看创建的 CRD 资源。
    alt
  5. 单击 PodMonitor,进入详情页。
  6. 选择需要编辑或删除的配置项,单击 操作 栏的...,选择 编辑 Yaml删除,即可编辑或删除该配置。
    alt

通过 Service/Pod annotation 实现服务发现

背景

如上文所述,您可以使用 ServiceMonitor 或 PodMonitor 实现服务发现。但是,如果集群中有很多的 Service/Pod,那么就需要人工去创建多个 ServiceMonitor 或 PodMonitor 对象来进行监控,这会使得您的配置变得尤为复杂。

为了解决上述问题,托管 Prometheus 为您提供了另外一种服务发现方式,即通过配置 Service/Pod annotation 来实现服务发现。您可以在部署 Service 或 Pod 时,添加指定的 annotation 字段,实现业务的快速接入。

注意

  • Service/Pod annotation 是一种快速的服务发现方式,但也存在部分问题,例如:无法实现指标的 Relabel 等。您需要根据实际需求,合理选择使用。
  • kube-system 命名空间下无法使用 Service/Pod annotation 实现服务发现。如有需求,建议使用 ServiceMonotor 或 PodMonitor 实现。

概述

当您在集群中配置 Service/Pod 时,可以通过添加如下的 annotation,实现对自定义目标的服务发现。

prometheus.io/scrape: "true"   # 配置为 true 表示开启采集
prometheus.io/port: "9400"     # 配置为采集指标暴露的端口号
prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics

说明

使用prometheus.io/port: "9400"指定目标的端口号时,该端口号必须在容器的配置中显示声明,如下所示:

...
    spec:
      containers:
        ports:
        - containerPort: 9400 # 在容器配置中,对容器端口进行显示声明

通过 Service annotation 配置服务发现

当您在集群中配置服务时,可以添加 annotation 完成服务发现。方便服务快速接入监控,步骤如下:

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击目标集群,进入集群管理页面。
  4. 在左侧导航栏中,选择 服务与路由 > 服务,单击 使用 Yaml 创建 ,配置服务,并同时添加 annotation,实现服务发现。
apiVersion: v1
kind: Service
metadata:
  name: golang-service-demo
  namespace: volcano-metrics # 配置服务所在的命名空间
  labels: 
    app: golang-service-demo # 配置服务的标签
  annotations: 
    prometheus.io/scrape: "true"  # 配置为 true 表示开启服务发现
    prometheus.io/port: "2023"  # 配置为采集指标暴露的端口号,该端口号必须在容器的配置中显示声明
    prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics
spec:
  selector:
    app: golang-demo
  ports:
    - protocol: TCP
      port: 2023
      targetPort: 2023
      name: metrics # 配置服务端口名称
  type: ClusterIP

通过 Pod Annotation 配置服务发现

当您在集群中配置 Pod 时,可以添加 annotation 完成服务发现。方便 Pod 快速接入监控,步骤如下:

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击目标集群,进入集群管理页面。
  4. 在左侧菜单栏中选择 工作负载 > 无状态负载。 单击 使用 Yaml 创建 ,部署应用,并同时添加 annotation,实现服务发现。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: golang-demo # 配置应用的名称
  namespace: volcano-metrics # 配置应用所在的命名空间
  labels:
    app: golang-demo # 配置应用的标签
spec:
  replicas: 2 # 配置应用副本数
  selector:
    matchLabels:
      app: golang-demo
  template:
    metadata:
      labels:
        app: golang-demo
      annotations: 
        prometheus.io/scrape: "true"  # 配置为 true 表示开启服务发现
        prometheus.io/port: "2023"  # 配置为采集指标暴露的端口号,该端口号必须在容器的配置中显示声明
        prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics
    spec:
      containers:
      - name: golang-demo # 配置容器名称
        image: doc-cn-beijing.cr.volces.com/vmp/golang-demo:1.0 # 配置应用镜像的地址和版本
        ports:
        - containerPort: 2023 # 配置容器端口号

说明

  • 本例以配置无状态负载(Deploument)为例,其他类型工作负载配置的方法相同。
  • 本例中的镜像地址为举例,您需要将其修改为实际环境中镜像的正确地址。

后续操作

配置服务发现后,您可以使用托管 Prometheus 的 Explore 功能,确认是否已经发现了期望的服务。操作步骤如下:

  1. 登录 VMP 服务控制台
  2. 在顶部导航栏,选择目标地域。
  3. 单击左侧导航栏的 Explore,进入 Explore 页面。
  4. 在右上角的配置项中,配置需要查询指标的 工作区,并在 指标检索 文本框内,输入 up{job="xxx"}语句,查看对应的服务是否被正确发现。指标的值为 1 表示对应的服务已经被正确发现。
    alt

    说明

    如果您仍然无法正确查询到预期的指标,请参见 无法正确查看到预期的指标?