Дело не в выборе одного вместо другого

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

Чтобы лучше ответить на этот вопрос, мы начнем с простого облачного приложения. Предположим, что интерфейс этого приложения написан на React при поддержке Node.js, и мы используем Java для доступа к базе данных. Для доступа к внешним API, возможно, мы будем использовать Python, чтобы позволить нам обслуживать конечные точки отдыха.

Чистый подход Docker к развертыванию этого приложения потребует переноса приложения в некоторый серверный стек. Этот серверный стек будет иметь оборудование, ОС (Ubuntu) и демон Docker, установленные поверх этой ОС. Это то, что позволит нам раскручивать контейнеры. Docker предоставляет несколько отличных инструментов для работы с нашими контейнерными приложениями.

Итак, как только мы возьмем эти приложения и создадим из них контейнеры Docker, мы перейдем к командам. Мы выполним docker build, docker push до реестра, SSH в наш стек, а затем, наконец, выполним docker run или даже docker-compose, чтобы раскрутить наши контейнеры. Используя Docker и инструменты, которые он предоставляет, простое развертывание становится очень простым.

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

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

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

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

Вот тут-то и пригодится инструмент оркестровки, такой как Kubernetes. Kubernetes позволит вам использовать ваши существующие Dockerized приложения, а также оркестровать их и более эффективно использовать ваши серверы и пространство. На изображении ниже прямоугольники представляют стек серверов. Но в Kubernetes Land это рабочие узлы:

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

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

Развертывание Kubernetes - это не разовое дело. Это то, что растет, живет и дышит вместе с приложением - полным стеком. Если приложение React выйдет из строя, Kubernetes автоматически перезапустит его, чтобы вернуться в то состояние, которое мы определили при первом создании этого развертывания. Таким образом, развертывание всегда растет и всегда живет вместе с нашим приложением. Думаю, вы согласитесь со мной, что это развертывание, помимо масштабирования, проще.

Как Kubernetes занимается разработкой? После того, как мы создали развертывания для каждой из этих отдельных служб и масштабировали их все, вы заметите, что у нас есть много разных микросервисов с разными конечными точками. Например, если нашему интерфейсу требуется доступ к базе данных, может быть десять различных экземпляров этого приложения Java, которые взаимодействуют с базой данных. В этом случае Kubernetes развертывает балансировку нагрузки для всех масштабируемых микросервисов. Кроме того, он использует возможности реестра и обнаружения служб, чтобы наши приложения могли взаимодействовать друг с другом с помощью так называемой службы Kubernetes. Таким образом, для каждого из этих развертываний Kubernetes также создаст сервис (скажем, сервис A, B и C). Проще говоря, эти приложения теперь могут общаться друг с другом, просто используя эти имена служб.

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

Заключение

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

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