如何使用helm優雅安裝prometheus-operator,並監控k8s叢集微服務

2022-09-09 06:00:18

前言:隨著雲原生概念盛行,對於容器、服務、節點以及叢集的監控變得越來越重要。Prometheus 作為 Kubernetes 監控的事實標準,有著強大的功能和良好的生態。但是它不支援分散式,不支援資料匯入、匯出,不支援通過 API 修改監控目標和報警規則,所以在使用它時,通常需要寫指令碼和程式碼來簡化操作。Prometheus Operator 為監控 Kubernetes service、deployment 和 Prometheus 範例的管理提供了簡單的定義,簡化在 Kubernetes 上部署、管理和執行 Prometheus 和 Alertmanager 叢集。

一、什麼是Prometheus-Operator

Prometheus-Operator是一套為了方便整合prometheus和kubernetes的軟體,使用Prometheus-Operator可以非常簡單的在kubernetes叢集中部署Prometheus服務,提供對kubernetes叢集各個元件和服務的監控,並且通過Prometheus-Operator使用者能夠使用簡單的宣告性設定來設定和管理Prometheus範例,這些設定將響應、建立、設定和管理Prometheus監控範例

Operator的核心思想是將Prometheus的部署與它監控的物件的設定分離,做到部署與監控物件的設定分離之後,就可以輕鬆實現動態設定。使用Operator部署了Prometheus之後就可以不用再管Prometheus Server了,以後如果要新增監控物件或者新增告警規則,只需要編寫對應的ServiceMonitor和Prometheus資源就可以,不用再重啟Prometheus服務,Operator會動態的觀察設定的改動,並將其生成為對應的prometheus組態檔其中Operator可以部署、管理Prometheus Service

二、Prometheus-Operator的架構


上圖是Prometheus-Operator官方提供的架構圖,從下向上看,Operator可以部署並且管理Prometheus Server,並且Operator可以Watch Prometheus,那麼這個Watch是什麼意思呢?

  • Operator : Operator是整個系統的控制中心,會以Deployment的方式執行於Kubernetes叢集上,並根據自定義資源(Custom Resources Definition)CRD 來負責管理與部署Prometheus,Operator會通過監聽這些CRD的變化來做出相對應的處理。

  • Prometheus : Operator會監聽叢集內的Prometheus CRD(Prometheus 也是一種CRD)來建立一個合適的statefulset在monitoring(.metadata.namespace指定)名稱空間,並且掛載了一個名為prometheus-k8s的Secret為Volume到/etc/prometheus/config目錄,Secret的data包含了以下內容:

    • configmaps.json指定了rule-files在configmap的名字
    • prometheus.yaml為主組態檔
  • ServiceMonitor : ServiceMonitor就是一種kubernetes自定義資源(CRD),Operator會通過監聽ServiceMonitor的變化來動態生成Prometheus的組態檔中的Scrape targets,並讓這些設定實時生效,operator通過將生成的job更新到上面的prometheus-k8s這個Secret的Data的prometheus.yaml欄位裡,然後prometheus這個pod裡的sidecar容器prometheus-config-reloader當檢測到掛載路徑的檔案發生改變後自動去執行HTTP Post請求到/api/-reload-路徑去reload設定。該自定義資源(CRD)通過labels選取對應的Service,並讓prometheus server通過選取的Service拉取對應的監控資訊(metric)

  • Service :Service其實就是指kubernetes的service資源,這裡特指Prometheus exporter的service,比如部署在kubernetes上的mysql-exporter的service

總結:想象一下,我們以傳統的方式去監控一個mysql服務,首先需要安裝mysql-exporter,獲取mysql metrics,並且暴露一個埠,等待prometheus服務來拉取監控資訊,然後去Prometheus Server的prometheus.yaml檔案中在scarpe_config中新增mysql-exporter的job,設定mysql-exporter的地址和埠等資訊,再然後,需要重啟Prometheus服務,就完成新增一個mysql監控的任務

現在我們以Prometheus-Operator的方式來部署Prometheus,當我們需要新增一個mysql監控我們會怎麼做,首先第一步和傳統方式一樣,部署一個mysql-exporter來獲取mysql監控項,然後編寫一個ServiceMonitor通過labelSelector選擇剛才部署的mysql-exporter,由於Operator在部署Prometheus的時候預設指定了Prometheus選擇label為:prometheus: kube-prometheus的ServiceMonitor,所以只需要在ServiceMonitor上打上prometheus: kube-prometheus標籤就可以被Prometheus選擇了,完成以上兩步就完成了對mysql的監控,不需要改Prometheus組態檔,也不需要重啟Prometheus服務,是不是很方便,Operator觀察到ServiceMonitor發生變化,會動態生成Prometheus組態檔,並保證組態檔實時生效

三、如何安裝Pometheus-Oerator

本地實驗環境是在虛擬機器器中的minikube單節點中進行的

1.下載helm壓縮包並解壓縮

2.新增helm repo源到本地,並updte更新repo




3.helm search命令可以列出prometheus的相關chart包及其版本號




4.monitoring名稱空間,並通過helm install安裝一個名為prometheus-operator的chart包


使用 helm 安裝後,會在 Kubernetes 叢集中建立、設定和管理 Prometheus 叢集,chart 中包含多種元件:

  • prometheus-operator
  • prometheus
  • alertmanager
  • node-exporter
  • kube-state-metrics
  • grafana

5.kubectl get po -n monitoring檢視promrthues-operator相關元件pod已經順利啟動,說明成功部署

promethues-operator部署好後下面講講如何實現用其來監控k8s叢集當中的微服務

四、如何通過prometheus-operator來監控k8s叢集當中的微服務

在這之前我在minikube當中以及部署好一套微服務:

1.通過miniube service list可以檢視到gateway已經暴露了31080埠,可以通過瀏覽器檢視一下



上文中已經講解了prometheus-operator是通過將ServiceMonitor中的lable將k8s中的service繫結從而實現對K8s中的服務進行監控的
具體關係如下所示:

2.編寫或更新好ServiceMonitor組態檔後只需要通過helm upgrade命令來更新prometheus-operator的chart包即可完成重新部署

如圖所示更新部署成功:

3.通過Kubectl get servicemonitors -n monitoring來檢視下已經部署好的ServiceMonitor

4.然後執行kubctl port-forward來將prometheus-operator埠臨時暴露並監聽本機所有地址


注:用虛擬機器器部署的同學,這裡注意一定要跟上--address 0.0.0.0這個選項,否則伺服器只會監聽本地迴環地址的9090埠,這樣通過主機就無法通過ip:port存取到了

5.通過主機瀏覽器輸入ip:port來存取prometheus,如果看到這個介面說明大功告成!