背景
最近一段時間,陸陸續續的把手裏頭項目都遷移到了k8s中,期間遇到不少的坑,而且也學到了許多k8s的知識(從0-1),你們都知道k8s中的一大特性是自動擴容,對此結合本身的業務發現非常有「用武之地」,我有個業務,是向消息隊列中插入消息,而後.net core console app進行消費,可是我這個業務有個特色,要麼沒有消息生產,要麼就是有一大批消息產生。在引用HPA以前,我不得不提早啓動「合適數量」的pod(1個pod多個消費者容器)來消費消息,要否則業務方要叫了。可是做爲有「潔癖」的開發者,我不想相同的容器有太多的閒置,無所事事,又佔用資源。因此咱們須要藉助HPA來實現自動伸縮擴容,消息多的時候,自動擴容;消息少的時候,自動縮容。php
前期準備:
要有一個k8s集羣(我是經過kubeadm搭建的3master+N node的集羣 1.18.2)node
有一個rabbitmq實例3.8.xgit
rabbitmq_exporter:一個經過轉化mq:15672接口數據,以metrics接口暴露出來的exportergithub
kube-prometheus:一個將prometheus全家桶集合安裝的開源項目docker
大致實現方向:
將rabbitmq的數據指標,以metrics接口的形式,暴露給prometheus server;而後再promethus中經過添加record rule規則來自定義你的隊列指標;而後再promethus adapter中添加一條rule來將以前的指標轉化成k8s api所能識別的接口;最後在k8s中定義HPA去監測prometheus adapter service暴露的轉化好的接口來動態伸縮。json
第一步:暴露rabbitmq數據指標
rabbitmq官網中monitor一節中有提到它有一個插件是給pormetheus用的,可是我看了下用起來不方便,達不到效果,遂用下面的這個開源項目。api
rabbitmq_exporter這個項目它sample中使用的是直接docker run去啓動容器,來進行mq數據指標的暴露,可是你最好把他運行在k8s中,方便管理。app
準備一個yaml文件,將rabbitmq exporter運行在k8s集羣中,並以service的形式,暴露給k8s中安裝的prometheus server去抓取curl
而後在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_exporter.yamlui
第二步:使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