DevOps課程-Prometheus 12

監控第三方應用程式

ZONGRU Li
8 min readOct 27, 2022

整理目前課程建置的指令

#建立Cluster:
eksctl create cluster
#取得目前現有哪些Cluster及其名稱:
eksctl get cluster
#對應課程結束移除(課上完才跑):
eksctl delete cluster --name {cluster名稱}
#這邊建置直接使用default的namespace建立要觀察的微服務系統:
kubectl apply -f config-best-practices.yaml
#安裝指令整理,增加Repo位置(如果本機沒做過的話):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
#更新Repo內容(如果本機沒做過的話):
helm repo update
#建立Prometheus專用的namespace:
kubectl create namespace monitoring
#安裝Prometheus Chart,並給予名稱為monitoring,並安裝到monitoring ns裡面:
helm install {名稱,這邊一樣給monitoring} {Repo名稱}/{chart名稱,叫kube-prometheus-stack} -n {指定的namespace}
#整理上述對應的指令即如下(大概10分鐘),有時候久了會清cache,要重做上面update:
helm install monitoring prometheus-community/kube-prometheus-stack -n monitoring
#將Prometheus Web UI服務可以透過本機連通,把本機對應PORT往前推到遠端服務:
kubectl port-forward {元件名稱} {執行kubectl指令本機PORT}:{這個元件PORT} -n monitoring &
#上面Prometheus Web UI使用PORT是9090,所以組出來的指令類似:
kubectl port-forward service/monitoring-kube-prometheus-prometheus 9090:9090 -n monitoring &
#上述執行後即可訪問本機127.0.0.1:9090 會自動導到遠端Prometheus Web#同理Grafana的Web UI:
kubectl port-forward service/monitoring-grafana 8080:80 -n monitoring &
#上述執行後,可以瀏覽127.0.0.1:8080,預設帳密是admin/prom-operator#透過kubectl工具建立寫好的Alert Rule(檔案內已經有寫指定的namespace了):
kubectl apply -f alert-rules.yaml
#確認現有Alert Rule方式:
kubectl get PrometheusRule -n monitoring
#查看建立Alert Rule的過程,指定到Container:
kubectl logs prometheus-monitoring-kube-prometheus-prometheus-0 -n monitoring -c config-reloader
#另一個主要Container的log也有建立Alert Rule的log可以看:
kubectl logs prometheus-monitoring-kube-prometheus-prometheus-0 -n monitoring -c prometheus
#起一個cpu壓測的pod(吃4core,持續30秒):
kubectl run cpu-test --image=docker.io/containerstack/cpustress -- --cpu 4 --timeout 30s --metrics-brief
#############Alertmanager部分######################查找Alertmanager的service:
kubectl get svc -n monitoring
#將Alertmanager的服務進行forward:
kubectl port-forward svc/monitoring-kube-prometheus-alertmanager 9093:9093 -n monitoring &
#透過以下指令拿到Alertmanager完整設定檔內容(但是有base64加密):
kubectl get secret alertmanager-monitoring-kube-prometheus-alertmanager-generated -n monitoring -o yaml
#後面就是自定義設定檔的部分:
#如果像講師畫面一樣只有alertmanager.yaml,沒有gz的話,可透過以下bash指令解密:
echo {後面那一長串} | base64 --decode
#如上,我的看到是"alertmanager.yaml.gz",所以解密要變成:
echo {後面那一長串} | base64 --decode | gzip -d
#建立寄送通知使用的gmail的密碼,但首先要先對密碼做base64加密,放到Secret的YAML:
echo "密碼" | base64
#寫好Secret後建立:
kubectl apply -f email-secret.yaml
#然後寫好Alertmanager的Config的YAML執行建立:
kubectl apply -f alert-manager-configuration.yaml
#確認上述建立的物件:
kubectl get alertmanagerconfig -n monitoring
#確認先找到Alertmanager的Pod:
kubectl get pod -n monitoring
#執行查看pod內容,順便看看有甚麼container在裡面:
kubectl describe pod alertmanager-monitoring-kube-prometheus-alertmanager-0 -n monitoring
#找到Pod後就可以查看log,先看alertmanager:
kubectl logs alertmanager-monitoring-kube-prometheus-alertmanager-0 -c alertmanager -n monitoring
#再看config-reloader:
kubectl logs alertmanager-monitoring-kube-prometheus-alertmanager-0 -c config-reloader -n monitoring
#建立個會觸發CPU偏高的Alert的pod(吃4core,持續60秒):
kubectl run cpu-test --image=docker.io/containerstack/cpustress -- --cpu 4 --timeout 60s --metrics-brief
#查看Alertmanager裡面的log,應該會寫:Username & password等問題:
kubectl logs alertmanager-monitoring-kube-prometheus-alertmanager-0 -c alertmanager -n monitoring

前面講解了很多的監控,但基本都專注在監控:

  1. K8S Component
  2. K8S Nodes,也就是機台的資源使用
  3. 開箱即用(out-of-box)監控Prometheus Stack本身(Alertmanage,Prometheus Operator…etc)

這邊有找到我們部屬上去的應用程式,google原本的github上有的架構圖:

LINK

大部分都是用DeploymentK8S元件方式運行在EKS Cluster

其中有包含了一個第三方應用程式不一定是google自己寫的 →Redis

這也是我們目前少監控到的"應用程式層級"的部分:

  1. 第三方應用程式 — 如Redis
  2. google的整個Online-shop應用程式

比如說我們想監控Redis當前的:

  • 負載流量?
  • 太多連線?
  • 服務是否正常運作中?

以上這些不是K8S層級,而是應用程式層級的監控

所以我們該如何透過Prometheus來監控這種第三方的應用程式?

→使用"Prometheus Exporters"

什麼是Exporters:

  • Exporter專門用來從service中蒐集metrics
  • 並將蒐集來的metrics資料轉化成Prometheus可以理解的時間序列(time series)資料
  • 接著Exporter會把轉化後的資料暴露在/metrics這個Endpoint,好讓Prometheus可以抓取
  • 當我們佈署了Exporter,我們則要通知Prometheus有新Endpoint要去抓取資料
  • 為了達上上述目的,需要額外建立custom K8S resource稱為ServiceMonitor
  • 透過ServiceMonitor這個元件來告知Prometheus有新Endpoint要去抓取

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet