asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!
背景
最近一段時間,陸陸續續的把手里頭項目都遷移到了k8s中,期間遇到很多的坑,并且也學到了許多k8s的知識(從0-1),大家都知道k8s中的一大特性是自動擴容,對此結合自己的業務發現很是有“用武之地”,我有個業務,是向消息隊列中插入消息,然后.net core console app進行消費,但是我這個業務有個特點,要么沒有消息生產,要么就是有一大批消息產生。在引用HPA之前,我不得不提前啟動“合適數量”的pod(1個pod多個消費者容器)來消費消息,要不然業務方要叫了。但是作為有“潔癖”的開發者,我不想相同的容器有太多的閑置,無所事事,又占用資源。所以我們需要借助HPA來實現自動伸縮擴容,消息多的時候,自動擴容;消息少的時候,自動縮容。
前期準備:
要有一個k8s集群(我是通過kubeadm搭建的3master+N node的集群 1.18.2)
有一個rabbitmq實例3.8.x
rabbitmq_exporter:一個通過轉化mq:15672接口數據,以metrics接口暴露出來的exporter
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 ./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
總結
以上是生活随笔為你收集整理的asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用交付老兵眼中的Envoy, 云原生时
- 下一篇: 搭建一套ASP.NET Core+Nac