阿里PB级Kubernetes日志平台建设实践
阿里PB級Kubernetes日志平臺建設實踐
QCon是由InfoQ主辦的綜合性技術盛會,每年在倫敦、北京、紐約、圣保羅、上海、舊金山召開。有幸參加這次QCon10周年大會,作為分享嘉賓在劉宇老師的運維專場發表了《阿里PB級Kubernetes日志平臺建設實踐》,現將PPT和文字稿整理下來,希望和更多的愛好者分享。
計算形態的發展與日志系統的演進
在阿里的十多年中,日志系統伴隨著計算形態的發展在不斷演進,大致分為3個主要階段:
日志平臺的重要性與建設目標
日志不僅僅是服務器、容器、應用的Debug日志,也包括各類訪問日志、中間件日志、用戶點擊、IoT/移動端日志、數據庫Binlog等等。這些日志隨著時效性的不同而應用在不同的場景:
在阿里,幾乎所有的業務角色都會涉及到各式各樣的日志數據,為了支撐各類應用場景,我們開發了非常多的工具和功能:日志實時分析、鏈路追蹤、監控、數據清洗、流計算、離線計算、BI系統、審計系統等等。其中很多系統都非常成熟,日志平臺主要專注于智能分析、監控等實時的場景,其他功能通常打通的形式支持。
阿里日志平臺現狀
目前阿里的日志平臺覆蓋幾乎所有的產品線和產品,同時我們的產品也在云上對外提供服務,已經服務了上萬家的企業。每天寫入流量16PB以上,對應日志行數40萬億+條,采集客戶端200萬,服務數千Kubernetes集群,是國內最大的日志平臺之一。
為何選擇自建
日志系統存在了十多年,目前也有非常多的開源的方案,例如最典型的ELK(Elastic Search、Logstash、Kibana),通常一個日志系統具備以下功能:日志收集/解析、查詢與檢索、日志分析、可視化/告警等,這些功能通過開源軟件的組合都可以實現,但最終我們選擇自建,主要有幾下幾點考慮:
Kubernetes日志平臺建設難點
圍繞著Kubernetes場景的需求,日志平臺建設的難點主要有以下幾點:
阿里PB級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系統中,實現無縫集成。
問題4:如何管理百萬級Logtail
對于人才管理有個經典的原則:10個人要用心良苦,100個人要殺伐果斷,1000個人要甩手掌柜。而同樣對于Logtail這款日志采集Agent的管理也是如此,這里我們分為3個主要過程:
Kubernetes日志平臺架構
上圖是阿里Kubernetes日志平臺的整體架構,從底到上分為日志接入層、平臺核心層以及方案整合層:
下面我們從問題排查的角度來具體展開平臺提供的核心功能。
PB級日志查詢
排查問題的最佳手段是查日志,大部分人腦海中最先想到的是用 grep 命令查找日志中的一些關鍵錯誤信息, grep 是Linux程序員最受歡迎的命令之一,對于簡單的問題排查場景也非常實用。如果應用部署在多臺機器,那還會配合使用pgm、pssh等命令。然而這些命令對于Kubernetes這種動態、大規模的場景并不適用,主要問題有:
我們在2009年開始在飛天平臺研發過程中,為夠解決大規模(例如5000臺)下的研發效率、問題診斷等問題,開始研支持超大規模的日志查詢平臺,其中最主要的目標是“快”,對于幾十億的數據也能夠輕松在秒級完成。
日志上下文
當我們通過查詢的方式定位到關鍵的日志后,需要分析當時系統的行為,并還原出當時的現場情況。而現場其實就是當時的日志上下文,例如:
- 一個錯誤,同一個日志文件中的前后數據
- 一行LogAppender中輸出,同一個進程順序輸出到日志模塊前后順序
- 一次請求,同一個Session組合
- 一次跨服務請求,同一個TraceId組合
在Kubernetes的場景中,每個容器的標準輸出(stdout)、文件都有對應的組合方式構成一個上下文分區,例如Namesapce+Pod+ContainerID+FileName/Stdout。
為支持上下文,我們在采集協議中對每個最小區分單元會帶上一個全局唯一并且單調遞增的游標,這個游標對單機日志、Docker、K8S以及移動端SDK、Log4J/LogBack等輸出中有不一樣的形式。
為日志而生的分析引擎
在一些復雜的場景中,我們需要對日志中的數據進行統計來發現其中規律。例如根據ClientIP進行聚合來查找攻擊源IP、將數據聚合計算P99/P9999延遲、從多個維度組合分析等。傳統的方式需要配合流計算或離線計算的引擎進行聚合計算,再對接可視化系統進行圖形化展示或對接告警系統。這種方式用戶需要維護多套系統,數據實時性變差,并且各個系統間的銜接很容易出現問題。
因此我們平臺原生集成了日志分析、可視化、告警等相關的功能,盡可能減少用戶配置鏈路。通過多年的實踐,我們發現用戶最容易接受的還是SQL的分析方式,因此我們分析基于SQL92標準實現,在此基礎上擴展了很多針對日志分析場景的高級函數,例如:
智能日志分析
在日志平臺上,應用方/用戶可以通過日志接入、查詢、分析、可視化、告警等功能可以完成異常監控、問題調查與定位。但隨著計算形態、應用形態以及開發人員職責的不斷演變,尤其在近兩年Kubernetes、ServiceMesh、Serverless等技術的興起,問題的復雜度不斷上升,常規手段已經很難適用。于是我們開始嘗試向AIOps領域發展,例如時序分析、根因分析、日志聚類等。
時序分析
- 通過時序預測相關方法,我們可以對CPU、存儲進行時序建模,進行更加智能的調度,讓整體利用率如絲般平滑;存儲團隊通過對磁盤空間的增長預測,提前制定預算并采購機器;在做部門/產品預算時,根據歷年賬單預測全年的消費,進行更優的成本控制。
- 稍微大一些的服務可能會有幾百、上千甚至上萬臺的機器,通過人肉很難發現每臺機器行為(時序)的區別,而通過時序聚類就可以快速得到集群的行為分布,定位出異常的機器;同時對于單條時序,可以通過時序異常相關的檢測方法,自動定位異常點。
根因分析
時序相關的函數主要用來發現問題,而查找問題根源還需要模式分析相關的方法(根因分析,Root Cause Analysis)。例如K8s集群整體Ingress錯誤率(5XX比例)突然上升時,如何排查是因為某個服務問題、某個用戶引起、某個URL引起、某個瀏覽器引起、某些地域網絡問題、某個節點異常還是整體性的問題?通常這種問題都需要人工從各個維度去排查,例如:
這種問題的排查在維度越多時復雜度越高,排查時間也越久,可能等到發現問題的時候影響面已經全面擴大了。因此我們開發了根因分析相關的函數,可以直接從多維數據中定位對目標(例如延遲、失敗率等)影響最大的一組(幾組)維度組合。
為了更加精確的定位問題,我們還支持對比兩個模式的差異,例如今天發生異常時,和昨天正常的模式進行對比,快速找到問題的原因;在發布時進行藍綠對比以及A/B Test。
智能日志聚類
上面我們通過智能時序函數發現問題、通過根因分析定位到關鍵的維度組合,但涉及到最終的代碼問題排查,還是離不開日志。當日志的數據量很大時,一次次的手動過濾太過耗時,我們希望可以通過智能聚類的方式,把相似的日志聚類到一起,最終可以通過聚類后的日志快速掌握系統的運行狀態。
上下游生態對接
Kubernetes日志平臺主要的目標在解決DevOps、Net/Site Ops、Sec Ops等問題上,然而這些并不能滿足所有用戶對于日志的所有需求,例如超大規模的日志分析、BI分析、極其龐大的安全規則過濾等。平臺的強大更多的是生態的強大,我們通過對接上下游廣泛的生態來滿足用戶越來越多的日志需求和場景。
優秀應用案例分析
案例1:混合云PAAS平臺日志管理
某大型游戲公司在進行技術架構升級,大部分業務會遷移到基于Kubernetes搭建的PAAS平臺上,為提高平臺整體的可用性,用戶采集混合云架構,對于日志的統一建設與管理存在很大困難:
- 眾多內部應用方:不希望應用方過多的接觸日志采集、存儲等細節,并且能夠為應用方提供全鏈路的日志;
- 1000+微服務:需要支持大規模的日志采集方式;
- 多云+線下IDC:希望多個云廠商以及線下IDC采用的是同一套采集方案;
- 應用周期短:部分應用的運行生命周期極短,需要能夠及時將數據采集到服務端;
- 海外數據回國:海外節點的日志回國分析,需盡可能保證傳輸穩定性和可靠性。
用戶最終選擇使用阿里云Kubernetes日志平臺的方案,使用Logtail的方案解決采集可靠性問題,通過公網、專線、全球加速的配合解決網絡問題,由系統管理員使用DaemonSet統一采集所有系統組件級別的日志,應用方只需使用CRD采集自己的業務日志。對于平臺側,系統管理員可以訪問所有系統級別日志,并進行統一的監控和告警;對于應用側,應用方不僅可以查到自己的業務日志,還能訪問到和業務相關的中間件、Ingress、系統組件日志,進行全鏈路的分析。
案例2:二次開發日志管理平臺
在阿里有很多大的業務部門希望基于我們標準的日志平臺進行二次開發,來滿足他們部門的一些特殊需求,例如:
- 通過各類規則以及接口限制規范數據接入。
- 通過TraceID將整個調用鏈串聯,構建Trace平臺。
- 部門內部多用戶的權限細化管理。
- 部門內部各個子部門的成本結算。
- 與一內部些管控、運維系統打通。
這些需求可以基于我們提供的OpenAPI以及各語言的SDK快速的實現,同時為了減少前端的工作量,平臺還提供Iframe嵌入的功能,支持直接將部分界面(例如查詢框、Dashboard)直接嵌入到業務部門自己的系統中。
未來工作展望
目前阿里Kubernetes日志平臺在內外部已經有非常多的應用,未來我們還將繼續打磨平臺,為應用方/用戶提供更加完美的方案,后續工作主要集中在以下幾點:
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
轉載于:https://juejin.im/post/5cf611e3e51d45572c05ffff
總結
以上是生活随笔為你收集整理的阿里PB级Kubernetes日志平台建设实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运行gulp项目报错:Assertion
- 下一篇: 使用tcpdump查看HTTP请求响应