使用kube-state-metrics将标签和注释导出为指标的方法是什么?
首先
在监视Kubernetes时,有时会遇到需要根据特定的标签名称连接多个指标并创建仪表板,或者需要通过检查特定批注的设置情况来确定相应功能是否在集群中使用的情况。
由于kube-state-metrics已经实现了满足这些需求的功能,所以我们可以利用相应功能来获取Kubernetes上任意附加标签名称和注释名称作为度量指标。本文是基于截至2022年6月28日最新版本v2.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 v1.9.7之前,kube_<对象名称>_labels 指标(例如:kube_pod_labels,kube_node_labels等)会输出附加到对象的所有标签名称。
从 v2.0.0 版本开始,在 kube_<对象名>_labels 中,默认不再输出标签名称。
以下是在v1.9.7和v2.5.0版本中kube_<对象名>_labels指标输出差异的示例。
# v1.9.7
- kube_node_labels{node="kind-control-plane",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-control-plane",label_kubernetes_io_os="linux",label_node_role_kubernetes_io_control_plane="",label_node_kubernetes_io_exclude_from_external_load_balancers=""} 1
- kube_node_labels{node="kind-worker2",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-worker2",label_kubernetes_io_os="linux"} 1
- kube_node_labels{node="kind-worker",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-worker",label_kubernetes_io_os="linux"} 1
# v2.5.0
+ kube_node_labels{node="kind-control-plane"} 1
+ kube_node_labels{node="kind-worker2"} 1
+ kube_node_labels{node="kind-worker"} 1
由于具有对象的所有标签名称的指标具有较高的基数并且容易引起Prometheus的性能问题,因此默认情况下输出受到了限制。有关指标的基数和Prometheus性能之间的关系,请参考这里。
如果在使用 kube-state-metrics 的 v2.0.0 及以上版本时想要使用 Kubernetes 对象上附加的标签作为指标,用户需要进行相应的配置。
设置方式
通过在启动参数中指定 –metric-labels-allowlist,可以将任意标签名称输出到指标中。
公式文件上的说明如下。 de .)
–metric-labels-allowlist string Comma-separated list of additional Kubernetes label keys that will be used in the resource’ labels metric. By default the metric contains only name and namespace labels. To include additional labels provide a list of resource names in their plural form and Kubernetes label keys you would like to allow for them (Example: ‘=namespaces=[k8s-label-1,k8s-label-n,…],pods=[app],…)’. A single ” can be provided per resource instead to allow any labels, but that has severe performance implications (Example: ‘=pods=[]’).
- https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md
公式ドキュメントの説明だと少し分かりにくいのですが、–metric-labels-allowlist には、オブジェクト名(複数形)とラベル名を組み合わせを以下のように設定します。
<オブジェクト名1(複数形)>=[<ラベル名1>,<ラベル名2>,...],<オブジェクト名2(複数形)>=[<ラベル名1>,<ラベル名2>],...
以下是一個設定的範例。
containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
args:
- --metric-labels-allowlist=pods=[app,k8s-app],nodes=[*]
如果指定为*,则会将目标对象的所有标签都输出为指标,因此请注意基数的增加。我们强烈建议您不要对 pod、configmap、secret 使用*,而是单独设置要输出的标签。
出力的例子如下。
# --metric-labels-allowlist 指定なし
- kube_node_labels{node="kind-control-plane"} 1
- kube_node_labels{node="kind-worker2"} 1
- kube_node_labels{node="kind-worker"} 1
# --metric-labels-allowlist 指定あり
+ kube_node_labels{node="kind-worker2",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-worker2",label_kubernetes_io_os="linux"} 1
+ kube_node_labels{node="kind-worker",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-worker",label_kubernetes_io_os="linux"} 1
+ kube_node_labels{node="kind-control-plane",label_beta_kubernetes_io_arch="amd64",label_beta_kubernetes_io_os="linux",label_kubernetes_io_arch="amd64",label_kubernetes_io_hostname="kind-control-plane",label_kubernetes_io_os="linux",label_node_role_kubernetes_io_control_plane="",label_node_kubernetes_io_exclude_from_external_load_balancers=""} 1
关于获取任意注解名称的方法
背景的描述
由于存在与标签相同的需求,我们希望将注释作为指标进行获取,并在 kube-state-metrics v2.2.0 中加以添加。
设定的步骤
起動時の引数に –metric-annotations-allowlist を指定することで任意のラベル名をメトリクスに出力できるようになります。
公式文件中的描述如下。
–metric-annotations-allowlist string Comma-separated list of Kubernetes annotations keys that will be used in the resource’ labels metric. By default the metric contains only name and namespace labels. To include additional annotations provide a list of resource names in their plural form and Kubernetes annotation keys you would like to allow for them (Example: ‘=namespaces=[kubernetes.io/team,…],pods=[kubernetes.io/team],…)’. A single ” can be provided per resource instead to allow any annotations, but that has severe performance implications (Example: ‘=pods=[]’).
- https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md
公式文件的内容有点难以理解,但是设置方法与标签时相同。
设定的例子如下。
containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0
args:
- --metric-annotations-allowlist=services=[prometheus.io/scrape,prometheus.io/path,prometheus.io/port],nodes=[*]
这里是输出的例子。
# --metric-annotations-allowlist 指定なし
- kube_service_annotations{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f"} 1
- kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20"} 1
- kube_service_annotations{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd"} 1
# --metric-annotations-allowlist 指定あり
+ kube_service_annotations{namespace="kube-system",service="kube-dns",uid="fae94b07-09d6-4939-8409-1a16d7cda19f",annotation_prometheus_io_port="9153",annotation_prometheus_io_scrape="true"} 1
+ kube_service_annotations{namespace="kube-system",service="kube-state-metrics",uid="2b87f007-4953-46e1-ade4-5496a2ca8c20",annotation_prometheus_io_scrape="true"} 1
+ kube_service_annotations{namespace="default",service="kubernetes",uid="69799a55-9095-4ef9-8e59-c99ad01e8bbd"} 1
metric-annotations-allowlist に対して * を指定できますが、その場合は kubectl.kubernetes.io/last-applied-configuration の内容もメトリクスに出力されます。kubectl.kubernetes.io/last-applied-configuration は前回適用したオブジェクトの情報を保持しているため、情報量が大きくなりやすいです。大きなメトリクスは Prometheus のメモリ使用量が増え、TSDB のデータサイズを圧迫するため metric-annotations-allowlist を利用する際には、 * を利用せずに明示的に値を指定することを強くお勧めします。
以下是一个使用–metric-annotations-allowlist=sdeployments=[*]参数的 deployment 示例。
# HELP kube_deployment_annotations Kubernetes annotations converted to Prometheus labels.
# TYPE kube_deployment_annotations gauge
kube_deployment_annotations{namespace="kube-system",deployment="kube-state-metrics",annotation_deployment_kubernetes_io_revision="12",annotation_kubectl_kubernetes_io_last_applied_configuration="{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"app.kubernetes.io/component\":\"exporter\",\"app.kubernetes.io/name\":\"kube-state-metrics\",\"app.kubernetes.io/version\":\"2.5.0\"},\"name\":\"kube-state-metrics\",\"namespace\":\"kube-system\"},\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"app.kubernetes.io/name\":\"kube-state-metrics\"}},\"template\":{\"metadata\":{\"labels\":{\"app.kubernetes.io/component\":\"exporter\",\"app.kubernetes.io/name\":\"kube-state-metrics\",\"app.kubernetes.io/version\":\"2.5.0\"}},\"spec\":{\"automountServiceAccountToken\":true,\"containers\":[{\"args\":[\"--metric-labels-allowlist=pods=[app,k8s-app],nodes=[*]\",\"--metric-annotations-allowlist=services=[*],nodes=[*],pods=[*],comfigmaps=[*],deployments=[*]\"],\"image\":\"registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0\",\"livenessProbe\":{\"httpGet\":{\"path\":\"/healthzs\",\"port\":8080},\"initialDelaySeconds\":5,\"timeoutSeconds\":5},\"name\":\"kube-state-metrics\",\"ports\":[{\"containerPort\":8080,\"name\":\"http-metrics\"},{\"containerPort\":8081,\"name\":\"telemetry\"}],\"readinessProbe\":{\"httpGet\":{\"path\":\"/\",\"port\":8081},\"initialDelaySeconds\":5,\"timeoutSeconds\":5},\"securityContext\":{\"allowPrivilegeEscalation\":false,\"capabilities\":{\"drop\":[\"ALL\"]},\"readOnlyRootFilesystem\":true,\"runAsUser\":65534}}],\"nodeSelector\":{\"kubernetes.io/os\":\"linux\"},\"serviceAccountName\":\"kube-state-metrics\"}}}}\n"} 1
通过 annotation_kubectl_kubernetes_io_last_applied_configuration 的全部内容都包含在度量中,可以了解到信息量非常丰富。
最后
我在ゼットラボ株式会社负责开发面向Yahoo! JAPAN的Kubernetes作为服务,并且还进行了一些用户文档的撰写工作。这次我尝试重新修改其中一部分内容,以便能够在外部公开。
如果能对您有所帮助,我将感到幸运。