一、Prometheus监控非云原生应用流程

Prometheus监控非云原生应用流程

上面流程图说明:

针对非云原生应用一般本身不存在一个/metrics接口,我们需要配置Exporter来指向非云原生应用Service(集群外部的应用也需要指定具体IP)。同时,Exporter会起一个Exporter Service以此暴露/metrics接口方便提供监控数据。最后,ServiceMonitor通过标签选择器自动发现符合条件的Exporter Service,并开始监控它们。最后告诉Prometheus 如何监控服务(Service)。

二、Prometheus监控非云原生应用Mysql

2.1 部署测试用例

1.部署 MySQL 至 Kubernetes 集群中,直接配置 MySQL 的权限即可

[root@k8s-master01 ~]# kubectl create deploy mysql --image=registry.cn-hangzhou.aliyuncs.com/abroad_images/mysql:5.7.23

2.设置密码

[root@k8s-master01 ~]# kubectl set env deploy/mysql MYSQL_ROOT_PASSWORD=mysql

说明:设置完密码后,Pod会自动重启

3.查看pod是否正常,观察到正常

[root@k8s-master01 ~]# kubectl get po -l app=mysql
NAME                     READY   STATUS    RESTARTS   AGE
mysql-7b759888cb-l6rht   1/1     Running   0          9m23s

4.创建 Service 暴露 MySQL

[root@k8s-master01 ~]# kubectl expose deploy mysql --port 3306
[root@k8s-master01 ~]# kubectl get svc -l app=mysql
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.0.4.4     <none>        3306/TCP   8s

5.检查 Service 是否可用,观察到服务正常

[root@k8s-master01 ~]# telnet 10.0.4.4 3306
Trying 10.0.4.4...
Connected to 10.0.4.4.
Escape character is '^]'.

6.登录 MySQL,创建 Exporter 所需的用户和权限

[root@k8s-master01 ~]# kubectl exec -it mysql-7b759888cb-l6rht -- bash
root@mysql-7b759888cb-l6rht:/# mysql -uroot -pmysql

mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter' WITH MAX_USER_CONNECTIONS 3;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
Query OK, 0 rows affected (0.00 sec)

上面关于CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter' WITH MAX_USER_CONNECTIONS 3;SQL语句说明:

  • CREATE USER: 这是MySQL数据库中用于创建用户的关键字
  • 'exporter'@'%': 这是要创建的用户的标识。在这里,exporter是用户名,%表示任意主机,因此用户exporter可以从任何主机连接到MySQL服务器
  • IDENTIFIED BY 'exporter': 这是用于指定用户的密码。在这里,用户exporter的密码是exporter
  • WITH MAX_USER_CONNECTIONS 3: 这是用于设置用户的最大连接数。在这里,用户exporter的最大连接数被设置为3。这意味着当用户exporter已经有3个连接时,将无法再建立新的连接

上面关于GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';SQL语句说明:

  • GRANT: 这是MySQL数据库中用于授予权限的关键字
  • PROCESS: 这是一种特殊权限,允许用户查看其他用户连接到MySQL服务器的信息和进程
  • REPLICATION CLIENT: 这是一种特殊权限,允许用户查看有关MySQL复制的信息,如主从复制状态和日志
  • SELECT: 这是一种通常的权限,允许用户查询(读取)数据库中的数据
  • *.*: 这是MySQL中的权限授权方式之一,表示授予用户在所有数据库(所有库名)和所有表(所有表名)上的指定权限
  • TO 'exporter'@'%': 这是指定接收权限的用户和主机的部分。在这里,exporter是用户名,%表示任意主机,因此用户exporter可以从任何主机连接到MySQL服务器并拥有指定的权限

2.2 创建Mysql-exporter

1.配置 MySQL Exporter 采集 MySQL 监控数据

[root@k8s-master01 ~]# vim mysql-exporter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  template:
    metadata:
      labels:
        k8s-app: mysql-exporter
    spec:
      containers:
      - name: mysql-exporter
        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/mysql-exporter
        env:
         - name: DATA_SOURCE_NAME
           value: "exporter:exporter@(mysql.default:3306)/"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9104
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
spec:
  type: ClusterIP
  selector:
    k8s-app: mysql-exporter
  ports:
  - name: api
    port: 9104
    protocol: TCP

注意:DATA_SOURCE_NAME配置需要根据自己环境进行修改,格式USERNAME:PASSWORD@MYSQL_HOST_ADDRESS:MYSQL_PORT

2.创建 Mysql-exporter

[root@k8s-master01 ~]# kubectl create -f mysql-exporter.yaml
[root@k8s-master01 ~]# kubectl get po -n monitoring | grep mysql
mysql-exporter-74b85b789-xwwwv                        1/1     Running            0               2m6s
[root@k8s-master01 ~]# kubectl get svc -n monitoring | grep mysql
mysql-exporter          ClusterIP   10.0.196.143   <none>        9104/TCP                        2m21s

3.通过Exporter Service 地址,检查是否能正常获取 Metrics 数据

[root@k8s-master01 ~]# curl 10.0.196.143:9104/metrics | tail -1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  130k    0  130k    0     0  7281k      0 --:--:-- --:--:-- --:--:-- 7690k
promhttp_metric_handler_requests_total{code="503"} 0

2.3 创建ServiceMonitor

1.配置 ServiceMonitor,需要注意 matchLabels 和 endpoints 的配置,要和 MySQL 的 Service 一致。

[root@k8s-master01 ~]# vim mysql-sm.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
    namespace: monitoring
spec:
  jobLabel: k8s-app
  endpoints:
  - port: api
    interval: 30s
    scheme: http
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  namespaceSelector:
    matchNames:
    - monitoring

2.创建该 ServiceMonitor

[root@k8s-master01 ~]# kubectl create -f mysql-sm.yaml

3.查看创建是否完成,观察到已经创建完成

[root@k8s-master01 ~]# kubectl get servicemonitor -n monitoring | grep mysql-exporter
mysql-exporter            34s

2.4 Prometheus页面验证

1.获取Prometheus服务NodePort端口

[root@k8s-master01 ~]# kubectl get svc -n monitoring | grep prometheus-k8s
prometheus-k8s          NodePort    10.0.110.215   <none>        9090:30186/TCP,8080:31400/TCP   2d2h

2.打开浏览器输入节点IP:30186后,依次点击【Status】-【Targets】后,观察到Mysql已被监控,且状态为UP

Prometheus监控非云原生应用Mysql-1

Prometheus监控非云原生应用Mysql-2

说明:Prometheus页面默认无账号密码

3.我们可以输入mysql_global_status_opened_tables来查询 MySQL 数据库全局状态(Global Status)中 Opened_tables 指标

Prometheus监控非云原生应用Mysql-3

2.5 Grafana页面验证

补充:最近又发现了一个新的页面,ID:17320、14057

1.获取Grafana服务NodePort端口

[root@k8s-master01 ~]# kubectl get svc -n monitoring | grep grafana
grafana                 NodePort    10.0.14.56     <none>        3000:30428/TCP                  2d3h

2.打开浏览器输入节点IP:30428后,依次点击【+】-【import dashboard】

Prometheus监控非云原生应用Mysql-4

你可以登录grafana官网下载自己心仪的模板,选择好后复制【Dashboard ID】,这里选择的是7362

Prometheus监控非云原生应用Mysql-5

回到grafana界面,填写刚刚复制的【Dashboard ID】后,点击【Load】

Prometheus监控非云原生应用Mysql-6

填写【Name】并选择监控来源(prometheus)后,点击【Import】

Prometheus监控非云原生应用Mysql-7

这样就可以观察到Mysql监控情况了

Prometheus监控非云原生应用Mysql-8