vivo 網際網路伺服器團隊-YuanPeng
從容器技術的推廣以及 Kubernetes成為容器排程管理領域的事實標準開始,雲原生的理念和技術架構體系逐漸在生產環境中得到了越來越廣泛的應用實踐。在雲原生的體系下,面對高度的彈性、動態的應用生命週期管理以及微服務化等特點,傳統的監控體系已經難以應對和支撐,因此新一代雲原生監控體系應運而生。
當前,以Prometheus為核心的監控系統已成為雲原生監控領域的事實標準。Prometheus作為新一代雲原生監控系統,擁有強大的查詢能力、便捷的操作、高效的儲存以及便捷的設定操作等特點,但任何一個系統都不是萬能的,面對複雜多樣的生產環境,單一的Prometheus系統也無法滿足生產環境的各種監控需求,都需要根據環境的特點來構建適合的監控方法和體系。
本文以vivo容器叢集監控實踐經驗為基礎,探討了雲原生監控體系架構如何構建、遇到的挑戰以及相應的對策。
雲原生監控相比於傳統監控,有其特徵和價值,可歸納為下表:
CNCF生態全景圖中監控相關的專案如下圖(參考https://landscape.cncf.io/),下面重點介紹幾個專案:
Prometheus是一個強大的監控系統,同時也是一個高效的時序資料庫,並且具有完整的圍繞它為核心的監控體系解決方案。單臺Prometheus就能夠高效的處理大量監控資料,並且具備非常友好且強大的PromQL語法,可以用來靈活查詢各種監控資料以及告警規則設定。
Prometheus是繼Kubernetes之後的第二個CNCF 「畢業」專案(也是目前監控方向唯一「畢業」的專案),開源社群活躍,在Github上擁有近4萬Stars。
Prometheus的Pull指標採集方式被廣泛採用,很多應用都直接實現了基於Prometheus採集標準的metric介面來暴露自身監控指標。即使是沒有實現metric介面的應用,大部分在社群裡都能找到相應的exporter來間接暴露監控指標。
但Prometheus仍然存在一些不足,比如只支援單機部署,Prometheus自帶時序庫使用的是本地儲存,因此儲存空間受限於單機磁碟容量,在巨量資料量儲存的情況下,prometheus的歷史資料查詢效能會有嚴重瓶頸。因此在大規模生產場景下,單一prometheus難以儲存長期歷史資料且不具備高可用能力。
Cortex對Prometheus進行了擴充套件,提供多租戶方式,併為Prometheus提供了對接持久化儲存的能力,支援Prometheus範例水平擴充套件,以及提供多個Prometheus資料的統一查詢入口。
Thanos通過將Prometheus監控資料儲存到物件儲存,提供了一種長期歷史監控資料儲存的低成本解決方案。Thanos通過Querier元件給Prometheus叢集提供了全域性檢視(全域性查詢),並能將Prometheus的樣本資料壓縮機制應用到物件儲存的歷史資料中,還能通過降取樣功能提升大範圍歷史資料的查詢速度,且不會引起明顯的精度損失。
Grafana是一個開源的度量分析與視覺化套件,主要在監控領域用於時序資料的圖示自定義和展示,UI非常靈活,有豐富的外掛和強大的擴充套件能力,支援多種不同的資料來源(Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, Druid等等)。Grafana還提供視覺化的告警客製化能力,能夠持續的評估告警指標,傳送告警通知。
此外,Grafana社群提供了大量常用系統/元件的監控告警面板設定,可以一鍵線上下載設定,簡單便捷。
VictoriaMetrics是一個高效能、經濟且可延伸的監控解決方案和時序資料庫,可以作為Prometheus的長期遠端儲存方案,支援PromQL查詢,並與Grafana相容,可用於替換Prometheus作為Grafana的資料來源。具有安裝設定簡單、低記憶體佔用、高壓縮比、高效能以及支援水平擴充套件等特性。
AlertManager是一個告警元件,接收Prometheus發來的告警,通過分組、沉默、抑制等策略處理後,通過路由傳送給指定的告警接收端。告警可以按照不同的規則傳送給不同的接收方,支援多種常見的告警接收端,比如Email,Slack,或通過webhook方式接入企業微信、釘釘等國內IM工具。
上文了解了雲原生監控領域的常用工具後,該如何搭建一套簡單的雲原生監控系統?下圖給出了Prometheus社群官方提供的方案:
(出處:Prometheus社群)
上述系統展開闡述如下:
上文展示了社群官方給出的監控系統搭建方案,但該方案在生產環境應用時存在的主要問題:
那麼對於大規模複雜生產環境,如何構建能力開放、穩定高效的雲原生監控體系?
綜合vivo自身容器叢集監控實踐經驗、各類雲原生監控相關檔案以及技術大會上各家廠商的技術架構分享,可以總結出適合大規模生產場景的雲原生監控體系架構,下圖展示了體系架構的分層模型。
任何系統的架構設計一定是針對生產環境和業務需求的特點,以滿足業務需求和高可用為前提,在綜合考慮技術難度、研發投入和運維成本等綜合因素後,設計出最符合當前場景的架構方案。因此,在詳解vivo容器叢集監控架構設計之前,需要先介紹下背景:
vivo目前有多個容器化生產叢集,分佈在若干機房,目前單叢集最大規模在1000~2000節點。
需要滿足生產高可用,監控範圍主要包括容器叢集指標、物理機執行指標和容器(業務)指標,其中業務監控告警還需要通過公司的基礎監控平臺來展示和設定。
告警需要視覺化的設定方式,需要傳送給公司的告警中心,並有分級分組等策略規則需求。
有各類豐富的周、月度、季度統計報表需求。
結合上文說明的環境和需求特點,vivo當前監控架構的設計思路:
前文介紹了社群的Cortex和Thanos高可用監控方案,這兩個方案在業界均有生產級的實踐經驗,但為什麼我們選擇用Prometheus雙副本+VictoriaMetrics的方案?
主要原因有以下幾點:
由於Prometheus採用雙副本部署高可用方案,資料儲存如何去重是需要設計時就考慮的。VictoriaMetrics本身支援儲存時去重,因此VictoriaMetrics這一側的資料去重得到天然解決。但監控資料通過Kafka轉發給基礎監控平臺和OLAP這一側的去重該如何實現?
我們設計的方案,如下圖,是通過自研Adapter 「分組選舉」方式實現去重。即每個Prometheus副本對應一組Adapter,兩組Adapter之間會進行選主,只有選舉為Leader的那組Adapter才會轉發資料。通過這種方式既實現了去重,也借用K8s service來支援Adapter的負載均衡。
此外,Adapter具備感知Prometheus故障的能力,當Leader Prometheus發生故障時,Leader Adapter會感知到並自動放棄Leader身份,從而切換到另一組Adapter繼續傳輸資料,確保了「雙副本高可用+去重」方案的有效性。
我們在容器叢集監控實踐的過程中,遇到的一些困難和挑戰,總結如下:
監控的目標是為了更高效可靠的運維,準確及時的發現問題。更高的目標是基於監控實現自動化的運維,甚至是智慧運維(AIOPS)。
基於目前對容器叢集監控的經驗總結,未來在監控架構上可以做的提升點包括:
沒有一種架構設計是一勞永逸的,必須要隨著生產環境和需求的變化,以及技術的發展來持續演進。我們在雲原生監控這條路上,需要繼續不忘初心,砥礪前行。