使用prometheus operator监控部署在k8s集群外的mysql实例
2019年10月份写的文章,重新整理了下内容发出
问题背景
平台使用了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.1CREATE 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.x.x.x:3306)/mysql" 10.x.x.x: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-mysqlcomponent: mysql-exporterprometheus: kube-prometheus # 此处label要和prometheus的crd的serviceMonitorSelector匹配name: kube-prometheus-exporter-mysqlnamespace: alauda-system
spec:endpoints:- interval: 15sport: metricsjobLabel: componentnamespaceSelector:matchNames:- alauda-systemselector:matchLabels:app: exporter-mysqlcomponent: mysql-exporter
5.创建service对象
apiVersion: v1
kind: Service
metadata:labels: #此处label要和上一步创建的servicemonitor对象的seletor匹配app: exporter-mysqlcomponent: mysql-exportername: kube-prometheus-exporter-mysqlnamespace: alauda-system
spec:type: ClusterIPports:- name: metricsport: 9104protocol: TCPtargetPort: 9104
6、创建与service对象同名的endpoint对象,ip信息为外部mysql实例所在的主机的ip地址
apiVersion: v1
kind: Endpoints
metadata:name: kube-prometheus-exporter-mysql #此处name要和上一步创建的service对象name相同namespace: alauda-systemlabels:k8s-app: mysql-metrics
subsets:
- addresses:- ip: 10.X.X.70 # ip信息为外部mysql实例所在的主机的ip地址- ip: 10.X.X.72ports:- name: metricsport: 9104protocol: TCP
7.登录prometheus的web界面,查看是否正常采集到mysql实例数据。
如上图,第二个节点State显示DOWN,因为该节点mysql-exporter的容器暂未拉起来。