Kubernetes日誌採集Sidecar模式介紹
Kubernetes(K8S)作為CNCF(cloud native computing foundation)的一個核心專案, 背靠Google和Redhat的強大社群, 近兩年發展十分迅速,在成為容器編排領域中領導者的同時,也正在朝著PAAS底座標配的方向發展。
日誌採集方式
日誌作為任一系統不可或缺的部分,在K8S的官方文件中也介紹了多種的 ofollow,noindex" target="_blank">日誌採集形式 ,總結起來主要有下述3種:原生方式、DaemonSet方式和Sidecar方式。
- 原生方式:使用
kubectl logs
直接在檢視本地保留的日誌,或者通過docker engine的log driver
把日誌重定向到檔案、syslog、fluentd等系統中。 - DaemonSet方式:在K8S的每個node上部署日誌agent,由agent採集所有容器的日誌到服務端。
- Sidecar方式:一個POD中執行一個sidecar的日誌agent容器,用於採集該POD主容器產生的日誌。
採集方式對比
每種採集方式都有一定的優劣勢,這裡我們進行簡單的對比:
原生方式 |
DaemonSet方式 |
Sidecar方式 |
|
採集日誌型別 |
標準輸出 |
標準輸出+部分檔案 |
檔案 |
部署運維 |
低,原生支援 |
一般,需維護DaemonSet |
較高,每個需要採集日誌的POD都需要部署sidecar容器 |
日誌分類儲存 |
無法實現 |
一般,可通過容器/路徑等對映 |
每個POD可單獨配置,靈活性高 |
多租戶隔離 |
弱 |
一般,只能通過配置間隔離 |
強,通過容器進行隔離,可單獨分配資源 |
支援叢集規模 |
本地儲存無限制,若使用syslog、fluentd會有單點限制 |
中小型規模,業務數最多支援百級別 |
無限制 |
資源佔用 |
低,docker engine提供 |
較低,每個節點執行一個容器 |
較高,每個POD執行一個容器 |
查詢便捷性 |
低 |
較高,可進行自定義的查詢、統計 |
高,可根據業務特點進行定製 |
可定製性 |
低 |
低 |
高,每個POD單獨配置 |
適用場景 |
測試、POC等非生產場景 |
功能單一型的叢集 |
大型、混合型、PAAS型叢集 |
從上述表格中可以看出:
- 原生方式相對功能太弱,一般不建議在生產系統中使用,否則問題調查、資料統計等工作很難完成;
- DaemonSet方式在每個節點只允許一個日誌agent,相對資源佔用要小很多,但擴充套件性、租戶隔離性受限,比較適用於功能單一或業務不是很多的叢集;
- Sidecar方式為每個POD單獨部署日誌agent,相對資源佔用較多,但靈活性以及多租戶隔離性較強,建議大型的K8S叢集或作為PAAS平臺為多個業務方服務的叢集使用該方式。
日誌服務K8S採集方式
DaemonSet和Sidecar模式各有優缺點,目前沒有哪種方式可以適用於所有場景。因此我們阿里雲日誌服務同時支援了DaemonSet以及Sidecar兩種方式,並對每種方式進行了一些額外的改進,更加適用於K8S下的動態場景。
這兩種模式均基於Logtail實現, 日誌服務客戶端Logtail目前已有百萬級部署,每天採集上萬應用、數PB的資料,歷經多次雙11、雙12考驗。相關技術分享可以參見文章: 多租戶隔離技術+雙十一實戰效果 , Polling + Inotify 組合下的日誌保序採集方案 。
DaemonSet採集方式
DaemonSet方式下Logtail做了非常多的適配工作,包括:
- 一條命令一個引數即可實現部署,資源自動初始化
- 支援CRD方式配置,支援K8S控制檯、kubectl、kube api等,與K8S釋出、部署無縫整合
- K8S RBAC鑑權,日誌服務STS鑑權管理
Sidecar採集方式
sidecar方式的配置以及使用相對在虛擬機器/物理機上採集資料區別不大,從Logtail容器視角來看:Logtail工作在一個“虛擬機器”上,需要採集這個機器上某個/某些日誌檔案。
但在容器場景下還需解決兩個問題:
- 配置:使用編排的方式配置agent容器
- 動態性:需適應POD的IP地址和hostname的變化
目前Logtail的容器支援通過環境變數配置相關引數,並支援自定義標識的機器組進行工作,可以完美解決上述兩個問題。
Sidecar配置示例
Sidecar模式下日誌元件安裝、配置方式如下:
步驟一: 部署Logtail容器
- 在部署POD時將日誌路徑掛載到本地,並將對應的volume也掛載到Logtail容器。
- Logtail容器需配置
ALIYUN_LOGTAIL_USER_ID
、ALIYUN_LOGTAIL_CONFIG
、ALIYUN_LOGTAIL_USER_DEFINED_ID
,引數含義以及值的選取參見:標準Docker日誌採集。
tips:
- Logtail容器建議配置健康檢查,在執行環境、核心等出現異常時可自動恢復。
- 示例中使用的Logtail映象訪問的是阿里雲hangzhou公網映象倉庫,您可根據需求替換成本Region的映象,並使用內網方式。
apiVersion: batch/v1 kind: Job metadata: name: nginx-log-sidecar-demo namespace: kube-system spec: template: metadata: name: nginx-log-sidecar-demo spec: # volumes配置 volumes: - name: nginx-log emptyDir: {} containers: # 主容器配置 - name: nginx-log-demo image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest command: ["/bin/mock_log"] args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"] volumeMounts: - name: nginx-log mountPath: /var/log/ngin # Logtail的Sidecar容器配置 - name: logtail image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest env: # aliuid - name: "ALIYUN_LOGTAIL_USER_ID" value: "165421******3050" # 自定義標識機器組配置 - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID" value: "nginx-log-sidecar" # 啟動配置(用於選擇Logtail所在Region) - name: "ALIYUN_LOGTAIL_CONFIG" value: "/etc/ilogtail/conf/cn-hangzhou/ilogtail_config.json" # 和主容器共享volume volumeMounts: - name: nginx-log mountPath: /var/log/nginx # 健康檢查 livenessProbe: exec: command: - /etc/init.d/ilogtaild - status initialDelaySeconds: 30 periodSeconds: 30
步驟二: 配置機器組
如下圖所示,在日誌服務控制檯建立一個Logtail的機器組,機器組選擇自定義標識,可以動態適應POD ip地址的改變。具體操作步驟如下:
- 開通日誌服務並建立Project、Logstore,詳細步驟請參考準備流程。
- 在日誌服務控制檯的機器組列表頁面單擊建立機器組。
- 選擇使用者自定義標識,將您上一步配置的
ALIYUN_LOGTAIL_USER_DEFINED_ID
填入使用者自定義標識內容框中。
步驟三:配置採集方式
機器組建立完成後,即可配置對應檔案的採集配置,目前支援極簡、Nginx訪問日誌、分隔符日誌、JSON日誌、正則日誌等格式,具體可參考:文字日誌配置方式。本示例中配置如下:
步驟四:查詢日誌
採集配置完成並應用到機器組後,1分鐘內日誌即可採集上來,進入對應logstore的查詢頁面即可查詢到採集上來的日誌。
日誌進階
阿里雲日誌服務針對日誌提供了完整的解決方案,日誌採集只是其中的第一步,以下相關功能是日誌進階的必備良藥:
- 日誌上下文查詢: https://help.aliyun.com/document_detail/48148.html
- 快速查詢: https://help.aliyun.com/document_detail/88985.html
- 實時分析: 3608.html" rel="nofollow,noindex" target="_blank">https://help.aliyun.com/document_detail/53608.html
- 快速分析: https://help.aliyun.com/document_detail/66275.html
- 基於日誌設定告警: https://help.aliyun.com/document_detail/48162.html
- 配置大盤: https://help.aliyun.com/document_detail/69313.html
更多日誌進階內容可以參考:日誌服務學習路徑。