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

通过 ServiceMonitor 配置服务发现

最近更新时间2024.04.26 15:28:58

首次发布时间2023.10.30 15:47:57

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

验证 Demo

您可以使用以下 Demo,体验基于 golang 的应用接入和 ServiceMonitor 服务发现过程。下面的示例中,使用 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 工作区,详细介绍参见:创建工作区
  • 已经将现有集群注册到分布式云原生平台,详细介绍参见:创建 VKE 集群注册现有集群
  • 已将 Demo 代码打包成镜像,并上传至镜像仓库。详细介绍参见:Golang 应用接入
  • 已通过 kubectl 连接目标集群。具体操作说明参见 连接集群

操作步骤

步骤一:安装组件并配置工作区&采集参数

  1. 登录 分布式云原生控制台
  2. 在左侧导航栏选择 容器集群,进入容器集群管理页面。
  3. 单击目标容器集群名称,在左侧导航栏选择 运维管理 > 组件管理
  4. 单击监控分类中 prometheus-agent 组件右上角...中的 安装
  5. 根据引导提示配置工作区和采集参数相关内容,完成后单击 确定,开始安装组件。

alt

配置项说明

Prometheus 工作区

按需选择 Prometheus 工作区,可使用 通过公网采集监控数据 来筛选工作区。

说明

  • 通过公网采集监控数据当前仅支持标准版工作区。

  • 若缺少 Prometheus 工作区,可前往 托管 prometheus 控制台 创建工作区后再进行选择。

认证方式

按照所选工作区实际配置,选择认证方式,并填写参数。

  • Basic Auth:配置用户名和密码,要求与工作区实际配置保持一致。

  • 证书:上传证书和私钥,要求与工作区实际配置保持一致。

说明

若目标工作区未开启期望的认证方式,可前往 托管 prometheus 控制台,对目标工作区的配置进行修改。

alt

配置项说明
部署方式组件的部署方式。当前该参数已固定,不可配置。
vm-agent 资源配置 vm-agent 采集器的默认资源配置,包括:CPU 请求、CPU 上限、内存请求、内存上限。

kube-state-metrics 资源配置

配置 kube-state-metrics 组件的默认资源配置,包括:CPU 请求、CPU 上限、内存请求、内存上限。

说明

由于 kube-state-metrics 组件本身存在的限制(例如:每个组件实例允许采集的 Target 数量有限),在大规模集群中,建议优先使用增加分片数的方式,提升 kube-state-metrics 组件的指标采集能力。

vm-agent 初始分片数配置 vm-agent 采集器的初始分片数。
kube-state-metrics 初始分片数配置 kube-state-metrics 组件的初始分片数。

组件扩缩容

配置是否开启 vm-agent 采集器和 kube-state-metrics 组件的自动扩缩容功能。

  • 不开启:组件的分片数为配置的初始分片数。不会随着资源占用率的提升而自动扩容。
  • 开启:需要配置组件的最大分片数。组件会基于资源占用率自动扩缩容,具体逻辑如下:
    • vm-agent 扩容:任一资源(CPU 或内存)使用率 > 70% 时,自动扩容。
    • vm-agent 缩容:全部资源(CPU 和内存)使用率均 < 30% 时,自动缩容。
    • kube-state-metrics 扩容:任一资源(CPU 或内存)使用率 > 70% 时,自动扩容。
    • kube-state-metrics 缩容:全部资源(CPU 和内存)使用率均 < 70% 时,自动缩容。

注意

  • vm-agent 扩缩容冷却时间为 30 分钟。kube-state-metrics 基于 HPA 进行扩缩容量。
  • 配置组件自动扩缩容功能后,请保证集群资源充足,否则可能由于资源不足,导致组件扩容失败。
  • vm-agent 采集器和 kube-state-metrics 组件扩容时,为保证均衡负载,建议配置 kube-state-metrics 组件的分片数为 vm-agent 采集器分片数的整数倍,例如:kube-state-metrics 组件分片数vm-agent 采集器分片数1:12:1 等。
部署插件配置是否同步安装 node-exporter 插件,默认安装插件。该插件用于采集节点操作系统的各项软硬件指标;如果不安装,则无法监控节点指标。建议您保持默认值。

步骤二:创建 ServiceMonitor CRD 资源

若当前容器集群中不存在 ServiceMonitor CRD 资源,可在本地环境中连接集群并执行以下命令,在集群中创建 ServiceMonitor CRD 资源。

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

说明

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

步骤三:部署应用和服务

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

  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:
        - containerPort: 2023 # 配置容器端口
  1. 在集群管理页面的左侧导航栏中,选择 服务与路由 > 服务,单击 使用 Yaml 创建 ,配置服务进行负载均衡和服务发现。
    apiVersion: v1
    kind: Service
    metadata:
      name: golang-service-demo
      namespace: volcano-metrics # 配置服务所在的命名空间
      labels: 
        app: golang-service-demo # 配置服务的标签
    spec:
      selector:
        app: golang-demo
      ports:
        - protocol: TCP
          port: 2023
          targetPort: 2023
          name: metrics # 配置服务端口名称
      type: ClusterIP
    

步骤四:配置 ServiceMonitor

  1. 登录 分布式云原生控制台

  2. 在左侧菜单栏中选择 容器集群,进入集群管理页面。

  3. 单击目标集群名称,进入集群配置页面。

  4. 在左侧菜单栏中选择 运维管理 > 对象浏览器。 单击 使用 Yaml 创建 ,通过 ServiceMonitor 配置采集规则。

    • 类型 下拉菜单中选择 自定义

    • Yaml 配置框内输入 Yaml 配置。

      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        name: golang-demo-discover # 配置采集规则名称
        namespace: default # 配置 ServiceMonitor 命名空间
        labels: 
          volcengine.vmp: "true" # 配置 ServiceMonitor 的标签,允许被 Prometheus-agent 发现
      spec:
        endpoints:
        - port: metrics # 填写服务端口名称
          relabelings: # 配置指标的 relabel。如没有需求,可省略
          - targetLabel: environment 
            action: replace # 这个例子中我们添加一个固定 label:environment="Production"
            replacement: Production
        namespaceSelector:
          matchNames:
          - volcano-metrics # 配置为服务所在的命名空间
        selector:
          matchLabels:
            app: golang-service-demo # 配置服务的 Label 值,以定位和选择目标 Service
      
  5. 单击 确定,完成配置。

结果验证

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

alt