再次升級!阿裏雲Kubernetes日誌解決方案
背景
針對K8S日誌采集存在的采集目標多、彈性伸縮難、運維成本大、侵入性高、采集性能低等問題,在18年2月份日誌服務和容器服務團隊一起發布了阿裏雲Kubernetes日誌解決方案。1分鐘內即可完成整個集群部署,實現該節點上宿主機日誌、容器日誌、容器stdout等所有數據源的一站式采集。並且後續集群動態伸縮無需對采集做任何二次部署。
今天阿裏雲Kubernetes日誌解決方案再次升級,為您帶來以下改進:
極致部署體驗:只需一條命令一個參數即可完成整個K8S集群的日誌解決方案部署。
支持更多配置方式:除原生控制臺、SDK配置方式外,支持通過CRD方式進行配置(kubectl、控制臺、K8S openapi)。
K8S無縫集成:采集配置支持yaml方式部署,兼容K8S各種集成方式。
日誌服務介紹
阿裏雲的日誌服務(log service)是針對日誌類數據的一站式服務,2013年研發,有5年多線上運行經驗,經歷雙十一、新春紅包等考驗。日誌采集Agent Logtail運行在100W+機器上,為萬級別應用提供服務。主要特點如下:
日誌服務主要包括 實時采集與消費、數據投遞、查詢與實時分析 等功能,接下來我們介紹下如何利用日誌服務進行Kubernetes日誌采集。
Kubernetes日誌采集方案介紹
方案簡介
阿裏雲Kubernetes日誌采集方案如上圖所示:
K8S的每個worker 節點都會運行一個Logtail容器,該容器可采集宿主機以及該宿主機上其他容器的日誌(包括標準輸出和日誌文件)。
Logtail以daemon set模式運行,保證每個節點都有一個Logtail容器在運行
使用自定義標識機器組,支持集群動態縮/擴容
所有的采集配置支持通過docker lable以及環境變量過濾指定容器
K8S內部會註冊自定義資源(CRD,CustomResourceDefinition)AliyunLogConfig,並部署alibaba-log-controller
支持用戶通過CRD方式或日誌服務控制臺對采集配置進行管理
運行流程
以CRD配置方式為例,內部工作流程如下:
用戶使用
kubectl
或其他工具應用aliyunlogconfigs CRD配置。alibaba-log-controller監聽到配置更新。
alibaba-log-controller根據CRD內容以及服務端狀態,自動向日誌服務提交logstore創建、配置創建以及應用機器組的請求。
以DaemonSet模式運行的Logtail會定期請求配置服務器,獲取新的或已更新的配置並進行熱加載。
Logtail根據配置信息采集各個容器(POD)上的標準輸出或日誌文件。
最終Logtail將處理、聚合好的數據發送到日誌服務。
部署方法
阿裏雲Kubernetes用戶只需一條命令即可完成日誌采集部署,命令中只需輸入一個參數。
開通阿裏雲日誌服務,日誌服務開通鏈接。
登錄您的阿裏雲容器服務Kubernetes的Master節點,如何登錄參考SSH訪問集群。
將下述命令中的
${your_k8s_cluster_id}
替換為您的Kubernetes集群id,執行此命令。
wget http://logtail-release.oss-cn-hangzhou.aliyuncs.com/linux64/alicloud-log-k8s-install.sh -O alicloud-log-k8s-install.sh; chmod 744 ./alicloud-log-k8s-install.sh; sh ./alicloud-log-k8s-install.sh ${your_k8s_cluster_id}
非阿裏雲Kubernetes用戶也支持,請參考Kubernetes日誌采集
配置方式
日誌采集配置默認支持控制臺配置方式,同時針對Kubernetes微服務開發模式,我們還提供CRD的配置方式,您可以直接使用kubectl對配置進行管理或集成到其他編排服務。兩種配置方式特點如下:
CRD方式 | 控制臺方式 | |
---|---|---|
操作復雜度 | 低 | 一般 |
功能項 | 支持除控制臺方式外的高級配置 | 一般 |
上手難度 | 一般 | 低 |
網絡連接 | 連接Kubernetes集群 | 連接互聯網 |
與組件/應用部署集成 | 支持 | 不支持 |
鑒權方式 | Kubernetes鑒權 | 雲賬號鑒權 |
如果您剛開始使用日誌服務,建議使用控制臺的配置方式,此種方式所見即所得,非常易於上手。
若後續您需要將日誌采集與服務/組件發布集成,建議使用CRD的配置方式。可以直接將采集配置和服務配置放到同一個yaml文件部署和管理。
方案優勢
相比其他采集方案,日誌服務Kubernetes采集方案具備以下優勢:
核心技術介紹
在上一篇阿裏雲Kubernetes日誌解決方案中我們對容器數據采集、自定義標識機器組等技術做了相關的介紹。本次主要為大家帶來日誌采集配置與K8S無縫集成的技術實現。
K8S無縫集成
問題背景
不同於其他開源日誌采集Agent,日誌服務Logtail從設計之初就已經考慮到配置管理的難題。因此Logtail從第一個版本發布就支持中心化的配置管理。支持在日誌服務控制臺或者SDK遠程對所有采集配置進行統一管理,大大降低了日誌采集的管理負擔。
但在K8S集群環境下,業務應用/服務/組件的持續集成和自動發布已經成為常態,使用控制臺或SDK操作采集配置的方式很難與各類CI、編排框架集成,導致業務應用發布後用戶只能通過控制臺手動配置的方式部署與之對應的日誌采集配置。
因此日誌服務專門為K8S進行了擴展,用以支持原始的配置管理。
實現方式
如上圖所示,日誌服務為K8S新增了一個CustomResourceDefinition擴展,名為AliyunLogConfig
。同時開發了alibaba-log-controller
用於監聽AliyunLogConfig
事件。
當用戶創建/刪除/修改AliyunLogConfig
資源時,alibaba-log-controller
會監聽到資源變化,並對應的在日誌服務上創建/刪除/修改相應的采集配置。以此實現K8S內部AliyunLogConfig
與日誌服務中采集配置的關聯關系。
alibaba-log-controller內部實現
alibaba-log-controller
主要由6個模塊組成,各個模塊的功能以及依賴關系如上圖所示:
EventListener:負責監聽
AliyunLogConfig
的CRD資源。這個EventListener是廣義上的listener,主要功能有初始化時會list所有的
AliyunLogConfig
資源註冊
AliyunLogConfig
監聽變化的事件定期再掃描全量的
AliyunLogConfig
資源防止事件出現遺漏或處理失效將事件打包,交由EventHandler處理
EventHandler:負責處理對應的Create/Update/Delete事件,作為Controller的核心模塊,主要功能如下:
首先檢查ConfigMapManager中對應的checkpoint,如該事件已經被處理(版本號相同且狀態為200),則直接跳過
為防止歷史事件幹擾處理結果,從服務端拉取最新的資源狀態,檢查是否為同一版本,若版本不一致,使用服務端版本替換
對事件進行一定的預處理,使之符合LogSDK的基本格式需求
調用LogSDKWrapper,創建日誌服務Logstore,Create/Update/Delete對應的配置
根據上述處理結果,更新對應
AliyunLogConfig
資源的狀態ConfigMapManager:依賴於K8S的ConfigMap機制實現Controller的checkpoint管理,包括:
維護checkpoint到ConfigMap的映射關系
提供基礎的checkpoint增刪改查接口
LogSDKWrapper:基於阿裏雲LOG golang sdk的二次封裝,功能包括:
初始化創建日誌服務資源,包括Project、MachineGroup、Operation Logstore等
將CRD資源轉換為對應的日誌服務資源操作,為1對多關系
包裝SDK接口,自動處理網絡異常、服務器異常、權限異常
負責權限管理,包括自動獲取role,更新sts token等
ScheduledSyner:後臺的定期同步模塊,防止進程/節點失效期間配置改動而遺漏事件,保證配置管理的最終一致性:
定期刷新所有的checkpoint和
AliyunLogConfig
檢查checkpoint和
AliyunLogConfig
資源的映射關系,如果checkpoint中出現不存在的配置,則刪除對應的資源Monitor:
alibaba-log-controller
除了將本地運行日誌輸出到stdout外,還會將日誌直接采集到日誌服務,便於遠程排查問題。采集日誌種類如下:k8s api內部異常日誌
alibaba-log-controller
運行日誌alibaba-log-controller
內部異常數據(自動聚合)
總結
阿裏雲日誌服務本次帶來的提升更進一步簡化了K8S日誌采集的上手門檻以及集成體驗。讓廣大用戶真正體驗到一個字:爽,從此日誌運維人員的生活質量大大提高。
目前Logtail除支持宿主機文件、容器文件、容器stdout采集外,還支持以下多種采集方式(這些方式k8s中均支持):
syslog采集
Mysql binlog采集
JDBC采集
http采集
原文鏈接
再次升級!阿裏雲Kubernetes日誌解決方案