轻松搞定对容器实例日志设置定期清理和回卷

企业动态
Kubernetes对于容器实例的日志收集,并没有提供原生的解决方案。但提供使用kubectl logs命令查看容器实例运行时的日志。kubectl logs命令实现的基本原理为:容器运行时默认将标准输出和标准错误中的日志输出到磁盘上保存。

引言

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的示例如下:

  1. apiVersion: extensions/v1beta1 
  2. kind: DaemonSet 
  3. metadata: 
  4.   name: logrotate 
  5. spec: 
  6.   template: 
  7.     metadata: 
  8.       labels: 
  9.         app: logging 
  10.         id: logrotate 
  11.       name: logrotate 
  12.     spec: 
  13.       containers: 
  14.       - name: logrotate-es 
  15.         image: blacklabelops/logrotate 
  16.         securityContext: 
  17.           privileged: true 
  18.         volumeMounts: 
  19.          - name: containers 
  20.            mountPath: /var/lib/docker/containers 
  21.          - name: varlog 
  22.            mountPath: /var/log/docker 
  23.          - name: logs 
  24.            mountPath: /logs 
  25.         env: 
  26.         - name: LOGS_DIRECTORIES 
  27.           value: "/var/lib/docker/containers /var/log/docker" 
  28.         - name: LOGROTATE_INTERVAL 
  29.           value: "hourly" 
  30.         - name: LOGROTATE_OLDDIR 
  31.           value: "/logs" 
  32.       volumes: 
  33.          - hostPath: 
  34.              path: /var/lib/docker/containers 
  35.            name: containers 
  36.          - hostPath: 
  37.              path: /var/log/docker 
  38.            name: varlog 
  39.          - hostPath: 
  40.              path: /var/log/containers/ 
  41.            name: logs 

使用这个yaml文件,可以直接在Kubernetes中进行部署。

  1. # kubectl create -f logrotate_ds.yaml 
  2. 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

  1.   "log-driver":"json-file"
  2.   "log-opts":{ 
  3.     "max-size" :"10m","max-file":"3" 
  4.     } 

参数说明: 设置单个容器日志超过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

原文链接:https://cloud.tencent.com/community/article/579587

【本文是51CTO专栏作者“腾讯云技术社区”的原创稿件,转载请通过51CTO联系原作者获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2009-12-11 15:37:58

Linux日志处理

2010-09-17 14:04:14

JVM内存设置

2016-03-17 17:35:15

云容器虚拟化管理Docker

2022-10-12 08:01:08

MySQL日志数据库

2010-01-21 16:57:35

交换机网关设置

2022-03-06 10:56:00

WizTree工具硬盘

2011-07-08 09:57:36

2017-05-11 15:01:43

Androidweb布局

2011-11-21 15:04:30

2009-07-16 16:51:49

JDBC连接设置

2022-09-16 08:04:25

阿里云权限网络

2010-05-18 11:28:57

MySQL binlo

2010-10-29 10:55:20

金饭碗

2014-07-25 14:20:45

Linux脚本

2009-10-23 17:51:51

Oracle用户密码

2023-07-12 08:01:28

FOADMROADMOXC

2021-05-11 08:00:00

Docker容器开发

2009-09-13 20:28:38

Linq插入数据

2010-06-04 09:08:56

2009-11-12 10:53:57

ADO.NET连接My
点赞
收藏

51CTO技术栈公众号