You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
可观测性
通过 PodMonitor 配置服务发现
复制全文
下载 pdf
通过 PodMonitor 配置服务发现
当您在集群中开启观测并安装 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)​
}​
​
前提条件​
  • 已开启云原生观测,详情请参见 开启观测。​
  • 已将 Demo 代码打包成镜像,并上传至镜像仓库。详情请参见 Golang 应用接入。​
  • 已通过 kubectl 连接目标集群。具体操作说明,请参见 连接集群。​
配置步骤​
步骤一:部署应用​
您可以使用镜像仓库中的镜像,在容器服务 VKE 集群中部署应用。步骤如下:​
  1. 在左侧导航栏中选择 集群,单击集群名称,进入集群配置页面。​
  1. 在左侧导航栏中选择 工作负载 > 无状态负载。 单击 使用 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. 在左侧导航栏中选择 工作负载 > 对象浏览器。 单击 使用 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 服务控制台。​
  1. 在顶部导航栏,选择目标地域。​
  1. 单击左侧导航栏的 Explore,进入 Explore 页面。​
  1. 在右上角的配置项中,配置需要查询指标的 工作区,并在 指标检索 文本框内,输入 up{job="volcano-metrics/golang-demo-discover"},查看对应的 Pod 是否被正确发现。​
  • ​alt​​
高级配置​
自定义 job 名称​
默认情况下,通过 PodMonitor 发现的 job 名称为 PodMonitor 的 <namespace>/<name>,例如在本文中,job 的默认名称为volcano-metrics/golang-demo-discover。您可以根据需要,自定义 job 的名称。​
方法一​
您可以在 PodMonitor 中使用jobLabel字段,将 job 名称修改为指定的 Pod 标签值。例如在本例中,可以将 job 名称修改为标签app: golang-demo的值,即 job 名称为golang-demo。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
jobLabel: app # 配置为 Pod 指定的标签名​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
预期结果如下所示,可以使用 job 名称golang-demo查询到指标。​
​alt​​
方法二​
说明​
该方法的优先级高于方法一。​
您可以在 PodMonitor 中使用spec.podMetricsEndpoints.N.relabelings字段,配置 Relabel 能力,自定义 job 的名称。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
relabelings: # 配置指标的 relabel​
- targetLabel: job​
action: replace​
replacement: jobname-demo # 自定义 job 名称​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
预期结果如下所示,可以使用 job 名称jobname-demo查询到指标。​
​alt​​
在指标中增加 PodLabel​
默认情况下,Pod 的 Label 不会加到指标中。您可以在 PodMonitor 中使用spec.podTargetLabels字段,将 Pod 的 Label 加入到指标中。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
jobLabel: app​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
podTargetLabels: # 将所需要增加到指标中的 PodLabel 加入到下述列表中​
- app​
- app.kubernetes.io/component​
selector: ​
matchLabels:​
app: golang-demo​
​
预期结果如下所示:​
​alt​​
注意​
由于 Prometheus 的 metricsLabel 只能由大小写英文字符、数字、下划线组成,因此 Pod 的 LabelName 中其他字符都会自动替换成下划线。例如 app.kubernetes.io/component变为app_kubernetes_io_component​
指标 Relabel​
您可以通过指标 Relabel,在抓取指标或推送指标到托管 Prometheus 工作区之前,添加、修改或删除指标标签。支持 2 种配置方式,包括:​
  • 使用relabelings:​
  • 需要在抓取目标之前修改或过滤目标标签。​
  • 需要在服务发现过程中修改或过滤目标标签。​
  • 使用metricRelabelings:​
  • 需要在抓取数据之后修改或过滤指标标签。​
  • 需要在数据已经抓取之后删除特定的指标。​
  • 典型场景包括删除不需要的指标、重命名指标标签、添加新的指标标签等。​
说明​
更多 PodMonitor 的 Relabel 详情,请参见 官方文档。您也可以通过 Relabel 工具来查看 Relabel 实现的过程,Debug 您的 Relabel 需求。​
增加全局 Label​
如果您希望在采集到的指标都增加指定的 Label,可以通过配置spec.podMetricsEndpoints.N.relabelings参数实现。例如通过以下配置,可以在采集到的所有指标上增加label: value标签对。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
relabelings: # 配置指标的 relabel,增加全局 Label​
- targetLabel: label​
action: replace ​
replacement: value​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
保留指定指标​
如果您希望仅写入某些指定的指标,可以通过配置action: keep来实现。例如通过以下配置,仅保留指标名满足正则表达式vmagent_remotewrite.*的指标。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
metricRelabelings: # 保留满足指定正则表达式的指标​
- action: keep ​
regex: vmagent_remotewrite.*​
sourceLabels:​
- __name__​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
删除指标​
如果您希望不写入某些指标,可以通过配置action: drop来将某些指标丢弃掉。例如通过以下配置,可以将vmagent_daily_series_limit_rows_dropped_total指标丢弃。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
metricRelabelings: # 删除指定的指标​
- action: drop​
regex: vmagent_daily_series_limit_rows_dropped_total # 需要删除的指标,支持正则表达式​
sourceLabels:​
- __name__​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
修改 Label 的值​
如果您希望修改某个 Label 的值,可以通过配置action: replace来实现。例如通过以下配置,可以将以/api/v1开头的 path label 值去掉/api/v1前缀,即由path: /api/v1/targets修改为path: /targets。​
​
apiVersion: monitoring.coreos.com/v1​
kind: PodMonitor​
metadata:​
name: golang-demo-discover​
namespace: volcano-metrics​
labels: ​
volcengine.vmp: "true"​
spec:​
podMetricsEndpoints:​
- interval: 30s​
port: metric-port​
path: /metrics​
relabelings: # 使用正则表达式,修改 Label 的值​
- action: replace​
regex: /api/v1:(.*)​
replacement: $1​
sourceLabels:​
- path​
targetLabel: path​
namespaceSelector:​
matchNames: ​
- volcano-metrics​
selector: ​
matchLabels:​
app: golang-demo​
​
最近更新时间:2025.12.15 19:15:39
这个页面对您有帮助吗?
有用
有用
无用
无用