Контейнеры

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


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

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

Для этого контейнеры используют форму виртуализации операционной системы (ОС), в которой функции ОС (в случае ядра Linux, а именно пространства имен и примитивы cgroups) используются как для изоляции процессов, так и для контроля количества ЦП, память и диск, к которым у этих процессов есть доступ.

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

Контейнеры впервые появились несколько десятилетий назад в таких версиях, как FreeBSD Jails и AIX Workload Partitions, но большинство современных разработчиков помнят 2013 год как начало современной эры контейнеров с появлением Docker.


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

Самый простой способ понять контейнер — это понять, чем он отличается от традиционной виртуальной машины (ВМ). При традиционной виртуализации — локальной или облачной — гипервизор используется для виртуализации физического оборудования. Затем каждая виртуальная машина содержит гостевую ОС, виртуальную копию оборудования, которое требуется ОС для запуска, а также приложение и связанные с ним библиотеки и зависимости.

Вместо виртуализации базового оборудования контейнеры виртуализируют операционную систему (обычно Linux), поэтому каждый отдельный контейнер содержит только приложение, его библиотеки и зависимости. Отсутствие гостевой ОС является причиной того, что контейнеры такие легкие и, следовательно, быстрые и портативные.


Преимущества контейнеров

Основное преимущество контейнеров, особенно по сравнению с виртуальной машиной, — это уровень абстракции, который делает их легкими и портативными.

  • Легковесность: контейнеры совместно используют ядро операционной системы компьютера, устраняя необходимость в полном экземпляре ОС для каждого приложения и делая файлы контейнеров небольшими и простыми в использовании ресурсов. Их меньший размер, особенно по сравнению с виртуальными машинами, означает, что они могут быстро разворачиваться и лучше поддерживать облачные приложения, которые масштабируются по горизонтали.
  • Переносимость и независимость от платформы: контейнеры несут с собой все свои зависимости, а это означает, что программное обеспечение можно написать один раз, а затем запустить без необходимости повторной настройки на ноутбуках, в облачных средах и в локальных вычислительных средах.
  • Поддерживает современную разработку и архитектуру: благодаря сочетанию переносимости / согласованности развертывания на разных платформах и небольшого размера контейнеры идеально подходят для современной разработки, а шаблоны приложений, такие как DevOps, бессерверные и микросервисы, создаются в виде обычного кода. развертывания небольшими приращениями.
  • Повышает эффективность использования: как и предыдущие виртуальные машины, контейнеры позволяют разработчикам и операторам улучшать использование ЦП и памяти физических машин. Контейнеры идут еще дальше, поскольку они также позволяют использовать микросервисные архитектуры, компоненты приложения могут развертываться и масштабироваться более детально, что является привлекательной альтернативой необходимости масштабирования всего монолитного приложения, поскольку отдельный компонент борется с нагрузкой.

Варианты использования контейнеров

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

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

Контейнеризация

Чтобы воспользоваться преимуществами контейнеров, программное обеспечение необходимо разрабатывать и упаковывать по-другому — этот процесс обычно называют контейнеризацией.

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


Оркестровка контейнеров с Kubernetes

Когда компании начали использовать контейнеры — часто как часть современных облачных архитектур — простота отдельного контейнера начала сталкиваться со сложностью управления сотнями (даже тысячами) контейнеров в распределенной системе.

Для решения этой проблемы возникла оркестровка контейнеров как способ управления большими объемами контейнеров на протяжении их жизненного цикла, включая:

  • Подготовка
  • Резервирование
  • Мониторинг здоровья
  • Распределение ресурсов
  • Масштабирование и балансировка нагрузки
  • Перемещение между физическими хостами

Хотя многие платформы оркестровки контейнеров (такие как Apache Mesos, Nomad и Docker Swarm) были созданы для решения этих проблем, Kubernetes, проект с открытым исходным кодом, представленный Google в 2014 году, быстро стал самой популярной платформой оркестровки контейнеров, и это один, на котором стандартизировано большинство отрасли.

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

Чтобы узнать больше о Kubernetes, Сай Веннам дает обзор Kubernetes в видео ниже:


Istio, Knative и расширяющаяся экосистема контейнеров

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

Istio

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

Knative

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

Вместо того, чтобы работать все время и отвечать, когда это необходимо (как это делает сервер), бессерверная функция может «масштабироваться до нуля», что означает, что она вообще не работает, пока не будет вызвана. Эта модель может сэкономить огромное количество вычислительной мощности при применении к десяткам тысяч контейнеров.

Для получения дополнительной информации о Knative посмотрите это видео: