Exporter是一个用于收集和暴露应用程序指标的工具。它允许你将应用程序中的特定指标暴露给Prometheus监控系统。Exporter可以作为一个独立的进程运行,它通过暴露一个HTTP端点来提供指标数据。Prometheus可以通过定期访问Exporter的端点来获取最新的指标数据,并进行存储和可视化。
Exporter提供了针对各种应用程序和服务的特定实现,包括数据库、消息代理、Web服务器等。我们平时用的各种服务(如Nginx、MySQL、Redis、RabbitMQ、MongoDB等)都有自己的Exporter,它们会从应用程序中提取指标,并将其格式化为Prometheus可理解的格式。
总之,通过使用Prometheus exporter,你可以方便地监控应用程序的性能、资源利用率和其他重要指标。它提供了一种简单而强大的方式来收集和分析应用程序的监控数据,帮助你及时发现潜在的问题并做出相应的调整。
Node Exporter¶
Node Exporter主要用来采集主机上的各种指标(如CPU、内存、磁盘、网络等),Node exporter作为一个独立的进程在主机上运行,并通过HTTP端点暴露指标数据。Prometheus可以定期访问该端点以获取最新的主机指标数据,并将其存储和可视化。
Node exporter可以在各种操作系统上运行,包括Linux、Windows和Mac。它使用系统级接口和命令行工具来收集主机指标数据,并将其转换为Prometheus可理解的格式。
1、给K8S各个节点安装Node Exporter,node-exporter为daemonset
$ helm install node-exporter bitnami/node-exporter
2、查看pod
$ kubectl get po | grep node-exporter
node-exporter-6zwsk 1/1 Running 0 7m48s
node-exporter-cxwbh 1/1 Running 0 7m48s
node-exporter-k7rg6 1/1 Running 0 7m48s
node-exporter-pm7kq 1/1 Running 0 7m48s
node-exporter-vnlzw 1/1 Running 0 7m48s
如果master节点上有污点,需要给daemonset设置一个容忍度,按如下方法操作:
(1)查看master节点上的污点
$ kubectl describe node aminglinux01 |grep -i taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule
(2)在线编辑daemonset
$ kubectl edit daemonset node-exporter ## 搜索volumes,在其上面增加如下红色字体内容,注意tolerations和container是平级
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
注意:tolerations和container是平级

3、获取节点metrics,如果node-exporter工作正常,那么下面五个节点的9100端口都可以访问
http://192.168.1.31:9100/metrics
http://192.168.1.32:9100/metrics
http://192.168.1.33:9100/metrics
http://192.168.1.34:9100/metrics
http://192.168.1.35:9100/metrics

Prometheus通过node-export来监控节点¶
由于我们用helm安装的Prometheus,要想通过编辑配置文件来修改Prometheus的配置就非常麻烦,好在k8s里Prometheus的配置是通过Configmap的形式存在的。
$ k get cm | grep prometheus
prometheus-alertmanager 1 103m
prometheus-server 2 103m
要修改Configmap有两种方式,第一种将k8s内的Configmap导出来,编辑后再次apply,而第二种是直接使用kubectl edit命令来在线编辑。建议使用第一种,安全更方便,因为后面更改这个配置的情况很多。
先把Configmap导出为yaml文件:
$ kubectl get cm prometheus-server -o yaml > prometheus_config.yaml
编辑yaml,在scrape_configs: 下面增加如下内容
$ vi prometheus_config.yaml
...
...
- job_name: node_exporter
static_configs:
- targets:
- 192.168.1.31:9100
- 192.168.1.32:9100
- 192.168.1.33:9100
- 192.168.1.34:9100
- 192.168.1.35:9100
...
...

编辑完,再重新应用yaml
$ kubectl apply -f prometheus_config.yaml
此时,配置虽然更新,但是Prometheus并还未应用最新配置,还需要重启一下Prometheus服务,比较简单的方法是,将现有pod删除,Kubernetes会自动新启动一个新的pod。
$ kubectl get po |grep prometheus-server |awk '{print $1}' |xargs -i kubectl delete po {}
等新的pod正常running后,再打开浏览器输入http://192.168.1.31:31093访问Prometheus,观察到node已成功监控

临时解决访问node-exporter有问题¶
正常来说,不会出现访问node-exporter有问题,如果出现,可参考以下方法临时解决
$ cat > node-exporter-endpoint.yaml <<EOF
apiVersion: v1
kind: Endpoints
metadata:
name: external-node-exporter-101
subsets:
- addresses:
- ip: 192.168.222.101
ports:
- port: 9100
---
apiVersion: v1
kind: Service ##注意,该service里并不需要定义selector,只要Service name和Endpoint name保持一致即可
metadata:
name: external-node-exporter-101
spec:
ports:
- port: 9100
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-node-exporter-102
subsets:
- addresses:
- ip: 192.168.222.102
ports:
- port: 9100
---
apiVersion: v1
kind: Service ##注意,该service里并不需要定义selector,只要Service name和Endpoint name保持一致即可
metadata:
name: external-node-exporter-102
spec:
ports:
- port: 9100
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-node-exporter-103
subsets:
- addresses:
- ip: 192.168.222.103
ports:
- port: 9100
---
apiVersion: v1
kind: Service ##注意,该service里并不需要定义selector,只要Service name和Endpoint name保持一致即可
metadata:
name: external-node-exporter-103
spec:
ports:
- port: 9100
EOF
应用上述YAML文件
$ kubectl apply -f node-exporter-endpoint.yaml
然后编辑prometheus_config.yaml,更改配置
- job_name: node_exporter
static_configs:
- targets:
- external-node-exporter-101:9100
- external-node-exporter-102:9100
- external-node-exporter-103:9100
编辑完,再重新应用yaml
$ kubectl apply -f prometheus_config.yaml
此时,配置虽然更新,但是Prometheus并还未应用最新配置,还需要重启一下Prometheus服务,比较简单的方法是,将现有pod删除,Kubernetes会自动新启动一个新的pod。
$ kubectl get po |grep prometheus-server |awk '{print $1}' |xargs -i kubectl delete po {}
等新的pod正常running后,再去浏览器查看。
