再次升級!阿里雲Kubernetes日誌解決方案
來自專欄我是程序員
摘要:今天阿里雲Kubernetes日誌解決方案再次升級,為您帶來以下改進: 1、極致部署體驗:只需一條命令一個參數即可完成整個K8S集群的日誌解決方案部署。 2、支持更多配置方式:除原生控制台、SDK配置方式外,支持通過CRD方式進行配置(kubectl、控制台、K8S openapi)。
背景
針對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的配置方式。可以直接將採集配置和服務配置放到同一個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
內部異常數據(自動聚合)
快速入門
https://www.zhihu.com/video/984790695776792576
總結
阿里雲日誌服務本次帶來的提升更進一步簡化了K8S日誌採集的上手門檻以及集成體驗。讓廣大用戶真正體驗到一個字:爽,從此日誌運維人員的生活質量大大提高。
目前Logtail除支持宿主機文件、容器文件、容器stdout採集外,還支持以下多種採集方式(這些方式k8s中均支持):
- syslog採集
- Mysql binlog採集
- JDBC採集
- http採集
本文作者:元乙
原文鏈接
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※阿里雲說要「萬物智能」,夢想何時才能照進現實?
※雲棲大會以「通往智能之路」為主題,阿里雲想傳達什麼?
※YunOS已經入車,自主科技力量崛起可期
※阿里雲聆聽快訊,互通之鏈
※如何看待阿里雲布局ET大腦這件事?