Облачные приложения и Kubernetes: контейнеры

Ранее мы обсудили основные методы и архитектуру, которые лежат в основе приложений Cloud Native. В этой статье мы рассмотрим основную технологию, которая позволяет разработчикам реализовывать эти более широкие архитектурные решения – здесь речь пойдет о контейнерах.

Читайте также:

Что такое контейнеры?

Контейнеры – это переносимый и легко развертываемый формат упаковки приложений со всеми их необходимыми зависимостями и библиотеками. После запуска эти пакеты обеспечивают согласованную и предсказуемую среду выполнения для контейнерного приложения. Используемые в контейнеризации преимущества функций изоляции ядра Linux (например, cgroups и пространства имен) обеспечивают изолированную и управляемую среду выполнения для приложений.

snappy_photo: 2.4

snappy_web: 1.0

Bins/Libs

Bins/Libs

СРЕДА ВЫПОЛНЕНИЯ КОНТЕЙНЕРА

ОПЕРАЦИОННАЯ СИСТЕМА ХОСТА

ИНФРАСТРУКТУРА

Контейнеры vs. виртуальные машины

По сравнению с виртуальными машинами контейнеры легче и требуют меньше ресурсов, поскольку они инкапсулируют меньшее количество уровней операционной системы. И ВМ, и контейнеры предоставляют ограниченные по ресурсам среды для запуска приложений и всех их программных зависимостей. Но поскольку контейнеры используют ядро ОС хоста и не требуют отдельных операционных систем, они загружаются в течение небольшого времени и имеют гораздо меньший размер.

Среда выполнения контейнера

Сегодня доступно несколько контейнерных сред выполнения, однако Docker является наиболее зрелым, широко поддерживаемым и распространенным форматом, встроенным в большинство систем оркестровки контейнеров. Совсем недавно проект Linux Foundation под названием Open Container Initiative (OCI) начал работу над стандартизацией форматов и сред выполнения контейнеров, что привело к разработке и интеграции облегченных и стабильных сред, совместимых с OCI, таких как containerd. В середине 2018 года проект Kubernetes объявил о доступности для среды выполнения containerd, включив ее в версии Kubernetes 1.10 и выше.

Сборка и доставка: контейнеризация приложения

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

DOCKERFILE
FROM      node: 10.2.1
...
copy      package.json ./
run       npm install
expose    8080
cmd       [”npm”, “start”]
...

Затем разработчики или серверы сборки используют среду выполнения контейнера Docker для встраивания этих зависимостей, библиотек и исходников приложений в двоичный пакет – в образ Docker. Образы Docker состоят из упорядоченных уровней, они компонуемые и могут быть использованы в качестве основы для новых образов. После создания эти образы можно использовать для запуска контейнеров на любом хосте с рабочей средой Docker. Контейнеры играют центральную роль в работе переносимых приложений Cloud Native, поскольку их использование естественным образом ведет к реализации нескольких основных принципов «12 факторов» и Cloud Native. При необходимости данный контейнер Docker:

  • Реализует узкую часть логики;
  • Явно объявляет все свои программные зависимости в Dockerfile;
  • Может обладать высокой портируемостью между облачными провайдерами, если у них есть необходимые ресурсы и среда выполнения Docker;
  • Может быстро развертываться для замены вышедшего из строя контейнера того же типа;
  • Быстро реплицируется для обработки дополнительной нагрузки функции с высоким спросом (за счет запуска дополнительных экземпляров контейнера).

После того как приложение было аккуратно упаковано в набор микросервисных контейнеров, каждый из которых выполняет определенную функцию, вам следует рассмотреть следующие вопросы:

  • Как вы будете развертывать и управлять всеми этими запущенными контейнерами?
  • Как эти контейнеры взаимодействуют друг с другом и что происходит, если данный контейнер выходит из строя и перестает отвечать на запросы?
  • Если один из микросервисов получает слишком большую нагрузку, как вы сможете масштабировать количество рабочих контейнеров, присваивая их хостам с доступными ресурсами?

На этом этапе в игру вступает Kubernetes и оркестровка.

Создание микросервиса Snappy: жизненный цикл контейнера Web UI

Чтобы продемонстрировать один из возможных процессов разработки приложения на основе контейнеров, мы увеличим микросервис Snappy Web UI, веб-сервер Express и Node.js.

Разработка и загрузка

Поскольку это приложение Express зависит от запуска Node.js и связанных с ним библиотек, Dockerfile snappy_web сначала получает образ Node.js из реестра Docker, например из Docker Hub. Дальнейшие шаги Dockerfile включают в себя настройку приложения, копирование исходного кода и, наконец, определение команды, которую нужно выполнить при запуске контейнера приложения.

Предположим, разработчик Snappy из команды веб-интерфейса начинает работу над исправлением небольшого бага. Он локально тестирует изменения кода, перестраивая образ Express Docker и запуская контейнер веб-сервера на своем ноутбуке. Довольный своими изменениями, разработчик затем помещает код в ветку в хранилище исходного кода команды.

Сборка и тестирование

Появление нового кода запускает конвейер непрерывной интеграции. Сервер непрерывной интеграции встраивает зависимости Node.js, библиотеки и измененные исходники в образ Docker. После сборки конвейер запускает этот образ как контейнер и приступает к выполнению модульных и интеграционных тестов. Если все тесты пройдены, этот проверенный образ Docker затем помещается в реестр образов контейнера – уровень абстракции, обычно создаваемый поверх хранилища объектов – для тегирования образов контейнера, организации и эффективного повторного использования существующих уровней образа. Частные реестры образов контейнеров позволяют группам обмениваться образами и централизованно публиковать их в надежном месте. А общедоступные реестры позволяют популярным проектам с открытым исходным кодом, таким как Node.js, предоставлять разработчикам последние версии своего программного обеспечения в виде предварительно созданного образа контейнера.

Развертывание и запуск

Теперь, когда образ контейнера веб-интерфейса Snappy, содержащий исправление бага, был одобрен и отправлен в реестр, система оркестровки контейнеров, например Kubernetes, может извлечь этот образ и развернуть его на любом хосте со средой выполнения Docker. Этот работающий контейнер имеет узкое представление о доступных ресурсах, указанных разработчиком, и запускается изолированно от других контейнеров. Один хост с установленной средой выполнения может запускать несколько контейнеров одновременно, в зависимости от доступных ресурсов.

Tags: , , ,