陳建娟++劉行行



摘 要 在大規模云服務及系統中,對日志的收集和集中處理具有重要作用,通過分析日志可以快速定位錯誤,提前預警風險。本文結合開源日志解決方案ELK和分布式消息隊列Kafka構建了實時消息系統,闡述了各組件的主要功能及其工作原理,并利用主流的云技術Kubernetes來實現快速部署和管理,通過ETCD和SKYDNS作為服務發現,為分布式系統提供技術支撐。基于Kubernetes的分布式ELK日志分析系統具有靈活性,方便性等特點,可用于企業快速搭建日志處理平臺。
【關鍵詞】Kubernetes ELK 日志分析 分布式
大數據時代,企業的IT構架不斷擴展,資源的種類和數量也越來越多,這標志著企業IT系統建設的日趨完善,同時也意味著運維管理將面臨更大的挑戰。優秀的系統運維平臺既能實現數據平臺各組件的集中式管理、方便系統運維人員日常監測、提升運維效率,又能反饋系統運行狀態給系統開發人員。大規模云服務及系統中,日志系統是保障系統穩定運行不可或缺的一部分,通過把帶時間戳的基于時間序列的機器數據包括IT系統信息、物聯網各種傳感器信息進行集中管理,并運用實時數據處理技術對這些數據建立索引以及統計,幫助快速定位問題的根源,發現數據價值,提高工作效率。其重要性和監控系統、自動測試系統等相當。
1 ELK
目前開源的日志收集系統有很多,比如Scribe、Flume、Logstash、Fluentd等,日志存儲工具有Redis、HDFS、MangoDB、Elasticsearch等,分析軟件如Kibana、Graylog2等,構建一個強健的集中化日志管理解決方案,需要多種工具的組合。本文采用ELK+Kafka實現日志收集分析,架構如圖1所示。ELK能在大量日志中快速準確定位故障,適合應用級別的實時監控和重要核心服務的報警。
ELK是一套流行的一體化日志處理平臺解決方案,提供日志收集、處理、存儲、搜索、展示等全方位功能。由分布式搜素引擎ElasticSearch、日志采集解析工具Logstash、分析可視化平臺Kibana組成。
Logstash是Ruby編寫的一款分布式日志收集系統,利用JVM的線程功能進行并行的數據處理,支持多輸入源Input,Filter中可以使用Grok、Mutat等插件來過濾文本和匹配的字段,Output指定日志去向,可以是消息隊列、Email、全文搜索引擎等幾十種目標端。
Elasticsearch是一個強大的具有搜索功能的無模式數據庫,是一個近實時搜索平臺,基于Lucene的分布式RESTfull搜素引擎。設計用于云計算中,能夠達到實時搜索、穩定、可靠、快速、安裝使用方便。支持通過HTTP使用JSON進行數據索引。
Kibana提供日志分析的web可視化界面,利用ElasticSearch搜索功能,以秒為單位可視化數據,支持Lucene的查詢字符串的語法和Elasticsearch的過濾功能。
2 Kubernetes
隨著云計算的推進,Docker作為主流云技術地位漸漸凸顯出來。Docker 是一個開源的應用容器引擎, 讓開發者可以打包他們的應用以及依賴包到一個可移植容器中, 然后發布到任何流行的 Linux 機器上,Docker可以快速構建一個高性能、超大規模的宿主機部署,但同時也給容器內日志收集與分析帶來了挑戰。Kubernetes作為Docker生態圈中重要一員,是自動化容器操作的平臺,是Google開源的容器集群管理系統,提供資源調度、均衡容災、服務注冊、動態擴縮容等功能套件。利用Kubernetes能方便地管理跨機器運行容器化的應用。一個典型的Kubernetes架構包括Pod、Container、Label、ReplicationController、Service、Node、KubernetesMaster。基于Kubernetes的ELK只需一個部署文件,使用一條命令就可以部署多層容器的完整集群,可隨時擴展或收縮容器規模,簡化分布式系統構建的過程。圖2顯示了部署一個pod所使用的json文件,通過kubectl命令即可部署并運行一個pod,修改類型為‘ReplicationController即可實現多replicas部署。在分布式集群系統中,服務發現功能至關重要,針對企業級系統最重要的是有效地發現部署在各個物理環境中分布式的服務,以及服務發現的引擎本身要能夠集群部署。本文采用etcd+skydns的技術組合來實現服務發現,如圖3所示。
skydns會通過讀取KubernetesAPI獲取服務的ip和port信息,同時以watch的方式發現service的變動并收集變動信息,并將對應的ip信息注冊到etcd,而skydns通過etcd內的dns記錄信息,開啟對外端口提供服務。注冊和發現組件在容器中獨立運行,負責監聽端口或者連接到其他主機的端口 ,不需要編寫容器植入性代碼。可以實現服務注冊集群,以及分布式的終端部署集成。
3 日志系統框架
使用Docker部署云平臺系統非常方便,但因為容器的隔離性,收集容器內的日志很不方便。容器中應用的日志有兩個去向,日志寫到控制臺或磁盤文件,這兩部分日志數據的生命期和容器相同,容器刪除后,日志也被刪除。收集容器應用的日志可借助Docker的volume功能。在Host機器上開辟一個固定目錄/path/a,產生日志的容器將日志文件所在目錄mount到/path/a目錄下的子目錄中,收集日志的容器Logstash再把目錄/path/amount到自己容器內。這樣日志收集容器就能訪問到所有日志文件了, 如圖4所示。另外,為了收集容器的stdout、stderr日志,還需要將host的/var/lib/docker/目錄mount到日志收集容器中,可以收集到json日志。
基于Kubernetes部署ELK非常方便,有各種現成的image可用。本文將Kubernetes、ELK、Kafka深度整合,構建生產環境,組成分布式日志收集分析系統,如圖5所示。多個獨立的Logstash agent(Shipper)部署在各個不同的Host上,負責收集不同來源的數據,一個中心Logstash agent(Indexer)負責匯總和分析數據,在中心agent前配置了KafkaBroker作為緩沖區,中心agent后的Elasticsearch用于存儲和搜索數據,前端的Kibana提供豐富的圖表展示。
Shipper表示日志收集,使用Logstash收集各種來源的日志數據,可以是系統日志、文件、redis、mq等等。Broker作為遠程agent與中心agent之間的緩沖區,使用Kafka實現。Logstashagent(Shipper)作為Kafka消息的生產者時,Output 插件需要配置好KafkaBroker的列表,相當于Kafka 集群主機的列表;相應的,用作Kafka消費者角色的 Logstashagent(Indexer),從broker中提取數據,其Input插件就要配置好需要訂閱的Kafka中相應消息的主題名稱和Zookeeper主機列表,執行相關的分析和處理(Filter)。Kafka通過將數據持久化到硬盤的WriteAheadLog(WAL)保證數據可靠性與順序性。Kafka是依賴于Zookeeper的,它將每組消費者消費的相應Topic的偏移量保存在Zookeeper中, 除了可靠性和先進的Push&Pull架構外,相較于傳統的消息隊列,Kafka有更大的吞吐量。簡化的Shipper和Indexer配置如圖6和圖7所示。
Elasticsearch用于存儲最終的數據,并提供搜索功能。Kibana提供一個簡單豐富的web界面,數據來自于Elasticsearch,支持各種查詢、統計和展示,圖8為UI動態監控數據庫實例產生的各種日志。系統中設計了Syslog主要用于備份Elasticsearch的數據,并可以輸出到遠程的logserver進行存儲。
4 總結
隨著虛擬技術的不斷發展,大規模云服務及系統的日志處理平臺是保障系統穩定運行的重要部分。本文結合目前主流的kubernetes和ELK簡單介紹了各自在日志處理系統架構中的功能。日志處理平臺不僅需要收集和分析日志,還需要對相應的分析結果進行處理,比如自動報警、提前預警風險等。現實中日志應用場景多種多樣,日志處理系統需要不斷的完善和優化。
參考文獻
[1]李祥池.基于ELK和Spark Streaming的 日志分析系統設計與實現[J].電子科學技術,2015.2(06):674-678.
[2]王亞玲,李春陽,崔蔚,張晶.基于 Docker的PaaS 平臺建設[J].計算機系統應用,2016(03).
[3]理解kubernetes核心概念[J].電腦編程技巧與維護,2016(03).
作者單位
諾基亞通信系統技術(北京)有限公司 浙江省杭州市 310000