Вопрос или проблема
Согласно man podman-run, сеть контейнера можно настроить в режиме хоста:
--network=mode, --net
...
host: Не создавать пространств имен сети, контейнер будет использовать сеть хоста. Примечание: Режим хоста предоставляет контейнеру полный доступ к местным системным службам, таким как D-bus, и поэтому считается небезопасным.
Какой может быть случай использования, когда мы не хотим, чтобы контейнер имел собственное пространство имен сети, а вместо этого делил пространство сети хоста?
Рассмотрим контейнерное административное приложение, которое вы, системный администратор, хотите запустить с управляющего хоста. Например, окружение на основе ansible-runner
, которое уже является контейнером, чтобы получить нужные версии Python и различные библиотеки. Ему нужно делать SSH-запросы к различным хостам.
Вам не так важна безопасность, поскольку вы лично запускаете это приложение и хост. Проще, если оно будет проходить через стек сети хоста напрямую.
И это даже не очень умно. Всегда есть интересные случаи использования, о которых я не думал, особенно в области, такой как IP-сеть.
Если вычислительный стек может поддерживать простые варианты, такие как “не беспокойтесь о пространстве имен сети для этого контейнера”, это хорошая опция. Надеюсь, это покрыто набором тестов. Мое главное беспокойство по поводу множества опций заключается в том, что они остаются функциональными, когда что-то меняется.
Еще один интересный случай использования, с которым я сталкиваюсь прямо сейчас: нам нужно обрабатывать данные через интерфейсы CAN¹
Это ужасная технология, используемая в автомобилях, коротко говоря, вы получаете интерфейс (как eth0), который не является Ethernet. Затем вы можете читать и записывать данные через сокетный API
Чтобы сделать это через Podman, вы должны использовать сеть хоста, так как в контейнерном движке нет встроенного прокси для CAN
[1] https://www.kernel.org/doc/html/latest/networking/can.html
Ответ или решение
Podman: Почему необходим режим сетевого хоста
В контексте использования контейнеров, одним из ключевых аспектов является управление их сетевыми настройками. Среди возможных режимов сети, режим хоста (--network=host
) выделяется особым образом, так как он обеспечивает контейнеру доступ к сетевому стеку хоста, без создания отдельного сетевого пространства имен. Этот подход имеет несколько значительных преимуществ и применений, которые мы рассмотрим более подробно.
Безопасность и удобство
Поскольку контейнер использует сетевой стек хоста, в этом режиме обеспечивается более простой и быстрый доступ к локальным сетевым сервисам. Например, если система требует взаимодействия с локальными системными службами, такими как D-Bus, то использование режима хоста минимизирует сложность конфигурации и потенциальные ошибки. Это особенно полезно для административных приложений, таких как ansible-runner, которые предполагают наличие необходимого программного обеспечения и библиотек.
Примеры использования
1. Административные сценарии
При запуске внутри контейнера инструмента управления, такого как ansible, зачастую возникает необходимость доступа к другим устройствам через SSH. Используя сеть хоста, администраторы могут избежать настройки сложных маршрутов и правил доступа, позволяя Ansible беспрепятственно связываться с удаленными узлами. Это особенно актуально, когда безопасность не является первоочередной задачей, и администратор работает в контролируемом окружении.
2. Специальные интерфейсы, такие как CAN
Другим примером является использование контейнеров для работы с интерфейсами CAN (Controller Area Network), которые часто применяются в автомобилестроении. Поскольку CAN не является частью стандартного стека Ethernet, использование стандартного сетевого пространства в контейнерах может быть неэффективным или невозможным. В данном случае, режим сетевого хоста предоставляет необходимую возможность для чтения и записи данных через сокеты непосредственно к интерфейсу CAN, так как контейнер имеет прямой доступ к этому ресурсу.
Гибкость и разработка
Режим сетевого хоста может быть особенно полезен в рамках разработки и тестирования, позволяя разработчикам проверять сетевые взаимодействия без необходимости сложной настройки сети. Это помогает сосредоточиться на функциональности приложения, не отвлекаясь на проблемы конфигурации сетевого окружения.
Заключение
Режим сетевого хоста в Podman предоставляет множество преимуществ, начиная от упрощения настройки сетевых взаимодействий приложения до специфических сценариев работы с уникальными сетевыми интерфейсами, такими как CAN. Несмотря на вопросы безопасности, этот режим может быть бесценным инструментом для системных администраторов и разработчиков, обеспечивая удобство и гибкость в управлении сетевыми задачами в контейнеризированной среде.
Использование режима сетевого хоста — это вопрос выбора подхода к архитектуре системы, который основывается на конкретных потребностях и задачах, стоящих перед разработчиком или администратором.