理解OpenShift(7):基於 Prometheus 的集群監控


理解OpenShift(1):網絡之 Router 和 Route

理解OpenShift(2):網絡之 DNS(域名服務)

理解OpenShift(3):網絡之 SDN

理解OpenShift(4):用戶及權限管理

理解OpenShift(5):從 Docker Volume 到 OpenShift Persistent Volume

理解OpenShift(6):集中式日志處理

理解OpenShift(7):基於 Prometheus 的集群監控

 

** 本文基於 OpenShift 3.11,Kubernetes 1.11 進行測試 ***

 

和日志系統一樣,監控系統也是平台一大不可或缺的組成部分。在敏態的OpenShift 和 Kubernetes 平台之中,運行平台組件及業務應用的Pod 時刻都處於變化之中,而且數量可能會巨大。在這種情況下,對監控系統的要求會更高。當前,基於 Prometheus 和 Granfana 的監控系統,對於OpenShfit 和 Kubernetes 這樣的平台來說,是一個比較好的選擇。但是,Prometheus 本身就相當復雜,再加上復雜的容器雲平台,復雜性成倍提高。本文試着對它的原理進行梳理,但肯定無法面面俱到。更多更詳細的信息,還請查閱更多資料。

1. Prometheus 概述

關於 Prometheus 的文檔非常多,這里不會詳細說明,只是一個概述。

它是什么:

  • 一個帶時序數據庫(TSDB)的監控系統。SoundCloud 在2012年開始開發,2015年開源,現在是 CNCF 繼 Kuebernetes 之后的第二個項目。
  • 通過拉取(pull)方式收集測量數據,並將其保存在TSDB 中。
  • 提供計量數據查詢功能,實現了類似於 SQL 的查詢語法PromSQL。
  • 提供告警功能,能根據已定義的告警規則向外輸出告警。
  • 雖然它自己實現了一個面板,但還比較簡陋。現在主流的做法是將它和 Grafana 結合,由 Grafana 提供面板。
它不是什么:
  • 它不處理日志或跟蹤(tracing),只處理計量數據。
  • 它本身不是專門的具有良好擴展性的持久存儲。它自身的存儲,被設計為用於短時間保存數據。

它的基本架構:

關於架構的簡單說明:

  • 左側是被監控的對象(target)。如果監控對象自身提供滿足Prometheus要求的測量數據的 HTTP API(比如cAdvisor,https://github.com/google/cadvisor),則可以直接和 Prometheus 對接;否則,可以借助 exporter 來實現對接(比如 node exporter,https://github.com/prometheus/node_exporter)。exporter 會從應用中獲取測量數據,然后提供HTTP API,再和 Prometheus 對接。
  • 中下部分是 Prometheus。它的開源項目地址是 https://github.com/prometheus。它是監控系統的中心,負責策略數據收集、存儲、告警、查詢等。
  • 中上部分是服務發現,用於動態對象的監控。在很多現代系統中,被監控對象不是靜態的,比如 K8S 中的Pod。對於動態目標,按照靜態目標那種監控方式就很難了,因此 Prometheus 提供了服務發現功能。它能動態地發現被監控的對象,然后對它們做監控。
  • 右上是 AlertManager。其開源項目地址是 https://github.com/prometheus/alertmanager。它接受 Prometheus 根據所配置的告警規則發過來的告警,然后做去重、分組和路由等處理,然后發給外部的接口組件,比如 PageDuty、郵件系統等。
  • 右下是 Grafana。其開源項目地址是 https://github.com/grafana/grafana。它以Prometheus 為后端(它支持對接很多種后端),根據配置,從中獲取數據,然后以非常漂亮的界面(Dashboard)將數據呈現出來。

網上有很多很多的關於 Prometheus 的文檔,比如 https://yunlzheng.gitbook.io/prometheus-book/ 

2. 利用 Prometheus 對 OpenShfit 集群進行監控

2.1 OpenShfit 集群的監控需求

上圖整理了OpenShift 集群的監控需求。它包括兩大部分:

  • 一部分是對OpenShift 平台進行監控,確保它穩定運行。這是平台運維團隊的需求。這部分又包括很多內容,包括節點監控(節點的CPU、內存、網絡、存儲等)、容器監控(每個容器所消耗的資源,包括cpu、內存、網絡、文件系統等),以及 OpenShift 核心組件等。
  • 另一部分是運行在OpenShfit 平台上的業務服務,確保業務服務穩定運行,這是應用開發和運維團隊的需求。

2.2 基於 Prometheus 的 OpenShift 監控系統的實現

為了滿足上述監控需求,OpenShift 提供了基於 Prometheus + Grafana 的監控系統。針對每個需要被監控的目標(target),都利用了Prometheus提供的某個功能來實現對它的監控。

先上一張官方的架構圖:

 

我畫的邏輯圖:

 具體每個部分在后文會有相關介紹。

2.3 基於 Prometheus 的 OpenShift 監控系統的部署和維護

OpenShfit 利用 ansible 在某個project(我的是 openshift-monitoring)中部署包括 Prometheus 和 Granfana 在內的監控系統。這里面主要用到兩個開源項目:

關於這兩個 Operator 的更多信息,請查閱有關文檔。下面只介紹某些重點部分。

Cluster Monitoring Operator 只是很薄的一層,但是它是入口。它的主要任務是負責把 Prometheus Operator 創建出來。

Prometheus Operator 是 CoreOS 開源的項目,它就很復雜了。以下圖為參照,它負責創建和管理三種東西:

  • 第一種是 Prometheus 及相關的服務。默認包括 alertmanager 服務、Prometheus 服務、Grafana 服務、kube-state-metrics 服務、node-exporter 服務。
  • 第二種是4個 CRD 類型(實際上有6個,但另兩個的用途不明),包括 AlterManager,Prometheus、PrometheusRule 和 ServiceMonitor。
    • 每一個 CRD 都是一個類似 Deployment 配置,從名字上可以看出與實體的對應關系。
    • Prometheus Operator 會監控這些實例。如果發現有更改,則會對相應的實體做變更。比如若 PrometheusRule 的內容被修改,那么新的監控和告警規則會被 Prometheus 重新加載。
    • 因此,定義這些 CRD 類型的目的,是為了簡化對 Prometheus 系統的管理。管理員只需要對這些 CRD 實例做管理,系統就會自動對實例做變更。
    第三類是這四個 CRD類型的實例。在部署監控系統時,若干個實例會被自動創建出來,對應第一種里面的那些服務。
    • 1 個 alertmanager 實例對應 alertmanager 服務,每個服務默認3 個副本,也就是有3個 Pod。
    • 1 個 Prometheus 實例對應 Prometheus 服務,每個服務默認2個副本,也就是有2個 Pod。
    • 1 個 PrometheusRule 實例對應當前 Prometheus 實例所使用的監控和告警規則。
    • 9 個 ServiceMonitor 實例,對應對 Prometheus 所監控的9個目標,這里的每個目標都是一個 OpenShift 服務。下面會詳細說明

 2.4 ServiceMonitor 實例

ServiceMonitor 是 Prometheus Operator 向運維人員暴露出來的被監控的目標。在部署完成后,默認創建了9個 ServiceMonitor 對象,對應9個需要被 Prometheus 監控的核心平台服務:

2.4.1 alertmanager

AlterManager 是一個 Prometheus 套件中的獨立組件,它自身實現了符合 Prometheus 要求的計量信息接口。

2.4.2  cluster-monitoring-operator 

這是 OpenShift cluster monitoring opeator 服務。它也實現了計量接口。

2.4.3  kube-apiserver 

這是 OpenShift 的 API 和 DNS 服務。

2.4.4 kube-controllers

這是 K8S master controllers 服務。 

2.4.5 kube-state-metrics

這是一個開源項目,地址在  https://github.com/kubernetes/kube-state-metrics。它從 K8S API Server 中獲取數據,比如:

ksm_resources_per_scrape{resource="node",quantile="0.99"} 7
ksm_resources_per_scrape_sum{resource="node"} 255444
ksm_resources_per_scrape_count{resource="node"} 36492
ksm_resources_per_scrape{resource="persistentvolume",quantile="0.5"} 15
ksm_resources_per_scrape{resource="persistentvolume",quantile="0.9"} 15

2.4.6 kubelet

kubelet 服務包含多個Static Pod,每個Pod運行在集群的每個節點上。它除了自身提供 kublet 的計量信息外,還內置了 cAdvisor 服務,因此也提供 cAdvisor 信息。 cAdvisor 對 Node機器上的資源及容器進行實時監控和性能數據采集,包括CPU使用情況、內存使用情況、網絡吞吐量及文件系統使用情況。cAdvisor集成在Kubelet中,當kubelet啟動時會自動啟動cAdvisor,一個cAdvisor僅對一台Node機器進行監控。

2.4.7 node-exporter     

 node-exporter 服務包含多個 DaemonSet Pod,每個 Pod 運行在一個集群節點上。  它主要用於 Linux 系統監控,其開源項目地址為  https://github.com/prometheus/node_exporter
 

2.4.8 prometheus

這是 Prometheus 服務,它可有多個 StatefulSet Pod,每個 Pod 中運行一個 Prometheus 進程。

 

2.4.9 prometheus-operator 

這是 Prometheus Operator 服務,只有一個pod。

 

2.5 基於OpenShift ServiceMonitor 和 Prometheus Service Discovery(服務發現)的監控的實現

Prometheus Pod 中,除了 Prometheus 容器外,還有一個 prometheus-config-reloader 容器。它負責導入在需要的時候讓Prometheus 重新加載配置文件。配置文件被以 Secret 形式創建並掛載給 prometheus-config-reloader Pod。一旦配置有變化,它會調用 Prometheus 的接口,使其重新加載配置文件。

配置文件中定義了被監控的目標為這些 ServiceMonitor 對象所對應的服務:

 

每個 job 都采用 endpoints 類型的 Prometheus 服務發現機制。這種機制下,Prometheus 會調用 OpenShift 的API,首先找到每個 job 所配置的 OpenShift 服務,然后找到這服務的端點(endpoint)。每個 OpenShfit endpoint 是一個 Prometheus target(目標),可以在 Prometheus 界面上看到目標列表。然后在每個目標上,調用 metrics HTTP API,以拉取(GET)形式,獲得該服務的計量數據。

 

關於 Premetheus 對 OpenShift/Kubernetes 平台所做的監控的詳細情況,下面這一系列文章做了比較詳細的解釋:https://blog.freshtracks.io/a-deep-dive-into-kubernetes-metrics-b190cc97f0f6

3. 利用 Prometheus 對部署在 OpenShift 平台上的應用進行監控

3.1 技術實現

3.1.1 監控框架總結

把前面的內容再總結一下,就有了下面的監控框架圖:

3.1.2 監控一個運行在OpenShift 中的應用

Prometheus 對容器雲平台做監控時,已經可以采集到容器的一些資源使用計量數據了,比如CPU、內存、網絡、存儲、文件系統等。但這還不夠,因為沒有應用自身的計量信息。要使得Prometheus 能采集到應用自身的監控信息,需要滿足一些條件,並做一些配置。

首先,應用的計量數據是應用自己產生的,只不過是被Prometheus獲取了。一個應用要能夠被Prometheus 監控,需要滿足幾個條件:

  • 首先的要求是,應用要暴露出它的計量數據。如果它不提供計量數據,也就不需要被監控了。
  • 其次,需要滿足 Prometheus 的數據格式和數據獲取要求。Prometheus 定義了計量數據的規范,同時定義了獲取方式(通過HTTP Get 獲取)。如果應用需要直接被Prometheus 監控,那么就得滿足這些要求。
  • 如果應用本身有數據,但是不滿足Prometheus 的要求,也有一些辦法。其中一個辦法是實現一個 sidecar exporter。它負責以應用特有的格式去獲取應用的計量數據,然后按照 Prometheus 的要求將數據暴露出來。Prometheus 項目中已經有了一些實現,比如 HAProxy 的 exporter 在 https://github.com/prometheus/haproxy_exporter

其次,需要做一些配置,使得 Prometheus 知道如何去獲取應用的計量數據。從上圖可以看出,通過使用 Prometheus Operator,配置監控的過程被大大簡化了。基本上大致步驟為:

  • 部署應用服務,檢查它的或他的 exporter 的 metrics HTTP API 能否正確運行
  • 為該應用服務創建一個 ServiceMonitor 對象
  • 修改 PrometheusRule 對象,為應用添加監控和告警規則

然后,Prometheus 就會自動地將這些變動應用到 Prometheus 和 AlterManager 實例中,然后該應用就會被監控到了。

3.2 產品相關

對這套基於 Prometheus 的OpenShift/Kubernetes 監控系統,到目前為止,我認為它還不夠成熟,在很多地方有待改進。比如Prometheus高可用,目前還沒有很好的方法;比如Prometheus 的存儲,從設計上它就只能作為短期存儲,如果應用於大型的生產環境,短時間內就會產生大量數據,那該怎么辦?;比如監控和告警規則配置,還不夠靈活和方便;比如服務發現,如果被監控的目標量很大而且變化很快,Prometheus 能否能夠及時響應?Grafana 如何做多租戶實現?等等。

因此,當前,我認為它還是更加適合於平台監控,也就是面向平台運維人員的。因為此時很多要求都可以被妥協,比如穩定性、擴展性、多租戶、靈活性、用戶友好等。

如果要用於用戶應用的監控,從產品和技術層面,那還有大量工作需要做,包括但不限於:

  • 用戶如何配置其應用監控(如何創建和管理 CRD 對象等)
  • 用戶如何創建和管理監控和告警規則
  • Grafana 如何實現多租戶
  • Prometheus 如何支持大量的被監控對象和計量信息 

參考鏈接:

 

感謝您的閱讀,歡迎關注我的微信公眾號:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM