在kube-state-metrics中如何不输出不需要的指标

首先

如果长时间使用Kubernetes,我认为收集的度量指标会逐渐增加。随着收集的度量指标增加,Prometheus的内存使用量也会增加,从而压缩TSDB的数据大小。此外,如果使用托管的Prometheus服务等,我认为存储的度量指标数量增加也会导致费用增加的情况存在。

因此,我们将解释如何在 kube-state-metrics 中禁用不需要的指标。
(基于截至2022年6月29日的最新版本2.5.0的内容进行编写。)

    https://github.com/kubernetes/kube-state-metrics/releases/tag/v2.5.0

kube-state-metrics 是什么?

这是我从官方概览中摘取的部分说明文。

kube-state-metrics是一个简单的服务,它监听Kubernetes API服务器,并生成关于对象状态的指标。

如上所述,它将定期检查Kubernetes的API服务器,并将Kubernetes对象的状态作为指标提供。

用kube-state-metrics减少指标的方法

在使用kube-state-metrics减少指标的方法有以下三种。

    • –resources

–namespaces or –namespaces-denylist

–metric-allowlist or –metric-denylist

关于使用方法,将在后面进行说明。

–资源

简洁概述

您可以在启动时指定参数 `–resources` 来指定输出 Kubernetes 对象的指标。

在公式文档中的说明如下:

–resources string 要启用的资源的逗号分隔列表。默认为 “certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,leases,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,secrets,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments”。

    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md

kube-state-metrics通过–resources参数输出与指定对象相关的度量指标,截至v2.5.0版本,默认设置了28种对象。在功能上类似于node-exporter的收集器。

因为公式文档的说明中没有换行,导致列表不易理解,所以下面摘录了源代码作为参考。

	// DefaultResources represents the default set of resources in kube-state-metrics.
	DefaultResources = ResourceSet{
		"certificatesigningrequests":      struct{}{},
		"configmaps":                      struct{}{},
		"cronjobs":                        struct{}{},
		"daemonsets":                      struct{}{},
		"deployments":                     struct{}{},
		"endpoints":                       struct{}{},
		"horizontalpodautoscalers":        struct{}{},
		"ingresses":                       struct{}{},
		"jobs":                            struct{}{},
		"leases":                          struct{}{},
		"limitranges":                     struct{}{},
		"mutatingwebhookconfigurations":   struct{}{},
		"namespaces":                      struct{}{},
		"networkpolicies":                 struct{}{},
		"nodes":                           struct{}{},
		"persistentvolumes":               struct{}{},
		"persistentvolumeclaims":          struct{}{},
		"poddisruptionbudgets":            struct{}{},
		"pods":                            struct{}{},
		"replicasets":                     struct{}{},
		"replicationcontrollers":          struct{}{},
		"resourcequotas":                  struct{}{},
		"secrets":                         struct{}{},
		"services":                        struct{}{},
		"statefulsets":                    struct{}{},
		"storageclasses":                  struct{}{},
		"validatingwebhookconfigurations": struct{}{},
		"volumeattachments":               struct{}{},
    https://github.com/kubernetes/kube-state-metrics/blob/v2.5.0/pkg/options/resource.go#L27-L56

设置的方式

设置示例如下。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --resources=leases

资源设置的内容将显示在启动日志的“活动资源”字段中。

I0628 08:00:51.581470       1 server.go:100] Using resources leases
I0628 08:00:51.581544       1 types.go:136] Using all namespace
I0628 08:00:51.581551       1 server.go:122] Metric allow-denylisting: Excluding the following lists that were on denylist: 
W0628 08:00:51.581590       1 client_config.go:617] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I0628 08:00:51.582018       1 server.go:250] Testing communication with server
I0628 08:00:51.587316       1 server.go:255] Running with Kubernetes cluster version: v1.24. git version: v1.24.2. git tree state: clean. commit: f66044f4361b9f1f96f0053dd46cb7dce5e990a8. platform: linux/amd64
I0628 08:00:51.587387       1 server.go:257] Communication with server successful
I0628 08:00:51.587695       1 server.go:202] Starting metrics server: [::]:8080
I0628 08:00:51.587825       1 metrics_handler.go:96] Autosharding disabled
I0628 08:00:51.587897       1 server.go:191] Starting kube-state-metrics self metrics server: [::]:8081
I0628 08:00:51.587936       1 server.go:66] levelinfomsgTLS is disabled.http2false
+ I0628 08:00:51.587921       1 builder.go:232] Active resources: leases
I0628 08:00:51.588224       1 server.go:66] levelinfomsgTLS is disabled.http2false

如果未设置资源,将会设置默认值如下。

- I0628 07:10:13.641643       1 builder.go:232] Active resources: certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,leases,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,secrets,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments

如果在没有为资源设置租约的情况下启动kube-state-metrics,将只输出以kube_lease_XXX格式的指标,并且将不再输出其他指标。

# HELP kube_lease_owner Information about the Lease's owner.
# TYPE kube_lease_owner gauge
kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane"} 1
kube_lease_owner{lease="kind-worker2",owner_kind="Node",owner_name="kind-worker2"} 1
kube_lease_owner{lease="kind-worker",owner_kind="Node",owner_name="kind-worker"} 1
# HELP kube_lease_renew_time Kube lease renew time.
# TYPE kube_lease_renew_time gauge
kube_lease_renew_time{lease="kind-control-plane"} 1.656403259e+09
kube_lease_renew_time{lease="kind-worker2"} 1.656403259e+09
kube_lease_renew_time{lease="kind-worker"} 1.656403265e+09

请注意

目前,kube-state-metrics无法以拒绝列表的形式指定资源。例如,如果只想要隐藏secrets的度量数据,则需要进行以下配置。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --resources=certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,leases,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments

就照目前情况而言,不仅仅通过一瞥就无法确定 secrets 的指标是否已经输出。只有通过与默认设置值进行比较,才能意识到 secrets 没有被设置。

考虑到持续运营,最好将未设置值的资源明确标记出来,以便团队新成员加入时也能知道哪些资源需要设置。

–命名空间 / –命名空间拒绝名单

简要概述

可以通过在启动参数中指定 –namespaces 或 –namespaces-denylist 来控制按命名空间输出的指标。

在公式文档中的说明如下。

-namespace string 要启用的命名空间列表,以逗号分隔。默认为空。
-namespace-denylist string 不应启用的命名空间列表,以逗号分隔。如果同时设置了命名空间和命名空间拒绝列表,那么只有在命名空间拒绝列表中的命名空间将被使用。

    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md

–namespaces 为指定的命名空间输出指标,用于限制仅输出与指定命名空间相关的指标。–namespaces-denylist 为指定的命名空间不输出指标,用于限制不输出与指定命名空间相关的指标。

设置的方式(–命名空间)

设定的示例如下所示。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --namespaces=kube-system

下面是输出的示例。

# --namespaces 指定なし
- kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20",cluster_ip="None",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1

# --namespaces 指定あり
+ kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20",cluster_ip="None",external_name="",load_balancer_ip=""} 1
+ kube_service_info{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1

您可以确认仅输出了关于指定的 kube-system 的度量指标。

设置选项(–命名空间拒绝列表)

以下是設定的例子。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --namespaces-denylist=kube-system

以下列举出的是一些例子。

# --namespaces-denylist 指定なし
- kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20",cluster_ip="None",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1

# --namespaces-denylist 指定あり
+ kube_service_info{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1

可以确认指定的 kube-system 没有输出指标。

如果同时设置了–namespaces和–namespaces-denylist参数,可如下设置方法:

设定的例子如下。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --namespaces=kube-system
  - --namespaces-denylist=kube-system

以下是示例输出。

# --namespaces-denylist 指定なし
- kube_service_info{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20",cluster_ip="None",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd",cluster_ip="10.96.0.1",external_name="",load_balancer_ip=""} 1
- kube_service_info{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f",cluster_ip="10.96.0.10",external_name="",load_balancer_ip=""} 1

# --namespaces-denylist 指定あり
+ N/A

–namespaces-denylist 字符串 逗号分隔的不启用的命名空间列表。如果同时设置了命名空间和命名空间拒绝列表,只有拒绝列表中排除的命名空间将被使用。

    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md

当阅读公式文档中 –namespaces-denylist 的描述时,看起来写着” –namespaces 和 –namespaces-denylist 都被设置时,–namespaces-denylist 会被优先考虑”。但实际尝试后,看起来两者都在同时起作用,所以若想要在命名空间级别控制指标的输出,我认为最好只使用 –namespaces 或 –namespaces-denylist 中的一个。

–允许度量清单 / –拒绝度量清单

摘要

您可以通过在启动参数中指定 –metric-allowlist 或 –metric-denylist 来控制输出指定指标的度量单位。

在公式文件中的说明如下所示。

–metric-allowlist 字符串 以逗号分隔的要公开的指标列表。该列表包含准确的指标名称和/或正则表达式模式。允许列表和拒绝列表是互斥的。
–metric-denylist 字符串 以逗号分隔的不要启用的指标列表。该列表包含准确的指标名称和/或正则表达式模式。允许列表和拒绝列表是互斥的。

    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md

设置指标白名单的方式(–metric-allowlist)。

以下是設定的範例。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --metric-allowlist=kube_node_created,kube_lease_*

我们会按照区分进行指定要输出的度量,同时也可以使用 * 进行指定。
(由于 v2.5.0 版本时仅存在两种有关租约的度量,这样更易理解,所以作为示例使用。)

以下是输出的示例。

# --metric-allowlist 指定なし
- 特に制限なく、全てのメトリクスが出力されます

# --metric-allowlist 指定あり
+ # HELP kube_lease_owner Information about the Lease's owner.
+ # TYPE kube_lease_owner gauge
+ kube_lease_owner{lease="kind-worker",owner_kind="Node",owner_name="kind-worker"} 1
+ kube_lease_owner{lease="kind-control-plane",owner_kind="Node",owner_name="kind-control-plane"} 1
+ kube_lease_owner{lease="kind-worker2",owner_kind="Node",owner_name="kind-worker2"} 1
+ # HELP kube_lease_renew_time Kube lease renew time.
+ # TYPE kube_lease_renew_time gauge
+ kube_lease_renew_time{lease="kind-worker"} 1.656629831e+09
+ kube_lease_renew_time{lease="kind-control-plane"} 1.65662983e+09
+ kube_lease_renew_time{lease="kind-worker2"} 1.656629832e+09
+ # HELP kube_node_created Unix creation timestamp
+ # TYPE kube_node_created gauge
+ kube_node_created{node="kind-worker2"} 1.65638235e+09
+ kube_node_created{node="kind-worker"} 1.65638235e+09
+ kube_node_created{node="kind-control-plane"} 1.656382327e+09

如上所述,只有在”–metric-allowlist”指定的指标才会被输出。

设置方式(-metric-denylist)

设置示例如下。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --metric-denylist=kube_configmap_metadata_resource_version,kube_secret_*

我们可以按逗号分隔指定不想输出的指标,另外,也可以使用*进行指定。

出力的例子如下。

# --metric-denylist 指定なし
- kube_configmap_metadata_resource_version{namespace="kube-public",configmap="kube-root-ca.crt"} 339
- kube_configmap_metadata_resource_version{namespace="kube-public",configmap="cluster-info"} 360
- kube_configmap_metadata_resource_version{namespace="kube-system",configmap="kube-proxy"} 254

# --metric-denylist 指定あり
+ N/A

如上所述,通过 –metric-denylist 指定的度量标准将不会被输出。

如果同时设置了–metric-allowlist和–metric-denylist,可以采取以下设置方法。

以下是设定的例子。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --metric-allowlist=kube_lease_*
  - --metric-denylist=kube_lease_owner

我要生成与租约相关的指标,但我不希望输出 kube_lease_owner 的指标,所以将以上设置配置一下。

部署完成后会变成如下形式。

# kubectl get po
kube-state-metrics-869fc5bb58-k2p2j          0/1     Error     1 (2s ago)     2s

# kubectl logs
I0630 23:01:12.267110       1 server.go:93] Using default resources
I0630 23:01:12.267218       1 types.go:136] Using all namespace
- F0630 23:01:12.267256       1 main.go:65] Failed to run kube-state-metrics: allowlist and denylist are both set, they are mutually exclusive, only one of them can be set
goroutine 1 [running]:
k8s.io/klog/v2.stacks(0x1)
	/go/pkg/mod/k8s.io/klog/v2@v2.60.1/klog.go:860 +0x8a
k8s.io/klog/v2.(*loggingT).output(0x264d0a0, 0x3, 0x0, 0xc000294a10, 0x1, {0x1e5b651?, 0x1?}, 0x264e2a0?, 0x0)
	/go/pkg/mod/k8s.io/klog/v2@v2.60.1/klog.go:825 +0x686
k8s.io/klog/v2.(*loggingT).printfDepth(0x264d0a0, 0x0?, 0x0, {0x0, 0x0}, 0x7fe82bd9c290?, {0x18a2283, 0x24}, {0xc00012b540, 0x1, ...})
	/go/pkg/mod/k8s.io/klog/v2@v2.60.1/klog.go:630 +0x1f2
k8s.io/klog/v2.(*loggingT).printf(...)
	/go/pkg/mod/k8s.io/klog/v2@v2.60.1/klog.go:612
k8s.io/klog/v2.Fatalf(...)
	/go/pkg/mod/k8s.io/klog/v2@v2.60.1/klog.go:1516
main.main()
	/go/src/k8s.io/kube-state-metrics/main.go:65 +0x514

在设定时,无法同时设置 “–metric-allowlist” 和 “–metric-denylist”,会在启动时报错。

比较–resources和–metric-denylist。

在 kube-state-metrics 中,指标名称的命名规则为 kube_<对象名称>_XXXX。因此,当需要禁止输出与 secrets 相关的指标时,可以通过以下两种方法进行设置。

–resources による設定

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --resources=certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,leases,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments

–metric-denylistによる設定

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --metric-denylist=kube_secret_*

我认为在上述两种选择中,决定因素可能是kube-state-metrics资源使用情况和manifest的可读性。如果更注重资源消耗的少,那么选择–resources可能更好。但是,如果资源消耗量的增加在可接受范围内,也可以选择注重可读性的–metric-denylist。对于这些判断,我认为取决于团队运作方式。

其他

以下是通过kube-state-metrics减少指标的三种方法,但是我会简要介绍相关事项。

    • –resources

–namespaces or –namespaces-denylist

–metric-allowlist or –metric-denylist

–度量选择列表

概要:简要说明。

kube-state-metrics v2.3.0版本添加了–metric-opt-in-list功能。

在公式文件中的解释如下。

以下是对上述内容的中文翻译:

–metric-opt-in-list string:已选择的指标列表,用逗号分隔,这些指标默认情况下是未启用的。这是在允许和拒绝列表之外的额外指标。

    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md

这是一个用于控制指定的度量标准可以通过用户指定来使用的功能,它默认不会被输出。它被添加是为了在向 kube-state-metrics 中添加具有高基数的度量标准时使用。

随着该功能的引入,指标的说明中新增了Opt-in列。
在kube-state-metrics v2.5.0版本中,仅支持Opt-in的指标为kube_pod_nodeselectors。

Metric nameMetric typeDescriptionUnit (where applicable)Labels/tagsStatusOpt-inkube_pod_nodeselectorsGaugeDescribes the Pod nodeSelectors
pod=<pod-name>
namespace=<pod-namespace>
nodeselector_NODE_SELECTOR=<NODE_SELECTOR>
uid=<pod-uid>EXPERIMENTALOpt-in
    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/pod-metrics.md

设定步骤

以下是設定的範例。

containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
  args:
  - --metric-opt-in-list=kube_pod_nodeselectors

由于目前仅支持指标“kube_pod_nodeselectors”,因此尚未确认支持多个指标的情况。如果要指定多个条件,可能需按照通常方式,使用逗号进行分隔。

以下是输出示例。

# HELP kube_pod_nodeselectors Describes the Pod nodeSelectors.
# TYPE kube_pod_nodeselectors gauge
kube_pod_nodeselectors{namespace="kube-system",pod="kube-state-metrics-84898b978d-rml7z",uid="4f78fe43-60f8-46aa-82e0-5172ae060937",nodeselector_kubernetes_io_os="linux"} 1
kube_pod_nodeselectors{namespace="kube-system",pod="kube-proxy-f7h4m",uid="a90db164-ff5a-4e91-9dfd-47150c836593",nodeselector_kubernetes_io_os="linux"} 1
kube_pod_nodeselectors{namespace="kube-system",pod="kube-apiserver-kind-control-plane",uid="992ad0ac-029c-4333-abc7-48747140b89a"} 1

有所疑虑

我认为当添加新度量时,我们可以始终考虑使用–metric-opt-in-list选项,以减少kube-state-metrics升级时的影响。然而,我认为大多数人在添加新度量时默认为true并提交PR,因此如果社区不积极推动这个功能,我认为在添加新度量时不会考虑使用这个功能。

kube-state-metrics存在一个叫做Metric Stages的概念,但严格来说,它并没有得到严格的运用。有时即使是STABLE版本,除了主要升级外,标签名称可能也会发生破坏性改变。在添加新的度量指标时,并不一定必须将其标记为EXPERIMENTAL,也没有明确指定EXPERIMENTAL何时变为STABLE。这就是现实情况。

StageDescriptionEXPERIMENTALMetrics which normally correspond to the Kubernetes API object alpha status or spec fields and can be changed at any time.STABLEMetrics which should have very few backwards-incompatible changes outside of major version updates.DEPRECATEDMetrics which will be removed once the deprecation timeline is met.
    https://github.com/kubernetes/kube-state-metrics/blob/master/docs/README.md#metrics-stages

我认为恐怕”metric-opt-in-list”的使用也并不会被严格执行。基本上,在更新时会检查 Changelog,并在有可能产生影响的指标被添加时,用户需要使用 “–metric-denylist” 等方法来自我保护。

由于所有人都是以志愿者的身份在空闲时间开发这个服务,所以我认为我们应该自己确认与我们服务相关的部分,然后再使用它。

优化指标归约

简要概括

通过使用 Prometheus 的 relabel 功能,您可以以同样的方式减少指标。
relabel 本身就像其名称一样,是在 Prometheus 上基于指标标签执行某种转换的功能。在其中可以执行的 relabel_action 中,以下四种类型也可以用于减少指标。

    • メトリクス自体の削減が可能なもの

keep:条件に一致するメトリクス以外を削除する

drop:条件に一致するメトリクスを削除する

メトリクスに含まれる特定のラベルの削減が可能なもの

labelkeep:メトリクスから条件に一致するラベル以外のラベルを削除する

labeldrop:メトリクスから条件に一致するラベルを削除する

以下是有关公式文档上相关功能的说明。

确定要采取的重新标记操作:

keep: 删除与连接的 source_labels 不匹配的目标。

drop: 删除与连接的 source_labels 匹配的目标。

labeldrop: 对所有标签名称进行正则匹配。任何匹配的标签将从标签集中移除。

labelkeep: 对所有标签名称进行正则匹配。任何不匹配的标签将从标签集中移除。

    https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config

在 Prometheus 上,可以在多个地方进行 relabel 的配置。但是如果是为了减少度量指标而进行设置的话,主要会在以下3个地方之一进行配置。每个地方在执行 relabel 的时机都有所不同。

    • scrape_config

relabel_configs:スクレイプ時
metric_relabel_configs:Prometheus が内部に持つ TSDB に書き込む手前

remote_write

write_relabel_configs:Prometheus が Remote storage に書き込む手前

如果 Prometheus 希望减小TSDB中的数据大小,您可以使用metric_relabel_configs来减少指标的长期存储,或者使用write_relabel_configs来减少管理型Prometheus服务的成本。这样设计意图就更加清晰易懂,也方便第三方理解。

设置方法

我在Grafana Labs的博客上找到了一篇很容易理解的文章,关于设置示例的内容,我参考了它。

需要了解更详细信息的人,请参考以下博客。

    https://grafana.com/blog/2022/03/21/how-relabeling-in-prometheus-works/

若出现以下类似的指标时

my_custom_counter_total{server="webserver01",subsystem="kata"} 192  1644075074000
my_custom_counter_total{server="sqldatabase",subsystem="kata"} 14700  1644075074000
    kubernetes の namespace 上の testing と staging のメトリクスを削減したい場合
- source_labels: [__meta_kubernetes_namespace]
  regex: “testing|staging”
  action: drop
    メトリクスの中で、subsystem のラベルに関する情報を削減したい場合
- regex: "subsystem"
  action: labeldrop

要点

如果你真的想要减少不需要使用的指标,我认为你应该考虑在输出指标的一方进行减少,而不是使用 Prometheus 的 relabel 功能。这样做的好处是,Prometheus 不需要进行额外的处理,并且减少了配置文件的大小,这样更容易进行操作。

长期运营 Prometheus 时,配置文件会不断膨胀,导致新加入的成员难以理解。因此,我认为简单的配置更易于操作。

然而,当前的kube-state-metrics只能使用–metric-denylist命令以逐个删除指定的指标名称,并且如果想要根据特定标签条件删除指标,只能使用Prometheus的relabel功能,所以需要理解并适当运用这两种方法。

最后

我发现使用Kubernetes并使用kube-state-metrics的人应该非常多,但是关于这方面的日文信息似乎很少,所以我想写一些关于如何通过kube-state-metrics减少指标的方法。

如果你想进一步降低指标,可以考虑查看 node-exporter 的 –no-collector.。如果你仍在使用默认设置的 node-exporter,我认为有些地方是可以进一步降低的。

广告
将在 10 秒后关闭
bannerAds