系列文章:Kubernetes日志采集最佳实践
前言
上一期主要介紹Kubernetes日志輸出的一些注意事項,日志輸出最終的目的還是做統一的采集和分析。在Kubernetes中,日志采集和普通虛擬機的方式有很大不同,相對實現難度和部署代價也略大,但若使用恰當則比傳統方式自動化程度更高、運維代價更低。
Kubernetes日志采集難點
在Kubernetes中,日志采集相比傳統虛擬機、物理機方式要復雜很多,最根本的原因是Kubernetes把底層異常屏蔽,提供更加細粒度的資源調度,向上提供穩定、動態的環境。因此日志采集面對的是更加豐富、動態的環境,需要考慮的點也更加的多。
例如:
| 日志種類 | 文件、stdout、宿主機文件、journal | 文件、journal |
| 日志源 | 業務容器、系統組件、宿主機 | 業務、宿主機 |
| 采集方式 | Agent(Sidecar、DaemonSet)、直寫(DockerEngine、業務) | Agent、直寫 |
| 單機應用數 | 10-100 | 1-10 |
| 應用動態性 | 高 | 低 |
| 節點動態性 | 高 | 低 |
| 采集部署方式 | 手動、Yaml | 手動、自定義 |
采集方式:主動 or 被動
日志的采集方式分為被動采集和主動推送兩種,在K8s中,被動采集一般分為Sidecar和DaemonSet兩種方式,主動推送有DockerEngine推送和業務直寫兩種方式。
- DockerEngine本身具有LogDriver功能,可通過配置不同的LogDriver將容器的stdout通過DockerEngine寫入到遠端存儲,以此達到日志采集的目的。這種方式的可定制化、靈活性、資源隔離性都很低,一般不建議在生產環境中使用。
- 業務直寫是在應用中集成日志采集的SDK,通過SDK直接將日志發送到服務端。這種方式省去了落盤采集的邏輯,也不需要額外部署Agent,對于系統的資源消耗最低,但由于業務和日志SDK強綁定,整體靈活性很低,一般只有日志量極大的場景中使用。
- DaemonSet方式在每個node節點上只運行一個日志agent,采集這個節點上所有的日志。DaemonSet相對資源占用要小很多,但擴展性、租戶隔離性受限,比較適用于功能單一或業務不是很多的集群。
- Sidecar方式為每個POD單獨部署日志agent,這個agent只負責一個業務應用的日志采集。Sidecar相對資源占用較多,但靈活性以及多租戶隔離性較強,建議大型的K8S集群或作為PAAS平臺為多個業務方服務的集群使用該方式。
總結下來:DockerEngine直寫一般不推薦;業務直寫推薦在日志量極大的場景中使用;DaemonSet一般在中小型集群中使用;Sidecar推薦在超大型的集群中使用。詳細的各種采集方式對比如下:
| 采集日志類型 | 標準輸出 | 業務日志 | 標準輸出+部分文件 | 文件 |
| 部署運維 | 低,原生支持 | 低,只需維護好配置文件即可 | 一般,需維護DaemonSet | 較高,每個需要采集日志的POD都需要部署sidecar容器 |
| 日志分類存儲 | 無法實現 | 業務獨立配置 | 一般,可通過容器/路徑等映射 | 每個POD可單獨配置,靈活性高 |
| 多租戶隔離 | 弱 | 弱,日志直寫會和業務邏輯競爭資源 | 一般,只能通過配置間隔離 | 強,通過容器進行隔離,可單獨分配資源 |
| 支持集群規模 | 本地存儲無限制,若使用syslog、fluentd會有單點限制 | 無限制 | 取決于配置數 | 無限制 |
| 資源占用 | 低,docker | |||
| engine提供 | 整體最低,省去采集開銷 | 較低,每個節點運行一個容器 | 較高,每個POD運行一個容器 | |
| 查詢便捷性 | 低,只能grep原始日志 | 高,可根據業務特點進行定制 | 較高,可進行自定義的查詢、統計 | 高,可根據業務特點進行定制 |
| 可定制性 | 低 | 高,可自由擴展 | 低 | 高,每個POD單獨配置 |
| 耦合度 | 高,與DockerEngine強綁定,修改需要重啟DockerEngine | 高,采集模塊修改/升級需要重新發布業務 | 低,Agent可獨立升級 | 一般,默認采集Agent升級對應Sidecar業務也會重啟(有一些擴展包可以支持Sidecar熱升級) |
| 適用場景 | 測試、POC等非生產場景 | 對性能要求極高的場景 | 日志分類明確、功能較單一的集群 | 大型、混合型、PAAS型集群 |
?
日志輸出:Stdout or 文件
和虛擬機/物理機不同,K8s的容器提供標準輸出和文件兩種方式。在容器中,標準輸出將日志直接輸出到stdout或stderr,而DockerEngine接管stdout和stderr文件描述符,將日志接收后按照DockerEngine配置的LogDriver規則進行處理;日志打印到文件的方式和虛擬機/物理機基本類似,只是日志可以使用不同的存儲方式,例如默認存儲、EmptyDir、HostVolume、NFS等。
雖然使用Stdout打印日志是Docker官方推薦的方式,但大家需要注意這個推薦是基于容器只作為簡單應用的場景,實際的業務場景中我們還是建議大家盡可能使用文件的方式,主要的原因有以下幾點:
因此我們建議線上應用使用文件的方式輸出日志,Stdout只在功能單一的應用或一些K8s系統/運維組件中使用。
CICD集成:Logging Operator
Kubernetes提供了標準化的業務部署方式,可以通過yaml(K8s API)來聲明路由規則、暴露服務、掛載存儲、運行業務、定義縮擴容規則等,所以Kubernetes很容易和CICD系統集成。而日志采集也是運維監控過程中的重要部分,業務上線后的所有日志都要進行實時的收集。
原始的方式是在發布之后手動去部署日志采集的邏輯,這種方式需要手工干預,違背CICD自動化的宗旨;為了實現自動化,有人開始基于日志采集的API/SDK包裝一個自動部署的服務,在發布后通過CICD的webhook觸發調用,但這種方式的開發代價很高。
在Kubernetes中,日志最標準的集成方式是以一個新資源注冊到Kubernetes系統中,以Operator(CRD)的方式來進行管理和維護。在這種方式下,CICD系統不需要額外的開發,只需在部署到Kubernetes系統時附加上日志相關的配置即可實現。
Kubernetes日志采集方案
早在Kubernetes出現之前,我們就開始為容器環境開發日志采集方案,隨著K8s的逐漸穩定,我們開始將很多業務遷移到K8s平臺上,因此也基于之前的基礎專門開發了一套K8s上的日志采集方案。主要具備的功能有:
安裝日志采集組件
目前這套采集方案已經對外開放,我們提供了一個Helm安裝包,其中包括Logtail的DaemonSet、AliyunlogConfig的CRD聲明以及CRD Controller,安裝之后就能直接使用DaemonSet采集以及CRD配置了。安裝方式如下:
安裝好上述組件之后,Logtail和對應的Controller就會運行在集群中,但默認這些組件并不會采集任何日志,需要配置日志采集規則來采集指定Pod的各類日志。
采集規則配置:環境變量 or CRD
除了在日志服務控制臺上手動配置之外,對于Kubernetes還額外支持兩種配置方式:環境變量和CRD。
環境變量是自swarm時代一直使用的配置方式,只需要在想要采集的容器環境變量上聲明需要采集的數據地址即可,Logtail會自動將這些數據采集到服務端。這種方式部署簡單,學習成本低,很容易上手;但能夠支持的配置規則很少,很多高級配置(例如解析方式、過濾方式、黑白名單等)都不支持,而且這種聲明的方式不支持修改/刪除,每次修改其實都是創建1個新的采集配置,歷史的采集配置需要手動清理,否則會造成資源浪費。
CRD配置方式是非常符合Kubernetes官方推薦的標準擴展方式,讓采集配置以K8s資源的方式進行管理,通過向Kubernetes部署AliyunLogConfig這個特殊的CRD資源來聲明需要采集的數據。例如下面的示例就是部署一個容器標準輸出的采集,其中定義需要Stdout和Stderr都采集,并且排除環境變量中包含COLLEXT_STDOUT_FLAG:false的容器。
基于CRD的配置方式以Kubernetes標準擴展資源的方式進行管理,支持配置的增刪改查完整語義,而且支持各種高級配置,是我們極其推薦的采集配置方式。
采集規則推薦的配置方式
實際應用場景中,一般都是使用DaemonSet或DaemonSet與Sidecar混用方式,DaemonSet的優勢是資源利用率高,但有一個問題是DaemonSet的所有Logtail都共享全局配置,而單一的Logtail有配置支撐的上限,因此無法支撐應用數比較多的集群。
上述是我們給出的推薦配置方式,核心的思想是:
實踐1-中小型集群
絕大部分Kubernetes集群都屬于中小型的,對于中小型沒有明確的定義,一般應用數在500以內,節點規模1000以內,沒有職能明確的Kubernetes平臺運維。這種場景應用數不會特別多,DaemonSet可以支撐所有的采集配置:
實踐2-大型集群
對于一些用作PAAS平臺的大型/超大型集群,一般業務在1000以上,節點規模也在1000以上,有專門的Kubernetes平臺運維人員。這種場景下應用數沒有限制,DaemonSet無法支持,因此必須使用Sidecar方式,整體規劃如下:
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的系列文章:Kubernetes日志采集最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冠赢网络:游戏盾彻底解决DDoS/CC攻
- 下一篇: 【开发者成长】每个人都在编写草率代码