在腾讯云容器服务中对容器实例日志设置定期清理和回卷

引言

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.yaml
daemonset "logrotate" created

在示例的yaml文件中,logrotate服务将按照定时(1小时)的对日志进行回卷,回卷超过5个副本后则会对日志进行清理。如果有需要,可以修改相应的参数,设置不同的回卷规则和清理规则。详细的参数说明可以参考:https://github.com/blacklabelops/logrotate。

通过修改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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FH云彩

网站服务器错误代码介绍

3494
来自专栏北京马哥教育

原创投稿 | 详解Mysql数据库恢复误删除数据

糖豆贴心提醒,本文阅读时间5分钟 血的教训,事发经过就不详述了。直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好备份),以下是Mysql数据后...

3519
来自专栏openshift持续集成

openshift镜像构建-s2i环境变量设置

源码构建的时候我们可以在应用程序内设置环境变量的值(每行一个),方法是在源码库的.s2i / environment文件中指定它们。这个文件中指定的环境变量在构...

5087
来自专栏王磊的博客

Ext.grid.CheckboxSelectionModel状态设置

直接上代码: var model = grid.getSelectionModel(); model.selectAll();//选择所有行 model.sel...

3778
来自专栏云计算教程系列

如何在Ubuntu上部署Elixir-Phoenix MySQL应用程序

在本教程中,您将使用Phoenix-Ecto和Mariaex配置现有的Phoenix应用程序连接到MySQL数据库。Ecto是Phoenix应用程序广泛使用的数...

3192
来自专栏散尽浮华

Linux系统批量化安装部署之Cobbler

说明: Cobbler服务器系统:CentOS 5.10 64位 IP地址:192.168.21.128 需要安装部署的Linux系统: eth0(第一块网卡,...

2258
来自专栏DeveWork

记录一个在Mac OS X 中本地安装Ghost 的报错问题

新买的Macbook Air 升级了最新版的OS X 10.10 Yosemite,昨天在本地安装Ghost 的时候出现了问题,在这里做一个记录。 安装node...

2519
来自专栏云计算教程系列

如何在一个Ubuntu 18.04服务器上将Nginx配置为Web服务器和Apache的反向代理

Apache和Nginx是目前比较流行的两种常用于PHP的开源Web服务器。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个...

7020
来自专栏大魏分享(微信公众号:david-share)

红帽技术干货速递系列之1:RHV4实验环境快速部署指南

大卫说: 本文是大卫同事马林根据实验完成的RHV4.0 step by step的安装步骤。这对于我们在PoC环境中部署RHV有很大的帮助。大卫也欢迎读者朋友们...

3984

注册和使用服务器的教程

几周前我们很高兴地宣布云服务器产品上线。对于Cloud 66客户来说,将十分容易使用公有云或私有云。今天,我将提供一个关于如何使用的简短教程。

3488

扫码关注云+社区

领取腾讯云代金券