asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!
背景
最近一段時(shí)間,陸陸續(xù)續(xù)的把手里頭項(xiàng)目都遷移到了k8s中,期間遇到很多的坑,并且也學(xué)到了許多k8s的知識(shí)(從0-1),大家都知道k8s中的一大特性是自動(dòng)擴(kuò)容,對(duì)此結(jié)合自己的業(yè)務(wù)發(fā)現(xiàn)很是有“用武之地”,我有個(gè)業(yè)務(wù),是向消息隊(duì)列中插入消息,然后.net core console app進(jìn)行消費(fèi),但是我這個(gè)業(yè)務(wù)有個(gè)特點(diǎn),要么沒(méi)有消息生產(chǎn),要么就是有一大批消息產(chǎn)生。在引用HPA之前,我不得不提前啟動(dòng)“合適數(shù)量”的pod(1個(gè)pod多個(gè)消費(fèi)者容器)來(lái)消費(fèi)消息,要不然業(yè)務(wù)方要叫了。但是作為有“潔癖”的開(kāi)發(fā)者,我不想相同的容器有太多的閑置,無(wú)所事事,又占用資源。所以我們需要借助HPA來(lái)實(shí)現(xiàn)自動(dòng)伸縮擴(kuò)容,消息多的時(shí)候,自動(dòng)擴(kuò)容;消息少的時(shí)候,自動(dòng)縮容。
前期準(zhǔn)備:
要有一個(gè)k8s集群(我是通過(guò)kubeadm搭建的3master+N node的集群 1.18.2)
有一個(gè)rabbitmq實(shí)例3.8.x
rabbitmq_exporter:一個(gè)通過(guò)轉(zhuǎn)化mq:15672接口數(shù)據(jù),以metrics接口暴露出來(lái)的exporter
kube-prometheus:一個(gè)將prometheus全家桶集合安裝的開(kāi)源項(xiàng)目
大體實(shí)現(xiàn)方向:
將rabbitmq的數(shù)據(jù)指標(biāo),以metrics接口的形式,暴露給prometheus server;然后再promethus中通過(guò)添加record rule規(guī)則來(lái)自定義你的隊(duì)列指標(biāo);然后再promethus adapter中添加一條rule來(lái)將之前的指標(biāo)轉(zhuǎn)化成k8s api所能識(shí)別的接口;最后在k8s中定義HPA去監(jiān)測(cè)prometheus adapter service暴露的轉(zhuǎn)化好的接口來(lái)動(dòng)態(tài)伸縮。
第一步:暴露rabbitmq數(shù)據(jù)指標(biāo)
rabbitmq官網(wǎng)中monitor一節(jié)中有提到它有一個(gè)插件是給pormetheus用的,但是我看了下用起來(lái)不方便,達(dá)不到效果,遂用下面的這個(gè)開(kāi)源項(xiàng)目。
rabbitmq_exporter這個(gè)項(xiàng)目它sample中使用的是直接docker run去啟動(dòng)容器,來(lái)進(jìn)行mq數(shù)據(jù)指標(biāo)的暴露,但是你最好把他運(yùn)行在k8s中,方便管理。
準(zhǔn)備一個(gè)yaml文件,將rabbitmq exporter運(yùn)行在k8s集群中,并以service的形式,暴露給k8s中安裝的prometheus server去抓取
rabbitmq_exporter.yaml
然后在k8s master中創(chuàng)建這個(gè)yaml: kubectl apply –f rabbitmq_exporter.yaml
看到如下內(nèi)容代表部署成功了:
我們看看39419端口暴露的metrics暴露的接口數(shù)據(jù)長(zhǎng)什么樣:
我們先用kubectl exec命令隨便進(jìn)入一個(gè)容器,在容器內(nèi)部訪問(wèn)上面的svc ip + port
然后訪問(wèn)我們上面的svc: curl 10.110.14.151:39419/metrics | grep rabbitmq_queue_messages{
看到有圖片中的數(shù)據(jù),就代表你rabbitmq exporter搭建成功了,否則的話查看下日志解決下。
至此,k8s集群中已經(jīng)存在一個(gè)這樣的svc接口(10.110.14.151:39419/metrics)他只能在k8s集群內(nèi)部訪問(wèn),他暴露的metrics數(shù)據(jù)中,就包含了隊(duì)列中消息的數(shù)量。
第二步:使rabbitmq metrics指標(biāo)能夠被prometheus server所定時(shí)抓取
安裝prometheus監(jiān)控全家桶
先把原項(xiàng)目clone下來(lái): git conle https://github.com/coreos/kube-prometheus.git
manifests:這個(gè)文件夾里放的全都是prometheus所需資源清單文件
example.jsonnet:這個(gè)文件是生成manifests文件夾的引導(dǎo)文件
理論上,你git clone下來(lái)的mainfests文件夾,可以直接用的,但是需要做下調(diào)整,接下來(lái)我通過(guò)example.jsonnet來(lái)重新編譯生成manifests資源清單
參考于:https://github.com/coreos/kube-prometheus#compiling
為了避免干擾,先將mainfests文件夾刪除。
我們先修改example.jsonnet文件,讓其按照我的要求生成mainfests資源清單:
在項(xiàng)目目錄下,先執(zhí)行(第一次會(huì)比較慢,大概10來(lái)分鐘吧,或者失敗,請(qǐng)重試!):
然后再執(zhí)行:
- docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci ./build.sh example.jsonnet
等執(zhí)行好了,我們能看到新的mainfests文件夾已經(jīng)生成好了。
安裝:kubectl apply –f mainfests/setup/.
安裝:kubectl apply –f mainfests/.
看下安裝好了之后,所啟動(dòng)的svc有哪些
3個(gè)UI的組件,之所以是nodeport(可以直接外網(wǎng)通過(guò) 主機(jī)ip+端口進(jìn)行訪問(wèn)),是因?yàn)樯厦娴膉sonnet文件。請(qǐng)?jiān)敿?xì)看下上面圖片中的備注
至此,全家桶不出意外的話,應(yīng)該都安裝完成了。
讓prometheus server可以抓取的到rabbitmq metrics指標(biāo)
參考資料:https://github.com/coreos/prometheus-operator/blob/master/Documentation/additional-scrape-config.md
創(chuàng)建prometheus-additional.yaml文件用于配置rabbitmq metrics job
prometheus-additional.yaml
執(zhí)行:kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml -n monitoring
驗(yàn)證:
然后修改:manifests/prometheus-prometheus.yaml
執(zhí)行:kubectl apply -f manifests/prometheus-prometheus.yaml
此時(shí)prometheus server并沒(méi)有抓取rabbitmq metrics,需要重新啟動(dòng)下,以加載到我們上述的新target
最后我們看下UI,是否成功添加target
graph中,也能看到rabbitmq_queue_messages指標(biāo)了
第三步:使用prometheus-adapter來(lái)讓k8s能夠訪問(wèn)的到自定義的資源指標(biāo)
上面全家桶中已經(jīng)包含了adapter,所以不需要再安裝了,推薦實(shí)戰(zhàn)的小伙伴,仔細(xì)看下這個(gè)全家桶項(xiàng)目doc。
首先,先確保k8s中custom.metrics.k8s.io自定義指標(biāo)接口可用
雖然你能在graph中看到rabbitmq_queue_messages指標(biāo),但是這個(gè)指標(biāo)也只有prometheus自己認(rèn)得,k8s api server并不認(rèn)得。
我們得添加一條prometheus rule,參考資料:點(diǎn)我
其實(shí)我們?cè)谏厦嬉呀?jīng)添加了一條,并且已經(jīng)運(yùn)行起來(lái)了,監(jiān)測(cè)vhost為xxxx,queue為xxxx的隊(duì)列。
labels必選要打上:
然后我們給prometheus-adapter添加一條rule用于映射到上面prometheus中的record rule:enriched_rabbitmq_queue_messages
參考資料:請(qǐng)戳我,看最后那個(gè)人的留言,最佳解釋
那我們?cè)趺刺砑幽?#xff0c;我們先看看prometheus-adapter容器的配置文件(rule默認(rèn)都有一個(gè)配置文件維護(hù)的)
先看下adapter的描述:kubectl describe pod prometheus-adapter-5cdcdf9c8d-5bq5p
發(fā)現(xiàn)他把配置信息都放到configmap里,那換個(gè)角度,只要我們能將給prometheus-adapter添加的rule,追加到這個(gè)configmap里面,理論上就可以實(shí)現(xiàn)動(dòng)態(tài)增加了。
其實(shí)adapter所有的配置都在manifests/prometheus-adapter-configMap.yaml
記得執(zhí)行讓它生效:kubectl apply -f manifests/prometheus-adapter-configMap.yaml
等待幾十秒后,驗(yàn)證下:
至此自定義metrics指標(biāo)已經(jīng)成功,實(shí)現(xiàn)了prometheus server不停的監(jiān)測(cè)某個(gè)隊(duì)列的消息數(shù),然后k8s api通過(guò)prometheus adapter能夠訪問(wèn)到這個(gè)指標(biāo),這樣后面的HPA就簡(jiǎn)單的多了。
第四步:定義HPA
?
秒殺+口令「k8sgogogo」到手僅?¥69
總結(jié)
以上是生活随笔為你收集整理的asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 应用交付老兵眼中的Envoy, 云原生时
- 下一篇: 搭建一套ASP.NET Core+Nac