前言html
上一期主要介紹Kubernetes日誌輸出的一些注意事項,日誌輸出最終的目的仍是作統一的採集和分析。在Kubernetes中,日誌採集和普通虛擬機的方式有很大不一樣,相對實現難度和部署代價也略大,但若使用恰當則比傳統方式自動化程度更高、運維代價更低。node
Kubernetes日誌採集難點web
在Kubernetes中,日誌採集相比傳統虛擬機、物理機方式要複雜不少,最根本的緣由是Kubernetes把底層異常屏蔽,提供更加細粒度的資源調度,向上提供穩定、動態的環境。所以日誌採集面對的是更加豐富、動態的環境,須要考慮的點也更加的多。docker
例如:緩存
Kubernetes傳統方式日誌種類文件、stdout、宿主機文件、journal文件、journal日誌源業務容器、系統組件、宿主機業務、宿主機採集方式Agent(Sidecar、DaemonSet)、直寫(DockerEngine、業務)Agent、直寫單機應用數10-1001-10應用動態性高低節點動態性高低採集部署方式手動、Yaml手動、自定義運維
採集方式:主動 or 被動異步
日誌的採集方式分爲被動採集和主動推送兩種,在K8s中,被動採集通常分爲Sidecar和DaemonSet兩種方式,主動推送有DockerEngine推送和業務直寫兩種方式。ide
總結下來:DockerEngine直寫通常不推薦;業務直寫推薦在日誌量極大的場景中使用;DaemonSet通常在中小型集羣中使用;Sidecar推薦在超大型的集羣中使用。詳細的各類採集方式對好比下:性能
DockerEngine業務直寫DaemonSet方式Sidecar方式採集日誌類型標準輸出業務日誌標準輸出+部分文件文件部署運維低,原生支持低,只需維護好配置文件便可通常,需維護DaemonSet較高,每一個須要採集日誌的POD都須要部署sidecar容器日誌分類存儲沒法實現業務獨立配置通常,可經過容器/路徑等映射每一個POD可單獨配置,靈活性高多租戶隔離弱弱,日誌直寫會和業務邏輯競爭資源通常,只能經過配置間隔離強,經過容器進行隔離,可單獨分配資源支持集羣規模本地存儲無限制,若使用syslog、fluentd會有單點限制無限制取決於配置數無限制資源佔用低,dockerengine提供總體最低,省去採集開銷較低,每一個節點運行一個容器較高,每一個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方式,總體規劃以下:
上雲就看雲棲號:更多雲資訊,上雲案例,最佳實踐,產品入門,訪問:https://yqh.aliyun.com/
本文爲阿里雲原創內容,未經容許不得轉載。