Что такое Kubernetes?

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

Название Kubernetes происходит из греческого языка и означает "рулевой" или "пилот". Компания Google открыла проект Kubernetes в 2014 году. Kubernetes сочетает в себе более чем 15-летний опыт Google в выполнении производственных рабочих нагрузок в масштабе с лучшими идеями и практикой сообщества.

Возвращаясь в прошлое

Давайте рассмотрим, почему Kubernetes так полезен, вернувшись в прошлое.

Эпоха традиционного развертывания

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

Эра виртуализированного развертывания

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

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

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

Эра развертывания контейнеров

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

Контейнеры стали популярными, поскольку они обеспечивают дополнительные преимущества, такие как:

  • Ускоренное создание и развертывание приложений: повышенная простота и эффективность создания образа контейнера по сравнению с использованием образа виртуальной машины.
  • Непрерывная разработка, интеграция и развертывание: обеспечивает надежную и частую сборку и развертывание контейнерных образов с быстрым и легким откатом (благодаря неизменяемости образа).
  • Разделение проблем между Dev и Ops: создание образов контейнеров приложений во время сборки/релиза, а не во время развертывания, что позволяет отделить приложения от инфраструктуры.
  • Возможность наблюдения не только за информацией и метриками на уровне ОС, но и за состоянием приложений и другими сигналами.
  • Согласованность среды при разработке, тестировании и производстве: Приложение работает одинаково как на ноутбуке, так и в облаке.
  • Переносимость облака и дистрибутива ОС: Работает на Ubuntu, RHEL, CoreOS, в локальной сети, в основных публичных облаках и в любом другом месте.
  • Управление, ориентированное на приложения: Повышает уровень абстракции от запуска ОС на виртуальном оборудовании до запуска приложения на ОС с использованием логических ресурсов.
  • Свободно связанные, распределенные, эластичные, освобожденные микросервисы: приложения разбиваются на более мелкие, независимые части и могут развертываться и управляться динамически - не монолитный стек, работающий на одной большой одноцелевой машине.
  • Изоляция ресурсов: предсказуемая производительность приложений.
  • Использование ресурсов: высокая эффективность и плотность.

Зачем вам нужен Kubernetes и что он может сделать

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

Вот как Kubernetes приходит на помощь! Kubernetes предоставляет вам основу для отказоустойчивой работы распределенных систем. Она позаботится о масштабировании и отказоустойчивости вашего приложения, предоставит шаблоны развертывания и многое другое. Например, Kubernetes может легко управлять развертыванием canary для вашей системы.

Kubernetes предоставляет вам:

  • обнаружение сервисов и балансировку нагрузки
  • Kubernetes может открыть контейнер, используя DNS-имя или собственный IP-адрес. Если трафик на контейнер высок, Kubernetes может сбалансировать нагрузку и распределить сетевой трафик так, чтобы развертывание было стабильным.
  • Оркестровка хранилищ
  • Kubernetes позволяет автоматически монтировать систему хранения данных по вашему выбору, например, локальные хранилища, общедоступные облачные провайдеры и многое другое.
  • Автоматизированное развертывание и откат
  • Вы можете описать желаемое состояние развернутых контейнеров с помощью Kubernetes, и он может изменить фактическое состояние на желаемое с контролируемой скоростью. Например, вы можете автоматизировать Kubernetes для создания новых контейнеров для развертывания, удаления существующих контейнеров и переноса всех их ресурсов в новый контейнер.

Автоматическая упаковка контейнеров

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

Самовосстановление

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

Управление секретами и конфигурациями

Kubernetes позволяет хранить и управлять конфиденциальной информацией, такой как пароли, токены OAuth и ключи SSH. Вы можете развертывать и обновлять секреты и конфигурацию приложений, не перестраивая образы контейнеров и не раскрывая секреты в конфигурации стека.

Чем не является Kubernetes

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

Kubernetes это

  • Не ограничивает типы поддерживаемых приложений. Kubernetes нацелена на поддержку чрезвычайно разнообразных рабочих нагрузок, включая рабочие нагрузки без состояния, с состоянием и с обработкой данных. Если приложение может работать в контейнере, оно должно отлично работать на Kubernetes.
  • Не развертывает исходный код и не создает ваше приложение. Рабочие процессы непрерывной интеграции, доставки и развертывания (CI/CD) определяются культурой и предпочтениями организации, а также техническими требованиями.
  • Не предоставляет сервисы уровня приложения, такие как промежуточное ПО (например, шины сообщений), фреймворки обработки данных (например, Spark), базы данных (например, MySQL), кэши и кластерные системы хранения (например, Ceph) в качестве встроенных сервисов. Такие компоненты могут работать на Kubernetes и/или могут быть доступны приложениям, работающим на Kubernetes, через переносимые механизмы, такие как Open Service Broker.
  • Не диктует решения для протоколирования, мониторинга или оповещения. Он предоставляет некоторые интеграции в качестве доказательства концепции, а также механизмы для сбора и экспорта метрик.
  • Не предоставляет и не предписывает язык/систему конфигурации (например, Jsonnet). Он предоставляет декларативный API, который может быть ориентирован на произвольные формы декларативных спецификаций.
  • Не предоставляет и не принимает никаких комплексных систем конфигурации, обслуживания, управления или самовосстановления машин.
  • Кроме того, Kubernetes - это не просто система оркестровки. Фактически, она устраняет необходимость в оркестровке. Техническое определение оркестровки - это выполнение определенного рабочего процесса: сначала сделай A, затем B, затем C. В отличие от этого, Kubernetes включает в себя набор независимых, композиционно совместимых процессов управления, которые непрерывно приводят текущее состояние в соответствие с заданным желаемым состоянием. Не должно иметь значения, как вы доберетесь от A до C. Централизованное управление также не требуется. В результате получается более простая в использовании и более мощная, надежная, устойчивая и расширяемая система.

Официальный сайт kubernetes.io