再次升級!阿里雲Kubernetes日誌解決方案

摘要: 今天阿里雲Kubernetes日誌解決方案再次升級,爲您帶來如下改進: 一、極致部署體驗:只需一條命令一個參數便可完成整個K8S集羣的日誌解決方案部署。 二、支持更多配置方式:除原生控制檯、SDK配置方式外,支持經過CRD方式進行配置(kubectl、控制檯、K8S openapi)。html

背景

針對K8S日誌採集存在的採集目標多、彈性伸縮難、運維成本大、侵入性高、採集性能低等問題,在18年2月份日誌服務和容器服務團隊一塊兒發佈了阿里雲Kubernetes日誌解決方案。1分鐘內便可完成整個集羣部署,實現該節點上宿主機日誌、容器日誌、容器stdout等全部數據源的一站式採集。而且後續集羣動態伸縮無需對採集作任何二次部署。linux

今天阿里雲Kubernetes日誌解決方案再次升級,爲您帶來如下改進:golang

  • 極致部署體驗:只需一條命令一個參數便可完成整個K8S集羣的日誌解決方案部署。
  • 支持更多配置方式:除原生控制檯、SDK配置方式外,支持經過CRD方式進行配置(kubectl、控制檯、K8S openapi)。
  • K8S無縫集成:採集配置支持yaml方式部署,兼容K8S各類集成方式。

日誌服務介紹

阿里雲的日誌服務(log service)是針對日誌類數據的一站式服務,2013年研發,有5年多線上運行經驗,經歷雙11、新春紅包等考驗。日誌採集Agent Logtail運行在100W+機器上,爲萬級別應用提供服務。主要特色以下:sql

日誌服務主要包括 實時採集與消費、數據投遞、查詢與實時分析 等功能,接下來咱們介紹下如何利用日誌服務進行Kubernetes日誌採集。
docker

Kubernetes日誌採集方案介紹

方案簡介

阿里雲Kubernetes日誌採集方案如上圖所示:api

  • K8S的每一個worker 節點都會運行一個Logtail容器,該容器可採集宿主機以及該宿主機上其餘容器的日誌(包括標準輸出和日誌文件)。
  • Logtail以daemon set模式運行,保證每一個節點都有一個Logtail容器在運行
  • 使用自定義標識機器組,支持集羣動態縮/擴容
  • 全部的採集配置支持經過docker lable以及環境變量過濾指定容器
  • K8S內部會註冊自定義資源(CRD,CustomResourceDefinition)AliyunLogConfig,並部署alibaba-log-controller
  • 支持用戶經過CRD方式或日誌服務控制檯對採集配置進行管理

運行流程

以CRD配置方式爲例,內部工做流程以下:服務器

  1. 用戶使用kubectl或其餘工具應用aliyunlogconfigs CRD配置。
  2. alibaba-log-controller監聽到配置更新。
  3. alibaba-log-controller根據CRD內容以及服務端狀態,自動向日誌服務提交logstore建立、配置建立以及應用機器組的請求。
  4. 以DaemonSet模式運行的Logtail會按期請求配置服務器,獲取新的或已更新的配置並進行熱加載。
  5. Logtail根據配置信息採集各個容器(POD)上的標準輸出或日誌文件。
  6. 最終Logtail將處理、聚合好的數據發送到日誌服務。

部署方法

阿里雲Kubernetes用戶只需一條命令便可完成日誌採集部署,命令中只需輸入一個參數。網絡

  1. 開通阿里雲日誌服務,日誌服務開通連接
  2. 登陸您的阿里雲容器服務Kubernetes的Master節點,如何登陸參考SSH訪問集羣
  3. 將下述命令中的${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微服務開發模式,咱們還提供CRD的配置方式,您能夠直接使用kubectl對配置進行管理或集成到其餘編排服務。兩種配置方式特色以下:app

  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中均支持):

  1. syslog採集
  2. Mysql binlog採集
  3. JDBC採集
  4. http採集

原文連接

相關文章
相關標籤/搜索