一文看懂 K8s 日志系统设计和实践
作者 | 元乙 阿里云存儲服務技術專家
導讀:上一篇文章《6 個 K8s 日志系統建設中的典型問題,你遇到過幾個?》中我們介紹了為什么需要一個日志系統、為什么云原生下的日志系統如此重要以及云原生背景下日志系統的建設難點,相信 DevOps、SRE、運維等同學看了之后深有體會。本篇文章單刀直入,會直接跟大家分享一下如何在云原生的場景下搭建一個靈活、功能強大、可靠、可擴容的日志系統。
需求驅動架構設計
技術架構,是將產品需求轉變為技術實現的過程。對于所有的架構師而言,能夠將產品需求分析透徹是非常基本也是非常重要的一點。很多系統剛建成沒多久就要被推翻,最根本的原因還是沒有解決好產品真正的需求。
我所在的日志服務團隊在日志這塊有近10年的經驗,幾乎服務阿里內部所有的團隊,涉及電商、支付、物流、云計算、游戲、即時通訊、IoT等領域,多年來的產品功能的優化和迭代都是基于各個團隊的日志需求變化。
有幸我們最近幾年在阿里云上實現了產品化,服務了數以萬計的企業用戶,包括國內各大直播類、短視頻、新聞媒體、游戲等行業Top1互聯網客戶。產品功能從服務一個公司到服務上萬家公司會有質的差別,上云促使我們更加深入的去思考:究竟哪些功能是日志這個平臺需要去為用戶去解決的,日志最核心的訴求是什么,如何去滿足各行各業、各種不同業務角色的需求…
需求分解與功能設計
上一節中我們分析了公司內各個不同角色對于日志的相關需求,總結起來有以下幾點:
為滿足上述這些功能需求,日志平臺上必須具備的功能功能模塊有:
開源方案設計
借助于強大的開源社區,我們可以很容易基于開源軟件的組合來實現這樣一套日志平臺,上圖是一個非常典型的以ELK為核心的日志平臺方案:
- 利用FileBeats、Fluentd等采集Agent實現容器上的數據統一收集。
- 為了提供更加豐富的上下游以及緩沖能力,可以使用kafka作為數據采集的接收端。
- 采集到的原始數據還需要進一步的清洗,可以使用Logstash或者Flink訂閱Kafka中的數據,清洗完畢后再寫入kafka中。
- 清洗后的數據可以對接ElasticSearch來做實時的查詢檢索、對接Flink來計算實時的指標和告警、對接Hadoop來做離線的數據分析、對接TensorFlow來做離線模型訓練。
- 數據的可視化可以使用grafana、kibana等常用的可視化組件。
為什么我們選擇自研
采用開源軟件的組合是非常高效的方案,得益于強大的開源社區以及龐大用戶群體的經驗積累,我們可以很快搭建出這樣一套系統,并且可以滿足我們絕大部分的需求。
當我們把這套系統部署好,能夠把日志從容器上采集上來、elasticsearch上能夠查到、Hadoop上能夠成功執行SQL、Grafana上能看到圖、告警短信能收到…完成上述流程打通后,加加班可能只需要花費幾天的時間,當系統終于跑通的時候,這時候終于可以長舒一口氣,躺在辦公椅上放松放松。
然而理想很豐滿現實很骨感,當我們預發通了,測試完了上到生產,開始接入第一個應用,逐漸更多的應用接入,越來越多的人開始使用…這時候很多問題都可能暴露出來:
- 隨著業務量的上漲,日志量也越來越大,Kakfa和ES要不斷擴容,同時同步Kafka到ES的Connector也需要擴容,最煩的是采集Agent,每臺機器上部署的DaemonSet Fluentd根本沒辦法擴容,到了單Agent瓶頸就沒辦法了,只能換Sidecar,換Sidecar工作量大不說,還會帶來一系列其他的問題,比如怎么和CICD系統集成、資源消耗、配置規劃、stdout采集不支持等等。
- 從剛開始上的邊緣業務,慢慢更多的核心業務接入,對于日志的可靠性要求越來越高,經常有研發反應從ES上查不到數據、運營說統計出來的報表不準、安全說拿到的數據不是實時的…每次問題的排查都要經過采集、隊列、清洗、傳輸等等非常多的路徑,排查代價非常高。同時還要為日志系統搭建一套監控方案,能夠即時發現問題,而且這套方案還不能基于日志系統,不能自依賴。
- 當越來越多的開發開始用日志平臺調查問題時,經常會出現因為某1-2個人提交一個大的查詢,導致系統整體負載上升,其他人的查詢都會被Block,甚至出現Full GC等情況。這時候一些大能力的公司會對ES進行改造,來支持多租戶隔離;或者為不同的業務部門搭建不同的ES集群,最后又要運維多個ES集群,工作量還是很大。
- 當投入了很多人力,終于能夠把日志平臺維持日常使用,這時候公司財務找過來了,說我們用了非常多的機器,成本太大。這時候開始要優化成本,但是思來想去就是需要這么多臺機器,每天大部分的機器水位都在20%-30%,但是高峰的水位可能到70%,所以不能撤,撤了高峰頂不住,這時候只能搞搞削峰填谷,又是一堆工作量。
上述這些是一家中等規模的互聯網企業在日志平臺建設中經常會遇到的問題,在阿里這些問題會放大非常多倍:
- 比如面對雙十一的流量,市面上所有的開源軟件都無法滿足我們那么大流量的需求。
- 面對阿里內部上萬個業務應用,幾千名工程師同時使用,并發和多租戶隔離我們必須要做到極致。
- 面對非常多核心的訂單、交易等場景,整個鏈路的穩定性必須要求3個9甚至4個9的可用性。
- 每天如此大的數據量,對于成本的優化顯得極為重要,10%的成本優化帶來的收益可能就有上億。
阿里K8s日志方案
針對上述的一些問題,我們經過多年的時間,開發并打磨出這樣一套K8s日志方案:
這套系統目前支撐了整個阿里集團、螞蟻集團、云上上萬家企業的日志分析,每天寫入的數據量16PB ,開發、運維這樣一套系統問題和挑戰非常多,這里就不再展開,有興趣的同學可以參考我們團隊的技術分享:阿里10PB/天日志系統設計和實現。
總結
本篇主要從架構層面去介紹如何搭建一套K8s的日志分析平臺,包括開源方案以及我們阿里自研的一套方案。然而實際這套系統落地到生產環境并有效運行還有很多工作要做:
“ 阿里巴巴云原生微信公眾號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的技術公眾號。”
總結
以上是生活随笔為你收集整理的一文看懂 K8s 日志系统设计和实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云开源 image-syncer 工
- 下一篇: 拐点已至,云原生引领数字化转型升级