Найти тему
Timeweb Cloud

Механизмы контейнеризации

Оглавление
📜 Читайте также: Виртуализация и контейнеризация: обзор технологий и в чем разница

Чтобы ваш код работал на любой машине, достаточно упаковать его со всеми зависимостями в контейнер. В отличие от виртуальных машин, контейнеры изолируют приложения друг от друга и от хост-системы, но при этом используют общие ресурсы операционной системы. Это делает их гораздо легче виртуальных машин. Всем, кто работает с контейнерами, нужно знать механизмы контейнеризации. Сегодня мы остановимся на механизме управления ресурсами в Linux.

В операционной системе Linux для ограничения доступа к ресурсам и изоляции системных процессов есть такие инструменты, как Namespaces и Cgroups.

Функция Cgroups или control groups позволяет контролировать и ограничивать использование таких ресурсов, как CPU, память, дисковое пространство. Дальше мы покажем, как с помощью этого инструмента можно установить лимит используемой памяти. А при помощи namespace можно объединять несколько процессов в группу и изолировать.

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

Контейнеры могут работать на обычных и на облачных серверах, а также на виртуальных машинах.

Принцип работы контейнеров

Выше мы упоминали про то, что каждый контейнер содержит различные компоненты и библиотеки для работы используемого программного обеспечения. При помощи контейнеров эти файлы устанавливаются и осуществляется запуск ПО.

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

Для описания зависимостей, конфигурации и других настроек используются специальные файлы:

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

Виртуализация сервера VS Контейнеризация

Виртуализация серверов позволяет запускать несколько виртуальных машин на одном физическом сервере. Каждая виртуальная машина имеет свою операционную систему, набор приложений и сервисов, а также работает в изолированной среде. При этом могут использоваться разные операционные системы или версии операционной системы, поскольку виртуальные машины изолированы друг от друга. Чтобы использовать виртуальную среду для разработки, необходимо позаботиться о различных версия операционной системы или приобрести лицензии.

В свою очередь, используя контейнеры, можно запустить несколько приложений на одной виртуальной машине. Это снижает расходы на лицензирование программного обеспечения, поскольку в работе с контейнерами достаточно одной операционной системы. Кроме того, контейнеры позволяют быстро развертывать и масштабировать приложения, что снижает затраты на инфраструктуру и сокращает время выхода новых продуктов на рынок.

Преимущества контейнеров для организаций

Во-первых, контейнеры помогают решить многие проблемы, возникающие еще на этапе разработки кода.

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

Далее мы расскажем обо всех преимуществах контейнерного движка для развертывания программного обеспечения.

Мультиоблачная инфраструктура

Возможность работать в облачной среде — это одно из самых главных преимуществ в использовании контейнеров в качестве технологии виртуализации. Большинство контейнерных движков, вроде Docker, поддерживают использование мультиоблачных платформ. Для запуска приложений можно использовать Amazon EC2 или Google Compute Engine, а также серверы Rackspace.

Кроме того, контейнеры упаковываются в образы, которые можно легко отправить на другую машину или в облако. При этом можно обратиться к абсолютно любому поставщику облачных услуг, поскольку нет определенных требований.

Гибкость

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

Избежать проблем, связанных с согласованностью между разными средами позволяют такие поставщики контейнеров, как Докер. В целом, если вы используете или хотите использовать DevOps для ускорения доставки приложений и повышения качества разработки, стоит попробовать технологию контейнеризации.

Возможность контролировать версии

Контроль версий является важным аспектом у контейнерных платформ. В качестве примера можно снова привести платформу Docker, у которой есть функция упрощенного контроля версий. Это означает, что если произойдет сбой среды, разработчик с легкостью может вернуться к прошлому образу.

Чтобы оставаться конкурентоспособными, поставщики контейнеров не должны забывать про внедрение данной функции.

Изолированная файловая система

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

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

Повышенный уровень безопасности

У любой технологии есть как преимущества, так и недостатки. Изначально у Докера был недостаточный уровень защиты. Однако, как только платформа начала активно использоваться, разработчики выявили ряд проблем, которые создатели быстро устранили.

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

Эффективное распределение ресурсов

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

Контейнеры занимают мало места, но при этом позволяют закрыть все потребности в разработке и развертывании приложений.

Перенос контейнеров из одной среды в другую

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

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

Воспроизводимость контейнеров

Не стоит забывать про такое важное преимущество, как воспроизводимость. Благодаря статичности и неизменности компонентов контейнера, готовый образ можно запускать в других контейнерах бесконечное количество раз.

Поддержка DevOps

Devops совместно с контейнерами представляют оптимальное решение для любой среды разработки, главным критерием которой является портативность и универсальность.

Это возможно благодаря двум ключевым тенденциям:

  • Активное внедрение облачных технологий среди компаний и предприятий, способствующих эффективному управлению операциями.
  • Рост числа облачных провайдеров, которые предоставляют услуги и сервисы для оптимизации бизнес-процессов.

Настройка, интеграция, автоматизация и надлежащее функционирование облачных ресурсов являются сложными задачами, с которыми сталкиваются многие компании. Это создает потребность в квалифицированных специалистах DevOps, которые способны эффективно решать такие проблемы.

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

В каких случаях нужны контейнеры

Быстрый темп изменений в цифровой среде требует от компаний и предприятий внедрение современных инструментов вроде технологии контейнеризации. Она обеспечивает мобильность, надежность и масштабируемость, что позволяет быстро реагировать на изменения. Команда Timeweb Cloud поможет разобраться и освоить механизмы контейнеризации.

На начальном этапе внедрения контейнеров необходимо пройти два этапа:

  • Запуск контейнеров в тестовом режиме с ограниченным масштабом для оценки потребностей организации.
  • Запуск стадии производства после прохождения первого этапа и подготовки инфраструктуры для развертывания контейнеров.

Технология Cgroups

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

Этот инструмент используется для управления такими системными ресурсами, как CPU, память, дисковые операции ввода/вывода и др. Каждый из этих ресурсов считается подсистемой.

Каждая подсистема cgroups содержит свои собственные файлы конфигурации и управляет распределением ресурсов для процессов, находящихся в соответствующих группах cgroups.

-2

Kubernetes по умолчанию использует cgroup для управления двумя типами ресурсов: CPU и памятью (RAM). Каждый узел кластера, который управляется Kubernetes, имеет определенные вычислительные ресурсы.

Как Linux контролирует выделение ресурсов для процессов

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

Для того, чтобы уязвимые приложения были под контролем, существуют группы управления или cgroups. Группы управления или cgroups представляют собой важную функцию ядра Linux, которая позволяет контролировать, ограничивать и изолировать использование ресурсов, таких как процессор, память, дисковое ввод-вывод и сеть, одним или несколькими процессами.

При помощи фреймворка cgroups можно сделать следующее:

  1. Ограничить системные ресурсы, установив лимиты на их использование.
  2. Определить приоритеты выполнения процессов в зависимости от их важности или потребностей в ресурсах.
  3. Осуществлять мониторинг и измерение используемых ресурсов процессами и группами процессов.
  4. Управлять группами процессов. При необходимости их можно приостановить и перезапустить.

Группа cgroup в Linux может содержать один или несколько процессов, которые привязаны к одному и тому же набору ограничений ресурсов. Кроме того, группы cgroup могут быть организованы в иерархическую структуру, где каждая подгруппа наследует ограничения и параметры, установленные для ее родительской группы. Это позволяет более гибко управлять использованием ресурсов и устанавливать ограничения на различных уровнях иерархии, а также унаследовать ограничения от вышестоящих групп cgroup.

Для управления cgroups в Linux можно использовать как прямой доступ к командам и настройкам, так и косвенный доступ через различные инструменты управления контейнерами, виртуализации и управления ресурсами.

Для доступа к cgroups напрямую в Red Hat Enterprise Linux или CentOS используйте команду:

$ sudo yum install libcgroup libcgroup-tools

А сейчас рассмотрим ручной способ управления cgroups в Linux через иерархию sysfs.

Ручной способ

После установки соответствующих пакетов вы можете настроить cgroups, используя иерархию sysfs. Например, для создания группы управления с названием myapp в подсистеме памяти создадим директорию с этим названием:

$ sudo mkdir /sys/fs/cgroup/memory/baz

Чтобы ограничить память для всех процессов, которые работают в cgroup с именем baz до 50 МБ, нужно установить лимит памяти и проверить настройки, используя вторую команду:

$ echo 50000000 | sudo tee /sys/fs/cgroup/memory/baz/memory.limit_in_bytes

$ sudo cat memory.limit_in_bytes

50003968

Затем нужно запустить приложение и переместить его в cgroup baz с применением PID процесса:

$ sh ~/test.sh &

$ echo 2845 /sys/fs/cgroup/memory/baz/cgroup.procs

Чтобы убедиться в том, процесс запущен в правильной cgroup, запустите команду ниже с тем же идентификатором PID:

$ ps -o cgroup 2845

CGROUP

8:memory:/foo,1:name=systemd:/user.slice/user-0.slice/

session-4.scope

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

$ cat /sys/fs/cgroup/memory/baz/memory.usage_in_bytes

253952

Ошибки процессов и их управление в Linux

На самом деле можно установить любой лимит памяти. Давайте проверим, что произойдет, если установить значение 500 байт вместо 50 МБ.

Повторим команду которую, описывали выше, указав после echo 500 вместо 50000000.

$ echo 500 | sudo tee /sys/fs/cgroup/memory/baz/

memory.limit_in_bytes

Важно! Но если данный предел препятствует выполнению поставленной задачи, ядро операционной системы может вмешаться и принять меры для ограничения или прекращения выполнения этого процесса.

Если установлено значение в 500 байт, то оно будет округлено до ближайшего кратного размера страницы ядра. На большинстве систем это будет размер страницы в 4 КБ, поэтому фактически установленное значение будет равно 4 КБ, а не 500 байт.

$ cat /sys/fs/cgroup/memory/baz/memory.limit_in_bytes

4096

После этой команды необходимо осуществить запуск приложения, затем переместить его в группу и отслеживать системные журналы.

Когда значение достигнет установленного в 4 КБ лимита, вмешается компонент ядра Linux под названием Out-Of-Memory Killer (OOM Killer). Он запускается, когда операционная система не может выделить достаточно памяти для запуска новых процессов и удаляет данное приложение.

Для проверки наберите:

$ ps -o cgroup 2687

CGROUP

Как использовать библиотеку libcgroup

Чтобы упростить вышеописанный процесс, можно использовать специальные утилиты администрирования. Они входят в библиотеку libcgroup.

Например, команду cgcreate можно использовать для создания группы:

$ sudo cgcreate -g memory:baz

Для установки лимитов памяти используйте те же команды без изменений.

Для запуска приложения используется бинарный файл cgexec. Команда реализуется следующим образом:

$ sudo cgexec -g memory:baz ~/test.sh

Для удаления cgroup с названием baz из подсистемы контроля памяти достаточно воспользоваться двоичным файлом cgdelete и выполнить следующую команду:

$ sudo cgdelete memory:baz

Статические группы в Linux

Чтобы не выполнять вышеописанные команды каждый раз, можно использовать простой конфигурационный файл /etc/cgconfig.conf. В нем определяются имена и атрибуты cgroup. Затем можно запустить службу cgconfig для автоматического создания и управления cgroup.

Параметр cpu.shares задает относительный приоритет использования процессорного времени между разными группами cgroup. По умолчанию каждая группа получает равный доступ к ЦП, что означает, что каждая группа может использовать до 100% процессорного времени. Однако, если уменьшить значение параметра cpu.shares для конкретной группы, например, до 100, то эта группа будет использовать только около 10% процессорного времени. Это может быть полезно в случаях, когда нужно убедиться, что определенная группа процессов не будет потреблять слишком много процессорного времени и не будет замедлять работу других приложений на системе.

В файл cgconfig.conf можно добавить раздел, который позволит ограничить количество ядер процессора, доступных для процесса, запущенного в cgroup. Для этого нужно указать параметры cpuset.cpus:

cpuset {

cpuset.cpus="0-3";

}

В данном примере cgroup ограничивает доступ процесса только к первым четырем ядрам процессора, а остальные ядра будут невидимы для этого процесса

Для того чтобы загрузить конфигурацию cgroup при загрузке системы, необходимо выполнить следующие действия:

$ sudo systemctl enable cgconfig

Create symlink from /etc/systemd/system/sysinit.target.wants/

cgconfig.service

to /usr/lib/systemd/system/cgconfig.service.

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

Чтобы запустить ваше приложение в cgroup под названием baz и ограничить его доступ к памяти, процессору и ядрам, вы можете использовать команду:

$ sudo cgexec -g memory,cpu,cpuset:baz ~/test.sh &

Использование Cgroups позволяет установить строгие аппаратные и программные ограничения на приложения, которые потребляют много памяти или процессорного времени. Если какое-то приложение не устанавливает верхний порог для использования ресурсов, то cgroups может это исправить. Это помогает обеспечить стабильную и безопасную работу операционной среды. Функциональность также доступна в cgroups для операционной системы Windows.

Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.💥