在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。
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。这就是现实情况。
- 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,我认为有些地方是可以进一步降低的。