如何在Grafana查询中自动映射两个标签值,无需手动配置?
怎么自动把Prometheus里的Instance IP和节点名称对应上?
方法1:采集时直接把节点名称加到指标里(最省心)
修改Prometheus的采集配置,针对kubelet的job添加relabel规则,从K8s节点元数据里直接提取节点名称生成新标签。这样所有kubelet指标都会自带节点名称标签,完全不用手动维护映射关系。
配置示例:
scrape_configs: - job_name: 'kubelet' kubernetes_sd_configs: - role: node relabel_configs: # 从K8s节点元数据提取节点名称,存为node_name标签 - source_labels: [__meta_kubernetes_node_name] target_label: node_name # 确保规则仅对kubelet job生效 - action: keep source_labels: [job] regex: kubelet
配置完成后重启Prometheus,后续查询kubelet_runtime_operations_total时,每个指标都会带上node_name标签(值为devops-test-srv01这类节点名),直接用该标签过滤即可。
方法2:查询时动态关联两个指标(不用改采集配置)
如果无法修改Prometheus采集配置,可通过PromQL将kubelet指标与kube-state-metrics提供的节点指标关联,自动匹配IP和节点名。
查询语句:
kubelet_runtime_operations_total{job="kubelet", metrics_path="/metrics"} * on(instance) group_left(node) label_replace(kube_node_info{}, "instance", "$1", "address", "(.*):.*")
逻辑说明:
kube_node_info指标包含node(节点名)和address(节点IP+端口,如100.130.101.101:10250)标签label_replace函数从address中提取IP部分,生成与kubelet指标一致的instance标签on(instance) group_left(node)通过IP关联两个指标,将节点名标签附加到kubelet指标上
查询结果会同时包含原IP标签和节点名标签,按需使用即可。
方法3:Grafana里用变量自动关联(针对可视化场景)
如果用Grafana展示数据,可通过变量实现自动关联:
- 创建
instance变量:查询语句用label_values(kubelet_runtime_operations_total{job="kubelet", metrics_path="/metrics"}, instance),获取所有IP列表 - 创建
node_name变量:查询语句用label_values(kube_node_info{address=~"${instance}:.*"}, node),选中IP时自动匹配对应节点名
或者直接创建节点名变量,查询语句用label_values(kube_node_info, node),然后在指标查询中通过节点名反向匹配IP:
kubelet_runtime_operations_total{job="kubelet", metrics_path="/metrics", instance=~"${node_name:instance}"}
这种方式无需手动维护映射,新节点加入后会自动同步。
内容的提问来源于stack exchange,提问作者Kavi Rakesh
相关产品推荐
相关产品推荐

