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