一、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的密码是exporterWITH 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页面默认无账号密码
3.我们可以输入mysql_global_status_opened_tables来查询 MySQL 数据库全局状态(Global Status)中 Opened_tables 指标

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】

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

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

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

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