背景
最近一段时间,陆陆续续的把手里头项目都迁移到了k8s中,期间遇到不少的坑,而且也学到了许多k8s的知识(从0-1),你们都知道k8s中的一大特性是自动扩容,对此结合本身的业务发现非常有“用武之地”,我有个业务,是向消息队列中插入消息,而后.net core console app进行消费,可是我这个业务有个特色,要么没有消息生产,要么就是有一大批消息产生。在引用HPA以前,我不得不提早启动“合适数量”的pod(1个pod多个消费者容器)来消费消息,要否则业务方要叫了。可是做为有“洁癖”的开发者,我不想相同的容器有太多的闲置,无所事事,又占用资源。因此咱们须要借助HPA来实现自动伸缩扩容,消息多的时候,自动扩容;消息少的时候,自动缩容。php
前期准备:
要有一个k8s集群(我是经过kubeadm搭建的3master+N node的集群 1.18.2)node
有一个rabbitmq实例3.8.xgit
rabbitmq_exporter:一个经过转化mq:15672接口数据,以metrics接口暴露出来的exportergithub
kube-prometheus:一个将prometheus全家桶集合安装的开源项目docker
大致实现方向:
将rabbitmq的数据指标,以metrics接口的形式,暴露给prometheus server;而后再promethus中经过添加record rule规则来自定义你的队列指标;而后再promethus adapter中添加一条rule来将以前的指标转化成k8s api所能识别的接口;最后在k8s中定义HPA去监测prometheus adapter service暴露的转化好的接口来动态伸缩。json
第一步:暴露rabbitmq数据指标
rabbitmq官网中monitor一节中有提到它有一个插件是给pormetheus用的,可是我看了下用起来不方便,达不到效果,遂用下面的这个开源项目。api
rabbitmq_exporter这个项目它sample中使用的是直接docker run去启动容器,来进行mq数据指标的暴露,可是你最好把他运行在k8s中,方便管理。app
准备一个yaml文件,将rabbitmq exporter运行在k8s集群中,并以service的形式,暴露给k8s中安装的prometheus server去抓取curl
而后在k8s master中建立这个yaml: kubectl apply –f rabbitmq_exporter.yaml
看到以下内容表明部署成功了:
咱们看看39419端口暴露的metrics暴露的接口数据长什么样:
咱们先用kubectl exec命令随便进入一个容器,在容器内部访问上面的svc ip + port
而后访问咱们上面的svc: curl 10.110.14.151:39419/metrics | grep rabbitmq_queue_messages{
看到有图片中的数据,就表明你rabbitmq exporter搭建成功了,不然的话查看下日志解决下。
至此,k8s集群中已经存在一个这样的svc接口(10.110.14.151:39419/metrics)他只能在k8s集群内部访问,他暴露的metrics数据中,就包含了队列中消息的数量。
rabbitmq_exporter.yamlui
第二步:使rabbitmq metrics指标可以被prometheus server所定时抓取
安装prometheus监控全家桶
先把原项目clone下来: git conle https://github.com/coreos/kube-prometheus.git
manifests:这个文件夹里放的全都是prometheus所需资源清单文件
example.jsonnet:这个文件是生成manifests文件夹的引导文件
理论上,你git clone下来的mainfests文件夹,能够直接用的,可是须要作下调整,接下来我经过example.jsonnet来从新编译生成manifests资源清单
参考于:https://github.com/coreos/kube-prometheus#compiling
为了不干扰,先将mainfests文件夹删除。
咱们先修改example.jsonnet文件,让其按照个人要求生成mainfests资源清单:
在项目目录下,先执行(第一次会比较慢,大概10来分钟吧,或者失败,请重试!):
docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci jb update
而后再执行:
docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci ./build.sh example.jsonnet
等执行好了,咱们能看到新的mainfests文件夹已经生成好了。
安装:kubectl apply –f mainfests/setup/.
安装:kubectl apply –f mainfests/.
看下安装好了以后,所启动的svc有哪些
3个UI的组件,之因此是nodeport(能够直接外网经过 主机ip+端口进行访问),是由于上面的jsonnet文件。请详细看下上面图片中的备注
至此,全家桶不出意外的话,应该都安装完成了。
让prometheus server能够抓取的到rabbitmq metrics指标
参考资料:https://github.com/coreos/prometheus-operator/blob/master/Documentation/additional-scrape-config.md
建立prometheus-additional.yaml文件用于配置rabbitmq metrics job
prometheus-additional.yaml
执行:kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml -n monitoring
验证:
而后修改:manifests/prometheus-prometheus.yaml
执行:kubectl apply -f manifests/prometheus-prometheus.yaml
此时prometheus server并无抓取rabbitmq metrics,须要从新启动下,以加载到咱们上述的新target
最后咱们看下UI,是否成功添加target
graph中,也能看到rabbitmq_queue_messages指标了
第三步:使用prometheus-adapter来让k8s可以访问的到自定义的资源指标
上面全家桶中已经包含了adapter,因此不须要再安装了,推荐实战的小伙伴,仔细看下这个全家桶项目doc。
首先,先确保k8s中custom.metrics.k8s.io自定义指标接口可用
虽然你能在graph中看到rabbitmq_queue_messages指标,可是这个指标也只有prometheus本身认得,k8s api server并不认得。
咱们得添加一条prometheus rule,参考资料:点我
其实咱们在上面已经添加了一条,而且已经运行起来了,监测vhost为xxxx,queue为xxxx的队列。
labels必选要打上:
而后咱们给prometheus-adapter添加一条rule用于映射到上面prometheus中的record rule:enriched_rabbitmq_queue_messages
参考资料:请戳我,看最后那我的的留言,最佳解释
那咱们怎么添加呢,咱们先看看prometheus-adapter容器的配置文件(rule默认都有一个配置文件维护的)
先看下adapter的描述:kubectl describe pod prometheus-adapter-5cdcdf9c8d-5bq5p
发现他把配置信息都放到configmap里,那换个角度,只要咱们能将给prometheus-adapter添加的rule,追加到这个configmap里面,理论上就能够实现动态增长了。
其实adapter全部的配置都在manifests/prometheus-adapter-configMap.yaml
记得执行让它生效:kubectl apply -f manifests/prometheus-adapter-configMap.yaml
等待几十秒后,验证下:
至此自定义metrics指标已经成功,实现了prometheus server不停的监测某个队列的消息数,而后k8s api经过prometheus adapter可以访问到这个指标,这样后面的HPA就简单的多了。
第四步:定义HPA
秒杀+口令「k8sgogogo」到手仅 ¥69