系统环境

  • 操作系统: CentOS 7.6
  • Docker 版本: 19.03.5
  • Prometheus 版本: 2.36.0
  • Kubernetes 版本: 1.20.0
  • Node Exporter 版本: 1.1.2

Node Exporter简介

Node Exporter 是 Prometheus 官方提供的一个节点资源采集组件,可以用于收集服务器节点的数据,如 CPU频率信息、磁盘IO统计、剩余可用内存等等。Node Exporter 会将收集到的信息转换为Prometheus可识别的Metrics数据,Prometheus可以从Node Exporter 中对这些指标进行收集与存储,并且可以根据这些数据的实时变化进行服务器节点资源监控

k8s部署Node Exporter

创建 Node Exporter 部署文件 node-exporter-ds.yaml

[root@k8s01 node-exporter]# vim node-exporter-ds.yaml 
apiVersion: v1
kind: Service
metadata:
  name: node-exporter
  namespace: monitoring
  labels:
    k8s-app: node-exporter
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 9100
    targetPort: 9100
  selector:
    k8s-app: node-exporter
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
      k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.3.1
        imagePullPolicy: IfNotPresent
        ports:
        - name: metrics
          containerPort: 9100
        args:
        - "--path.procfs=/host/proc"
        - "--path.sysfs=/host/sys"
        - "--path.rootfs=/host"
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /host
      volumes:
        - name: dev
          hostPath:
            path: /dev
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
      hostPID: true
      hostNetwork: true
      tolerations:
      - operator: "Exists"
      
[root@k8s01 node-exporter]# kubectl apply -f node-exporter-deploy.yaml 
service/node-exporter created
daemonset.apps/node-exporter created      

部署完后可在任一节点执行下面命令测试是否能够正常访问到Node Exporter暴露的metrics数据

[root@k8s01 node-exporter]# curl -kL http://127.0.0.1:9100/metrics
...
process_max_fds 1.048576e+06
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 9
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.1456512e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.6545927432e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 7.33663232e+08
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes 1.8446744073709552e+19
# HELP promhttp_metric_handler_errors_total Total number of internal errors encountered by the promhttp metric handler.
# TYPE promhttp_metric_handler_errors_total counter
promhttp_metric_handler_errors_total{cause="encoding"} 0
promhttp_metric_handler_errors_total{cause="gathering"} 0
...

Prometheus中配置Node Exporter

在 Prometheus 配置文件中添加 Node Exporter 指标数据采集配置,配置内容如下

scrape_configs:
- job_name: 'node-exporter'
  kubernetes_sd_configs:
  - role: node
  relabel_configs:
  - action: replace
    source_labels: [__address__]
    regex: '(.*):10250'
    replacement: '${1}:9100'
    target_label: __address__

上面部分参数说明如下:

  • kubernetes_sd_configs: 设置发现模式为 Kubernetes 动态服务发现。
  • kubernetes_sd_configs.role: 指定 Kubernetes 的服务发现模式,这里设置为 Node 则表示从 Kubernetes 集群中每个节点发现目标,其默认地址为 Kubelet 地址的 HTTP 端口
  • relabel_configs: 用于对采集的标签进行重新标记

配置文件中relabel_configs参数说明

Node Exporter 使用的是 DaemonSet 方式部署到 Kubernetes 集群中的,这种部署方式能够在 Kubernetes 中每个节点里面都部署一个实例,每个节点上的 Node Exporter 都会通过 9100 端口和 /metrics 接口暴露节点节点监控指标数据。要想采集这些指标数据,我们可以在 Prometheus 配置文件中,添加全部的Node Exporter 的地址与端口这样的静态配置
不过配置地址是一件非常繁琐的事情,为什么这么说呢?这是因为在实际使用过程中,我们每当 Kubernetes 集群中"新增节点"或"剔除节点",那么我们就必须手动修改一次 Prometheus 配置,将它们更新。那么有没有配置一个配置,就能自动采集全部节点信息的配置呢?且能根据节点的变化而变化呢?
带着问题分析一下如何实现,刚刚讲了 Node Exporter 的 端口 和 指标暴露接口 在每个服务器节点中都是固定的,唯一可能每个节点中不一致的地方就是它们部署的服务器 IP 地址,如果我们能够获取它们的服务器 IP 地址,再加上 Node Exporter 应用的端口号 9100,将其拼合在一起就组成 Node Exporter 的完整地址,即 <Kubernetes节点IP>:9100 的形式。这样我们也就可以在 Prometheus 配置文件中动态配置 Node Exporter 采集地址了
不过 Prometheus 已经想到这点,其原生就提供了 Kubernetes 动态服务发现功能的支持,可以调用 Kube-ApiServer 接口获取 Kubernetes 集群相关信息。其中服务发现级别可以配置为 node,这种级别下的动态服务发现可以获得 Kubernetes 集群中的全部 Kubelet 信息。要知道在 Kubernetes 中,每个节点都是通过 Kubelet 与 Master 交互进行管控的,所以 Kubelet 组件一定在每个节点中都存在。既然这个 node 服务发现机制能够发现在各个节点中的 Kubelet 信息,那么肯定能够获取 Kubelet 的 IP 地址,由于 Node Exporter 和 Kubelet 在一起,所以获取到 Kubelet IP 地址就相当于获取到 Node Exporter 的 IP 地址了
<relabel_configs> 标签中配置参数的作用,其中该标签就是用于从 Kubernetes 动态服务发现机制中,得到的标签列表中找到 address 标签的值,该标签就是 Kubelet 的地址。不过该地址是一个完整地址,所以,我们需要使用 regex 正则表达式来截取标签值中的 IP 部分,然后再在加上 9100 端口与 /metrics 地址 (在 Prometheus 配置中会忽略,因为对于 Prometheus 来说,当不指定采集接口时默认就会从 /metrics 接口获取指标数据),这样就得到了我们收集指标的 Node Exporter 的完整地址,再将它们写到目标标签 address 中作为指标数据采集的地址
其实说白了通过这个 relabel_configs 重标记的功能获取 Kubernetes 各个节点地址,然后加上 Node Exporter 端口,组成完整采集地址,通过这个地址我们就可以收集我们需要的节点指标数据

Prometheus配置存入ConfigMap

之前k8s部署peometheus了,部署过程中将 Prometheus的配置文件存储在 Kubernetes 的 ConfigMap 资源里进行存储,所以我们需要修改 ConfigMap 资源中的配置内容,在配置中添加 Node Exporter 相关配置

[root@k8s01 prometheus]# vim prometheus-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: monitoring
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
      external_labels:
        cluster: "kubernetes"
        
    scrape_configs:
    - job_name: prometheus
      static_configs:
      - targets: ['127.0.0.1:9090']
        labels:
          instance: prometheus 
###################### Node Exporter ######################
    - job_name: 'node-exporter'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: replace
        source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__ 
        
[root@k8s01 prometheus]# kubectl apply -f prometheus-config.yaml 
configmap/prometheus-config configured        

重新加载 Prometheus 配置

[root@k8s01 prometheus]# curl -XPOST http://10.x.x.x:30089/-/reload

Grafana引入模板

到这已经完成 Prometheus 监控 Kubernetes 节点,不过我们很难直观的通过采集的 Metrics 数据观测节点运行状态信息。需要借助 Grafana 图表工具将这些指标信息绘制成图表,来直观的显示节点的运行情况,之前已经介绍过如何在 Kubernetes 中部署 Grafana,这里就不介绍该组件的安装过程
点击 Grafana 左侧栏菜单,选择 Manage 菜单,进入后点击右上角 Import 按钮,输入8919,引入Node Exporter模板,然后点击Load按钮配置数据库,结果如下:
prom-node-logo-1666233804656

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
监控服务 Prometheus Kubernetes Kubernetes 监控服务 Prometheus
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝