Эй! Привет! Мой босс сказал поговорить с тобой. Сказал, что ты много знаешь про веб приложения.
— Да, сейчас правда, я больше занимаюсь распределенными системами. Я только что вернулся с ContainerCamp и GlueCon, а еще я собираюсь на DockerCon на следующей неделе. Реально впечатлен тем, как двигается бизнес — все становится намного проще и доступнее! Это — будущее!
Здорово… Видишь ли, я сейчас разрабатываю простенькое web-приложение — обычный CRUD на Rails, собираюсь деплоиться в Heroku. Скажи, Heroku все еще актуальна?
— Ты что! Нет. Это уже старая школа. Heroku — труп. Никто этим больше не пользуется. Теперь тебе нужно познать Docker. Это будущее!
Ах вот как. Ну ок. А что это?— Да, сейчас правда, я больше занимаюсь распределенными системами. Я только что вернулся с ContainerCamp и GlueCon, а еще я собираюсь на DockerCon на следующей неделе. Реально впечатлен тем, как двигается бизнес — все становится намного проще и доступнее! Это — будущее!
Здорово… Видишь ли, я сейчас разрабатываю простенькое web-приложение — обычный CRUD на Rails, собираюсь деплоиться в Heroku. Скажи, Heroku все еще актуальна?
— Ты что! Нет. Это уже старая школа. Heroku — труп. Никто этим больше не пользуется. Теперь тебе нужно познать Docker. Это будущее!
— Docker — новый способ контейнеризации. Это как LXC, только еще включает формат запаковки контейнеров, а еще это распределительная платформа и ряд утилит, чтобы сделать построение распределенной системы реально простым делом.
Консерверезация?.. — что за? А что за LXE?
— LXC. Это как chroot на стероидах.
Что за cher-oot?
— Ясно… Смотри… Docker… Контейнеризация… Это будущее… Это как виртуализация, только быстрее и дешевле.
Окей, типа как Vagrant.
— Не, Vagrant — труп. Теперь все готовится к использованию внутри контейнеров, Это Будущее!
Ок, так мне теперь не надо ничего знать о виртуализации?
— Ну… Нет, тебе надо понимать виртуализацию, т.к. контейнеры не предоставляют полную защиту данных приложения, пока что. Так что, если ты хочешь запускать все в мультиарендном окружении, то тебе надо будет убедиться, что пользователи не выберутся из песочницы.
Так, что-то я потерялся. Давай отмотаем немного назад. Так вот, есть виртуализация, называемая контейнерами. Я могу использовать это на Heroku?
— Что-ж, Heroku поддерживает Docker, но вспомни, что я говорил тебе. Heroku — труп. Тебе надо запускать контейнеры на CoreOS.
Что это?
— Это та самая крутая host OS, которую ты сможешь использовать с Docker. Блин, да тебе даже Docker не понадобится! Ты просто можешь использовать rkt!
Rocket?
— Не, rkt.
Правильно, Rocket.
— Не, теперь это называется rkt. Полностью другая штука. Это альтернативный формат контейнеризации, который предоставляется как конкурент Docker.
Дак это выходит круто?
— Конечно, круто. Компонуемость — это будущее!
А ты этим rkt вообще пользуешься?
— Я не знаю. Я не думаю, что кто-то этим пользуется.
Эххх… Так ты что-то там про CoreOS говорил?
— Да… так вот, это host, который ты используешь с Docker.
А что такое host?
— CoreOS создана для оптимальной работы с контейнерами. Она настроена на работу с контейнерами.
Работу с контейнерами...?
— Да, у тебя же что-то там есть в твоих контейнерах. Так что, ты типа поднимаешь инстанс вроде Amazon EC2, поднимаешь там CoreOS host, дальше запускаешь сервис Docker-а, и затем ты там уже можешь деплоить Docker-образы.
Какая часть из всего этого — контейнер?
— Все из этого. Смотри, ты берешь свое приложение, пишешь Dockerfile, делаешь локальный образ, потом пушишь на любой Docker-host.
Ааа, типа Heroku?
— Нет… не Heroku. Я ж тебе говорил, что Heroku — труп. Ты запускаешь свое собственное облако, используя Docker.
О_о?
— Да, это реально просто. Почитай про #gifee.
Gify?
— GIFEE — это Google Infrastructure For Everyone Else. Ты берешь все эти утилиты и стеки технологий, использующие контейнеры, и у тебя вся та инфраструктура, прямо как у Google.
Почему просто не использовать сервисы Google?
— А если через пол года там все полностью поменяется?
Хорошо, разве кто-то еще это все не хостит? Я реально не хочу сам хостить вот это все.
— Ну, AmazonECS, но тебе придется писать какую-то XML херь.
Что скажешь про OpenStack?
— Фу…
Послушай, я не хочу ничего хостить и обслуживать сам.
— Нет, это реально просто. Ты просто настраиваешь Kubernetes cluster.
Так мне нужен кластер?
— Kubernetes cluster. Он управляет деплоями всех твоих сервисов.
У меня только один сервис.
— О чем ты говоришь? Смотри, у тебя же web-приложение, правильно? Так значит у тебя должно быть 8-12 сервисов.
Что? Нет! У меня одно приложение. Сервис, похервис — пофигу! Всего одно долбаное приложение!
— Нет, смотри в сторону микросервисов. Это будущее. Это то, как мы все вокруг теперь работаем. Ты берешь свое супер-пупер приложение и разделяешь на 12 сервисов. По одному для каждой задачи.
Ну это уже чересчур…
— Это единственный путь убедиться, что конфигурация надежна. Так что, если твой сервис аутентификации грохнется…
Сервис аутентификации? Да е-мае, я просто собирался использовать тот же самый плагин, который использовал много раз до этого!
— Супер. Используй его. Положи его в отдельный проект. Накидай поверх его RestAPI. Потом твои другие сервисы будут использовать этот API и будут супер изящно обрабатывать отказы в работе. Положи его в контейнер и делай CI/CD!
Будь по твоему. Теперь у меня на руках десятки неуправляемых сервисов и что дальше?
— Да, так вот, я и говорил про Kubernetes. Он позволяет тебе удобно проводить оркестрацию всех твоих сервисов.
Проводить оркестрацию?
— Да! Вот, у тебя есть эти твои сервисы, и они должны быть отказоустойчивыми, поэтому тебе нужно запускать сразу несколько копий для каждого из твоих сервисов! И Kubernetes гарантирует тебе, что у тебя этих копий будет достаточно и они распределены между хостами в твоем fleet и всегда доступны.
То есть, мне нужен fleet?
— Да, для отказоустойчивости. Но Kubernetes сделает все за тебя. К тому же, ты уверен, что Kubernetes будет работать как надо, потому что его сделал Google, и еще потому что он работает на основе etcd.
Что такое etcd?
— Эта штука сделана на основе RAFT.
OK, что такое RAFT?
— Это как Paxos.
Господи, насколько глубокой будет эта сраная кроличья дыра, куда мы сейчас направляемся? Я просто хочу запустить одно сраное веб приложение!!! Твоюж мать!!! Окей, глубокий вдох, выдох… Ок, что такое Paxos?
— Paxos — это старое семейство распределенных протоколов из 70х, которые никто не понимает и не использует.
Отлично! Я так рад, что ты рассказал мне об этом! Так что такое Raft?
— Так как никто не понимает Paxos… эээ… кроме Диего…
О! Так ты его знаешь?
— Нет конечно, он работает в CoreOS. Так или иначе, Диего придумал Raft для своей кандидатской диссертации, т.к. Paxos был слишком сложен. Чертовски умный чел. И потом он написал etcd в качестве реализации и потом Aphyr сказал, что это действительно не говно, а круто!!!
Кто такой Aphyr?
— Aphyr — ну это тот чел, который написал «Call Me Maybe», ну… ты же знаешь его? «The distributed systems and BDSM guy»?
Ты только что сказал BDSM?
— Да, BDSM. Это Сан-Франциско. Здесь все увлечены распределенными системами и BDSM.
И он написал ту песню Кэти Перри?
— Нет, он написал серию статьей о том, что каждая база данных заваливает CAP.
Что за CAP?
— Тероема про CAP (известная также как теорема Брюера). Она говорит, что у тебя может быть только 2 пункта из трех: Консистентности, Доступности и Устойчивости к расщеплению.
И все базы данных заваливают эту CAP? Что блин это все значит?
— Это означает, что все это — отстой. Как MongoDB.
Я думал, что MongoDB горизонтально расширяемая.
— Никто кроме тебя.
Ладно. Так что там с etcd?
— Да, так вот, etcd — это распределенное хранилище значений.
Прямо как Redis.
— Нет, совсем не как Redis. etcd — распределенная система. Redis теряет часть информации если сеть временно отказывает.
Хорошо, это распределенное хранилище значений. Чем же эта штука так полезна?
— Kubernetes настраивает стандартный кластер из пяти узлов используя etcd как шину обмена сообщениями. Он комбинируется с парой своих собственных сервисов для предоставления весьма устойчивой оркестровой системы.
5 узлов? У меня одно приложение. Сколько машин мне нужно поднять для этого?
— Что ж, ты же собираешься поднять 12 сервисов, и конечно же тебе понадобиться пара лишних копий для каждого, пара балансировщиков, etcd, твоя база данных и Kubernetes cluster. Так что, это может быть около 50-ти одновременно работающих контейнеров.
ЧЗХ!
— Да ваще не вопрос! Контейнеры реально эффективные, так что тебе не составит труда распределить все это дело между 8 машинами! Разве это не потрясающе?
И все-таки, это только твое впечатление. И вот взяв вот это все, я смогу просто развернуть мое приложение?
— Ну конечно! Правда, объемы хранилища данных — все еще открытый вопрос в случае с Docker и Kubernetes, и сетевая нагрузка повышена, но эти вопросы очень скоро будут решены!
Хмм, понятно. Хорошо, кажется, я теперь все понял.
— Супер!
Спасибо за развернутый рассказ.
— Да никаких проблем.
Позволь только мне подытожить все то, о чем мы говорили, чтобы убедиться, что мы друг друга поняли.
— Конечно!
Так вот, мне просто-напросто нужно разделить мое простое CRUD приложение на 12 микросервисов, каждое из которых должно быть обернуто в собственное API, которые должны звать друг друга по этим API, но при этом обрабатывать ошибки каждого из них, положить все это в контейнеры Docker, запустить fleet из 8 машин, которые являются Docker-хостами на базе CoreOS, «оркестрить на них» используя небольшой Kubernetes cluster на базе etcd, решить «пару открытых вопросов» по поводу сетевой нагрузки и хранения информации, настроить CI/CD нескольких копий каждого микросервиса с балансировщиками во fleet. Все так?
— Да! Разве это не шикарно?
… Пойду деплоиться в Heroku.