云计算中如何对容器实例日志设置定期清理和回卷

73次阅读
没有评论

共计 2550 个字符,预计需要花费 7 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下云计算中如何对容器实例日志设置定期清理和回卷,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

引言

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

在示例的 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

看完了这篇文章,相信你对“云计算中如何对容器实例日志设置定期清理和回卷”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2550字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)