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是平级

Prometheus的Exporter-1

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的Exporter-2

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

...
...

Prometheus通过node-export来监控节点-1

编辑完,再重新应用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已成功监控

Prometheus通过node-export来监控节点-2

临时解决访问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后,再去浏览器查看。

Prometheus通过node-export来监控节点-3