背景
目前我们大部分的服务器都已经在k8s集群中,通过prometheus可以很方便的监控集群内的服务器。
但是目前我们还有一少量部分服务器还没上k8s,之前都是通过zabbix进行监控,监控相对比较分散,而且和k8s集群内监控也不够统一,在经历过几次可用区迁移,已经出现过多次监控漏迁移的情况。
因此我们迫切希望那些非k8s集群内的机器也能过通过prometheus进行监控。
安装NodeExporter
Exporter是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。
node-exporter用于采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等基础监控,类似于传统主机监控维度的zabbix-agent。
node-export由prometheus官方提供、维护,不会捆绑安装,但基本上是必备的exporter。
https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
在需要监控的ecs上下载node-exporter 并启动node-exporter即可。
创建系统级别的用户和组
此用户帐户将用于运行node_exporter程序服务。
1groupadd -r prometheus
2useradd -s /sbin/nologin -r -g prometheus prometheus
下载NodeExporter二进制文件
参考:https://github.com/prometheus/node_exporter/releases
1wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
2tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz
3mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin
查看node-exporter版本
1node_exporter --version
配置Systemd服务
https://github.com/prometheus/node_exporter/tree/master/examples/systemd
1cat > /etc/systemd/system/node_exporter.service << 'EOF'
2[Unit]
3Description=Node Exporter
4Wants=network-online.target
5After=network-online.target
6
7[Service]
8User=prometheus
9ExecStart=/usr/local/bin/node_exporter
10
11[Install]
12WantedBy=default.target
13EOF
启动NodeExporter服务
1systemctl enable --now node_exporter
浏览器访问以下地址,查看node-exporter收集的metrics指标:
1curl http://xx.xx.xx.xx:9100/metrics
prometheus-operator配置
首先我们新建一个ServiceMonitor,用来统一监控非k8s集群内的ecs机器,名称就定为ecs-exporter。
另外我们还需要定义一个被监控机器的svc和endpoint。由于node-exporter默认端口是9100,所以endpoint中的port设置成9100即可。
这里以ocr这台ecs作为例子:
Service:
1apiVersion: v1
2kind: Service
3metadata:
4 name: ocr-node-exporter
5 namespace: monitoring
6 labels:
7 app: ecs-exporter
8 ecs-app: node-exporter
9spec:
10 clusterIP: None
11 type: ClusterIP
Endpoints:
1apiVersion: v1
2kind: Endpoints
3metadata:
4 name: ocr-node-exporter
5 namespace: monitoring
6
7subsets:
8 - addresses:
9 - ip: xx.xx.xx.xx
10 ports:
11 - name: http-metrics
12 port: 9100
13 protocol: TCP
ServiceMonitor:
1apiVersion: monitoring.coreos.com/v1
2kind: ServiceMonitor
3metadata:
4 name: ecs-exporter
5 namespace: monitoring
6 labels:
7 app: ecs-exporter
8spec:
9 selector:
10 matchLabels:
11 app: ecs-exporter
12 jobLabel: ecs-app
13 endpoints:
14 - port: http-metrics
15 interval: 15s
16 honorLabels: true
17 scheme: http
小技巧
yaml文件apply -f之后如果想快速让配置生效,可以通过下面这个命令进行快速reload
1curl -X POST http://prometheus.xxx.com/-/reload
配置完成后就可以在prometheus的target中看到了
http://prometheus.xxx.com/targets

由于job的名称默认是endpoints的名称,为了能复用k8s node节点的告警规则,我们需要将job的名称也改成node-exporter,但是由于node-exporter这个名称的ServiceMonitor已经存在,所以只能想别的办法
这里我们使用jobLabel这个标签来实现job名称的替换。

1// By default, generate a safe job name from the service name. We also keep
2// this around if a jobLabel is set in case the targets don't actually have a
3// value for it.
4relabelings = append(relabelings, yaml.MapSlice{
5 {Key: "source_labels", Value: []string{"__meta_kubernetes_service_name"}},
6 {Key: "target_label", Value: "job"},
7 {Key: "replacement", Value: "${1}"},
8})
9if m.Spec.JobLabel != "" {
10 relabelings = append(relabelings, yaml.MapSlice{
11 {Key: "source_labels", Value: []string{"__meta_kubernetes_service_label_" + sanitizeLabelName(m.Spec.JobLabel)}},
12 {Key: "target_label", Value: "job"},
13 {Key: "regex", Value: "(.+)"},
14 {Key: "replacement", Value: "${1}"},
15 })
16 }
这里我们统一使用ecs-app这个标签进行配置,在svc中标签ecs-app值设置成node-exporter。
然后在ServiceMonitor中设置jobLabel 为ecs-app即可,这样就可以将job统一替换成node-exporter了。


同样我们从configuration中也看到替换的规则
访问 http://prometheus.xxx.com/config

接入Grafana

使用grafana 的仪表盘模板导入ID=10604的仪表盘 ,点击 import导入即成功。
通过以上配置我们就可以使用grafana原有看板看到新加的ecs监控内容了。

后续如果要增加别的ecs监控,也可以通过上述方法,只需要增加新的svc和enpoint即可,另外注意在svc中增加ecs-app:node-exporter
标签,这样就能复用k8s node节点的告警规则了。
参考文献
https://www.kancloud.cn/willseecloud/prometheus/1904334




