理解OpenShift(2):網絡之 DNS(域名服務)node
理解OpenShift(4):用戶及權限管理github
理解OpenShift(5):從 Docker Volume 到 OpenShift Persistent Volume數據庫
理解OpenShift(6):集中式日誌處理segmentfault
理解OpenShift(7):基於 Prometheus 的集羣監控後端
** 本文基於 OpenShift 3.11,Kubernetes 1.11 進行測試 ***api
和日誌系統同樣,監控系統也是平臺一大不可或缺的組成部分。在敏態的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 在內的監控系統。這裏面主要用到兩個開源項目:
- 一個是 Cluster Monitoring Operator。它的開源項目地址是 https://github.com/openshift/cluster-monitoring-operator。它負責在 OpenShfit 環境中部署基於 Prometheus 的監控系統。
- 另外一個是 Prometheus Operator。 它的開源項目地址是 https://github.com/coreos/prometheus-operator。它負責在 Kubernetes 環境中部署基於 Prometheus 的監控系統。
關於這兩個 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 實例作管理,系統就會自動對實例作變動。
- 1 個 alertmanager 實例對應 alertmanager 服務,每一個服務默認3 個副本,也就是有3個 Pod。
- 1 個 Prometheus 實例對應 Prometheus 服務,每一個服務默認2個副本,也就是有2個 Pod。
- 1 個 PrometheusRule 實例對應當前 Prometheus 實例所使用的監控和告警規則。
- 9 個 ServiceMonitor 實例,對應對 Prometheus 所監控的9個目標,這裏的每一個目標都是一個 OpenShift 服務。下面會詳細說明