Журнал демона Docker занимает слишком много места на диске
преамбула
Для пояснения эта проблема касается журналов демона докера, а не журналов уровня контейнера докера. Конфигурации демона log-driver и log-opts, похоже, прекрасно обрабатывают журналы на уровне контейнера.
Описание
Проблема, с которой мы сталкиваемся, заключается в том, что журнал демона Docker (расположен в /var/log/docker.err.log
) файл журнала растет слишком быстро и не вращается на наших рабочих серверах. Мы, естественно, беспокоимся о дисковом пространстве в долгосрочной перспективе. Конкретно, мы работаем уже почти месяц, и на одном узле этот файл журнала уже вырос до 5,1 ГБ. Ожидается, что наши виртуальные машины будут работать в течение нескольких месяцев подряд, что, очевидно, вызывает беспокойство.
Используемаянами ОС linuxkit имеет конфигурацию, очень похожую на пример конфигурации докера, с некоторыми дополнительными настройками в /etc/docker/daemon.json
файл, в частности, что мы установили для отладки 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"
}
}
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, включая журналы демона докеров, и запишет их на диск. Он обрабатывает вращение при записи.