前言:隨著雲原生概念盛行,對於容器、服務、節點以及叢集的監控變得越來越重要。Prometheus 作為 Kubernetes 監控的事實標準,有著強大的功能和良好的生態。但是它不支援分散式,不支援資料匯入、匯出,不支援通過 API 修改監控目標和報警規則,所以在使用它時,通常需要寫指令碼和程式碼來簡化操作。Prometheus Operator 為監控 Kubernetes service、deployment 和 Prometheus 範例的管理提供了簡單的定義,簡化在 Kubernetes 上部署、管理和執行 Prometheus 和 Alertmanager 叢集。
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官方提供的架構圖,從下向上看,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包含了以下內容:
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組態檔,並保證組態檔實時生效
本地實驗環境是在虛擬機器器中的minikube單節點中進行的
使用 helm 安裝後,會在 Kubernetes 叢集中建立、設定和管理 Prometheus 叢集,chart 中包含多種元件:
在這之前我在minikube當中以及部署好一套微服務:
上文中已經講解了prometheus-operator是通過將ServiceMonitor中的lable將k8s中的service繫結從而實現對K8s中的服務進行監控的
具體關係如下所示:
如圖所示更新部署成功:
注:用虛擬機器器部署的同學,這裡注意一定要跟上--address 0.0.0.0這個選項,否則伺服器只會監聽本地迴環地址的9090埠,這樣通過主機就無法通過ip:port存取到了