asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景

最近一段时间,陆陆续续的把手里头项目都迁移到了k8s中,期间遇到很多的坑,并且也学到了许多k8s的知识(从0-1),大家都知道k8s中的一大特性是自动扩容,对此结合自己的业务发现很是有“用武之地”,我有个业务,是向消息队列中插入消息,然后.net core console app进行消费,但是我这个业务有个特点,要么没有消息生产,要么就是有一大批消息产生。在引用HPA之前,我不得不提前启动“合适数量”的pod(1个pod多个消费者容器)来消费消息,要不然业务方要叫了。但是作为有“洁癖”的开发者,我不想相同的容器有太多的闲置,无所事事,又占用资源。所以我们需要借助HPA来实现自动伸缩扩容,消息多的时候,自动扩容;消息少的时候,自动缩容。

前期准备:

  1. 要有一个k8s集群(我是通过kubeadm搭建的3master+N node的集群 1.18.2)

  2. 有一个rabbitmq实例3.8.x

  3. rabbitmq_exporter:一个通过转化mq:15672接口数据,以metrics接口暴露出来的exporter

  4. kube-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.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非递归遍历二叉树(算法导论第三版第十章10.4-5)

非递归遍历二叉树&#xff08;算法导论第三版第十章10.4-5&#xff09; template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTreeNode<T>* root) {BinaryTreeNode<T>* prev nullptr;BinaryTreeNode<T>* current root;while (current!…

图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变量&#xff0c;已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) { /* 以V为出发点对邻接表存储…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「149」篇原创敬上大家好&#xff0c;我是Z哥。不管是日常的工作中还是生活中&#xff0c;我们每天会用到很多软件系统。不知道你有没有过这样的感受&#xff0c;当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行&#xff0c;与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代&#xff0c;各种编程语言大行其道&#xff0c;各有各的优势。但是有一点未曾改变&#xff0c;那就是他们服务的方式&#xff0c;工作的时候各司其职&#xff0…

dijkstra算法和floyd算法(C语言)

dijkstra算法: /* 邻接表存储 - 无权图的单源最短路算法 *//* dist[]和path[]全部初始化为-1 */ void Unweighted ( LGraph Graph, int dist[], int path[], Vertex S ) {Queue Q;Vertex V;PtrToAdjVNode W;Q CreateQueue( Graph->Nv ); /* 创建空队列, MaxSize为外部定义…

辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)

辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟&#xff0c;二叉树结点&#xff09; template<typename T> class BinaryTreeNodeLeftChildRightSibling { public:T key;BinaryTreeNodeLeftChildRightSibling<T>* parent;BinaryTreeNodeLeftChildRightS…

如何在ASP.NET Core中集成ElasticSearch

本文来自&#xff1a;https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌&#xff0c;您肯定会被要求向Web应用程序中添加高级搜索功能&#xff0c;而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

prim算法和kruskal算法(C语言)

prim算法: /* 邻接矩阵存储 - Prim最小生成树算法 */Vertex FindMinDist( MGraph Graph, WeightType dist[] ) { /* 返回未被收录顶点中dist最小者 */Vertex MinV, V;WeightType MinDist INFINITY;for (V0; V<Graph->Nv; V) {if ( dist[V]!0 && dist[V]<Min…

利用链表实现可合并堆(算法导论第三版思考题10-2)

利用链表实现可合并堆&#xff08;算法导论第三版思考题10-2&#xff09; a 链表已排序 创建一个空堆&#xff1a; Θ(1) 插入&#xff1a;Θ(n)&#xff0c;插入后依然保持排序 最小值&#xff1a;Θ(1)&#xff0c;第一位便是 取最小值&#xff1a;Θ(1) 合并&#xff1a;Θ…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

拓扑排序(C语言)

代码如下: /* 邻接表存储 - 拓扑排序算法 */bool TopSort( LGraph Graph, Vertex TopOrder[] ) { /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */int Indegree[MaxVertexNum], cnt;Vertex V;PtrToAdjVNode W;Queue Q CreateQueue( Graph->Nv );/* 初始化…

假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。你所给的过程在最坏情况下的运行时间是多少。 &#xff08;算法导论第十一章11.1-1&#xff09; #include "KeyNode.h" template<typename T> KeyNode<T>* direct…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目&#xff1a;.netcore采集程序向Azure事件中心(EventHubs)发送数据&#xff0c;通过Azure EventHubs Capture转储到Azure BlogStorage&#xff0c;供数据科学团队分析。为什么使用Azure事件中心&#xff1f;Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

辅助类KeyNode

#ifndef C11LEARN_KEYNODE_H #define C11LEARN_KEYNODE_H template<typename T> class KeyNode { public:int key{};T value; public:KeyNode() default;KeyNode(int key,const T value):key(key),value(value){} }; #endif //C11LEARN_KEYNODE_H

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…

位向量(bit vector)(算法导论第十一章11.1-2)

位向量(bit vector) 位向量&#xff08;bit vector&#xff09;是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。说明如何用一个位向量来表示一个包含不同元素&#xff08;无卫星数据&#xff09;的动态集合。字典操作运行时间应为O&#xff08…

Mysql@和@@符号的详细使用说明

一、概述 是用户变量&#xff0c;是系统变量。 二、使用语法及实践 用户自定义变量 1、用户定义变量语法 SET var_name expr [, var_name expr] 如&#xff1a;set t1 100; 2、获取用户定义变量值方式&#xff0c;如&#xff1a; select t1 from dual; 如下图 系统变…

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》&#xff0c;最近看到有人提出弱密钥问题&#xff0c;换个强密钥不就完了吗&#xff0c;猜测可能是与第三方对接导致很无奈不能更换密钥&#xff0c;所以产生本文解决.NET Core中3DES弱密钥问题&#xff0c;写…