问题背景
平台使用了mysql,部署在k8s集群之外,但是prometheus operator部署在集群内部,涉及如何监控外部的mysql实例问题。
问题调研
MySQL的监控可以使用prometheus的mysql-exporter暴露metrics;对于mysql处在k8s集群外场景,使用手工创建k8s的endpoint对象,创建时指定endpoint对象的ip地址为mysql所在主机的ip地址,以此来暴露外部mysql服务到k8s集群。
操作步骤
1.登录运行的mysql实例,创建mysql-exporter连接mysql需要的用户,授予相应权限。
mysql -uroot -pXXXX -h 127.0.0.1
CREATE USER 'mysqlexporter'@"%" IDENTIFIED BY 'mysqlexporter';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqlexporter'@'%' IDENTIFIED BY 'mysqlexporter' WITH MAX_USER_CONNECTIONS 30;
GRANT select on performance_schema.* to "mysqlexporter"@"%" IDENTIFIED BY 'mysqlexporter';
flush privileges;
2. 运行mysql-exporter容器,利用上一步创建的账户密码信息,通过DATA_SOURCE_NAME环境变量传入连接mysql实例的信息,注意需要暴露mysql-exporter的9104端口。
docker run -d -p 9104:9104 -e DATA_SOURCE_NAME="mysqlexporter:mysqlexporter@(10.233.71.70:3306)/mysql" 10.233.71.70:60080/alaudak8s/mysql-exporter:latest
3.检查通过mysql-exporter的metrics,是否可以正常获取到mysql信息;其中mysql_up 为1表示正常采集到数据。
4.创建servicemonitor的crd对象,其metadat的label要和prometheus的crd对应的serviceMonitorSelector匹配
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: exporter-mysql
component: mysql-exporter
prometheus: kube-prometheus # 此处label要和prometheus的crd的serviceMonitorSelector匹配
name: kube-prometheus-exporter-mysql
namespace: alauda-system
spec:
endpoints:
- interval: 15s
port: metrics
jobLabel: component
namespaceSelector:
matchNames:
- alauda-system
selector:
matchLabels:
app: exporter-mysql
component: mysql-exporter
5.创建service对象
apiVersion: v1
kind: Service
metadata:
labels: #此处label要和上一步创建的servicemonitor对象的seletor匹配
app: exporter-mysql
component: mysql-exporter
name: kube-prometheus-exporter-mysql
namespace: alauda-system
spec:
type: ClusterIP
ports:
- name: metrics
port: 9104
protocol: TCP
targetPort: 9104
6、创建与service对象同名的endpoint对象,ip信息为外部mysql实例所在的主机的ip地址
apiVersion: v1
kind: Endpoints
metadata:
name: kube-prometheus-exporter-mysql #此处name要和上一步创建的service对象name相同
namespace: alauda-system
labels:
k8s-app: mysql-metrics
subsets:
- addresses:
- ip: 10.233.71.70 # ip信息为外部mysql实例所在的主机的ip地址
- ip: 10.233.71.72
ports:
- name: metrics
port: 9104
protocol: TCP
7.登录prometheus的web界面,查看是否正常采集到mysql实例数据。