微服务监控 - 使用 Exporter 监控 Kubernetes 集群应用

上一篇 讲解了如何利用 Prometheus 监控 Kubernetes 集群。本篇主要借助上一篇对 node_exporter 的理解,向大家介绍 使用 Exporter 监控 Kubernetes 集群应用。

Exporter

Prometheus 监控固然好用,但不是所有的服务都有自带 /metrics 接口。这个时候 Exporter 就派上用场了。Prometheus 官方为许多应用提供了对应的 Exporter 应用,也有许多第三方的实现,详见 Third-party exporters

这里需要注意的是,每个 Exporter 都有默认暴露的端口,详见 Default port allocations

下面以 redis 应用为例,为大家讲解如何使用 Exporter 监控 Kubernetes 集群应用。

redis

部署

下面是 redis 的部署文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: observability
spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:5.0.8
          resources:
            limits:
              cpu: 1000m
              memory: 500Mi
            requests:
              cpu: 100m
              memory: 100Mi
          ports:
            - containerPort: 6379
        - name: redis-exporter
          image: oliver006/redis_exporter:latest
          resources:
            limits:
              cpu: 200m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 100Mi
          ports:
            - containerPort: 9121
---
kind: Service
apiVersion: v1
metadata:
  name: redis
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9121"
  namespace: observability
spec:
  selector:
    app: redis
  ports:
    - name: redis
      port: 6379
      targetPort: 6379
    - name: prom
      port: 9121
      targetPort: 9121

一般地,Exporter 会以 sidecar 的形式和主应用部署在同一个 Pod 中。这里,使用 redis-exporter 这个 sidecar 来采集 redis 的监控数据供 Prometheus 使用。

Default port allocations 中可以找到 redis_exporter 默认的端口为 9121,因此,这里设置 prometheus.io/port: "9121"

Prometheus server 根据配置匹配定义注解 prometheus.io/scrape: 'true' 的 pod,并将 pod ip 和注解中定义的端口(prometheus.io/port: "9121")和路径(prometheus.io/path:"/metrics")拼接成采集目标 http://xx.xx.xx.xx:9121/metrics。通过这种方式就可以完成动态添加需要采集的应用

1
2
3
$ kubectl apply -f redis.yaml
deployment.apps/redis created
service/redis created

查看 redis 部署情况

1
2
3
4
$ kubectl get deployment -n observability
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
prometheus   1/1     1            1           3d22h
redis        1/1     1            1           88s
1
2
3
4
5
$ kubectl get service -n observability
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
node-exporter   NodePort    10.111.82.119    <none>        9100:31672/TCP      23h
prometheus      NodePort    10.98.133.13     <none>        9090:31033/TCP      3d22h
redis           ClusterIP   10.104.118.216   <none>        6379/TCP,9121/TCP   42s

验证

查看指标

从上图可以看出,redis_exporter 服务已经被 Prometheus 自动发现。

查看 reids_ 可以看出,已经增加了redis_exporter 相关的指标数据

小结

本篇为大家介绍了使用 Prometheus 使用 Exporter 监控 Kubernetes 集群应用。下一篇将为大家带来,监控自己的服务

注:本章内容涉及的 yaml 文件可前往 https://github.com/MakeOptim/service-mesh/prometheus 获取。


CatchZeng
Written by CatchZeng Follow
AI (Machine Learning) and DevOps enthusiast.