Вопрос или проблема
У меня есть 3 кластера для развертывания на контейнерах, предоставленных с помощью docker-compose, кластеры имеют 3, 4 и 14 узлов каждый. Все контейнеры построены из одного и того же образа Rocky Linux 8 и имеют SystemD с несколькими службами, работающими на них. В каждом docker-compose.yml добавляется /sys/fs/cgroup:/sys/fs/cgroup:ro
к томам. Однако, независимо от порядка, в котором я разворачиваю каждый кластер, я получаю работающий SystemD только на 14 контейнерах, которые были запущены первыми. 15-й контейнер в последовательности, а также каждый другой после этого запускается, но у него нет запущенных служб, и systemctl выдает ошибку, т.е.:
# systemctl status sshd
Не удалось подключиться к шине: Нет такого файла или каталога
Когда я захожу в контейнер с помощью docker exec, я вижу, что монтирование cgroup на месте, но ps aux
показывает только:
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 89084 7556 ? Ss 13:00 0:00 /usr/sbin/init
root 6 0.0 0.0 21324 3796 pts/0 Ss 13:03 0:00 bash
root 23 0.0 0.0 53952 3848 pts/0 R+ 13:15 0:00 ps aux
в то время как на хорошем контейнере больше:
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 171716 10104 ? Ss 13:00 0:00 /usr/sbin/init
root 28 0.0 0.0 89464 13432 ? Ss 13:00 0:00 /usr/lib/systemd/systemd-journald
rpc 30 0.0 0.0 67196 5596 ? Ss 13:00 0:00 /usr/bin/rpcbind -w -f
root 32 0.0 0.0 202388 14172 ? Ss 13:00 0:00 /usr/sbin/sssd -i --logger=files
root 45 0.0 0.0 78648 7028 ? Ss 13:00 0:00 /usr/sbin/sshd -D [email protected],[email protected],aes256-ctr
root 47 0.0 0.0 209484 7108 ? Ssl 13:00 0:00 /usr/sbin/rsyslogd -n
root 49 0.0 0.0 106028 3708 ? Ssl 13:00 0:00 /usr/sbin/gssproxy -D
dbus 61 0.0 0.0 76488 5424 ? Ss 13:00 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 62 0.0 0.0 212680 15516 ? S 13:00 0:00 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files
root 63 0.0 0.1 224344 40632 ? S 13:00 0:00 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
root 67 0.0 0.0 90364 7420 ? Ss 13:01 0:00 /usr/lib/systemd/systemd-logind
root 645 0.3 0.0 30364 3796 pts/0 Ss 13:15 0:00 bash
root 663 0.0 0.0 62992 3976 pts/0 R+ 13:15 0:00 ps aux
Когда я пытаюсь запустить dbus-daemon на неисправном контейнере, я получаю эту ошибку:
# /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
dbus-daemon[24]: Не удалось запустить шину сообщений: Сокет не получен.
Две вещи меня больше всего озадачивают:
- Раньше это работало нормально без таких проблем с образами CentOS 7.
- Жесткий лимит в 14 контейнеров, которые могут быть развернуты корректно.
Что касается #2. Если я уменьшаю количество работающих контейнеров, неисправные контейнеры начинают нормально работать с SystemD после перезапуска, так что кажется, что где-то установлен лимит, но я еще не смог найти где, поэтому любые комментарии или ответы, которые помогут объяснить или решить эту проблему, будут очень appreciated.
Вы это решили? Я сталкиваюсь с той же проблемой! Я получаю Не удалось подключиться к шине: Нет такого файла или каталога
, когда запускаю команду systemctl!
Ответ или решение
Не удается подключиться к шине: ошибка на некоторых контейнерах, развернутых с помощью docker-compose
Введение
Ваша ситуация с ошибкой "Failed to connect to bus: No such file or directory" в контейнерах, запущенных с использованием Docker и Docker Compose, является распространенной проблемой при работе с системами, использующими SystemD в контейнеризированной среде. Рассмотрим причины, диагностику и потенциальные решения этой ошибки.
Описание Проблемы
Вы упомянули, что развертываете 3 кластера, содержащие 3, 4 и 14 узлов, и стали сталкиваться с проблемами после перехода на образ Rocky Linux 8. По вашей информации, при запуске контейнеров с SystemD только первые 14 контейнеров работают корректно — начиная с 15-го контейнера и далее, SystemD не инициализируется должным образом, что и приводит к указанной ошибке.
Важные Аспекты
- Использование монтирования cgroup: Вы правильно добавили
/sys/fs/cgroup:/sys/fs/cgroup:ro
вdocker-compose.yml
, что необходимо для работы SystemD. - Ограничение на количество правильных контейнеров: Вы указали, что когда количество работающих контейнеров снижается, "неисправные" контейнеры начинают работать корректно после перезапуска.
Причины Проблемы
-
Ограничение ресурсов: Возможно, в вашей системе установлены ограничения на количество ресурсов, доступных для системных процессов. Это может быть связано с настройкой Docker или с системными ограничениями (например, конфигурациями cgroups или ulimits).
-
Процессы D-Bus: Каждый экземпляр SystemD требует работающего D-Bus для выполнения большинства своих функций. Ошибка при попытке запуска
dbus-daemon
указывает на возможность отсутствия необходимого сокета для системного шины сообщений. -
Изменения в системах на базе RHEL: Возможные изменения между CentOS 7 и Rocky Linux 8 могут повлиять на реализацию SystemD и его работу в контейнерах. В частности, контроль доступа и разделяемые пространства имен могут отличаться.
Методы Устранения Проблем
-
Проверка ресурсов:
- Убедитесь, что система не достигла предела по количеству процессов или потоков. Используйте команды
ulimit -a
и проверьте настройки в/etc/security/limits.conf
.
- Убедитесь, что система не достигла предела по количеству процессов или потоков. Используйте команды
-
Параметры Docker:
- Проверьте настройки вашего демона Docker. В частности, обратите внимание на конфигурацию
--default-ulimits
в конфигурационном файле Docker.
- Проверьте настройки вашего демона Docker. В частности, обратите внимание на конфигурацию
-
Логи SystemD:
- Проверьте журналы (
journalctl
) для получения дополнительной информации о сбоях SystemD и D-Bus.
- Проверьте журналы (
-
Обновление образа:
- Попробуйте протестировать с последней доступной версией образа Rocky Linux 8 или переключиться на другой базовый образ на некоторое время, чтобы оценить, устранит ли это ваше затруднение.
-
Контейнерное запуска с флагом
--privileged
:- Внедрение флага
--privileged
в Docker может предоставить все необходимые разрешения для работы с самими контейнерами и улучшить инициализацию SystemD.
- Внедрение флага
-
Альтернативные методы управления службами:
- Рассмотрите возможность использования других инструментов управления службами, таких как supervisord, если это подходит для вашего проекта, чтобы избежать проблем с SystemD в контейнерах.
Заключение
Ошибки, подобные "Failed to connect to bus: No such file or directory", требуют тщательной диагностики и понимания взаимодействий между системой и средой контейнеров. Применяя описанные методы и проверяя системные ресурсы, возможно, вы сможете решить эту проблему. При необходимости обновляйте свою среду, чтобы обеспечить совместимость и безотказность развертываний.