輕鬆搞定對容器例項日誌設定定期清理和回捲
說明:該文轉載自騰訊雲技術社群騰雲閣,已徵求作者本人同意。
引言
Kubernetes對於容器例項的日誌收集,並沒有提供原生的解決方案。但提供使用kubectl logs命令檢視容器例項執行時的日誌。kubectl logs命令實現的基本原理為:容器執行時預設將標準輸出和標準錯誤中的日誌輸出到磁碟上儲存。儲存至主機目錄:/var/lib/docker/containers/container_id/目錄。使用者呼叫kubectl logs命令時,kubelet讀取對應的日誌檔案中的資料,將資料回傳給master,再由master返回到使用者。從而實現使用者對日誌的檢視。
騰訊雲容器服務利用kubectl logs命令,實現在控制檯即可檢視對應容器例項的日誌,並且提供檢視某個特定時間段的日誌的功能,這極大的方便了使用者對容器例項中的程式進行定位和跟蹤。但是,由於在容器例項日誌儲存在本地,當程式中大量列印日誌時,很容易造成主機上的磁碟空間大量被佔用。在日誌服務上線一段時間後,發現使用者遇到這種情況時,一般是手動去清理日誌。我們就考慮是不是有比較簡單的方式,在叢集節點對日誌進行定期清理和回捲。
透過logrotate服務實現日誌定期清理和回捲
logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌檔案。例如,你可以設定logrotate,讓/var/log/foo日誌檔案每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。
但如果按照之前的部署方式,需要手動在每個節點上都安裝和配置對應logrotate工具。如果透過Kubernetes容器服務編排的能力,將logrotate透過Kubernetes中服務的方式部署到各個節點上,這樣既可以實現只需要一次部署,部署到所有節點。並且透過容器的方式保證了logrotate配置的一致性。
具體的實施方案如下圖所示:
方案的具體實現是在Kubernetes叢集中,建立DaemonSet資源實現。DaemonSet資源會在每個Node節點上都部署一個logrotate的容器例項,並且在容器例項中設定對映主機的log日誌目錄,從而實現日誌的定時清理和回捲。
建立DaemonSet的示例如下:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: logrotate
spec:
template:
metadata:
labels:
app: logging
id: logrotate
name: logrotate
spec:
containers:
- name: logrotate-es
image: blacklabelops/logrotate
securityContext:
privileged: true
volumeMounts:
- name: containers
mountPath: /var/lib/docker/containers
- name: varlog
mountPath: /var/log/docker
- name: logs
mountPath: /logs
env:
- name: LOGS_DIRECTORIES
value: "/var/lib/docker/containers /var/log/docker"
- name: LOGROTATE_INTERVAL
value: "hourly"
- name: LOGROTATE_OLDDIR
value: "/logs"
volumes:
- hostPath:
path: /var/lib/docker/containers
name: containers
- hostPath:
path: /var/log/docker
name: varlog
- hostPath:
path: /var/log/containers/
name: logs
使用這個yaml檔案,可以直接在Kubernetes中進行部署。
# kubectl create -f logrotate_ds.yamldaemonset "logrotate" created
在示例的yaml檔案中,logrotate服務將按照定時(1小時)的對日誌進行回捲,回捲超過5個副本後則會對日誌進行清理。如果有需要,可以修改相應的引數,設定不同的回捲規則和清理規則。詳細的引數說明可以參考:。
透過修改dockerd引數進行回捲和清理
由於Kubernetes的日誌收集,底層是透過docker來實現。而docker提供了一定的日誌回捲和清理功能。可以透過在dockerd的啟動引數中,增加log-opts()引數實現對日誌的回捲和清理,其中max-size引數設定日誌一個副本的最大值,max-file設定日誌的最大的副本數。超過這個副本數則會對日誌進行刪除。
具體的修改過程包括三個步驟:
1、建立/etc/dockerd/daemon.json
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"10m","max-file":"3"
}
}
引數說明: 設定單個容器日誌超過10M則進行回捲,回捲的副本數超過3個就進行清理。
2、修改dockerd 服務配置檔案
在 /etc/systemd/system/multi-user.target.wants/dockerd.serviced檔案中
新增dockerd啟動引數--config-file=/etc/docker/daemon.json
3、重新啟動dockerd服務
systemctl daemon-reload
service dockerd restart
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31483116/viewspace-2144394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DophinScheduler 如何定期刪除日誌例項?
- ELK日誌定期清理 ES索引資料索引
- docker 容器日誌清理方案Docker
- 海豚排程清理:使用 API 輕鬆清理工作流歷史版本記錄,一鍵減少關係日誌和任務定義日誌表的資料量API
- 輕鬆定位硬體故障方法-日誌分析
- 在ECS上輕鬆搭建RDS的從例項
- eclipse設定檢視GC日誌和如何理解GC日誌EclipseGC
- IT小白也能輕鬆get日誌服務---使用Nginx模式採集日誌Nginx模式
- 如何輕鬆搞定光纖熔接
- Docker 日誌自動輪轉和清理配置Docker
- Nginx日誌格式設定Nginx
- 佔用磁碟100%?Apache DolphinScheduler 日誌如何定時清理!Apache
- 智慧工具+海量模板幫你輕鬆搞定主圖設計!
- Oracle歸檔日誌清理Oracle
- 三個例項演示 Java Thread Dump 日誌分析Javathread
- Linux 使用 crontab 定時拆分日誌、清理過期檔案Linux
- 輕鬆搞定專案流程自動化
- Oracle 例項和RAC叢集下資料庫日誌目錄合集Oracle資料庫
- SVN提交日誌模板設定
- 設定mybatis 是否列印日誌MyBatis
- 輕鬆保障萬級例項,vivo服務端監控體系建設實踐服務端
- 智慧摳圖+海量模板=輕鬆搞定主圖設計的工具!
- 2018網頁UI設計:輕鬆搞定視覺層次感網頁UI視覺
- 結合 AOP 輕鬆處理事件釋出處理日誌事件
- 日誌檔案過大清理
- AUTOCAD——捲軸設定
- Docker 容器日誌分析Docker
- WPF中輕鬆生成動態圖表:例項詳解(MVVM模式)MVVM模式
- 3D 穿梭效果?使用 CSS 輕鬆搞定3DCSS
- MySQL8.0輕鬆搞定GTID組複製MySql
- Jenkins部署安裝,輕鬆三步搞定Jenkins
- 電商直播主圖設計素材,輕鬆搞定直播懸浮窗設計!
- 最火UI素材|短視訊、直播APP套件,輕鬆搞定設計UIAPP套件
- 【TUNE_ORACLE】Oracle檢查點(四)檢查點對redo日誌的影響和redo日誌大小設定建議Oracle
- 容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌Docker
- zookeeper 清理snapshot及事務日誌
- SQL Server誤區 一個例項多個映象和日誌傳送延遲SQLServer
- 全是乾貨!千鋒UI設計全套影片合集讓你輕鬆搞定設計UI
- 一文輕鬆搞定 tarjan 演算法(二)演算法