Docker и kubelet: несовпадение драйвера cgroup
Docker может управлять контрольными группами двумя способами: через собственный драйвер или через systemd. Если драйвер не совпадает с тем, что использует система, ограничения ресурсов применяются непоследовательно, а kubelet отказывается работать.
Что это значит
Рекомендация простая: на системах с systemd драйвер тоже должен быть systemd. Тогда всё дерево контрольных групп управляется одним хозяином, и ограничения не расходятся.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В daemon.json не задан драйвер systemd
По умолчанию Docker использует собственный драйвер. На системе с systemd это приводит к двум хозяевам дерева групп.
-
Смешанная иерархия контрольных групп
На системе, где часть контроллеров работает по первой версии, поведение ограничений неполное независимо от драйвера.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Текущий драйвер и версия иерархии.
docker info | grep -i -E "cgroup (driver|version)"Тип файловой системы контрольных групп: cgroup2fs означает вторую версию.
stat -fc %T /sys/fs/cgroupПредупреждения демона о драйвере.
journalctl -u docker -n 30 --no-pager | grep -i cgroupРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- По умолчанию Docker использует собственный драйвер. На системе с systemd это приводит к двум хозяевам дерева групп.
- Как проверить
-
Посмотрите текущий драйвер.
docker info 2>/dev/null | grep -i "cgroup driver"
- Как исправить
-
Укажите драйвер systemd в daemon.json и перезапустите демон.
# /etc/docker/daemon.json # {"exec-opts": ["native.cgroupdriver=systemd"]} sudo systemctl restart docker
- Почему происходит
- На системе, где часть контроллеров работает по первой версии, поведение ограничений неполное независимо от драйвера.
- Как проверить
-
Определите версию иерархии.
stat -fc %T /sys/fs/cgroup docker info 2>/dev/null | grep -i "cgroup version"
- Как исправить
- Переведите систему на единую иерархию второй версии параметром ядра и перезагрузитесь.
Пример вывода
Docker использует собственный драйвер на системе с systemd. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ docker info | grep -i cgroup
Cgroup Driver: cgroupfs
Cgroup Version: 2
kubelet[2100]: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
Связанные ошибки
- status=219/CGROUP в systemd Код 219/CGROUP: не удалось создать или настроить контрольную группу службы. Причины на уровне системы и контейнеров.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
- Docker: демон не запускается без containerd docker.service падает, потому что не работает containerd.service. Разбор зависимости и сокета containerd.
- Docker: имена не разрешаются внутри контейнера Контейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
- Docker: правила брандмауэра конфликтуют с вашими После перезапуска брандмауэра контейнеры теряют сеть: Docker управляет своими правилами сам.
- Too many tasks: упор в предел TasksMax Служба не может создать новый процесс: достигнут предел TasksMax. Где он задан и как поднять правильно.
Где встречается чаще всего
Источники
- Документация Docker: драйверы контрольных групп
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на Ubuntu 24.04: по умолчанию используется cgroupfs.