前言:随着云原生概念盛行,对于容器、服务、节点以及集群的监控变得越来越重要。Prometheus 作为 Kubernetes 监控的事实标准,有着强大的功能和良好的生态。但是它不支持分布式,不支持数据导入、导出,不支持通过 API 修改监控目标和报警规则,所以在使用它时,通常需要写脚本和代码来简化操作。Prometheus Operator 为监控 Kubernetes service、deployment 和 Prometheus 实例的管理提供了简单的定义,简化在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群。
Prometheus-Operator是一套为了方便整合prometheus和kubernetes的软件,使用Prometheus-Operator可以非常简单的在kubernetes集群中部署Prometheus服务,提供对kubernetes集群各个组件和服务的监控,并且通过Prometheus-Operator用户能够使用简单的声明性配置来配置和管理Prometheus实例,这些配置将响应、创建、配置和管理Prometheus监控实例
Operator的核心思想是将Prometheus的部署与它监控的对象的配置分离,做到部署与监控对象的配置分离之后,就可以轻松实现动态配置。使用Operator部署了Prometheus之后就可以不用再管Prometheus Server了,以后如果要添加监控对象或者添加告警规则,只需要编写对应的ServiceMonitor和Prometheus资源就可以,不用再重启Prometheus服务,Operator会动态的观察配置的改动,并将其生成为对应的prometheus配置文件其中Operator可以部署、管理Prometheus Service
二、Prometheus-Operator的架构
上图是Prometheus-Operator官方提供的架构图,从下向上看,Operator可以部署并且管理Prometheus Server,并且Operator可以Watch Prometheus,那么这个Watch是什么意思呢?
-
Operator : Operator是整个系统的控制中心,会以Deployment的方式运行于Kubernetes集群上,并根据自定义资源(Custom Resources Definition)CRD 来负责管理与部署Prometheus,Operator会通过监听这些CRD的变化来做出相对应的处理。
-
Prometheus : Operator会监听集群内的Prometheus CRD(Prometheus 也是一种CRD)来创建一个合适的statefulset在monitoring(.metadata.namespace指定)命名空间,并且挂载了一个名为prometheus-k8s的Secret为Volume到/etc/prometheus/config目录,Secret的data包含了以下内容:
- configmaps.json指定了rule-files在configmap的名字
- prometheus.yaml为主配置文件
-
ServiceMonitor : ServiceMonitor就是一种kubernetes自定义资源(CRD),Operator会通过监听ServiceMonitor的变化来动态生成Prometheus的配置文件中的Scrape targets,并让这些配置实时生效,operator通过将生成的job更新到上面的prometheus-k8s这个Secret的Data的prometheus.yaml字段里,然后prometheus这个pod里的sidecar容器prometheus-config-reloader当检测到挂载路径的文件发生改变后自动去执行HTTP Post请求到/api/-reload-路径去reload配置。该自定义资源(CRD)通过labels选取对应的Service,并让prometheus server通过选取的Service拉取对应的监控信息(metric)
-
Service :Service其实就是指kubernetes的service资源,这里特指Prometheus exporter的service,比如部署在kubernetes上的mysql-exporter的service
总结:想象一下,我们以传统的方式去监控一个mysql服务,首先需要安装mysql-exporter,获取mysql metrics,并且暴露一个端口,等待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配置文件,并保证配置文件实时生效
三、如何安装Pometheus-Oerator
本地实验环境是在虚拟机中的minikube单节点中进行的
1.下载helm压缩包并解压缩
2.添加helm repo源到本地,并updte更新repo
3.helm search命令可以列出prometheus的相关chart包及其版本号
4.monitoring命名空间,并通过helm install安装一个名为prometheus-operator的chart包
使用 helm 安装后,会在 Kubernetes 集群中创建、配置和管理 Prometheus 集群,chart 中包含多种组件:
- prometheus-operator
- prometheus
- alertmanager
- node-exporter
- kube-state-metrics
- grafana
5.kubectl get po -n monitoring查看promrthues-operator相关组件pod已经顺利启动,说明成功部署
promethues-operator部署好后下面讲讲如何实现用其来监控k8s集群当中的微服务
四、如何通过prometheus-operator来监控k8s集群当中的微服务
在这之前我在minikube当中以及部署好一套微服务:
1.通过miniube service list可以查看到gateway已经暴露了31080端口,可以通过浏览器查看一下
上文中已经讲解了prometheus-operator是通过将ServiceMonitor中的lable将k8s中的service绑定从而实现对K8s中的服务进行监控的
具体关系如下所示:
2.编写或更新好ServiceMonitor配置文件后只需要通过helm upgrade命令来更新prometheus-operator的chart包即可完成重新部署
如图所示更新部署成功:
3.通过Kubectl get servicemonitors -n monitoring来查看下已经部署好的ServiceMonitor
4.然后运行kubctl port-forward来将prometheus-operator端口临时暴露并监听本机所有地址
注:用虚拟机部署的同学,这里注意一定要跟上--address 0.0.0.0这个选项,否则服务器只会监听本地回环地址的9090端口,这样通过主机就无法通过ip:port访问到了