本文发布于Cylon的收藏册,转载请著名原文链接~


背景

目前的 Kubernetes 集群资源面板是基于集群的使用资源,因为是多集群,业务同时运行字啊不同集群上,如果通过 label 来划分业务使用的资源情况,这个才是真的和每个集群的每个业务使用的资源有关。

对于这种场景的划分,Kubernetes 中有一个专门的名词是 Pod 的拓扑域;基于这些需要做的事情就如下步骤

  • 首先确定node label可以搜集到,如果不存在需要收集
  • 当收集到node label 时,需要根据对应的 label 将一个域中的
  • 根据域(label)做变量注入到 对应的查询语句中以生成图表

收集 node label

在使用 kube-prometheus-stack 中收集 kubernetes 的 node label 需要手动启动参数 - --metric-labels-allowlist=nodes=[*] 才可以收集到 node label,手动给Node 打上标签,test 拓扑域 为 aaaa bbbb两个

$ kubectl get node --show-labels
NAME             STATUS   ROLES    AGE   VERSION    LABELS
node01   Ready    <none>   13d   v1.16.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,test=bbbb
node01   Ready    <none>   13d   v1.16.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,test=aaaa

开启后,会在 kube_node_labels 收取到 node 的 label,其他 node label 没什么用,使用 relabeing 删除掉

regex: label_(beta_kubernetes_io_arch|beta_kubernetes_io_os|kubernetes_io_arch|kubernetes_io_os|kubernetes_io_hostname)
action: labeldrop

使用标签分组

因为标签 只存在于 kube_node_label 指标中,需要利用这个指标对每种类型 Pod 分组,首先找到指标的相同标签,可以看到每个 Pod 都会存在一个 node=“xxxxxxx” 这与 kube_node_labels 上的相符合。

kube_pod_container_resource_requests{container="alertmanager", endpoint="http", instance="10.0.130.150:8080", job="kube-state-metrics", namespace="default", node="node003", pod="alertmanager-kube-prometheus-stack-alertmanager-0", resource="memory", service="kube-prometheus-stack-kube-state-metrics", uid="12787588-b05e-466a-9f1a-661a05e8b634", unit="byte"}

kube_node_labels{container="kube-state-metrics", endpoint="http", instance="10.0.130.150:8080", job="kube-state-metrics", label_test="aaaa", namespace="default", node="node195", pod="kube-prometheus-stack-kube-state-metrics-7fb89968cb-jrrdp", service="kube-prometheus-stack-kube-state-metrics"}

然后使用 promQL 的 join 表达式,对应决定拓扑域的 label 注入到每个 Pod 的标签中

kube_pod_info{node=xxx} 
  * on(node) group_left(test) kube_node_labels{test="aaa"}

上面的表达式中,选择了 kube_pod_info 指标,并且使用 node=xxx 进行过滤。然后使用 on(node) 语句指定在 node 标签上进行 join 操作,同时使用 group_left(test) 告诉 Prometheus 把 kube_node_labels 中的 test 标签添加到左侧的指标(即 kube_pod_info)中。

通过这种方式,我们就可以把 kube_node_labels 中的 test=aaa 标签附加到所有 kube_pod_info 上,且它们都是在相同的节点中。具体效果如下图

image-2024109141236234

图1:node label指标

grafana 使用 label 做变量

有了决定拓扑域的标签,还需要吧这个 label 作为 grafana 的变量

image-202410914631411

图2:grafana变量配置

这个里可以用 promql 的 by 进行分组

count(kube_pod_info{}
  * on(node) group_left(label_test) kube_node_labels{}) by (label_test)

如图1所示,这时就知道每个拓扑域中的 Pod 使用了多少资源,以及可以是用 聚合函数 算出每个拓扑域总资源等信息

基于 kube_node_labels 作为变量进行输出面板

image-2024109141263453

图3:grafana定义变量

image-202410914645123

图4:promql

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/08/kubernetes-node-label-dashboard/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。