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

通过 PodMonitor 配置服务发现

最近更新时间2024.03.01 14:07:17

首次发布时间2023.06.06 11:37:29

当您在组件管理中安装 prometheus-agent 组件后,允许通过 PodMonitor 来满足自定义采集规则的需求。本文为您介绍如何通过 PodMonitor 来配置服务发现。

验证 Demo

您可以使用以下 Demo,体验基于 golang 的应用接入和 PodMonitor 服务发现过程。下面的示例中,使用 golang 语言创建了一个应用,并在应用中暴露了一个名为 rpc_durations_seconds 的指标,用于对服务的 RPC 延迟进行统计。

package main

import (
        "math"
        "math/rand"
        "net/http"
        "time"

        "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/collectors"
        "github.com/prometheus/client_golang/prometheus/promhttp"
)

var rpcDurations = prometheus.NewSummaryVec(
        prometheus.SummaryOpts{
                Name:       "rpc_durations_seconds",
                Help:       "RPC latency distributions.",
                Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
        },
        []string{"service"},
)

func main() {
        // Create a new registry.
        reg := prometheus.NewRegistry()

        // Add Go module build info.
        reg.MustRegister(collectors.NewBuildInfoCollector())
        // Add go runtime metrics and process collectors.
        reg.MustRegister(
                collectors.NewGoCollector(),
                collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
        )

        reg.MustRegister(rpcDurations)

        start := time.Now()

        oscillationFactor := func() float64 {
                return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(10*time.Minute)))
        }

        // Periodically record some sample latencies for the three services.
        go func() {
                for {
                        v := rand.Float64() * 0.0002
                        rpcDurations.WithLabelValues("uniform").Observe(v)
                        time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)
                }
        }()

        go func() {
                for {
                        v := (rand.NormFloat64() * 0.0002) + 0.00001
                        rpcDurations.WithLabelValues("normal").Observe(v)
                        time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)
                }
        }()

        go func() {
                for {
                        v := rand.ExpFloat64() / 1e6
                        rpcDurations.WithLabelValues("exponential").Observe(v)
                        time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)
                }
        }()

        http.Handle("/metrics", promhttp.HandlerFor(
                reg, promhttp.HandlerOpts{},
        ))
        http.ListenAndServe(":2023", nil)
}

前提条件

  • 已在火山引擎注册并开通托管 Prometheus 服务。
  • 已创建托管 Prometheus 工作区,详情请参见 创建工作区
  • 已创建集群,详情请参见 创建集群
  • 已将 Demo 代码打包成镜像,并上传至镜像仓库。详情请参见 Golang 应用接入
  • 已通过 kubectl 连接目标集群。具体操作说明,请参见 连接集群

配置步骤

步骤一:集群绑定工作区

  1. 登录 容器服务控制台
  2. 在顶部导航栏,选择您业务所在地域。
  3. 在左侧导航栏单击 集群,找到目标集群,单击集群名称。
  4. 在集群 基本信息 页面,单击 运维配置 页签。在配置页面中单击 进行配置 链接。
    alt
  5. 在弹出的配置框内,选择与集群绑定的托管 Prometheus 工作区。
    alt

    说明

    您也可以在创建集群时,绑定托管 Prometheus 工作区,详情请参见 创建集群

步骤二:部署采集器

  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击需要配置的目标集群,进入集群管理页面。
  3. 左侧导航栏中,选择 组件管理
  4. 选择 监控 页签,找到 prometheus-agent 组件,选择该组件右上角的 ... > 安装
    alt
  5. 配置组件的相关参数。
    • vm-agent 和 kube-state-metrics 组件的的资源保持默认值。
    • 开启 组件扩缩容 功能,并配置 vm-agent 和 kube-state-metrics 组件的初始分片数和最大分片数。
      alt
  6. 单击 确定,完成组件部署。

步骤三:创建 PodMonitor CRD 资源

如果您的集群中不存在 PodMonitor CRD 资源,您需要在本地环境中连接集群,执行以下命令,在集群中创建 PodMonitor CRD 资源。

kubectl apply -f https://vmp-release-cn-beijing.tos-cn-beijing.volces.com/manifests/crds/promopeartor-crd-podmonitors.yaml

说明

  • 如果您的集群所在地域不为 华北2(北京),则您需要将上述命令中的 cn-beijing 字段修改为对应地域的 RegionID。例如:华东2(上海)地域的集群,部署命令为 kubectl apply -f https://vmp-release-cn-shanghai.tos-cn-shanghai.volces.com/manifests/crds/promopeartor-crd-podmonitors.yaml。地域的 RegionID 详情请参见 地域和可用区
  • ServiceMonitor 和 Probe 对应 CRD 资源的部署方式,请参见 如何在集群中创建 ServiceMonitor 等 CRD 资源?

步骤四:部署应用

您可以使用镜像仓库中的镜像,在容器服务 VKE 集群中部署应用。步骤如下:

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 无状态负载。 单击 使用 Yaml 创建 ,部署应用。
    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
        spec:
          containers:
          - name: golang-demo # 配置容器名称
            image: doc-cn-beijing.cr.volces.com/vmp/golang-demo:1.0 # 配置应用镜像的地址和版本
            ports:
            - name: metric-port # 配置容器端口名称
              containerPort: 2023 # 配置容器端口
    

    说明

    本例中的镜像地址为举例,您需要将其修改为实际环境中镜像的正确地址。

步骤五:配置 PodMonitor

  1. 登录 容器服务控制台
  2. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
  3. 单击集群名称,进入集群配置页面。
  4. 在左侧菜单栏中选择 工作负载 > 对象浏览器。 单击 使用 Yaml 创建 ,通过 PodMonitor 配置采集规则。
    • 类型 下拉菜单中选择 自定义
    • Yaml 配置框内输入 Yaml 配置。
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: golang-demo-discover # 配置 PodMonitor 的名称
  namespace: volcano-metrics # 配置 PodMonitor 的命名空间
  labels: 
    volcengine.vmp: "true" # 配置 PodMonitor 的标签,允许被 Prometheus-agent 发现
spec:
  podMetricsEndpoints:
  - interval: 30s
    port: metric-port # 填写容器端口名称
    path: /metrics # 填写容器指标的 Path 路径,不填默认为 /metrics
    relabelings: # 配置指标的 relabel。如没有需求,可省略
    - targetLabel: environment 
      action: replace # 这个例子中我们添加一个固定 label:environment="Production"
      replacement: Production
  namespaceSelector:
    matchNames: 
    - volcano-metrics # 配置容器所在的命名空间
  selector: 
    matchLabels:
      app: golang-demo # 配置容器的 Label 值,以定位和选择目标 Pod
  1. 单击 确定,完成配置。

结果验证

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