从节点到 daemonset/kube-prometheus-exporter-node 的标签

Labels from nodes to daemonset/kube-prometheus-exporter-node

prometheus-operator 包括 DaemonSet 以将节点导出器部署到集群中的每个节点。它可以工作,但是我们缺少一些有用的标签信息,例如:

# kubectl get nodes --all-namespaces --show-labels=true
NAME                            STATUS    ROLES     AGE       VERSION    LABELS
ip-1   Ready     master    2d        v1.10.12   ...,kubernetes.io/role=master,...
=
ip-2   Ready     node      2d        v1.10.12   ...,kubernetes.io/role=node,...

所以我们在标签中有有用的信息 - ip-1 是 master,ip-2 是 worker 等等

但是这个信息在节点导出器目标上丢失了,因为节点标签没有传播到守护进程节点导出器pods。

所以在 prometheus 中,我无法按类型对节点进行分组。

也许有办法实现这一点?谢谢!

看来你需要用relabel_config

这是一个例子:https://www.robustperception.io/automatically-monitoring-ec2-instances

P.S。至于特定角色,您也可以找到有用的 post:How to have labels for machine roles

更新: 要获取无法从元数据中获取的其他节点详细信息,可以使用 sidecar 或 init 容器,例如:init container for node properties example.

此外,使节点标签可用于 pod 是未解决的问题:40610

之所以node-exporter metrics在prometheus中没有node信息但是有pod信息是因为prometheus-operator提供了一个ServiceMonitor for node-exporter, which sets up a scrape configuration with a kubernetes_sd_config.role of endpoints,这个只得到了__meta_kubernetes_endpoint__meta_kubernetes_pod元标签。

我们想使用 kubernetes_sd_config.rolenode. To do this the node-exporter scrape endpoint must be reachable on the node address, the provided daemonset for node-exporter already exposes port 9100 on the node 的抓取配置。

下一步是给 prometheus-operator 一个 additional scrape config 以通过节点而不是服务发现 node-exporter 并复制我们可能需要的任何节点标签:

- job_name: node-exporter
  relabel_configs:
  - source_labels: [__address__]
    action: replace
    regex: ([^:]+):.*
    replacement: :9100
    target_label: __address__
  - source_labels: [__meta_kubernetes_node_name]
    target_label: name
  - source_labels: [__meta_kubernetes_node_label_beta_kubernetes_io_arch]
    target_label: arch
  - source_labels: [__meta_kubernetes_node_label_beta_kubernetes_io_instance_type]
    target_label: instance_type
  - source_labels: [__meta_kubernetes_node_label_kubernetes_io_os]
    target_label: os
  - source_labels: [__meta_kubernetes_node_label_topology_kubernetes_io_region]
    target_label: region
  - source_labels: [__meta_kubernetes_node_label_topology_kubernetes_io_zone]
    target_label: zone
  - source_labels: [__meta_kubernetes_node_label_dedicated] # or any other custom label
    target_label: dedicated
  kubernetes_sd_configs:
  - role: node

之后你可以删除node-exporter的ServiceMonitor。

__address__ 重新标记很重要,感谢 How to configure prometheus kubernetes_sd_configs to specify a specific host port?