Docker守护程序日志占用太多磁盘空间

时间:2018-06-25 15:36:15

标签: linux docker logging docker-swarm linuxkit

序言

为澄清起见,此问题与docker守护程序日志有关,不是与docker容器级日志有关。日志驱动程序和log-opts docker守护程序配置似乎可以很好地处理容器级日志。

说明

我们遇到的问题是docker守护进程日志(位于/var/log/docker.err.log)日志文件增长过快,并且没有在我们的 docker swarm 生产服务器上旋转。我们自然会长期担心磁盘空间。具体来说,我们已经运行了将近一个月,并且在一个节点上,该日志文件已经增长到5.1GB。由于我们的虚拟机有望连续运行数月,因此这显然是一个令人担忧的趋势。

我们正在使用的 linuxkit 操作系统与example docker configuration的配置非常相似,在/etc/docker/daemon.json文件中还有一些其他配置,最值得注意的是将调试设置为True。很明显,这是一个错误,因为我们的测试表明,如果不使用该选项,则日志文件会小很多。

但是,即使我们将日志级别保留为默认的信息级别,但在我看来,如果服务器运行时间过长,日志文件仍然可能导致问题。我的一位同事做了一些粗略的计算,他的猜测是,如果守护程序运行6个月左右,该文件仍可能增长到10GB。

我们尝试过的事情

我们一直在尝试使用手动logrotate解决方案来防止这种情况的发生,但是似乎docker守护进程从不重新加载其日志文件,这意味着当logrotate进行操作时便会创建新的docker.err空白。在日志中,泊坞窗守护程序会继续以其剩余的偏移量进行写入,并用空字节回填文件的其余部分,占用以前的空间。我们尝试了一些解决方案,包括将HUP信号发送到docker进程,但没有成功。似乎docker守护程序没有处理该信号,或者至少没有以重新加载其日志文件的方式进行处理。

问题

是否存在一种实现docker daemon日志轮换的方法?

我们无法找到有关此的任何信息,这似乎很不寻常,因为以前似乎某个地方有人遇到过此问题。还是在集群上运行的其他服务器在某个时候定期重新启动服务器?理想情况下,我们很想找到一种基于linuxkit的方式来专门旋转日志文件

此外,有没有办法在不关闭服务器或docker daemon实例的情况下截断正在运行的服务器上的现有docker.err.log?我们希望不惜一切代价避免部署更新的OS映像,只是为了防止docker daemon日志耗尽我们所有的磁盘空间。

复制步骤

  • 使用带有调试功能的docker守护程序服务创建linuxkit OS ISO:在配置文件中为True
  • 使用该ISO,运行docker swarm群集几天
  • 观察docker.err.log文件的增长情况

Linuxkit配置

kernel:
  image: linuxkit/kernel:4.15.5
  cmdline: "console=tty0 quiet console=ttyAMA0"
init:
  - linuxkit/init:6061875ba11fd9c563fda6234b103ed9997ff782
  - linuxkit/runc:52ecfdef1ae051e7fd5ac5f1d0b7dd859adff015
  - linuxkit/containerd:13f62c61f0465fb07766d88b317cabb960261cbb
  - linuxkit/ca-certificates:0a188e40108b6ece8c2aefdfaaad94acc84368ce
 ...

services:
   - name: docker
    image: docker:17.12.0-ce-dind
    capabilities:
     - all
    net: host
    mounts:
     - type: cgroup
       options: ["rw","nosuid","noexec","nodev","relatime"]
    binds:
     - /tiles:/tiles
     - /etc/resolv.conf:/etc/resolv.conf
     - /tmp/hosts:/etc/hosts
     - /root/.ssh:/root/.ssh
     - /var/lib/docker:/var/lib/docker
     - /lib/modules:/lib/modules
     - /etc/docker/daemon.json:/etc/docker/daemon.json
     - /persistent:/persistent
     - /application:/application
    command: ["/usr/local/bin/docker-init", "/usr/local/bin/dockerd"]

files:
  - path: etc/docker/daemon.json
    contents: |
        {
          "debug": true,
          "data-root": "/persistent/docker",
          "insecure-registries" : ["cfps-docker-registry.chip:5000"],
          "log-driver": "json-file",
          "log-opts": {
            "max-size": "100m",
            "max-file": "4"
          }
        }

1 个答案:

答案 0 :(得分:0)

只需将其关闭,这在linuxkit中就不再是问题。此后,他们使用init: # A circular buffer that captures logs from onboot and service-level containers - linuxkit/memlogd:v0.7 ... services: - name: write-and-rotate-logs image: foobar/logwrite command: ["/usr/bin/logwrite", "-log-dir", "/persistent/log/bespin", # Keep at most 25 files (Note: file numbers are 0-based) "-max-log-files", "25", # Max log file size set to 200MB (200 * 1024 * 1024 = 209,715,200 bytes) "-max-log-size", "209715200"] 添加了日志支持,并使用自己的日志编写器来处理自动轮换。这是指向他们的logging documentation的链接。

yaml的配置如下:

.Text = "<[0-9]{1,2} [JFMASOND][abceghilmnoprstuvy]{2,8} [12][0-9]{3}>"

这将捕获所有linuxkit服务日志,包括docker daemon日志,并将它们写入磁盘。它会在书写时处理旋转。