k8s容器内部通过Prometheus Operator部署MySQL Exporter监控k8s集群外部的MySQL
k8s容器内部通过Prometheus Operator部署MySQL Exporter监控k8s集群外部的MySQL在按照下面步骤操作之前,请先确保服务器已经部署k8s,prometheus,prometheus operator,关于这些环境的部署,可以自行查找相关资料安装部署,本文档便不在此赘述。关于prometheus监控这部分,大致的系统架构图如下,感兴趣的同学可以自行研究一下,这里就不
k8s容器内部通过Prometheus Operator部署MySQL Exporter监控k8s集群外部的MySQL
在按照下面步骤操作之前,请先确保服务器已经部署k8s,prometheus,prometheus operator,关于这些环境的部署,可以自行查找相关资料安装部署,本文档便不在此赘述。
关于prometheus监控这部分,大致的系统架构图如下,感兴趣的同学可以自行研究一下,这里就不再具体说明。
1、问题说明
由于部分业务系统使用MySQL数据库存储数据,同时该数据库部署在k8s集群之外,但是prometheus operator部署在k8s集群内部,这里就涉及到了如何监控k8s集群外部的MySQL实例的问题。MySQL的监控可以使用prometheus的mysql-exporter暴露metrics,对于mysql处在k8s集群外部的场景,可以在创建Deployment时指定监控的数据源实例的IP地址为MySQL所在主机的IP地址,以此来暴露外部MySQL服务到k8s集群中。
2、部署操作
2.1、创建监控数据库的用户并授权
这里主要是创建mysql-exporter连接mysql需要的用户,同时并授予相应权限,操作SQL如下:
复制代码
查看数据库密码长度,确保密码符合要求
SHOW VARIABLES LIKE 'validate_password%';
创建用户并授权,这里以exporter用户为例,密码长度与上述查询长度保持一致
create user 'exporter'@'%' identified with mysql_native_password by 'admin@321';
GRANT ALL PRIVILEGES ON *.* TO 'exporter'@'%' with grant option;
flush privileges;
2.2、k8s集群创建mysql-exporter的Deployment
创建mysql-exporter容器,利用上一步创建的账户密码信息,通过DATA_SOURCE_NAME环境变量传入连接mysql实例的信息,注意需要暴露mysql-exporter的9104端口。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-slave02
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
k8s-app: mysql-slave02
template:
metadata:
labels:
k8s-app: mysql-slave02
spec:
containers:
- name: mysql-slave02
image: 172.31.96.51/middleware/mysqld-exporter:v0.14.0
env:
# 此处为mysql-exporter指定监控的数据库地址以及对应的用户名、密码,这里监控的数据库IP地址为mysql-slave02.middleware:3306(可以直接写ip也可以使用svc,但是用svc必须再创建对应的svc和Endpoints)
- name: DATA_SOURCE_NAME
value: "账号:密码@(mysql-slave02.middleware:3306)/"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9104
nodeSelector:
node: middleware
2.3、k8s集群创建mysql-exporter的Service
---
apiVersion: v1
kind: Service
metadata:
name: mysql-slave02
namespace: monitoring
labels:
k8s-app: mysql-slave02
spec:
type: ClusterIP
selector:
k8s-app: mysql-slave02
ports:
- name: api
port: 9104
protocol: TCP
2.4、创建ServiceMonitor
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mysql-exporter-slave02
namespace: monitoring
labels:
k8s-app: mysql-slave02
namespace: monitoring
spec:
jobLabel: k8s-app
endpoints:
- port: api
interval: 30s
scheme: http
selector:
matchLabels:
k8s-app: mysql-slave02
namespaceSelector:
matchNames:
- monitoring
2.5、添加PrometheusRule监控规则
---
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: k8s
role: alert-rules
name: mysql-exporter-rules
namespace: kubesphere-monitoring-system
spec:
groups:
- name: mysql-exporter
rules:
- alert: MysqlDown
annotations:
description: |-
MySQL instance is down on {{ $labels.instance }}
VALUE = {{ $value }}
LABELS = {{ $labels }}
summary: 'MySQL down (instance {{ $labels.instance }})'
expr: mysql_up == 0
for: 0m
labels:
severity: critical
- alert: MysqlSlaveIoThreadNotRunning
annotations:
description: |-
MySQL Slave IO thread not running on {{ $labels.instance }}
VALUE = {{ $value }}
LABELS = {{ $labels }}
summary: >-
MySQL Slave IO thread not running (instance {{ $labels.instance
}})
expr: >-
mysql_slave_status_master_server_id > 0 and ON (instance)
mysql_slave_status_slave_io_running == 0
for: 0m
labels:
severity: critical
- alert: MysqlSlaveSqlThreadNotRunning
annotations:
description: |-
MySQL Slave SQL thread not running on {{ $labels.instance }}
VALUE = {{ $value }}
LABELS = {{ $labels }}
summary: >-
MySQL Slave SQL thread not running (instance {{ $labels.instance
}})
expr: >-
mysql_slave_status_master_server_id > 0 and ON (instance)
mysql_slave_status_slave_sql_running == 0
for: 0m
labels:
severity: critical
不是必须,如果外部地址写的svc,则需要创建对应的svc和Endpoints
kind: Endpoints
apiVersion: v1
metadata:
# 此处 metadata.name 的值要和 service 中的 metadata.name 的值保持一致
# endpoint 的名称必须和服务的名称相匹配
name: mysql-slave02
# 外部服务服务统一在固定的名称空间中
namespace: middleware
subsets:
- addresses:
# 外部服务 IP 地址
# 服务将连接重定向到 endpoint 的 IP 地址
#- ip: 172.31.96.175
- ip: 172.31.96.176
ports:
# 外部服务端口
# endpoint 的目标端口
- port: 3306
---
apiVersion: v1
kind: Service
metadata:
# 此处 metadata.name 的值要和 endpoints 中的 metadata.name 的值保持一致
name: mysql-slave02
# 外部服务服务统一在固定的名称空间中
namespace: middleware
spec:
ports:
- port: 3306
更多推荐
所有评论(0)