摘要: 將在QCon上分享的《阿里PB級Kubernetes日誌平臺建設實踐》整理出來,分享給你們。
QCon是由InfoQ主辦的綜合性技術盛會,每一年在倫敦、北京、紐約、聖保羅、上海、舊金山召開。有幸參加此次QCon10週年大會,做爲分享嘉賓在劉宇老師的運維專場發表了《阿里PB級Kubernetes日誌平臺建設實踐》,現將PPT和文字稿整理下來,但願和更多的愛好者分享。前端
在阿里的十多年中,日誌系統伴隨着計算形態的發展在不斷演進,大體分爲3個主要階段:node
日誌不只僅是服務器、容器、應用的Debug日誌,也包括各種訪問日誌、中間件日誌、用戶點擊、IoT/移動端日誌、數據庫Binlog等等。這些日誌隨着時效性的不一樣而應用在不一樣的場景:程序員
在阿里,幾乎全部的業務角色都會涉及到各式各樣的日誌數據,爲了支撐各種應用場景,咱們開發了很是多的工具和功能:日誌實時分析、鏈路追蹤、監控、數據清洗、流計算、離線計算、BI系統、審計系統等等。其中不少系統都很是成熟,日誌平臺主要專一於智能分析、監控等實時的場景,其餘功能一般打通的形式支持。數據庫
目前阿里的日誌平臺覆蓋幾乎全部的產品線和產品,同時咱們的產品也在雲上對外提供服務,已經服務了上萬家的企業。天天寫入流量16PB以上,對應日誌行數40萬億+條,採集客戶端200萬,服務數千Kubernetes集羣,是國內最大的日誌平臺之一。 瀏覽器
日誌系統存在了十多年,目前也有很是多的開源的方案,例如最典型的ELK(Elastic Search、Logstash、Kibana),一般一個日誌系統具有如下功能:日誌收集/解析、查詢與檢索、日誌分析、可視化/告警等,這些功能經過開源軟件的組合均可以實現,但最終咱們選擇自建,主要有幾下幾點考慮:安全
圍繞着Kubernetes場景的需求,日誌平臺建設的難點主要有如下幾點:服務器
Kubernetes日誌數據採集網絡
不管是在ITOM仍是在將來的AIOps場景中,日誌獲取都是其中必不可少的一個部分,數據源直接決定了後續應用的形態和功能。在十多年中,咱們積累了一套物理機、虛擬機的日誌採集經驗,但在Kubernetes中不能徹底適用,這裏咱們以問題的形式展開:架構
問題1:DaemonSet or Sidecar框架
日誌最主要的採集工具是Agent,在Kubernetes場景下,一般會分爲兩種採集方式:
每種採集方式都有其對應的優缺點,這裏簡單總結以下:
DaemonSet方式 | Sidecar方式 | |
---|---|---|
採集日誌類型 | 標準輸出+部分文件 | 文件 |
部署運維 | 通常,需維護DaemonSet | 較高,每一個須要採集日誌的POD都須要部署sidecar容器 |
日誌分類存儲 | 通常,可經過容器/路徑等映射 | 每一個POD可單獨配置,靈活性高 |
多租戶隔離 | 通常,只能經過配置間隔離 | 強,經過容器進行隔離,可單獨分配資源 |
支持集羣規模 | 中小型規模,業務數最多支持百級別 | 無限制 |
資源佔用 | 較低,每一個節點運行一個容器 | 較高,每一個POD運行一個容器 |
查詢便捷性 | 較高,可進行自定義的查詢、統計 | 高,可根據業務特色進行定製 |
可定製性 | 低 | 高,每一個POD單獨配置 |
適用場景 | 功能單一型的集羣 | 大型、混合型、PAAS型集羣 |
在阿里內部,對於大型的PAAS集羣,主要使用Sidecar方式採集數據,相對隔離性、靈活性最好;而對與功能比較單一(部門內部/產品自建)的集羣,基本都採用DaemonSet的方式,資源佔用最低。
問題2:如何下降資源消耗
咱們數據採集Agent使用的是自研的Logtail,Logtail用C++/Go編寫,相對開源Agent在資源消耗上具備很是大的優點,但咱們還一直在壓榨數據採集的資源消耗,尤爲在容器場景。一般,爲了提升打日誌和採集的性能,咱們都使用本地SSD盤做爲日誌盤。這裏咱們能夠作個簡答的計算:假設每一個容器掛載1GB的SSD盤,1個物理機運行40個容器,那每臺物理機須要40GB的SSD做爲日誌存儲,那5W物理機則會佔用2PB的SSD盤。
爲了下降這部分資源消耗,咱們和螞蟻金服團隊的同窗們一塊兒開發了FUSE的日誌採集方式,使用FUSE(Filesystem in Userspace,用戶態文件系統)虛擬化出日誌盤,應用直接將日誌寫入到虛擬的日誌盤中,最終數據將直接從內存中被Logtail採集到服務端。這種採集的好處有:
問題3:如何與Kubernetes無縫集成
Kubernetes一個很是大的突破是使用聲明式的API來完成服務部署、集羣管理等工做。但在K8s集羣環境下,業務應用/服務/組件的持續集成和自動發佈已經成爲常態,使用控制檯或SDK操做採集配置的方式很難與各種CI、編排框架集成,致使業務應用發佈後用戶只能經過控制檯手動配置的方式部署與之對應的日誌採集配置。
所以咱們基於Kubernetes的CRD(CustomResourceDefinition)擴展實現了採集配置的Operator,用戶能夠直接使用K8s API、Yaml、kubectl、Helm等方式直接配置採集方式,真正把日誌採集融入到Kubernetes系統中,實現無縫集成。
對於人才管理有個經典的原則:10我的要用心良苦,100我的要殺伐果斷,1000我的要甩手掌櫃。而一樣對於Logtail這款日誌採集Agent的管理也是如此,這裏咱們分爲3個主要過程:
Kubernetes日誌平臺架構
上圖是阿里Kubernetes日誌平臺的總體架構,從底到上分爲日誌接入層、平臺核心層以及方案整合層:
日誌首先會到達平臺提供的實時隊列中,相似於Kafka的consumer group,咱們提供實時數據訂閱的功能,用戶能夠基於該功能實現ETL的相關需求。平臺最核心的功能包括:
下面咱們從問題排查的角度來具體展開平臺提供的核心功能。
PB級日誌查詢
排查問題的最佳手段是查日誌,大部分人腦海中最早想到的是用 grep
命令查找日誌中的一些關鍵錯誤信息, grep
是Linux程序員最受歡迎的命令之一,對於簡單的問題排查場景也很是實用。若是應用部署在多臺機器,那還會配合使用pgm、pssh等命令。然而這些命令對於Kubernetes這種動態、大規模的場景並不適用,主要問題有:
咱們在2009年開始在飛天平臺研發過程當中,爲夠解決大規模(例如5000臺)下的研發效率、問題診斷等問題,開始研支持超大規模的日誌查詢平臺,其中最主要的目標是「快」,對於幾十億的數據也可以輕鬆在秒級完成。
日誌上下文
當咱們經過查詢的方式定位到關鍵的日誌後,須要分析當時系統的行爲,並還原出當時的現場狀況。而現場其實就是當時的日誌上下文,例如:
在Kubernetes的場景中,每一個容器的標準輸出(stdout)、文件都有對應的組合方式構成一個上下文分區,例如Namesapce+Pod+ContainerID+FileName/Stdout。
爲支持上下文,咱們在採集協議中對每一個最小區分單元會帶上一個全局惟一而且單調遞增的遊標,這個遊標對單機日誌、Docker、K8S以及移動端SDK、Log4J/LogBack等輸出中有不同的形式。
爲日誌而生的分析引擎
在一些複雜的場景中,咱們須要對日誌中的數據進行統計來發現其中規律。例如根據ClientIP進行聚合來查找攻擊源IP、將數據聚合計算P99/P9999延遲、從多個維度組合分析等。傳統的方式須要配合流計算或離線計算的引擎進行聚合計算,再對接可視化系統進行圖形化展現或對接告警系統。這種方式用戶須要維護多套系統,數據實時性變差,而且各個系統間的銜接很容易出現問題。
所以咱們平臺原生集成了日誌分析、可視化、告警等相關的功能,儘量減小用戶配置鏈路。經過多年的實踐,咱們發現用戶最容易接受的仍是SQL的分析方式,所以咱們分析基於SQL92標準實現,在此基礎上擴展了不少針對日誌分析場景的高級函數,例如:
智能日誌分析
在日誌平臺上,應用方/用戶能夠經過日誌接入、查詢、分析、可視化、告警等功能能夠完成異常監控、問題調查與定位。但隨着計算形態、應用形態以及開發人員職責的不斷演變,尤爲在近兩年Kubernetes、ServiceMesh、Serverless等技術的興起,問題的複雜度不斷上升,常規手段已經很難適用。因而咱們開始嘗試向AIOps領域發展,例如時序分析、根因分析、日誌聚類等。
時序分析
根因分析
時序相關的函數主要用來發現問題,而查找問題根源還須要模式分析相關的方法(根因分析,Root Cause Analysis)。例如K8s集羣總體Ingress錯誤率(5XX比例)忽然上升時,如何排查是由於某個服務問題、某個用戶引發、某個URL引發、某個瀏覽器引發、某些地域網絡問題、某個節點異常仍是總體性的問題?一般這種問題都須要人工從各個維度去排查,例如:
這種問題的排查在維度越多時複雜度越高,排查時間也越久,可能等到發現問題的時候影響面已經全面擴大了。所以咱們開發了根因分析相關的函數,能夠直接從多維數據中定位對目標(例如延遲、失敗率等)影響最大的一組(幾組)維度組合。
爲了更加精確的定位問題,咱們還支持對比兩個模式的差別,例現在天發生異常時,和昨天正常的模式進行對比,快速找到問題的緣由;在發佈時進行藍綠對比以及A/B Test。
智能日誌聚類
上面咱們經過智能時序函數發現問題、經過根因分析定位到關鍵的維度組合,但涉及到最終的代碼問題排查,仍是離不開日誌。當日志的數據量很大時,一次次的手動過濾太過耗時,咱們但願能夠經過智能聚類的方式,把類似的日誌聚類到一塊兒,最終能夠經過聚類後的日誌快速掌握系統的運行狀態。
上下游生態對接
Kubernetes日誌平臺主要的目標在解決DevOps、Net/Site Ops、Sec Ops等問題上,然而這些並不能知足全部用戶對於日誌的全部需求,例如超大規模的日誌分析、BI分析、極其龐大的安全規則過濾等。平臺的強大更多的是生態的強大,咱們經過對接上下游普遍的生態來知足用戶愈來愈多的日誌需求和場景。
案例1:混合雲PAAS平臺日誌管理
某大型遊戲公司在進行技術架構升級,大部分業務會遷移到基於Kubernetes搭建的PAAS平臺上,爲提升平臺總體的可用性,用戶採集混合雲架構,對於日誌的統一建設與管理存在很大困難:
用戶最終選擇使用阿里雲Kubernetes日誌平臺的方案,使用Logtail的方案解決採集可靠性問題,經過公網、專線、全球加速的配合解決網絡問題,由系統管理員使用DaemonSet統一採集全部系統組件級別的日誌,應用方只需使用CRD採集本身的業務日誌。對於平臺側,系統管理員能夠訪問全部系統級別日誌,並進行統一的監控和告警;對於應用側,應用方不只能夠查到本身的業務日誌,還能訪問到和業務相關的中間件、Ingress、系統組件日誌,進行全鏈路的分析。
案例2:二次開發日誌管理平臺
在阿里有不少大的業務部門但願基於咱們標準的日誌平臺進行二次開發,來知足他們部門的一些特殊需求,例如:
這些需求能夠基於咱們提供的OpenAPI以及各語言的SDK快速的實現,同時爲了減小前端的工做量,平臺還提供Iframe嵌入的功能,支持直接將部分界面(例如查詢框、Dashboard)直接嵌入到業務部門本身的系統中。
目前阿里Kubernetes日誌平臺在內外部已經有很是多的應用,將來咱們還將繼續打磨平臺,爲應用方/用戶提供更加完美的方案,後續工做主要集中在如下幾點:
相關工做與參考
本文爲雲棲社區原創內容,未經容許不得轉載。