Kubernetes (K8s) — это программная платформа для автоматического управления контейнеризованными приложениями. Она предлагает базовые механизмы для их развертывания, масштабирования и поддержки. Система имеет открытый исходный код и быстро растущую экосистему.
Kubernetes разработала компания Google на основе более ранней системы управления кластерами Borg. Первое название — Project Seven, в честь героини сериала Star Trek. Аллюзией на нее также являются семь ручек на штурвале логотипа проекта. Современное название отсылает к греческому слову «рулевой». Исходный код системы был представлен в 2014 году. После выхода версии 1.0 в 2015 году Google в сотрудничестве с Linux Foundation основала фонд Cloud Native Computing Foundation (CNCF) и передала ему Kubernetes в рамках начального технологического вклада.
Что представляет собой контейнеризация
Контейнеризация приложений — одно из ключевых понятий в работе Kubernetes. Для его понимания кратко рассмотрим подходы к развертыванию приложений на серверах.
Традиционный способ. На первых этапах развития компьютерной техники несколько приложений, установленных на одном сервере, отбирали ресурсы друг у друга, снижая эффективность работы. Решением стал запуск одной программы на одном физическом сервере. Но иметь несколько серверов было невыгодно.
Виртуальная машина. Это программная или аппаратная эмуляция работы одной или нескольких гостевых платформ (quest) на платформе-хозяине (host). Виртуальная машина имитирует компоненты аппаратного обеспечения или целый ПК с отдельной ОС. Это позволило эффективнее разграничить ресурсы физического сервера между ВМ и масштабировать их работу.
Контейнер. По сути, это усовершенствованный вариант виртуальной машины с максимальной изоляцией в рамках одной операционной системы. В отличие от обычной ВМ, он не связан с базовой аппаратной инфраструктурой и может легко переноситься между облаками и несколькими ОС.
Преимущества контейнеризации:
- простота и гибкость развертывания приложений по сравнению с ВМ;
- непрерывность создания, интеграции и развертывания контейнера с возможностью быстро откатить изменения;
- создание контейнеров приложений в процессе сборки/релиза и отделение приложения от аппаратной инфраструктуры;
- идентичность среды разработки и тестирования на сервере и терминалах разработчика (ноутбуках, ПК);
- возможность переносить приложения между облаками и ОС — Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine и т.д.;
- разделение приложений на изолированные, распределенные, гибкие микросервисы с динамическим развертыванием и управлением.
Как работает Kubernetes
Сами по себе контейнеры — это способ развертывания и запуска приложений на сервере. Если контейнеров несколько, важно настроить их совместную работу так, чтобы они не отбирали друг у друга ресурсы аппаратной платформы и эффективно их расходовали. Кроме развертывания и запуска контейнеров, разработчику нужно периодически исправлять ошибки. Делать это вручную очень сложно. Kubernetes позволяет автоматизировать большинство процессов. Это называется «оркестрация контейнеров». Платформа может масштабировать приложения и обрабатывать возникающие ошибки, распределять ресурсы, поддерживать баланс между контейнерами и т.д. Но K8s работает не один. Чтобы он мог запустить приложения и службы в контейнерах, каждый должен быть оснащен средой выполнения. Это может быть Docker, rkt или runc.
Kubernetes действует на уровне логики, а не аппаратного обеспечения, по принципу «ведущий — ведомый». Управление системой основано на двух подходах:
- декларативном — разработчик задает цели, а не пути их достижения, которые система автоматически выбирает сама;
- императивном — разработчик может распоряжаться ресурсами с помощью команд «Создать», «Изменить», «Удалить».
Возможности Kubernetes
Наблюдение за работой сервисов. Платформа позволяет следить как за отдельными приложениями, так и за всем кластером сразу. K8s имеет веб-интерфейс. Все данные о работе сервисов система предоставляет разработчику в интуитивно понятном виде.
Распределение нагрузки. Трафик, который потребляют контейнеры, может различаться. Это негативно влияет на развертывание приложений. Kubernetes автоматически отслеживает нагрузку в контейнерах, и если в каком-то из них обнаруживается высокий трафик, то платформа распределяет его между другими контейнерами. Это может сделать и сам разработчик, указав платформе имеющиеся ресурсы, а также их количество, необходимое для работы приложений.
Оркестрация хранилища. С помощью Kubernetes разработчик может выбрать систему хранения: локальное хранилище, облако и т.д. Платформа автоматически создаст ее и настроит под потребности проекта.
Развертывание и откаты. Платформа позволяет развертывать приложения в автоматическом и ручном режимах. Есть вариант канареечного развертывания, когда изменения, внесенные разработчиком, применяются только на некоторой части контейнеров. Такое решение позволяет осторожно тестировать обновления. Изменения можно автоматически откатить.
Самоконтроль. Если контейнер отказывает или сбоит, Kubernetes автоматически перезапускает или останавливает его. Освободившиеся ресурсы она распределяет на другие приложения. Система контролирует их работу в соответствии с критериями, заданными разработчиком. Если контейнер не соответствует им, платформа отключает его или заменяет на другой, а также скрывает от клиента, пока он не будет готов к обслуживанию.
Безопасность и конфиденциальность. Kubernetes может сохранять и контролировать конфиденциальные данные (пароли, ключи SSH, OAuth-токены), распределять права доступа к системе. Обновление и развертывание приложений не затрагивает образы контейнеров и не раскрывает секретные сведения в конфигурации стека.
Хотя Kubernetes предоставляет широкие возможности по автоматизированной оркестровке контейнеризованных приложений, она не является полностью автоматической. Разработчику нужно выполнять предварительную подготовку и настройку.
Основные объекты кластера Kubernetes
Объекты — сущности, которые в архитектуре Kubernetes используются для представления состояния кластера.
Nodes (ноды, узлы)
Это физические или виртуальные машины, на которых развертываются и запускаются контейнеры с приложениями. Совокупность нод образует кластер Kubernetes.
Nodes бывают двух типов:
- Master (мастер-нода) — узел, управляющий всем кластером. Он следит за остальными нодами и распределяет между ними нагрузку с помощью менеджера контроллеров (controller manager) и планировщика (scheduler). Как правило, мастер-нода занимается только управлением и не берет на себя рабочие нагрузки. Для повышения отказоустойчивости существует несколько мастер-нод.
- Worker (рабочие ноды) — узлы, на которых работают контейнеры. В зависимости от параметров ноды (объема памяти и центрального процессора) на одном узле может работать много контейнеров. Чем больше рабочих узлов, тем больше приложений можно запустить. Также количество влияет на отказоустойчивость кластера, потому что при выходе из строя одной ноды нагрузка переносится на другие.
Pods (Поды)
Это абстрактный объект Kubernetes, представляющий собой «обертку» для одного или группы контейнеров. Контейнеры в поде запускаются и работают вместе, имеют общие сетевые ресурсы и хранилище. Kubernetes не управляет контейнерами напрямую, он собирает их в поды и работает с ими.
Под и все его контейнеры функционируют на одном узле и находятся там до завершения работы. Оно может произойти в соответствии с жизненным циклом, из-за выхода из строя узла или обновления контейнера в составе пода. При пересоздании под может создаться на другой ноде, которая отличается от первоначальной.
Чаще всего в поде только один контейнер (приложение), потому что у каждого могут быть свои требования к масштабированию, производительности, SLA и пр.
Поды, объединяющие несколько контейнеров, встречаются реже. Например, когда надо объединить взаимосвязанные приложения, зависящие друг от друга. Запускать их отдельно бессмысленно.
Обычно Kubernetes сам создает поды. Для этого он должен знать образы, требования к узлам и пр. В этом помогают контроллеры, например Deployments.
Controllers (контроллеры)
Контроллеры — это общее название средств управления, следящих за кластером и поддерживающих желаемое его состояние. Существует несколько типов контроллеров:
- Deployment (развертывание). Набор алгоритмов и директив, описывающих поды, число их экземпляров, порядок их замены при изменении характеристик. С его помощью разработчик декларирует изменения нодов и наборов реплик. Это самый популярный способ разместить приложение в Kubernetes.
- ReplicaSet (набор реплик). Описывает и управляет работой нескольких подов на кластере. Чем больше таких реплик, тем выше устойчивость системы к отказам и лучше масштабируются приложения.
- StatefulSet (набор состояния). Контроллер применяется для управления приложениями с отслеживанием состояния (stateful-приложениями) с использованием постоянного хранилища.
- DaemonSet (набор «демонов»). Представляет собой совокупность «демонов» (фоновых программ, работающих без взаимодействия с пользователем) и отвечает за запуск одной реплики выбранного пода на каждом отдельном узле. То есть по мере добавления узлов в кластер добавляются и поды.
- Job (задание). Контроллер, отвечающий за однократный запуск выбранного пода и завершающий его работу. CronJob — его разновидность, запускающая группу заданий по заданному расписанию.
Services (сервисы)
Сервисы объединяют поды в логическую группу и определяют политику доступа к ним. По функционалу они напоминают маршрутизатор и балансировщик нагрузки между подами.
Поды могут пересоздаваться, уничтожаться, переезжать на другие ноды и изменять IP-адреса. Если внешней системе или сервису будет нужно обратиться к поду, они должны быть в курсе его жизненного цикла и понимать, куда обращаться в конкретный момент времени. Это неудобно. Поэтому в Kubernetes есть сервисы, которые знают количество подов, хосты, на которых они работают, и пр. Сервис получает запрос от внешних систем или сервисов, определяет, какому именно поду его адресовать, и делает это.
Persistent Volumes (постоянные тома)
Это способ хранения данных между перезапусками контейнеров.
Контейнеры могут в любой момент быть уничтожены или перезапущены. Их идея в том, что они легко «умирают» и заново появляются при необходимости. Поэтому все постоянные данные должны храниться вне контейнера. Но в целях безопасности контейнеры изолированы от основной системы. Кроме того, для отказоустойчивости могут создаваться несколько экземпляров контейнеров. Появляется новая проблема: нужно синхронизировать данные между репликами.
Для решения этих проблем в Kubernetes есть Persistent Volumes. Это постоянные тома, жизненный цикл которых не связан с подами и контейнерами. Самостоятельные ресурсы создаются и управляются отдельно.
Namespaces (пространства имен)
Это возможность разделить физический кластер Kubernetes на виртуальные, каждый из которых изолирован от других. Обычно пространства имен создаются для того, чтобы разделить команды, разные проекты или среды развертывания (dev, test, prod).
Ресурсы в них скрыты друг от друга, но не изолированы полностью. Сервис из одного пространства может общаться с сервисом из другого. При необходимости разграничить доступ пространства имен можно полностью изолировать.
В каждом Namespaces есть свои ресурсы: сервисы, поды, развертывания. В одном пространстве имен они должны иметь уникальные названия, но эти же названия допустимо использовать в других пространствах. В Namespaces входят не все ресурсы: например, Persistent Volumes и ноды доступны всему кластеру.
Основные компоненты кластера
Компоненты — это службы, модули и программы, обеспечивающие работу всего кластера. Они работают в нодах, то есть на виртуальных или физических серверах, где используется Kubernetes.
Кластер Kubernetes включает следующие компоненты:
- kube-apiserver. С помощью сервера API обеспечивается работа API кластера, обрабатываются REST-операции и предоставляется интерфейс, через который остальные компоненты взаимодействуют друг с другом. Также через него проходят запросы на изменение состояния или чтение кластера. Работает на master-нодах;
- kube-scheduler. Компонент, планирующий, на каких узлах разворачивать поды. Он учитывает такие факторы, как ограничения, требования к ресурсам, местонахождение данных и пр. Работает на master-нодах;
- etcd. Распределенное хранилище в формате «ключ-значение». В нем хранится состояние всего кластера. Главная задача etcd — обеспечить отказоустойчивость кластера и консистентность данных. Etcd — самостоятельный проект. Он развивается отдельно от Kubernetes и применяется в разных продуктах. Работает на master-нодах;
- kube-proxy. Служба, которая управляет правилами балансировки нагрузки. Она конфигурирует правила IPVS или iptables, через которые выполняются проксирование и роутинг. Работает на worker-нодах;
- kube-controller-manager. Компонент запускает работу контроллеров. Работает на master-нодах;
- kubelet. Cлужба, которая управляет состоянием ноды: запуском, остановкой и поддержанием работы контейнеров и подов. Работает на worker-нодах.
Преимущества и недостатки Kubernetes
Высокая популярность этой платформы среди разработчиков имеет следующие причины.
Портативность и гибкость
Kubernetes не зависит от аппаратного обеспечения. Работающую платформу можно переносить на другой сервер, в частное или общедоступное облако. Главное требование — операционная система хоста должна иметь подходящую версию ОС Linux и Windows.
Экономичность
Крупным компаниям Kubernetes помогает уменьшить расходы на ИТ-инфраструктуру благодаря группировке приложений в пакеты. Это оптимизирует использование средств, инвестированных в инфраструктуру и оборудование. K8s дает много возможностей для масштабирования приложения и делает процесс более доступным. Одновременно он сокращает нагрузку на персонал, позволяет сотрудникам направить силы на решение других задач, повышает эффективность использования ресурсов инфраструктуры.
Поддержка мультиоблачности
Kubernetes позволяет работать с мультиоблачной средой, то есть выполнять рабочие задачи как в одном облаке, так и в нескольких. Также можно переносить систему из одной облачной среды в другую, повышая ее безопасность.
Эффективное распределение задач
Микросервисы Kubernetes эффективно распределяют задачи между рабочими группами. Это делает систему более гибкой и ускоряет выполнение большого объема работы. Разработчики контролируют большие приложения, включающие множество контейнеров, одновременно делая их более детализированными.
Наличие развитой экосистемы
Kubernetes поддерживает много крупных корпораций, но это свободное ПО. Фонд CNCF только контролирует его развитие, но не владеет им. Поэтому сторонние разработчики могут создавать дополнения, расширяющие функционал системы, обмениваться опытом друг с другом. Большое количество справочных материалов и широкое комьюнити энтузиастов делают решаемой любую проблему, возникающую при работе с Kubernetes. Также можно пройти интерактивные уроки на официальном сайте.
Надежность
K8s уменьшает сложность облака, а также делает работу с ним более понятной и надежной. Это касается не только технических аспектов системы, но и вопросов безопасности информации, распределения прав доступа.
Из недостатков разработчики выделяют только относительную сложность платформы. Многие процессы необходимо настраивать вручную, сложно организован перенос между облаками и серверами. Поэтому от разработчика требуется высокий уровень квалификации даже для решения задач средней сложности.
0 комментариев