运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践
exporter 简介
随着 Prometheus 的流行,很多系统都已经自带了用于 Prometheus 监控的接口,例如 etcd、Kubernetes、CoreDNS 等,所以这些系统可以直接被 Prometheus 所监控。
但是,有很多应用目前还没有提供用于 Prometheus 监控的接口(一些出现的比 Prometheus 还要早的应用),针对这这类应用,Prometheus 提出了 Exporter 的解决方案。
Exporter 是需要独立部署的服务
Exporter 是 Prometheus 的指标数据收集组件。它负责从目标 Jobs 收集数据,并把收集到的数据转换为 Prometheus 支持的时序数据格式。和传统的指标数据收集组件不同的是,他只负责收集,并不向 Server 端发送数据,而是等待 Prometheus Server 主动抓取
常用的 exporter
- Elasticsearch exporter
- MySQL server exporter
- Kafka exporter
- Gluster exporter
- Ceph exporter
- Node/system metrics exporter
- Blackbox exporter
- kube-state-metrics
- cAdvisor
node-exporter 实践
- node-exporter 用于采集类 *NIX 内核的硬件以及系统指标
- windows exporter 用于采集 windows 系统指标
- dcgm-exporter 用于采集 NVIDIA GPU 指标
- 同 Prometheus,这里的 node-exporter 也是在 k8s 内部署的,部署的 node-exporter 版本是 v1.8.0
创建 svc
---
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: node-exporter
name: node-exporter-svc
namespace: monitor
spec:
clusterIP: None
ports:
- name: http
port: 9100
protocol: TCP
selector:
app: node-exporter
type: ClusterIP
创建 daemonset
要采集每个机器的指标,所以采用 daemonset 的方式来部署,保证有新增节点的时候,会自动启动 node-exporter
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
annotations:
labels:
app: node-exporter
name: node-exporter
namespace: monitor
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
annotations:
prometheus.io/port: "9100"
prometheus.io/scrape: "true"
prometheus.io/type: "node_exporter"
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.8.0
args:
- "--path.rootfs=/rootfs"
ports:
- containerPort: 9100
hostPort: 9100
name: http
volumeMounts:
- mountPath: /rootfs
name: root
volumes:
- hostPath:
path: /
name: root
prometheus 配置服务发现
因为之前的 prometheus 配置文件只简单的配置了 prometheus 自身的 target,现在要增加一个关于 kubernetes 的服务发现,这样,如果后面有新增节点,也会被加入到 promethus 内
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_timeout: 10s
external_labels:
prometheus: monitor/k8s
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: prometheus
metrics_path: '/metrics'
static_configs:
- targets: ['prometheus-svc.monitor.svc.cluster.local:9090']
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
使用 reload 来刷新 prometheus 配置,下面的 ip 和端口要换成自己环境的
curl -XPOST http://192.168.11.167:31090/-/reload
再次查看 prometheus 的页面,可以发现 target 里面增加了每个节点的 node-exporter 了