Пользователь
0,0
рейтинг
15 января 2015 в 14:04

Разработка → Docker в продакшене — чему мы научились, запустив более 300 миллионов контейнеров перевод

Go*
Docker в продакшене на Iron.io


Ранее в этом году (прим. 2014 г.), мы приняли решение запускать каждую задачу на IronWorker внутри своего собственного Docker контейнера. С тех пор мы запустили более 300 000 000 программ внутри собственных Docker контейнеров в облаке.

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

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

Мы начали работать с Docker версии 0.7.4 где было замечено несколько багов (один из самых больших — контейнер не закрывался должным образом, позднее он был поправлен). Мы преодолели почти все из них, постепенно обнаруживая, что Docker не только удовлетворяет наши потребности, но и даже превосходит наши ожидания, настолько, что мы даже расширили масштабы использования Docker во всей нашей инфраструктуре. Учитывая наш опыт на сегодняшний день, это имело смысл.

Преимущества


Вот список лишь некоторых преимуществ, которые мы увидели:


Немного цифр

Лёгкость в обновлении и поддержке образов


Git-овый подход в Docker является очень мощным и позволяет легко управлять большим количеством постоянно развертывающихся сред, и его система работы с образами позволяет нам тонко настраивать детализацию отдельных образов, экономя дисковое пространство. Теперь мы в состоянии идти в ногу с быстро обновляемыми языками, а также мы можем предложить специальные образы, как например новый стек FFmpeg, разработанный специально для обработки медиа. Сейчас у нас около 15 различных стеков и этот список быстро растет.

Распределение ресурсов и анализ


LXC-контейнеры являются методом виртуализации на уровне операционной системы и позволяют контейнерам разделять между собой ядро, но таким образом, что каждый контейнер может быть ограничен в использовании определенного количества ресурсов, таких как процессор, память и устройства ввода / вывода. Docker предоставляет эти возможности, а также и многие другие, в том числе REST API, систему контроля версий, обновление образов и легкий доступ к различным метрикам. Кроме того, Docker поддерживает более безопасный способ изоляции данных, используя файловую систему CoW. Это означает, что все изменения, внесенные в файлы в рамках задачи, хранятся отдельно и могут быть очищены с помощью одной команды. LXC не в состоянии отслеживать такие изменения.

Простая интеграция с Dockerfiles


Наши команды разбросаны по всему миру. Тот факт, что мы в состоянии опубликовать простой Dockerfile и чувствовать себя спокойно, зная, что проснувшись, кто-то другой будет в состоянии собрать точно такой же образ, как и вы — огромный выигрыш для каждого из нас и наших режимов сна. Наличие чистых образов также делает намного более быстрыми развёртку и тестирование. Циклы нашей разработки стали гораздо быстрее, а все члены команды намного счастливее.


Пользовательские среды, построенные с помощью Docker'a

Растущее сообщество


Обновления на Docker выходят очень часто (даже чаще, чем на Chrome). Степень участия сообщества в добавлении новых функций и устранении ошибок стремительно растет. Будь то поддержка образов, обновления самого Docker'а, или даже добавление дополнительных инструментов для работы с Docker, говорит о большом количестве умных людей, занимающихся этими проблемами, так что нам этого делать не приходится. Мы видим, что Docker-сообщество чрезвычайно позитивно и участие в нём приносит много пользы, и мы рады быть его частью.

Docker + CoreOS


Мы все еще ​​в процессе исследования, но сочетание Docker и CoreOS обещает занять серьёзные позиции в нашем стеке. Docker обеспечивает стабильное управление образами и контейнеризацией. CoreOS обеспечивает урезанную облачную ОС, распределенное управление и управление конфигурациями. Это сочетание позволяет более логично разделить проблемы и лучше наладить стек инфраструктуры, чем мы имеем сейчас.

Недостатки


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

Вот несколько проблем, с которыми мы столкнулись при использовании Docker на больших объемах:


Ошибки Docker — небольшие и поправимые

Ограниченная обратная совместимость


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

В других случаях, однако, это повлияло на эксплуатационные характеристики. Например, в случае каких-либо ошибок Docker после запуска контейнеров, мы анализируем STDERR и реагируем в зависимости от типа ошибки (например — повторной попыткой запуска задачи). К сожалению формат вывода ошибок менялся от версии к версии и поэтому мы решили делать отладку на лету.

Решить эти проблемы относительно несложно, но это значит, что все обновления должны быть проверены несколько раз, и вы все еще остаетесь в подвешенном состоянии, пока не выпустите релиз в мир больших чисел. Следует отметить, что мы начали несколько месяцев назад с версии 0.7.4 и недавно обновили нашу систему до версии 1.2.0 и увидели значительный прогресс в этой области.

Ограниченные средства и библиотеки


В то время как у Docker был стабильный релиз 4 месяца назад, многие инструменты, сделанные для него, по-прежнему остаются нестабильными. Применение большого количества инструментов в системе Docker означает также принятие больших накладных расходов. Кому-то из вашей команды придется оставаться в курсе всего и много возиться для того, чтобы учесть новые функции и исправить ошибки. Тем не менее, нам нравятся многие инструменты, которые сделаны для Docker, и нам не терпится дождаться кто победит в этих сражениях (глядя на управление инфраструктурой). Особый интерес для нас представляют etcd, fleet и kubernetes.

Торжествуя над сложностями


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


Выдержка из сеанса отладки

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

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

Длительный процесс удаления



Решение проблемы Медленного Удаления Контейнера

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

После изучения и исследования devicemapper (драйвера файловой системы Docker), мы обнаружили специальную опцию `--storage-opt dm.blkdiscard=false`. Эта опция говорит Docker, что нужно пропустить тяжелую дисковую операцию при удалении контейнеров, что значительно ускоряет процесс отключения контейнера. С тех пор проблема была решена.

Не отмонтировывающиеся тома


Контейнеры не завершали работу корректно, потому что Docker не размонтировал тома должным образом. Из-за этого контейнеры работали без остановки, даже после того, как задача была завершена. Другой путь — размонтировать тома и удалить папки явно с помощью набора стандартных скриптов. К счастью, это было давно, когда мы использовали Docker v0.7.6. Мы удалили этот длинный скрипт так как эта проблема размонтирования была решена в Docker версии 0.9.0.


Распределение использования стеков

Переключение лимита памяти


В один из релизов Docker вдруг добавили возможность ограничения памяти и убрали опции LXC. В результате этого, некоторые из рабочих процессов превысили ограничения памяти, и вся система перестала отвечать на запросы. Это застало нас врасплох, потому что Docker никогда не ломался, даже используя неподдерживаемые опции. Исправить было несложно — применить ограничения памяти в Docker — но всё равно изменения застали нас врасплох.

Планы на будущее


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

Эти области включают в себя:

IronWorker Backend


В дополнение к использованию Docker как контейнера для задач, мы находимся в процессе внедрения его как инструмента управления обработкой на каждом сервере, который контролирует и запускает рабочие задачи. (Главная задача на каждом исполнителе берет задание из очереди, загружает в соответствующую среду Docker, выполняет задание, контролирует его, а затем, после окончания выполнения задания, очищает среду.) Интересно, что мы будем иметь в контейнере код, управляющий другими контейнерами на тех же машинах. Переложение всей нашей инфрастуктуры IronWorker на Docker контейнеры позволяет довольно легко запускать их на CoreOS.

API IronWorker, IronMQ и IronCache


Мы ничем не отличается от других команд разработчиков, которые не любят заниматься настройкой и развертыванием. И поэтому мы очень рады возможности упаковки всех наших сервисов в Docker контейнеры для создания простых и предсказуемых рабочих сред. Больше не нужно настраивать сервера. Все что нам нужно это серверы, на которых можно запускать Docker контейнеры и… наши сервисы работают! Следует также отметить, что мы заменяем наши серверы сборки — серверы, которые строят релизы наших программных продуктов в определенных средах — Docker контейнерами. Преимущества здесь в большей гибкости и более простом, надежном стеке. Оставайтесь на связи.

Cборка и загрузка Worker'ов


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

Внедрение On-Premise сборки


Использование Docker в качестве основного метода распределения нашего IronMQ Enterprise последней версии упрощает нашу работу и обеспечивает простоту и универсальный способ развертывания в практически любой облачной среде. Помимо сервисов, которые мы запускаем в облаке, всем клиентам нужны серверы, которые могут запускать Docker контейнеры и они с относительной легкостью могут получить мульти-серверные облачные сервисы в тестовой или продакшен среде.

Продакшен и далее



Эволюция технологий(Взято с docker.com)

За последние полтора года, с тех пор как Solomon Hykes представил демо версию на GoSF meetup, Docker прошел долгий путь. С момента выпуска версии 1.0 Docker показал себя как достаточно стабильный и действительно готовый к продакшену.

Развитие Docker'a очень впечатляет. Как видно из приведенного выше списка, мы с нетерпением ждем новых возможностей, но мы также рады и нынешним его возможностям.

Если бы мы только могли заполучить инструмент для управления инфраструктурой на базе Docker.
Перевод: Travis Reeder, Roman Kononov
Роман Кононов @rkononov
карма
21,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +5
    Спасибо за статью, но это прямо «неделя статей о Docker на Хабре».
    • +5
      Это же прекрасно, смысл ресурса как раз в обмене опытом сообщества, имхо, процесс удачно проходит =)
      • –11
        Такое чувство, что тут одни админы датацентров сидят.
        • +1
          Ну когда система взята на вооружение крупными датацентрами, они много багфиксят или репортят о багах.
          И обычно всё начинается с датацентров, а потом плавно спускается до компаний из 50 сотрудников, так было с виртуалдизацией серверов.

          И вот тот момент, когда пора технологии спускаться, это когда датацентры отладили, довольны и пишут стати о ней ;)
    • 0
      А скоро еще виндузятники присоединятся к этой тусовке, и будет x2 статей на хабре.
      • 0
        да и Microsoft обещал сделать поддержку Docker, но для меня пока остается загадкой каким образом они это будут делать
        • +1
          Встроят поддержку в сервер скорей всего только контейнеров для винды, но встроят точно, пруф.
  • +2
    Астрологи объявили неделю легковесных контейнеров. Количество постов про Docker удвоилось.
  • +4
    Кстати, про лимиты ресурсов для lxc/docker — сеть, память, процессор, дисковое место — где можно годный мануал почитать? а то ограничил память до 128, к примеру — а контейнер видит всю физическую и хоть тресни — валится:( или всю сетевую полосу отьедает.
    Спасибо.
    • +1
      Вообще, лучше сразу начать с мануалов по cgroups и их возможностям.

      access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-memory.html

      Вот тут — применительно к докеру.
      fabiokung.com/2014/03/13/memory-inside-linux-containers/
      goldmann.pl/blog/2014/09/11/resource-management-in-docker/

      Ну, и, собственно, github.com/docker/libcontainer

      Контейнер и будет видить всю физическую память, поскольку он ее читает и /proc/meminfo. Докер, если я не ошибаюсь, просто перемонтирует внутри контейнера procfs как есть, никак его не изменяя. Суть лимита памяти заключается чуть-чуть в ином. Если содержимое конейнера выходит за лимит памяти, в контейнере просто срабатывает oom-killer. Ну и у докера есть еще одна неприятная деталь.

      1. Когда вы выставляете докеру лимит памяти, он задает его через memory.limit_in_bytes в cgroup контейнера.
      2. Но кроме этого, если в системе доступен swap, он устанавливает memory.memsw.limit_in_bytes в значение равное двум лимитам памяти, который вы выставили. В этом случае, oom-killer может не прийти достаточно долго.

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

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