以前传统方式去监控一个mysql服务,首先需要安装mysql-exporter,获取mysql metrics,并且暴露一个Port端口,等待prometheus服务来拉取监控信息,然后去Prometheus Server的prometheus.yaml文件中在scarpe_config中添加mysql-exporter的job,配置mysql-exporter的地址和端口等信息,再然后重启Prometheus服务,就完成添加一个mysql监控的任务。
现在以Prometheus-Operator的方式来部署Prometheus,当需要添加一个mysql服务监控会怎么做,首先第一步和传统方式一样,部署一个mysql-exporter来获取mysql监控项,然后编写一个ServiceMonitor通过labelSelector选择刚才部署的mysql-exporter,由于Operator在部署Prometheus的时候默认指定了Prometheus选择label为:prometheus: kube-prometheus的ServiceMonitor,所以只需要在ServiceMonitor上打上prometheus: kube-prometheus标签就可以被Prometheus选择了,完成以上两步就完成了对mysql服务的监控,不需要改Prometheus配置文件,也不需要重启Prometheus服务,Operator观察到ServiceMonitor发生变化,会动态生成Prometheus配置文件,并保证配置文件实时生效。
添加自定义监控项流程
创建ServiceMonitor对象,用于Kube-Prometheus添加监控项
创建Service对象,提供metrics数据接口,并将其和ServiceMonitor关联
确保Service对象可以正确获取metrics数据
如何编写ServiceMonitor
ServiceMonitor是一个kubernetes的自定义资源,所以得遵循Kubernetes ServiceMonitor编写规范,这里通过动态添加一个mysql监控的示例来演示如何编写ServiceMonitor。
先决条件:
1. 已搭建好kubernetes集群 (Kubernetes 1.18.2集群部署 (单Master)+docker)
2. 已通过使用prometheus-operator来部署好了Prometheus服务 (此处加链接)
3. 已经成功安装好了mysql ( Kubernetes Prometheus监控MySQL ——安装mysql 用于监控测试,创建账号并授权)
在满足上述先决条件的情况下,首先打开prometheus server的界面,如下图,可以在Targets下看到已经有prometheus和kubernetes集群自身的监控了,目前还没有mysql监控。
接下来在kubernetes集群中添加mysql监控的exporter:prometheus-mysql-exporter
https://github.com/helm/charts/tree/master/stable/prometheus-mysql-exporter
这里采用helm的方式安装prometheus-mysql-exporter,按照github上的步骤进行安装。
预先安装helm (参考文章 加链接)
#验证helm 和 tiller版本[root@k8s-master01 helm]# helm versionClient: &version.Version{
SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}Server: &version.Version{
SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"
安装方法1:
修改values.yaml中的datasource为安装在kubernetes中mysql的地址,然后执行命令
helm install --name my-release -f values.yaml stable/prometheus-mysql-exporter
安装方法2:(选择此方法)
Specify each parameter using the --set key=value[,key=value] argument to helm install. For example,
添加helm仓库地址[root@k8s-master01 helm]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts[root@k8s-master01 helm]# helm repo add apphub https://apphub.aliyuncs.com[root@k8s-master01 helm]# helm repo add azure http://mirror.azure.cn/kubernetes/charts查看helm仓库列表[root@k8s-master01 helm]# helm repo listNAME URL stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartslocal http://127.0.0.1:8879/charts apphub https://apphub.aliyuncs.com azure http://mirror.azure.cn/kubernetes/charts更新helm仓库chart[root@k8s-master01 helm]# helm repo updateHang tight while we grab the latest from your chart repositories......Skip local chart repository...Successfully got an update from the "stable" chart repository...Successfully got an update from the "apphub" chart repository...Successfully got an update from the "azure" chart repositoryUpdate Complete. ⎈ Happy Helming!⎈查找chart prometheus-mysql-exporter[root@k8s-master01 helm]# helm search prometheus-mysql-exporterNAME CHART VERSION APP VERSION DESCRIPTION apphub/prometheus-mysql-exporter 0.5.2 v0.11.0 A Helm chart for prometheus mysql exporter with cloudsqlp...azure/prometheus-mysql-exporter 0.6.0 v0.11.0 A Helm chart for prometheus mysql exporter with cloudsqlp...kubernetes集群中已有成功安装好mysql数据库,mysql信息如下:mysql.user="mysql_exporter1",mysql.pass="Abcdef123",mysql.host="localhost",mysql.port="3306"安装chart prometheus-mysql-exporter[root@k8s-master01 helm]# helm install --namespace monitoring --name my-release apphub/prometheus-mysql-exporter --set mysql.user="mysql_exporter1",mysql.pass="Abcdef123",mysql.host="localhost",mysql.port="3306" NAME: my-releaseLAST DEPLOYED: Wed Jul 15 14:35:46 2020NAMESPACE: monitoringSTATUS: DEPLOYEDRESOURCES:==> v1/DeploymentNAME READY UP-TO-DATE AVAILABLE AGEmy-release-prometheus-mysql-exporter 0/1 1 0 2s==> v1/Pod(related)NAME READY STATUS RESTARTS AGEmy-release-prometheus-mysql-exporter-58ff67f687-22qpk 0/1 ContainerCreating 0 1s==> v1/SecretNAME TYPE DATA AGEmy-release-prometheus-mysql-exporter Opaque 1 2s==> v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmy-release-prometheus-mysql-exporter ClusterIP 10.101.57.225 <none> 9104/TCP 2sNOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus-mysql-exporter,release=my-release" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 8080:9104 echo "Visit http://127.0.0.1:8080 to use your application"
接下来查看刚才安装的mysql-exporter的service:
[root@k8s-master01 helm]# kubectl get svc -n monitoringNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEalertmanager-main NodePort 10.96.186.209 <none> 9093:30093/TCP