Первый раз о CoreOS я услышал от Петра Леменкова на Yandex конференции “Дорога в облака” в сентябре 2013 года. Тогда я даже подумать не мог, что буду участвовать в разработке этой ОС.


Второй раз о CoreOS я вспомнил в октябре 2014, когда поступила задача о переводе микросервисов, написанных на Ruby (которые использовали, как это ни странно разные версии Ruby), в более благоприятную среду для continuous integration. Тогда я первый раз запустил CoreOS, и мне она показалось ужасно неудобной в использовании. Документация к ней была поверхностная. Сервисы, которые превращали CoreOS в кластерную ОС, имели множество недоработок и вызывали только чувство раздражения из-за постоянных ошибок. О переводе даже части инфраструктуры на CoreOS не было и речи.


В третий же раз, в марте 2015, поступила задача о предоставлении услуги поддержки в рамках community support для CoreOS. О том, как я справлялся, и пойдет речь.


Знакомство


Первой задачей было построить кластер, который выполняет функции, близкие к production системе одного из заказчиков, с которым я работал. Пришлось экспериментировать со связкой Kafka-Storm-Cassandra. За время выполнения proof-of-concept мне встретились всё те же недочеты в документации и коде etcd и fleet. Еще тогда мне показалось нелогичным поднимать кластер Zookeeper, когда в системе уже имеется etcd. К сожалению, пока ни у кого не возникло желания написать транслятор протокола Zookeeper Jute в REST API etcd. Наибольшие сложности тогда вызвало написание топологий для Apache Storm. Благодаря проекту https://github.com/Yelp/pyleus мне удалось избежать описания топологий на Java/Clojure. Работающий proof-of-concept был даже успешно продемонстрирован одному из потенциальных заказчиков для внедрения, но, к сожалению, из-за проблем с финансированием проект реализовать не удалось.


Практика


Используя полученный опыт и набитые шишки в процессе изучения CoreOS был дан старт улучшению. С официального IRC канала #coreos я получал вопросы, на которые отвечал и писал документацию. Самое главное — воспринимать все поступающие вопросы всерьез и стараться отвечать даже на самые глупые. Стоит отметить, что новые технологии, по которым я предоставлял поддержку, были для меня так же неизвестны, как и для пользователей, которые задают по ним вопросы. В то время, когда пользователь просто задавал вопрос, мне приходилось воспроизвести пользовательскую среду у себя и самому разбираться в деталях, лезть в исходный код, а иногда и исправлять там ошибки. Подобное боевое крещение позволило изучить многие нюансы работы systemd, ядра Linux, попрактиковаться в Си и научиться писать на Go.


Документация


Очень часто вопросы пользователей касались systemd. Хоть официальная документация systemd всё подробно расписывает, пользователям нужны примеры, им некогда читать (что не говори, но чтобы завоевать сердце пользователя, нужны готовые примеры, и много). В рамках поддержки CoreOS я написал немало примеров и дополнительной документации которая касается systemd. По некоторым из них Google даже выдавал первые ссылки на страницы документации CoreOS. Затем первенство перенял Wiki Archlinux. Примеры и пояснения должны были быть везде, где пользователь мог интерпретировать информацию не так. Почти любое недопонимание пользователя касательно документации или вопрос «а что если?», который возникал у меня в мыслях, превращались в pull request на github. Если ответа на вопрос пользователя нет в документации — исправь это.


Воспроизведение


Перед тем как публиковать ответ, по возможности его необходимо проверить в stable, beta и alpha релизах CoreOS. Для этого мне пришлось адаптировать bash скрипт, который с помощью libvirt поднимал виртуальные машины для внутренней инфраструктуры(возможно напишу об этом отдельный пост), используя уже готовые cloud VM образы Ubuntu. Скрипт при необходимости скачивает официальный образ CoreOS заданного релиза (https://stable.release.core-os.net/amd64-usr/current/), создает на его основе snapshot и поднимает виртуальную машину с примонтированным к ней cloud-config. При использовании shapshot'ов процесс создания «чистой» виртуальной машины занимает всего 20 секунд (при использовании SSD еще быстрее). При создании кластера виртуальных машин будет использоваться один базовый образ, что экономит дисковое время и место. К примеру, кластер из трех виртуальных машин поднимается всего за 30 секунд. Преимущество libvirt-qemu решения перед Vagrant в скорости работы. Даже libvirt provider в Vagrant не давал такой скорости. За день мне приходилось создавать и удалять кластеры, повторяющие пользовательское окружение, по несколько десятков раз. Конфигурация всего кластера формировалась при помощи всего одного cloud-config. Сейчас вместо cloudinit активно внедряется Ignition, который выполняется на стадии начальной загрузки системы.


Рулевой


Не стоит забывать и о проекте Kubernetes, который тесно используется с продуктами CoreOS. Для изучения Kubernetes я написал cloud-config, который воспроизводит конфигурацию точно так, как изложено в официальной документации, написанной Kubernetes командой из CoreOS. Это также позволяло за несколько минут воспроизвести проблему, возникшую у пользователя, и предложить решение.


Решение


На любой вопрос пользователя я старался выдать решение или, как минимум, workaround. Даже доступ в кулуары CoreOS мне не сильно помогал, т.к. я предоставлял поддержку в европейской части света, а вся команда CoreOS работала в тихоокеанской временной зоне. Чтобы не ждать, пока мои коллеги проснутся на другом конце Земли, я часто изучал исходный код для понимания процесса работы ПО, а порой сразу исправлял ошибки в коде.


Мнение


До сих пор очень многие скептически и категорично смотрят в сторону контейнеризации. Стоит только упомянуть Docker или CoreOS, так на тебя выливается ушат **вна. Я всегда стараюсь обратить внимание на то, что у каждой задачи есть свой инструмент решения. И у каждого инструмента есть свои плюсы и минусы. Если система уже работает на виртуальных машинах и не стоит задачи что-либо изменить или испортить улучшить, то пускай она работает дальше. Никто тебя не заставляет переводить всё на контейнеры. Но вот если задача уже поставлена или есть свободное время поиграться с контейнерам, то тут возникает недопонимание. Люди, привыкшие работать с виртуальными машинами, kickstart'ами, и системами управления конфигурацией, применяют старый подход к контейнерам, а потом жалуются на то, что контейнеры не работают. Не буду разводить флейм, просто еще раз дам ссылку на http://12factor.net/ и напомню, что контейнеры в большинстве случаях не должны хранить внутри конфигурацию и быть зависимыми от хоста.


Совершенство


Нет предела совершенству. Работа была всегда. В спокойные дни я тратил время на свой TODO-list. Все мелкие идеи или недочеты я записывал в список, и этот список никогда не заканчивался.


Контекст


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


Флот


Как только количество обращений по поддержке стало падать, я вступил в небольшую команду, работающей над проектом fleet. На тот момент проект был заброшен, т.к. всё внимание переключилось на Kubernetes. Но остались пользователи, которым необходимо было работать с systemd как с кластером. За три месяца мы написали около 15 новых функциональных тестов, реализовали автоматическую их проверку в https://semaphoreci.com. К выходу версии v0.12.0 мы закрыли 36 проблем и внесли в код 20 изменений. К версии v0.13.0 мы планируем закрыть около 20 проблем и внести 16 изменений в код.


Сегодня


На сегодняшний день команда поддержки CoreOS сформирована в Сан-Францизско, а я переключился на работу с другими проектами. За год работы мне посчастливилось пообщаться с такими людьми как Matthew Garrett, Brian 'redbeard' Harrington, Lennart Poettering, Kelsey Hightower и другими.


P.S. Полагаю я немного подпортил доход по предоставлению коммерческой поддержки:


nalum: anyone using the CoreOS managed linux service?
balboah: no we just ask kayrus :)
nalum: Who is kayrus?
balboah: the man that answers all the questions, usually

P.P.S. На следующей неделе в Берлине проходит конференция CoreOS Fest. Желающие поучаствовать могут еще успеть купить билеты: https://coreos.com/fest/

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


  1. fuCtor
    05.05.2016 15:28

    Как человек опытный, можете посдказать, на сколько материал от DigitalOcean по развертыванию CoreOS отвечает действительности? Некоторое время назад по инструкции пробовал собрать кластер, но через пару минут он разваливался, etcd переставал видет узлы. Как только не колдовал, уже для упрощения написал скрипт для автоматического развертывания. Так в итоге завести и не получилось.


    1. kay
      06.05.2016 09:49
      +1

      Типичный пример обращения пользователя, когда приходится применять libastral. etcd просто так не падает, должна быть причина. Пытались ли включить автозагрузку etcd через systemd enable. Обычно это самая распространенная ошибка. Как правило etcd конфигурируется с помощь cloud-config, если использовать systemd enable etcd2, то при перезагрузке CoreOS (например при установке автоматического обновления) etcd2 сервис запустится до конфигурации системы, что может вызвать сбои.


      А вобще причину нужно искать в логах. Нет информации по размеру кластера, был ли достигнут кворум. Ну и желательно сам cloud-config предоставить.


  1. akzhan
    05.05.2016 17:43
    +2

    Respect kay


  1. Gendalph
    06.05.2016 01:17
    +2

    /me кричит из дальнего угла "LXC!", а потом ещё " OpenVZ!"
    Тоже контейнеры, только применение другое.


    Собственно, вопрос на который мне никто не может сформулировать внятный ответ: что делать когда надо в контейнере иметь больше одного процесса? Скажем, Консул нужен.
    Да, я знаю про supervisord, но он тупой. Что-то в контейнере "встало раком", как это словить и обработать?


    1. Flip89
      06.05.2016 08:13
      +1

      В CoreOS rkt идеалогически контейнер не привязывается к одному процессу там можно запускать и приветсутвуются запускать много процессов, такие контейнеры они называют подами, а в качестве pid 1 там systemd.


    1. boombick
      06.05.2016 09:40
      -1

      Ну раз там все равно уже больше одного процесса, то можно впихнуть еще и мониторинг.


      1. Gendalph
        06.05.2016 16:05
        +1

        Как выражался один мой знакомый "Костылинг и х**чинг".
        Зачем делать то, что идет вразрез с парадигмой использования технологии?
        Раз уже там появляется еще и мониторинг, то почему бы не использовать уже простые виртуалки с системой управления состояниями (Salt, Chef, Puppet, ...)? Городить в таком раскладе контейнер — глупо.


    1. kay
      06.05.2016 09:55
      +1

      Как уже ответили выше, можно использовать rkt + systemd. Кстати rkt может запускать не только контейнеры, но и полноценную изолированную виртуальную машину на основе lkvm (тут нужно сказать спасибо ребятам из Intel, которые это разработали).


      True way — использовать контейнер под каждый сервис, а если требуется запутстиь нечто, что должно работать в одном контейнере — namespaces в помощь. Можно расшарить сеть (как это делается для kubernetes pods). Вот насчет pid namespace — пока только на стадии разработки (https://github.com/docker/docker/pull/22481)


      1. Gendalph
        06.05.2016 16:02

        https://github.com/coreos/rkt -краем уха слышал, но пока не щупал. Выглядит интересно.
        Насколько я слышал о pod'ах, ими пользуется Kubernetes и там это несколько (Docker) контейнеров с общим localhost'ом. В целом — интересно. На бумаге мне это нравится больше чем Docker.


        True way — использовать контейнер под каждый сервис

        Так вот в том же и дело, что если использовать discovery или еще что-то, что требует резидентного приложения (читай Consul, а он такой не один), то вы автоматом отказываетесь от парадигмы "один процесс = один контейнер", что в определенных ситуациях ломает внутренние механизмы Docker.


        если требуется запутстиь нечто, что должно работать в одном контейнере

        тут всё просто — lxc-create и у вас появляется виртуальное окружение, пусть и с кучей ограничений, но с точки зрения управления это почти ВМ.


  1. shuron
    07.05.2016 13:33

    Спасибо за статью. Очень интересно…
    Я в плотную работаюс Докером, но в основнон на старых, достаточно монилтных проектах, которые регулярно патчатся но перерефакторитьих на микросервицы или нет время или нет смысла…
    Однако по 2-5 контейнеров на аппликушечку набирается…
    Пока хватает Docker-Compose на одной двух машинах, но тема с CoreOS очень интересна…
    Мозехте просветить с вашим опытом по паре вопросов…
    1) Стоит ли заморачиватся с CoreOS если сервисов пока 2-5 на аппликуху и 2, 3 виртуальных машин хватает.
    2) Есть ли у вас опыт с Kubernetes который предлагхает гугл в своем опыте, мы поигрались, конечно это для наших задачь церезчур мощнан и динамическая среда… Но на рост в полне, однако мои мене опытные коллеги испугались (Инфраструктуры боятся)…
    3) Есть ли у вас опыт со стэком Rancher? Воспринимается ли это как конкуренция CoreOS?

    Может у вас есть общего плана совет для проектов с таким начальным количеством контейнеров и достаточно медленным их ростом, что-бы не не сильно вкладываться в инфраструктуру (в смысле майтенненса)
    ни иметь по возможности максимум контроля?


    1. kay
      07.05.2016 17:47

      1) Стоит. Как минимум для того, чтобы понабраться опыта проектирования приложения под контейнеры. С ростом проекта будет все сложнее и сложнее.
      2) См. выше. Технологии Kubernetes/Mesos очень бурно развиваются. Лучше потратить силы сейчас, чем быть менее конкурентноспособным в будущем.
      3) Опыта нет, но разработчики CoreOS о Rancher знают. Эти проекты всё же отличаются друг от друга, чтобы их можно было сравнивать как конкурентов.


      Общий план и совет: см. выше.


      1. shuron
        08.05.2016 21:34

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

        3)
        Можете как-то осветить отличия?