Kubernetes

menu icon

Kubernetes

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

Что такое Kubernetes?

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

Изначально Kubernetes был разработан в Google, а в 2014 году был открыт доступ к его исходному коду. Предшественником этой платформы была Borg  — внутренняя платформа управления контейнерами Google. По-гречески Kubernetes означает рулевой или пилот, отсюда и штурвал в логотипе Kubernetes (внешняя ссылка ).

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

В следующем видео Сэй Веннам объясняет основы Kubernetes (10:59):

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

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

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

Чем отличаются контейнеры от виртуальных машин и традиционной инфраструктуры

Возможно, проще всего представить контейнер как конечную точку абстракции и автоматизации ИТ-инфраструктуры.

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

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

Дополнительную информацию о виртуальных машинах можно найти в публикации «Виртуальные машины: краткое руководство».

Контейнеры выводят эту абстракцию на более высокий уровень: в частности, они совместно используют не только виртуализированное оборудование, но и виртуализированное ядро ОС. Контейнеры предоставляют те же преимущества изоляции, масштабируемости и одноразового применения, что и виртуальные машины, но значительно «легче» их (то есть требуют меньше ресурсов) из-за того, что они не содержат свой экземпляр ОС. Они эффективнее используют ресурсы, что позволяет выполнять больше приложений на меньшем количестве виртуальных или физических систем и с меньшим числом экземпляров ОС. Контейнеры легче переносить между ПК, ЦОД и облачной средой. Они прекрасно подходят для методологий разработки Agile и DevOps.

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

Что такое Docker?

Docker — самый популярный инструмент для создания и выполнения контейнеров Linux®. Первые разновидности контейнеров появились несколько десятилетий назад (благодаря таким технологиям, как FreeBSD Jails и AIX Workload Partitions), но настоящую популярность и широкое распространение контейнеры получили в 2013 году с появлением Docker и его новой реализации, удобной и для разработчиков, и для облаков.

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

Docker был создан на основе традиционной технологии контейнера Linux (LXC), но обеспечивает более детальную виртуализацию процессов ядра Linux и предлагает ряд дополнительных функций, упрощающих задачу создания, развертывания, администрирования и обеспечения безопасности контейнеров для разработчиков.

Несмотря на то, что сегодня существует множество альтернативных контейнерных платформ (например, Open Container Initiative (OCI), CoreOS и Canonical (Ubuntu) LXD), Docker настолько популярен, что уже фактически является синонимом слова «контейнер» и иногда ошибочно принимается за конкурента дополнительных технологий типа Kubernetes (см. видео «Kubernetes или Docker: не нужно решать дилемму» ниже).

Управление контейнерами с помощью Kubernetes

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

Хотя на раннем этапе были популярны разные варианты координации контейнеров,  самые заметные из которых — это Docker Swarm и Apache Mesos, платформа Kubernetes быстро получила широкое распространение (фактически, в какой-то момент это был самый быстро развивающийся проект за всю историю открытого ПО).

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

Более подробно о координации контейнеров можно узнать из видео «Что такое координация контейнеров?» (08:59):

Что делает Kubernetes?

В числе прочих Kubernetes планирует и автоматизирует следующие задачи, связанные с контейнерами:

  • Развертывание: развертывание указанного числа контейнеров на заданном хосте и обеспечение их работы в нужном состоянии.
  • Плавающее обновление: плавающим обновлением называется изменение развертывания. Kubernetes позволяет инициировать, приостановить, возобновить плавающее обновление или выполнить его откат.
  • Обнаружение сервисов: Kubernetes может автоматически открыть внешний доступ к контейнеру в Интернете или других контейнерах по доменному имени или IP-адресу.
  • Выделение ресурсов для хранения данных: монтирование локального или облачного хранилища для контейнеров с помощью Kubernetes.
  • Распределение нагрузки и масштабирование: при резком росте объема трафика контейнера Kubernetes может применять средства распределения нагрузки и масштабирования, чтобы распределить его по сети и обеспечить стабильную работу.
  • Самовосстановление для высокой доступности: при сбое контейнера Kubernetes может автоматически перезапустить или заменить его; кроме того, он может автоматически удалять контейнеры, не прошедшие проверку работоспособности.

Kubernetes и Docker

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

В действительности для тех пользователей Docker, которые создают развертывания с большим числом контейнеров Docker, внедрение Kubernetes для их управления является следующим наиболее логичным шагом. Для того чтобы узнать больше, посмотрите видеоролик «Kubernetes или Docker: не нужно решать дилемму» (08:03):

Архитектура Kubernetes

Архитектура Kubernetes состоит из следующих основных компонентов:

Кластеры и узлы (вычисления)

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

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

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

За более подробной информацией о кластерах Kubernetes обратитесь к следующей публикации в блоге: «Кластеры Kubernetes: архитектура для быстрой управляемой поставки облачных приложений».

Поды и развертывания (программное обеспечение)

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

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

Для того чтобы подробнее узнать о развертываниях Kubernetes, посмотрите видеоролик «Развертывания Kubernetes: краткое знакомство» (03:54):

Для более подробного изучения элементов архитектуры Kubernetes рекомендуем пройти самостоятельный курс: «Kubernetes 101».

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

Сервисная сетка Istio

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

Добавьте Istio — уровень сервисной сетки с открытым исходным кодом для кластеров Kubernetes. К каждому кластеру Kubernetes Istio добавляет отдельный контейнер. Для программиста и администратора этот контейнер фактически невидим, но он настраивает, отслеживает и контролирует взаимодействия между контейнерами.

Istio позволяет задать единую политику для настройки соединений между контейнерами, избавляющую вас от необходимости отдельно настраивать каждое соединение. Это упрощает отладку соединений между контейнерами.

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

Более подробную информацию, в том числе видео и ряд примеров использования Istio, можно найти в статье «Что такое Istio?».

Knative и бессерверные вычисления

Knative (произносится как «kay-native») — это платформа с открытым исходным кодом, которая находится на верхнем уровне Kubernetes и обеспечивает два важнейших преимущества облачной разработки:

Knative предоставляет простую отправную точку для бессерверных вычислений

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

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

Knative упрощает разработку контейнеров и управление ими

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

Knative упрощает выполнение этих задач, обеспечивая автоматизацию с помощью трех компонентов:

  • Сборка: компонент Knative Build автоматически преобразует исходный код в облачный контейнер или функцию. В частности, он извлекает код из хранилища, устанавливает требуемые зависимости, выполняет сборку образа контейнера и помещает его в реестр контейнеров для других разработчиков. Разработчики должны указать расположение всех компонентов, чтобы Knative мог их найти, после чего Knative автоматически выполняет сборку.
  • Serve: компонент Serve обеспечивает выполнение контейнеров как масштабируемых сервисов; он позволяет нарастить число экземпляров контейнера до нескольких тысяч или свести его к нулю (что называется сокращением до нуля). Помимо этого, компонент Serve предоставляет две полезные функции:
    • Настройка — позволяет сохранять версии контейнера (именуемые моментальными копиями) при каждом выпуске контейнера для использования в рабочей среде и использовать сразу несколько таких версий.
    • Маршрутизация внутри сервиса — позволяет направлять разные объемы трафика этим версиям. Эти функции можно использовать вместе для постепенного плавного обновления контейнера или промежуточного канареечного развертывания контейнерного приложения с целью тестирования перед его выпуском в рабочей среде.
  • Event: компонент Event позволяет запускать определенные функции или сервисы контейнера при наступлении указанных событий. Эта возможность является ключевым элементом поддержки бессерверных вычислений в Knative: в нужный момент система должна как-то понять, что необходимо активировать функцию. Событие позволяет командам выражать интерес  к типам событий, а затем автоматически подключается к источнику событий и направляет события в контейнер, избавляя от необходимости программировать эти соединения.

Дополнительная информация о Knative приведена в публикации «Knative: краткое руководство».

Коммиты Kubernetes в GitHub и другие свидетельства растущей популярности

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

  • На момент написания этой статьи в хранилище Kubernetes на GitHub (внешняя ссылка) было зафиксировано более 86200 изменений кода, из которых около 6000 — только за последние четыре месяца, а число активных участников проекта составляет уже более 2300. Согласно Cloud Native Computing Foundation (внешняя ссылка), суммарно по всем хранилищам, связанным с Kubernetes (включая Kubernetes Dashboard и Kubernetes MiniKube), насчитывается более 148000 коммитов.
  • Более 1 500 компаний используют Kubernetes в программном стеке, применяемом в рабочей среде. К ним относятся такие всемирно известные компании, как AirBnB, Bose, CapitalOne, Intuit, Nordstrom, Philips, Reddit, Slautify, Spotify, Tinder и, конечно, IBM. Ознакомьтесь с этими и другими примерами внедрения (внешняя ссылка)
  • Опрос, проведенный в июле 2019 года и опубликованный в Container Journal (внешняя ссылка) показал, что за последние шесть месяцев число компаний, внедривших Kubernetes, выросло на 51 %.
  • Конференцию KubeCon + CloudNative Con North America 2019 (внешняя ссылка) посетило более 12000 человек — это на 3000  больше рекордного показателя предыдущего года.
  • По данным ZipRecruiter (внешняя ссылка), среднегодовой доход (в Северной Америке) специалиста по Kubernetes составляет 144628 долларов США. На момент написания этой статьи в сети LinkedIn (внешняя ссылка) насчитывается уже более 21000 вакансий, связанных с Kubernetes.

Учебники по Kubernetes

Если вы хотите начать использовать Kubernetes или повысить свою квалификацию в сфере Kubernetes или инструментов из экосистемы Kubernetes, рекомендуем ознакомиться с одним из следующих учебников:

Kubernetes и IBM Cloud

IBM Cloud® Kubernetes Service — это управляемое решение для автоматизации развертывания, выполнения, масштабирования и мониторинга контейнеризованных приложений в кластере вычислительных узлов, дополненное возможностями IBM. Оно обеспечивает быструю доставку приложений и поддерживает подключение к современным сервисам типа блокчейна и IBM Watson®.

Узнайте, как управляемая служба Kubernetes может помочь вашей компании в освоении облака, в нашем видео «Преимущества управляемой службы Kubernetes» (03:14):

Red Hat® OpenShift® on IBM Cloud — это комплексная услуга, предоставляющая полностью управляемые кластеры OpenShift на платформе IBM Cloud. (OpenShift — это корпоративная платформа Kubernetes, работающая на базе Red Hat Enterprise Linux).

Дополнительную информацию по OpenShift можно найти в новом отчете Forrester Wave «Мультиоблачные контейнерные платформы разработки» (PDF, 415 КБ).

Для того чтобы приступить к работе, зарегистрируйтесь для получения IBMid и создайте учетную запись IBM Cloud.