Журнал демона Docker занимает слишком много места на диске - PullRequest
0 голосов
/ 25 июня 2018

Преамбула

Для пояснения, это касается журналов демона докера, не для журналов уровня контейнера докера. Конфигурации демона log-driver и log-opts, похоже, прекрасно обрабатывают журналы на уровне контейнера.

Описание

Проблема, с которой мы сталкиваемся, заключается в том, что файл журнала демона docker (расположенный в /var/log/docker.err.log) растет слишком быстро и не вращается на наших производственных серверах docker swarm . Мы, естественно, беспокоимся о дисковом пространстве в долгосрочной перспективе. Конкретно, мы работаем уже почти месяц, и на одном узле этот файл журнала уже вырос до 5,1 ГБ. Ожидается, что наши виртуальные машины будут работать в течение нескольких месяцев подряд, и это явно тревожная тенденция.

Используемая нами linuxkit ОС имеет очень похожую конфигурацию с примером конфигурации докера , с некоторыми дополнительными настройками в файле /etc/docker/daemon.json, в частности, мы установили для debug значение True. Это явно было ошибкой, поскольку наши тесты показали, что, если бы мы не использовали эту опцию, наши файлы журналов были бы существенно меньше.

Однако, даже если мы оставили уровень журнала на уровне информации по умолчанию, мне кажется, что файл журнала все еще может вызывать проблемы, если сервер остается работать слишком долго. Один из моих коллег сделал несколько грубых вычислений, и он предположил, что файл все равно может вырасти до 10 ГБ, если демон будет работать в течение 6 месяцев или около того.

Что мы попробовали

Мы пытались заставить ручное решение logrotate работать, чтобы защитить от этого, но похоже, что демон docker никогда не перезагружает свой файл журнала, что означает, что когда logrotate делает свое дело и создает пустой новый docker.err. log, демон docker продолжает запись с любым смещением, в котором он остановился, и заполняет оставшуюся часть файла нулевыми байтами, занимая столько же места, сколько было раньше. Мы попробовали некоторые решения, включающие отправку сигнала HUP в процесс докера без какого-либо успеха; похоже, что демон docker не обрабатывает этот сигнал или, по крайней мере, не перезагружает свой файл журнала.

Вопрос (ы)

Есть ли приемлемый способ реализации ротации журналов демона docker?

Кажется необычным, что мы не можем найти какую-либо информацию об этом, так как кажется, что кто-то где-то сталкивался с этой проблемой раньше. Или другие работающие на Swarm периодически перезагружают серверы в какой-то момент? В идеале мы хотели бы найти способ поворота этого файла журнала на основе linuxkit

Кроме того, есть ли способ обрезать существующий файл docker.err.log на работающем сервере без выключения экземпляра сервера или демона docker? Мы бы хотели во что бы то ни стало избежать развертывания обновленного образа ОС только для того, чтобы журнал демонов Docker не занимал все наше дисковое пространство.

Шаги для воспроизведения

  • Создание ISO-образа ОС linuxkit с помощью службы демона docker с отладкой: True в его конфигурационном файле
  • Используя этот ISO, запустите кластер Docker Swarm на несколько дней
  • Наблюдать за ростом файла docker.err.log

Linuxkit Config

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