本文发布于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 上,且它们都是在相同的节点中。具体效果如下图
grafana 使用 label 做变量
有了决定拓扑域的标签,还需要吧这个 label 作为 grafana 的变量
这个里可以用 promql 的 by 进行分组
count(kube_pod_info{}
* on(node) group_left(label_test) kube_node_labels{}) by (label_test)
如图1所示,这时就知道每个拓扑域中的 Pod 使用了多少资源,以及可以是用 聚合函数 算出每个拓扑域总资源等信息
基于 kube_node_labels 作为变量进行输出面板
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2023/08/kubernetes-node-label-dashboard/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。