Можете объяснить, как работает cgroups и namespaces в Linux для изоляции контейнеров?

Категория: Docker

Просмотров: 24

Ответ:

В Linux контейнеры обеспечивают изоляцию и ограничение ресурсов с помощью двух ключевых технологий ядра: namespaces (пространства имён) и cgroups (группы контроля). Эти механизмы позволяют создавать контейнеры, которые выглядят как отдельные изолированные процессы или мини-окружения, но при этом используют общее ядро операционной системы.

Namespaces — это механизм изоляции, который предоставляет контейнерам собственное "пространство" для различных ресурсов. Благодаря namespaces каждый контейнер видит только свою часть системы, что создаёт иллюзию работы в полностью изолированной среде.

Основные виды namespaces:

  • PID namespace (пространство процессов): изолирует процессы. Процессы внутри контейнера видят только свои собственные PID и не могут наблюдать процессы хостовой системы или других контейнеров. Это создаёт иллюзию того, что контейнер работает в своей отдельной системе.

  • NET namespace (пространство сети): изолирует сетевые интерфейсы, IP-адреса, маршруты и порты. Каждый контейнер может иметь свои собственные сетевые интерфейсы (например, виртуальные интерфейсы) и не видит сетевые интерфейсы хостовой системы или других контейнеров. Это позволяет контейнерам общаться друг с другом через виртуальные сети или использовать собственные маршруты.

  • MNT namespace (пространство монтирования): изолирует файловую систему. Каждый контейнер может монтировать свои собственные файловые системы (например, тома) и не видит файловую систему хоста. Это позволяет контейнеру работать с собственными файловыми структурами, не вмешиваясь в файловую систему хостовой машины.

  • IPC namespace (пространство межпроцессорного взаимодействия): изолирует объекты IPC (межпроцессорного взаимодействия), такие как очереди сообщений и разделяемую память. Это предотвращает доступ к IPC объектам других контейнеров.

  • USER namespace (пространство пользователей): изолирует пользователей и группы. Это позволяет контейнерам запускать процессы с root-привилегиями внутри контейнера, но при этом на хосте они могут выполняться с низкими привилегиями.

  • UTS namespace (пространство имени узла): изолирует имя узла (hostname) и доменное имя (NIS). Контейнеры могут иметь свои собственные имена узлов, что позволяет каждому контейнеру "считаться" отдельным хостом.

Таким образом, namespaces создают изоляцию между контейнерами и хостовой системой по различным аспектам, создавая иллюзию отдельной операционной системы для каждого контейнера.

Cgroups — это механизм управления ресурсами, который позволяет ограничивать и распределять системные ресурсы (процессор, память, сетевую пропускную способность, дисковые операции) для групп процессов. С помощью cgroups можно гарантировать, что контейнеры не будут использовать больше ресурсов, чем им разрешено, и обеспечивать стабильную работу всей системы, даже при запуске большого количества контейнеров.

Основные функции cgroups:

  • Ограничение CPU: cgroups позволяют ограничивать использование процессора для контейнеров. Например, можно задать лимит, который предотвратит использование более определённого процента CPU для конкретного контейнера.

  • Ограничение памяти: можно задать контейнеру максимальный объём доступной оперативной памяти. Если контейнер превысит это значение, его процессы могут быть завершены системой (например, с помощью механизма OOM — Out of Memory).

  • Ограничение ввода-вывода (I/O): cgroups могут контролировать скорость доступа контейнера к дисковым устройствам. Это полезно для предотвращения чрезмерной нагрузки на диск со стороны одного контейнера.

  • Ограничение сетевой пропускной способности: cgroups могут управлять сетевой активностью контейнеров, ограничивая доступную пропускную способность, чтобы контейнеры не создавали сетьевые перегрузки.