文档章节

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

 克劳德同学
发布于 2017/09/04 14:13
字数 1124
阅读 11
收藏 0
点赞 0
评论 0

说明:该文转载自腾讯云技术社区腾云阁,已征求作者本人同意。

引言

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.yamldaemonset "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

 

本文转载自:

共有 人打赏支持
粉丝 0
博文 7
码字总数 6947
作品 0
长沙
【深入浅出容器云】五分钟带你玩转Docker容器服务

导语:随着以Docker为代表的容器技术在国内的迅速发展,容器云也逐渐被广大开发者所熟知,但容器云(CaaS)相比传统的云主机(IaaS)在实际应用中还存在着一些鸿沟。为此,我们试图以通俗精炼...

时速云
2016/03/05
1K
0
Docker 空间使用分析与清理

摘要: 用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响。 本文先对 Docker 的空间分析与清理进行...

姬子玉
2017/11/27
0
0
如何清理Docker占用的磁盘空间?

摘要:用了Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理。 使用Docker好处还是不少的: 所有服务器的配置都非常简单,只安装了Doc...

田心双木
01/11
1
0
谁用光了磁盘?Docker System命令详解

译者按: Docker镜像,容器,数据卷以及网络都会占用主机的磁盘空间,这样的话,磁盘很容易就会被用完。这篇博客介绍了一个简单的解决方案 - Docker System命令。 原文: What’s eating my d...

Fundebug
2017/04/24
0
0
使Kubernetes更容易使用的3个开源项目

显然,Kubernetes是一个解决重要问题的优雅方案。Kubernetes允许我们在不淹没负载、网络容器、确保应用程序高可用性、管理更新或回滚等细节的情况下,在规模上运行容器化的应用程序。如此多的...

云技术之家
03/09
0
0
16. 使用Exhibitor管理ZooKeeper

Exhibitor是管理ZooKeeper服务实例的主管服务。由Netflix开发和开放源码,对于ZooKeeper的实例监控、备份/恢复、清理和可视化非常有用。 Note Netflix Exhibitor主页位于https://github.com/...

M104
2017/12/09
0
0
docker 安装 mysql

1. 启动一个服务器实例 使用镜像创建或启动MySQL容器时,可以先将镜像下载到本地: $ docker pull mysql 也可以直接使用以下命令来启动MySQL实例: $ docker run -p 3306:3306 --name itbil...

yunlielai
04/12
0
0
Kubernetes核心概念总结(转载)

转载一篇不错的文章:https://www.cnblogs.com/WayneZeng/p/7680597.html 1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。...

yushanjin0767
05/29
0
0
Kubernetes核心概念总结

1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。     APIServer。APIServer负责对外提供RESTful的Kubernetes API服务...

zwqjoy
2017/12/13
0
0
50+ 个有用的 Docker 工具

Docker工具分类列表 编排和调度 持续集成/持续部署(CI / CD) 监控 记录 安全 存储/卷管理 联网 服务发现 构建 管理 编排和调度 1. Kubernetes Kubernetes是市场上最实用的最受欢迎的容器编...

Anoyi
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat中JAVA JVM内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
刚刚
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
6分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
11分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
11分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
15分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
15分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
15分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
17分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树

liuyan_lc
19分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部