針對(duì)K8s日志采集存在的采集目標(biāo)多、彈性伸縮難、運(yùn)維成本大、侵入性高、采集性能低等問(wèn)題,阿里云日志服務(wù)和容器服務(wù)團(tuán)隊(duì)設(shè)計(jì)了阿里云K8s日志解決方案。
用戶(hù)一分鐘內(nèi)即可完成整個(gè)集群部署,并實(shí)現(xiàn)集群節(jié)點(diǎn)日志、容器日志、容器標(biāo)準(zhǔn)輸出等所有數(shù)據(jù)源的一站式采集。而且,在后續(xù)集群動(dòng)態(tài)伸縮的時(shí)候,用戶(hù)也不需要對(duì)日志組件做任何二次調(diào)整。
9.1 日志服務(wù)介紹
阿里云的日志服務(wù)是針對(duì)日志類(lèi)數(shù)據(jù)的一站式服務(wù)。日志采集代理Logtail運(yùn)行在上百萬(wàn)機(jī)器上,為數(shù)以萬(wàn)計(jì)的應(yīng)用提供服務(wù)。阿里云日志服務(wù)有如下特點(diǎn):
- 可靠:經(jīng)歷了“金融級(jí)別”的考驗(yàn),不丟失一條日志。
- 穩(wěn)定:客戶(hù)端性能強(qiáng)勁,資源占用率低,在上百萬(wàn)臺(tái)機(jī)器上運(yùn)行。
- 高吞吐:PB級(jí)規(guī)模,參數(shù)配置靈活,“秒級(jí)”出結(jié)果。
- 無(wú)維負(fù)擔(dān): 零負(fù)擔(dān),零代價(jià),零預(yù)留成本。
- 生態(tài)豐富:完美支撐Hadoop、Spark、Flink等開(kāi)源產(chǎn)品與阿里云自研技術(shù)。
-
迭代快:是阿里共用的一套產(chǎn)品,可第一時(shí)間提供新功能。新技術(shù)。
從功能角度來(lái)看,日志服務(wù)主要包括日志采集、離線計(jì)算、可視分析以及實(shí)時(shí)計(jì)算等。如下圖所示。
圖1-阿里云日志服務(wù)特性.png
9.2 采集方案介紹
9.2.1 方案簡(jiǎn)介
阿里云K8s日志采集方案如下圖所示。K8s的每個(gè)節(jié)點(diǎn)都會(huì)運(yùn)行一個(gè)Logtail容器,該容器可采集宿主機(jī)以及該宿主機(jī)上容器的日志,包括標(biāo)準(zhǔn)輸出和日志文件。

Logtail以集群Daemonset的方式編排,這保證了每個(gè)節(jié)點(diǎn)都有一個(gè)Logtail容器在運(yùn)行。
同時(shí),此方案使用了自定義標(biāo)識(shí)機(jī)器組,支持集群動(dòng)態(tài)縮容和擴(kuò)容。另外,采集配置支持通過(guò)標(biāo)簽以及環(huán)境變量過(guò)濾指定容器。
K8s內(nèi)部會(huì)注冊(cè)自定義資源CRD AliyunLogConfig,并部署ALibaba Log Controller控制器。所以,此方案支持用戶(hù)通過(guò)CRD方式或日志服務(wù)控制臺(tái)兩種方式對(duì)采集配置進(jìn)行管理。
9.2.2 運(yùn)行流程
以CRD的配置方式為例,可以把日子方案的工作流程簡(jiǎn)單總結(jié)為6個(gè)步驟,如下圖所示。
- (1)用戶(hù)使用kubectl或其他工具應(yīng)用aliyunlogconfigs CRD配置。
- (2)alibaba-log-controller監(jiān)聽(tīng)到配置更新。
- (3)alibaba-log-controller根據(jù)CRD內(nèi)容以及服務(wù)端狀態(tài),自動(dòng)向日志服務(wù)提交創(chuàng)建Logstore、創(chuàng)建配置以及創(chuàng)建應(yīng)用機(jī)器組的請(qǐng)求。
- (4)以DaemonSet模式運(yùn)行的Logtail會(huì)定期請(qǐng)求配置服務(wù)器,獲取新的或已更新的配置并進(jìn)行熱加載。
- (5)Logtail根據(jù)配置信息采集各個(gè)容器(Pod)上的標(biāo)準(zhǔn)輸出或日志文件。
- (6)最終Logtail將處理、聚合好的數(shù)據(jù)發(fā)送給日志服務(wù)。
9.2.3 配置方式
日志采集配置默認(rèn)支持控制臺(tái)配置方式,同時(shí)針對(duì)K8s微服務(wù)開(kāi)發(fā)模式,提供了CRD的配置方式,用戶(hù)可以直接使用命令行對(duì)配置進(jìn)行處理或?qū)⑵浼傻狡渌幣欧?wù)中。兩種配置方式的特點(diǎn)如下表所示。

如果剛開(kāi)始使用日志服務(wù),建議使用控制臺(tái)的配置方式,此種方式所見(jiàn)即所得,易于上手。
若后續(xù)需要將日志采集與服務(wù)或組件發(fā)布集成,建議使用CRD的配置方式,可以直接將采集配置和服務(wù)配置放在同一個(gè)Yaml文件中部署和管理。
若后續(xù)需要將日志采集于服務(wù)或組件發(fā)布集成,建議使用CRD的配置方式,可以直接將采集配置和服務(wù)配置放到同一個(gè)Yaml文件中部署和管理。
9.3 核心技術(shù)介紹
9.3.1 背景
不同于其他開(kāi)源日志采集Agent,日志服務(wù)Logtail從設(shè)計(jì)之初就已經(jīng)考慮到配置管理的難題。因此Logtail從第一個(gè)版本開(kāi)始就支持中心化的配置管理,支持在日志服務(wù)臺(tái)或者SDK中對(duì)所有采集配置進(jìn)行統(tǒng)一管理,大大降低了日志采集的管理負(fù)擔(dān)。
但在K8s集群環(huán)境下,業(yè)務(wù)應(yīng)用、服務(wù)、組件的持續(xù)集成和自動(dòng)發(fā)布已經(jīng)成為常態(tài),使用控制臺(tái)或SDK操作采集配置的方式很難與各類(lèi)CI、編排框架集成,導(dǎo)致業(yè)務(wù)應(yīng)用發(fā)布后用戶(hù)只能通過(guò)控制臺(tái)以手動(dòng)配置的方式部署與之對(duì)應(yīng)的日志采集配置。因此日志服務(wù)專(zhuān)門(mén)為K8s進(jìn)行了擴(kuò)展,用以支持原始的配置管理。
9.3.2 實(shí)現(xiàn)方式
如下圖所示,日志服務(wù)為K8s新增了一個(gè)CRD擴(kuò)展,名為AliyunLogConfig。同時(shí)開(kāi)發(fā)了alibaba-controller用于監(jiān)聽(tīng)AlilyunLogConfig事件。

當(dāng)用戶(hù)創(chuàng)建、刪除、修改AliyunLogConfig資源時(shí),alibaba-log-controller會(huì)監(jiān)聽(tīng)到資源變化,并在日志服務(wù)上創(chuàng)建、刪除、修改相應(yīng)的采集配置,以此實(shí)現(xiàn)K8s內(nèi)部AliyunLogConfig與日志服務(wù)中采集配置的關(guān)聯(lián)關(guān)系。
9.3.3 allibaba-log-controller內(nèi)部實(shí)現(xiàn)
alibaba-log-controller主要由6個(gè)模塊組成,各個(gè)模塊的功能以及依賴(lài)關(guān)系如下圖所示。

EventListener:負(fù)責(zé)監(jiān)聽(tīng)AliyunLogConfig的CRD 資源。這個(gè)EventListener是廣義上的Listener,主要功能有:
- 初始化時(shí)會(huì)羅列所有的AliyunLogConfig資源。
- 注冊(cè)AliyunLogConfig監(jiān)聽(tīng)變化的事件。
- 定期再掃描全部AliyunLogConfig資源,防止事件出現(xiàn)遺漏或處理失效。
- 將事件打包,交由EventHandler處理。
EventHandler:負(fù)責(zé)處理對(duì)應(yīng)的創(chuàng)建、刪除、修改事件,作為Controller的核心模塊,主要功能如下: - 首先檢查ConfigMapManager中對(duì)應(yīng)的Checkpoint,如該事件已經(jīng)被處理(版本號(hào)相同且狀態(tài)為200),則直接跳過(guò)。
- 為防止歷史時(shí)間干擾處理結(jié)果,從服務(wù)端拉去最新的資源狀態(tài),檢查是否為同一版本,若版本不一致,則使用服務(wù)端版本替換。
- 對(duì)事件進(jìn)行一定的預(yù)處理,使之符合LogSDK的基本格式需求。
- 調(diào)用LogSDKWrapper,創(chuàng)建日志服務(wù)Logstore,創(chuàng)建、刪除、修改對(duì)應(yīng)的配置。
- 根據(jù)上述處理結(jié)果,更新對(duì)應(yīng)的AliyunLogConfig資源的狀態(tài)。
ConfigMapManager:依賴(lài)于K8s的ConfigMap機(jī)制實(shí)現(xiàn)Controller的Checkpoint管理,包括: - 維護(hù)Checkpoint到ConfigMap的映射關(guān)系。
- 提供基礎(chǔ)的Checkpoint增刪改查接口。
LogSDKWrapper:基于阿里云LOG golang sdk的二次封裝,功能包括: - 初始化創(chuàng)建日志服務(wù)資源,包括Project、MachineGroup、OperationLogstore等。
- 將CRD資源轉(zhuǎn)換為對(duì)應(yīng)的日志服務(wù)資源操作、CRD與日志服務(wù)資源為一對(duì)多關(guān)系。
- 包裝SDK接口,自動(dòng)處理網(wǎng)絡(luò)異常、服務(wù)器異常、權(quán)限異常。
- 負(fù)責(zé)權(quán)限管理,包括自動(dòng)獲取role,更新STS Token。
ScheduledSyner:后臺(tái)的定期同步模塊,防止進(jìn)程或節(jié)點(diǎn)失效期間配置改動(dòng)而遺漏事件,保證配置管理的最終一致性: - 定期刷新所有的Checkpoint和AliyunLogConfig。
- 檢查Checkpoint和AliyunLogConfig資源的映射關(guān)系,如果Checkpoint中出現(xiàn)不存在的配置,則刪除對(duì)應(yīng)的資源。
- Monitor:alibaba-log-controller除了將本地運(yùn)行日志輸出到stdout外,還會(huì)將日志直接采集到日志服務(wù)中,便于遠(yuǎn)程排查問(wèn)題。采集日志種類(lèi)如下:
- K8s內(nèi)部異常日志
- alibaba-log-controller運(yùn)行日志
- alibaba-log-controller內(nèi)部異常數(shù)據(jù)(自動(dòng)聚合)
9.4 總結(jié)
總體來(lái)說(shuō),阿里云K8s日志解決方案做到了以下三點(diǎn):
首先打造了極致的不熟體驗(yàn),用戶(hù)只要一條命令、一個(gè)參數(shù)即可完成整個(gè)K8s集群的日志解決方案部署。
其次是支持更多配置方式,除原生控制臺(tái)、SDK配置方式外,還支持通過(guò)CRD方式進(jìn)行配置。
最后是與K8s無(wú)縫集成,采集配置支持yaml方式部署,兼容K8s各種集成方式。
