Привет!

На связи Ваня Гулаков, DevOps из CloudMTS. Сегодня хочу рассказать про контейнерные ОС и как мы искали для сервиса Managed Kubernetes ту самую.

До недавнего времени мы использовали дедушку CentOS 7, который уже давно отжил свое. Основные причины переезда, соответственно, старое ядро и отсутствие поддержки. 

Раз уж переезд был неизбежен, появилась мысль присмотреться к так называемым Linux For Containers или Container Optimized OS дистрибутивам. 

Чем контейнерные ОС отличаются от обычных?

  • Ориентация на работу в облачном окружении. В комплект поставки сразу входит система инициализации cloud-init/ignition. Подразумевается, что конфигурация ОС будет идти через нее.

  • Образ ОС максимально «выпотрошен». Виртуальные машины из него максимально тонкие. При этом на борту уже установлен container runtime, благодаря чему можно сразу стартовать и запускать контейнеры.

  • Вместе с «лишними» пакетами под нож уходит и пакетный менеджер. Обновление компонентов происходит по концепции immutable infrastructure. Запуск отладочных приложений рекомендуется делать в виде привилегированных контейнеров.

  • Read-only корневой файловой системы ОС разной степени тяжести. Может распространяться как на часть системных разделов, так и почти на весь диск. Подразумевается, что это снижает поверхность атаки для злоумышленника.

  • Часть дистрибутивов вообще ориентирована строго на запуск Kubernetes и управляется через API, что довольно необычно по сравнению с классическими Linux-системами.

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

RancherOS

RancherOS интересный концепт дистрибутива, где init-процессом является не привычный для пользователей linux-супервизор вроде systemd, а Docker. Грубо говоря, реализовано это с помощью механизма DinD.

Rancher описывают свою архитектуру так:

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

Менеджмент системы осуществляется с помощью cloud-init и cli утилиты ros, поставляемой внутри образа ОС.

От кандидата отказались по следующим причинам:

  • EOL в 2021 году, обновления выпускаются сугубо на критические уязвимости.

  • Запуск Kubernetes подразумевается с помощью Rancher или утилиты rke, что не совместимо с текущей схемой работы наших управляющих сервисов Managed Kubernetes.

K3os

K3os еще один дистрибутив от Rancher. Его главное назначение — запуск кластеров k3s — легковесной версии Kubernetes, в которой все основные компоненты control-plane упакованы в единый бинарный файл. Init-процессом тут вместо Docker является сразу k3s. Менеджмент ОС — через kubectl и cloud-init.

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

AWS Bottlerocket

Bottlerocket — контейнерная ОС от AWS. 

Из особенностей:

  • Вырезаны командные оболочки, управление ОС идет через API либо так называемый control container.

  • Почти все разделы на системном диске read-only. Обновляется через подгрузку дистрибутива целиком на отдельную партицию и последующим переключением на нее. Реализовано это с помощью фреймворка TUF. Присутствуют механизмы автоматического и ручного (через API-вызов) отката назад.

  • Правильно приготовленный (так написано в документации) selinux из коробки. Авторы проекта утверждают, что безопасность для них цель № 1.

  • Плотная завязка на инфраструктуру AWS. Присутствуют управляющие контейнеры для интеграции с облаком.

Навскидку дистрибутив выглядит очень перспективно. От пилота отказались по двум причинам — это ориентация на AWS и довольно сильно отличающийся от классического менеджмент ОС через toml-файлы + API-клиент. Слишком дорого бы встало переписывать сервисы под это дело.

Talos OS

Talos OS — очень похожий на предыдущего пациент. Еще более плотная ориентация на Kubernetes. Кажется, что больше нигде его и не используют.

Особенности:

  • Авторы пошли еще дальше и не только порезали командные оболочки и условно спрятали ssh-демона в контейнер. Управление осуществляется только через gRCP API и больше никак. Внутрь экземпляра ОС попасть нельзя.

  • Обновления, соответственно, тоже иммутабельные. Системные read-only-разделы в наличии.

  • Файлы конфигурации системы в yaml, собственный формат, не cloud-init.

  • Продвинутая консольная утилита управления talosctl. С помощью нее можно не только что-то сделать с ОС, но и сразу забутстрапить k8s-кластер.

А теперь о том, что не понравилось. Довольно схожая ситуация с Bottlerocket — слишком отличный от привычного концепт ОС, необходимо учиться дебажить систему и переделывать управляющие сервисы. Был и еще момент, на который жаловались коллеги из ИБ. Для того чтобы подгрузить какие-то модули в ядро, необходимо целиком пересобирать образ ОС, что довольно трудозатратно.

LinuxKit

Бонусный контент для красноглазиков. В отличие от всех примеров выше, LinuxKit —- это не полноценная хостовая ОС, а конструктор, который позволяет разработчикам собирать свои собственные минималистичные образы операционной системы на базе Linux.

Init- система и все служебные демоны пользовательского пространства вроде sshd представляют собой контейнеры, что позволяет выгружать одни компоненты и загружать другие. C LinuxKkit можно создавать экстремально легковесные дистрибутивы с минимальным набор компонентов, необходимых для запуска контейнеров: ядро Linux, библиотеки glibc, libcontainer, контейнерный runtime и минимальный набор утилит командной строки.

Сама ОС неизменяема (только если не сконфигурированы тома с данными) и может быть запущена везде, где есть гипервизор, или на голой железке.

CoreOS: Fedora CoreOS и Flatcar Linux

Прежде чем перейдем к последним двум контейнерным ОС, небольшой исторический экскурс. Пионером в области вот этих самых container optimized linux'ов была компания CoreOS. Параллельно Red Hat пилила свой похожий дистрибутив Project Atomic. В какой-то момент красная шляпа купила данную компанию и слила наработки обеих проектов в 1 флакон. В 2020 году проект был помечен как deprecated. А дальше, в лучших традициях open source, появилось два правопреемника — Fedora CoreOS и Flatcar Container Linux. Fedora CoreOS, соответственно, связан больше с компанией Red Hat и сообществом Fedora.

Второй проект делают ребята из Kinovolk, которые еще и пилят разный тулкит непосредственно для k8s. На данный момент Kinovolk находится в составе Microsoft. Оба проекта довольно похожи по функциональности. Подробнее остановлюсь на Flatcar Linux.

Ключевые функциональные особенности Flatcar OS:

  • Для конфигурации системы при старте используется не cloud-init, а собственная разработка ignition. Основные отличия следующие — ignition намертво приклеен к initrd-образу системы и отрабатывает на момент передачи управления супервизору systemd. Это позволяет делать различные низкоуровневые штуки вроде переразметки партиций и настройки systemd-юнитов непосредственно до их загрузки.

  • Конфигурация ignition возможна в двух форматах — CLC и Butane. Они довольно похожи, но есть некоторые различия в функциональности. Butane новее и считается основным стандартом на данный момент. Особенности конфигурации в том, что непосредственно в ВМ доставляется машинный конфиг в формате JSON, который генерирует специальная утилита из CLC/Butane yaml-файла.

  • Часть разделов системы, а если конкретнее /usr, read-only. Это уменьшает поверхность атаки, при этом не накладывает настолько сильных ограничений, как, например, в Bottlerocket.

  • Командные оболочки присутствуют в полной мере.

  • Есть менеджер автоматических обновлений с различными каналами (stable/beta и т. д.). Возможно их отключить полностью. Пакетный менеджер все так же отсутствует.

Почему выбрали Flatcar? У него понравились релизные каналы образов системы и приятная документация. Был и есть потенциал для использования в формате immutable infrastructure, при этом менеджмент и дебаг проблем внутри ОС остались в относительно привычном для разработчиков формате. Накладные затраты при переезде были минимальны, по сравнению с остальными ОС из списка выше. Завести первую машинку у себя на стенде получилось довольно быстро, тестовый запуск куба через kubeadm тоже не особо добавил хлопот. Свое дело сыграла и вкусовщина: CoreOS мне всегда импонировал.

Вы можете опробовать работу ОС Flatcar в сервисе Managed Kubernetes, воспользовавшись приветственным грантом на 5000 рублей.


Данная статья имеет сугубо обзорный характер для того, чтобы понять основной контекст работы с контейнерными ОС. В следующих выпусках расскажу уже о технических подробностях переезда на flatcar: c какими проблемами сталкивались при сборе ignition-конфигураций, какие есть особенности в настройке компонентов куба при работе c ro-разделами и прочие интересные штуки.

А пока поделитесь в опросе / в комментариях, с какими контейнерными ОС был опыт?

Комментарии (14)


  1. WondeRu
    00.00.0000 00:00

    Подскажите, а alpine является контейнерной ОС? Если нет, чего не хватает?


    1. 13werwolf13
      00.00.0000 00:00

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

      вот вопрос поинтереснее: нельзя ли для тех же задач применить buildroot?


      1. kepiukik Автор
        00.00.0000 00:00

        На первую часть вопроса коллега уже ответил ниже, отвечу на вторую.

        Вариантов что использовать масса, на самом деле. Помимо buildroot в заметке написал про LinuxKit, концептуально почти тоже самое.
        У такого подхода есть одна большая проблема - это банально дорого. Если в случае с вендором, взять тот же kinovolk и flatcar, который мы выбрали, предоставляются уже готовые под ключ образа + закрытие CVE, то тут придется все делать самим. Придется отдельную команду собирать только на поддержку своего микро дистрибутива.

        ИМХО, если человеческих ресурсов действительно много, и хочется что-то крутое и необычное - стоит присмотреться к концепции unikernel. Пакуем свои кусочки control-plane куба и запускаем либо в гипервизоре, либо на kata-containers каких-нибудь. Где-то слышал, что в гигантах вроде Google/AWS так и делают в gke и eks.


    1. Color
      00.00.0000 00:00

      В статье речь про ОС, для запуска контейнерного рантайма (т.е. ОС для оркестратора).

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


      1. WondeRu
        00.00.0000 00:00

        Такс, а чем дебиан с убунтой не вышел лицом? На них все привычно и все работает, как надо.


        1. kepiukik Автор
          00.00.0000 00:00
          +2

          Если говорить сугубо с технической точки зрения - там во-первых слишком много всего лишнего (а это накладные расходы на размер ВМки и скорость ее создания/запуска), а во вторых, опять же, immutable infrastructure, про которую сейчас из каждого утюга кричат. 

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

          RO разделы, в свою очередь, дают очень весомый буст с точки зрения ИБ. На куче докладов по безопасности в кубе рассматривают кейсы, когда злоумышленник запускает некий привелигированный под, монтирует туда что-то с помощью hostpath и проводит инъекцию в конфигурацию машины. Вот такая атака тут отсекается почти полностью. Примонтировал себе хакер раздел хостовой ОС (resolv.conf там или nssswitch.conf в etc, например, подменить захотел), а писать ничего нельзя и переконфигурить тоже. 

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


  1. ctapmex
    00.00.0000 00:00

    а какой образ использовать в рамках "защиты от санкций" ? т.е. чтобы и для минцифры/росреестра подходил, и жить на нем можно было.


    1. kepiukik Автор
      00.00.0000 00:00

      Честно говоря, не особо вникал в данный вопрос, ибо пока не настолько приперло.

      Чутка тыкал Астру, конкретно cloud образа для запуска ВМ на VMware. Мне лично показалось странным, что образ вроде как cloud, а cloud-init там отсутствует и как машинку сконфигурировать перед запуском - непонятно. Документации по этому поводу особо не нашел, но может и плохо искал.

      С docker образами, по крайней мере с год назад, вроде были какие-то проблемы. Они выкладывались в виде тарболов, причем были весьма пухлые. Соответственно, сперва их надо импортировать в рантайм и только потом перекладывать в реджистри.

      Про Alt/РедОС ничего сказать не могу, не пользовался от слова совсем.


      1. WondeRu
        00.00.0000 00:00

        Да, до сих пор тарболы на Астре. Я писал про них статью на Хабре, но удалил. Образы сейчас довольно маленькие, по 60мб


  1. brake
    00.00.0000 00:00

    непосредственно в ВМ доставляется машинный конфиг в формате JSON, который генерирует специальная утилита из CLC/Butane yaml-файла

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


  1. Yerzhan46
    00.00.0000 00:00

    Red Hat Enterprise Linux CoreOS (RHCOS)


  1. BATAZOR
    00.00.0000 00:00

    CoreOS была крутой OS, использовали долгое время, крутой механизм обновлений с откатом если что-то пошло не так на последнюю рабочую версию, синхронизация времени между машинами (etcd-кластер), протестированные докер/кубер из коробки и что самое главное - долгое время это была наиболее полная дока по работе с k8s на baremetal


  1. VASYL_MELNYK
    00.00.0000 00:00

    А прчему не посмотрели в сторону оракл линукс 7? Тот же самий ридхет, но обновляется и плбс оракли пилят новое ядро к нему

    Жить ему еще год , а там глядишь и чегото появится


  1. alex_www
    00.00.0000 00:00

    Нужно продолжение. После просмотра документации по Flatcar не стало понятнее как туда поставить куб. Гугление говорит что кто-то ставил кубеспреем. Но кака тогда работают апдейты самого флаткара? Вобщем реквестирую продолжение.