免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2630 | 回复: 0
打印 上一主题 下一主题

[其他] 轻松搞定对容器实例日志设置定期清理和回卷 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-09-01 10:26 |只看该作者 |倒序浏览
说明:该文转载自腾讯云技术社区腾云阁,已征求作者本人同意。
引言
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/v1beta1kind: DaemonSetmetadata:  name: logrotatespec:  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: [color=rgb(221, 17, 6]"/var/lib/docker/containers /var/log/docker"        - name: LOGROTATE_INTERVAL          value: [color=rgb(221, 17, 6]"hourly"        - name: LOGROTATE_OLDDIR          value: [color=rgb(221, 17, 6]"/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 [color=rgb(221, 17, 6]"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":[color=rgb(221, 17, 6]"json-file",  "log-opts":{    "max-size" :[color=rgb(221, 17, 6]"10m","max-file":[color=rgb(221, 17, 6]"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-reloadservice dockerd restart

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP