DevOps課程-Prometheus 15
前面到目前為止,已經完成了以下項目的監控設置:
- K8S Component
- K8S Nodes,也就是機台的資源使用
- 開箱即用(out-of-box)監控Prometheus Stack本身(Alertmanage,Prometheus Operator…etc)
- 第三方應用程式 — 如Redis
現在還缺少監控的是自己的應用程式專案的監控
接下來例子是一個Nodejs專案進行監控
但是有幾項需要解決的問題:
- 自己的應用程式沒有exporter來蒐集Metrics資料
- 當然我們還得要自己定義Metrics資料
這時候就會想找找是不是有客製化的解決方案!?
→找該應用程式對應的"Prometheus Client Library"
Prometheus Client Library:
- 有對應各種不同的程式語言
- 用以抽象化的介面,暴露Metrics資訊
- 而這些Metrics資訊是以時間序列化(Time Series)格式的方式暴露給Prometheus去讀取
- 也就是Library實作成Prometheus metric type:
- 1.Counter
- 2.Gauge
- 3.Histogram
- 4.Summary
- 再重複一次,各種不同程式語言有各自對應的Prometheus的Library
- 這些Library用以暴露應用程式的Metrics資訊
後面就是簡單用一個Nodejs程式專案來當範例,其步驟如下:
- 使用Nodejs的Promethus client library暴露其Metrics資訊到/metrics
- 佈署該Nodejs應用程式
- 設置Prometheus來搜集新的Target(也就是設置serviceMonitor元件)
- 將獲得的Metrics資料在Grafana Dashboard上以視覺化呈現
架構大致如下:
1.Expose Metrics — Nodejs Client Library:
依據課程準備寫的,所使用的程式專案是以下:
我有fork一份到自己的GitLab上
如果本機有裝node的話
#執行以下node指令即可在本機看到網頁:
cd {到有package.json目錄}
npm install
node ./app/server.js
隨便起了一台ubuntu來用:
然後防火牆有開的話,就可以看到:
接下來這邊決定要做的Metrics有兩個:
- 被請求的數量
- 每個請求所花費的時間
以一位DevOps工程師角度或是K8S Admin角度來說
我們通常需要監控應用程式,所以要要求開發者在應用程式中暴露Metrix資訊
而開發者就要找到Prometheus的Clinet Library進行相關設置
以下就假設已通知開發者要做相關程式內的設置
所以我們可以簡單分析一下程式內容:
其來源可以google找"prometheus client nodejs npm":
往下拉會看到相關使用解說(不過nodejs我不熟...):
然後程式內容可以看到 →server.js:
以上僅僅只是宣告了我們要得兩個Metrics資訊
實際上的統計則要靠後面的程式碼:
以開發者角度而言,其職責在於:
- 定義Metric
- 在程式邏輯內追蹤該值
而最後這些Metrics資訊要暴露在其位置的/metrics這個URI上:
所以這時候可以連到以下位置看到相關資訊
如上圖內容很多,因為還有預設的metrics資訊,上面code也有暴露出來
往下也能找到我們額外定義的兩個Metrics內容:
這時候進去原本的3000 PORT首頁:
然後回去metrics頁面刷新:
以上對程式以及引用的Prometheus Client Library
來暴露metrics資訊的方式就有大概了解
再來就是要把這個程式想辦法佈署到K8S上面
並且實際串接Prometheus來做監控,設置Alert Rule,甚至視覺化到Grafana去
打包成Docker image,並且推到Repo上:
在fork來的程式專案內,還有包含道Dockerfile:
所以接著就來打包
#執行以下指令進行image封裝(記得改帳號):
docker build -t nanajanashia/demo-app:nodeapp .
簡單確認:
docker images
再來要推上Repo前要登入才能推
#登入(填帳號密碼):
docker login#推(記得改帳號部分):
docker push nanajanashia/demo-app:nodeapp
然後到dockerhub上看到:
這邊如果有做CICD PIPELINE設置的話
一般當Code進行commit到Git Repo後,就會觸發打包成image儲存了
佈署應用程式到K8S Clsuter內:
這邊可以看到該程式專案也有寫好的Deployment yaml內容:
Service yaml部分:
當前完整兩個K8S元件yaml內容如下:
#取得docker server位置,等等後面建立拉image的secret要用:
docker info#如上這時候有一行是Registry的位置的URL#簡單建立取用image的帳密SECRET:
kubectl create secret docker-registry my-registry-key --docker-server={上面Registry的URL值} --docker-username=nanajanashia --docker-password={這邊填密碼}#上面指令實際組出來就是:
kubectl create secret docker-registry my-registry-key --docker-server=https://index.docker.io/v1/ --docker-username=nanajanashia --docker-password={密碼}
#接著就是佈署上述兩個K8S元件:
kubectl apply -f k8s-config.yaml
#這時候可以確認(這邊就沒有再佈署google的微服務專案了,比較乾淨):
kubectl get pod#確認service:
kubectl get svc
(這邊目前重建的Cluster省去前面google的online-shop那一堆微服務程式)
#快速本機確認:
kubectl port-forward svc/nodeapp 3000:3000
上面Deployment設定檔裡面的image是講師的
我這邊調整成我自己dockerhub那份後重新apply
#快速調整成自己dockerhub的image:
kubectl apply -f k8s-config.yaml
再重跑port-forward:
這時候就可以點開web打開來看:
127.0.0.1:3000
也可以看看metrics資訊:
localhost:3000/metrics
後面再來就是設置讓Prometheus開始抓取這個Target