1

前言

澄清一下,这个问题是针对 docker 守护进程日志的,而不是针对 docker 的容器级日志的。log-driver 和 log-opts docker daemon 配置似乎可以很好地处理容器级日志。

描述

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

我们使用的linuxkit操作系统与示例docker configuration 具有非常相似的配置,文件中有一些额外的配置/etc/docker/daemon.json,最值得注意的是我们将 debug 设置为 True。这显然是一个错误,因为我们的测试表明,如果我们不使用该选项,我们的日志文件将大大缩小。

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

我们尝试了什么

我们一直在尝试使用手动 logrotate 解决方案来防止这种情况,但似乎 docker 守护进程从不重新加载它的日志文件,这意味着当 logrotate 执行它并创建一个空白的新 docker.err.log 时, docker daemon 继续以它离开的任何偏移量写入,并用空字节回填文件的其余部分,占用与以前一样多的空间。我们尝试了一些解决方案,包括将 HUP 信号发送到 docker 进程,但没有成功;似乎 docker 守护进程没有处理该信号,或者至少没有以重新加载它的日志文件的方式。

问题

是否有一种可接受的方式来实现 docker 守护程序日志的轮换?

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

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

重现步骤

  • 使用带有调试的 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" : ["foobar-docker-registry.chip:5000"],
          "log-driver": "json-file",
          "log-opts": {
            "max-size": "100m",
            "max-file": "4"
          }
        }
4

1 回答 1

0

只是为了关闭它,这不再是 linuxkit 中的问题。此后,他们添加了使用 的日志记录支持memlogd,以及他们自己的处理自动轮换的日志编写器。这是他们的日志记录文档的链接。

yaml 配置如下:

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"]

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

于 2020-02-17T22:21:43.980 回答