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, 和 ~ 
sizesize当日志文件到达指定的大小时才转储,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

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值