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

前言:隨著雲原生概念盛行,對於容器、服務、節點以及集群的監控變得越來越重要。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的架構

image
上圖是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壓縮包並解壓縮

image

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

image
image
image
image

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

image
image
image
image

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

image
使用 helm 安裝後,會在 Kubernetes 集群中創建、配置和管理 Prometheus 集群,chart 中包含多種組件:

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

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

image

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

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

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

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

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

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

如圖所示更新部署成功:
image

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

image

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

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

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