沈阳做网站的电话,个人网站的设计及实现,图片网站建站系统,池州网站网站建设背景最近一段时间#xff0c;陆陆续续的把手里头项目都迁移到了k8s中#xff0c;期间遇到很多的坑#xff0c;并且也学到了许多k8s的知识#xff08;从0-1#xff09;#xff0c;大家都知道k8s中的一大特性是自动扩容#xff0c;对此结合自己的业务发现很是有“用武之地… 背景最近一段时间陆陆续续的把手里头项目都迁移到了k8s中期间遇到很多的坑并且也学到了许多k8s的知识从0-1大家都知道k8s中的一大特性是自动扩容对此结合自己的业务发现很是有“用武之地”我有个业务是向消息队列中插入消息然后.net core console app进行消费但是我这个业务有个特点要么没有消息生产要么就是有一大批消息产生。在引用HPA之前我不得不提前启动“合适数量”的pod1个pod多个消费者容器来消费消息要不然业务方要叫了。但是作为有“洁癖”的开发者我不想相同的容器有太多的闲置无所事事又占用资源。所以我们需要借助HPA来实现自动伸缩扩容消息多的时候自动扩容消息少的时候自动缩容。前期准备要有一个k8s集群我是通过kubeadm搭建的3masterN node的集群 1.18.2有一个rabbitmq实例3.8.xrabbitmq_exporter一个通过转化mq:15672接口数据以metrics接口暴露出来的exporterkube-prometheus一个将prometheus全家桶集合安装的开源项目大体实现方向将rabbitmq的数据指标以metrics接口的形式暴露给prometheus server然后再promethus中通过添加record rule规则来自定义你的队列指标然后再promethus adapter中添加一条rule来将之前的指标转化成k8s api所能识别的接口最后在k8s中定义HPA去监测prometheus adapter service暴露的转化好的接口来动态伸缩。第一步暴露rabbitmq数据指标rabbitmq官网中monitor一节中有提到它有一个插件是给pormetheus用的但是我看了下用起来不方便达不到效果遂用下面的这个开源项目。rabbitmq_exporter这个项目它sample中使用的是直接docker run去启动容器来进行mq数据指标的暴露但是你最好把他运行在k8s中方便管理。准备一个yaml文件将rabbitmq exporter运行在k8s集群中并以service的形式暴露给k8s中安装的prometheus server去抓取rabbitmq_exporter.yaml然后在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 metrics指标能够被prometheus server所定时抓取安装prometheus监控全家桶先把原项目clone下来 git conle https://github.com/coreos/kube-prometheus.gitmanifests这个文件夹里放的全都是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 jobprometheus-additional.yaml执行kubectl create secret generic additional-scrape-configs --from-fileprometheus-additional.yaml -n monitoring验证然后修改manifests/prometheus-prometheus.yaml执行kubectl apply -f manifests/prometheus-prometheus.yaml此时prometheus server并没有抓取rabbitmq metrics需要重新启动下以加载到我们上述的新target最后我们看下UI是否成功添加targetgraph中也能看到rabbitmq_queue_messages指标了第三步使用prometheus-adapter来让k8s能够访问的到自定义的资源指标上面全家桶中已经包含了adapter所以不需要再安装了推荐实战的小伙伴仔细看下这个全家桶项目doc。首先先确保k8s中custom.metrics.k8s.io自定义指标接口可用虽然你能在graph中看到rabbitmq_queue_messages指标但是这个指标也只有prometheus自己认得k8s api server并不认得。我们得添加一条prometheus rule参考资料点我其实我们在上面已经添加了一条并且已经运行起来了,监测vhost为xxxxqueue为xxxx的队列。labels必选要打上然后我们给prometheus-adapter添加一条rule用于映射到上面prometheus中的record ruleenriched_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