k8s 的日志旋转方案

本文介绍,如何管理k8s中的POD的标准输出,防止出现应用系统磁盘存储空间使用率100%的问题。

在docker中,程序是不可以后台运行的,而程序在运行时又会产生一些必要的标准输出,并存储起来以便排查问题所需。那当程序以docker运行时,就有可能会出现两份日志,一份程序自行定义的日志输出,一份来自docker的标准输出和错误输出日志。这样会被系统磁盘造成比较大的压力。

在独立的docker系统 中,我们可以使用配置命令行参数来控制docker默认的标准输出,关闭docker的标准输出或者控制日志个数,日志大小)来达成日志的旋转。

#默认的docker日志级别
--log-driver=json-file

#关闭日志输出
--log-driver=none


#日志控制到10m大小,最多保存2个日志文件
--log-opt max-size=10m --log-opt max-file=2

在k8s当中,在启动pod时,就没办法去修改上面这样的参数,如果全范围的修改docker的默认参数也不太好。因此,就需要借助其它的工具来完成日志的旋转。减轻磁盘的存储压力。

logrotate是linux系统中自带的日志工具,本文介绍如何使用它来完成POD日志的旋转。

我们去logrotate的配置目录下,新建一个文件,叫logrotate-test,内容如下

/var/lib/docker/containers/*/*-json.log {
	create 0644 root root
	notifempty
	missingok
	copytruncate
	noolddir
	rotate 2
	size=5M
}

logrotate 配置文件: /etc/logrotate.conf

配置参数 功能说明
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate 备份日志文件但是不截断
create mode owner group  转储文件,使用指定的文件模式创建新的日志文件。轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩
errors address  专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address  把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript

在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;这两个关键字必须单独成行;
postrotate/endscript 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行;
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的个数,0 指没有备份,5 指保留5个备份
tabootext [+] list 让logrotate  不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 
size size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
missingok 如果日志丢失,不报错继续滚动下一个日志
notifempty 当日志文件为空时,不进行轮转
sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
dateext 使用当期日期作为命名格式
dateformat .%s  配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).

当日志文件 >= log-size 的时候就转储。
以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

 

logrotate默认是一天执行一次,我们肯定不满足这样,所以可以通过定时任务来调度logrotate.

*/5 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/logrotate-test


 

这样,当logrotate完成日志旋转的时候,也不会影响docker logs的标准输出,也减轻了磁盘存储的压力。也不需要去配置k8s,当pod运行时,pod的标准输出日志就会被logrotate接管。

 

挺好。。。END

 

 

你可能感兴趣的:(Kubenetes,logrotate,docker,k8s)