Что такое Kubernetes и как он работает | robot_dreams
Для отслеживания статуса заказа — авторизируйтесь
Введите код, который был выслан на почту Введите код с SMS, который был выслан на номер
 
Код действителен в течение 5 минут Код с sms действителен в течение 5 минут
Вы уверены, что хотите выйти?
Сеанс завершен
На главную
Серверный дирижер: что такое Kubernetes и как он работает

Серверный дирижер: что такое Kubernetes и как он работает

Гайд от robot_dreams с примером синтаксиса

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

Но для начала разберем базовые понятия, в том числе, что такое контейнер и оркестрация и для чего применяется Docker.

Как родилась идея контейнера и что это такое

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

Как вариант решения проблемы была придумана технология виртуализации машин. Так, в конце девяностых компания VMWare выпустила инструмент под названием VMware Virtual Platform, которая позволяла разделить ресурсы сервера на независимо функционирующие части или виртуальные машины.

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

Устройство виртуальных машин

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

Компании-хостеры стали предоставлять услугу VDS (Virtual Dedicated Server) — «услуга виртуального выделенного сервера». Это платформа, которая предоставляет клиентам ресурсы выделенного сервера без необходимости покупать физическое оборудование.

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

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

Проблема виртуальной машины и как ее решает контейнер

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

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

Устройство контейнера

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

Самое популярное решения для работы с контейнерами — это Docker, контейнеризатор приложений, позволяющий упаковать их со всем окружением и зависимостями.

Работа с контейнерами в Docker

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

Образ можно установить на сервер и на его базе запустить контейнер. Он описывается одним файлом, что очень удобно, потому что его можно записать в Git-репозиторий. Файл версионируется, все изменения в нем фиксируются и можно делать сборки новых версий контейнера через систему Continuous Integration (например, GitLab CI).

Docker запускается как системная служба на сервере под управлением Windows или Linux. Эта служба отвечает за запуск контейнера, остановку и прочее управление.

Как работает Docker

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

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

Концепция контейнеров оказалась настолько успешной, что крупные компании, такие как Google, Amazon, Microsoft и Docker, объединились, чтобы разработать общий стандарт формата образов контейнеров. Это привело к созданию проекта OCI (Open Container Initiative), который определяет стандарты для контейнеров и образов, базируясь на идеях Docker.

Что такое оркестрация

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

По этой причине в крупных компаниях уже до появления контейнеров существовали собственные системы управления инфраструктурой.

Управление инфраструктурой, включающей множество контейнеров, называется оркестрацией .

Kubernetes (K8s)

Команда разработчиков Google создала систему управления контейнерами с названием Borg, на основе которой была разработана платформа Kubernetes (K8s). Написанный на языке Go, Kubernetes (имеет открытый код ) предоставляет средства для автоматизации процессов развертывания, масштабирования и управления контейнерами, обеспечивая более легкое и эффективное управление сложными приложениями.

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

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

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

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

Поды (Pods)

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

Мастер-узел

Главный контролирующий компонент кластера называется Master Node (мастер-узел). Он отвечает за принятие решений о состоянии кластера, с него выполняется планирование и распределение заданий, а также происходит управление ресурсами.

Для работы с объектами Kubernetes (подами, службами, репликациями и пр.) — их создания, изменения или удаления — необходимо взаимодействие с Kubernetes API. Его можно выполнить различными способами:

  • Посредством утилиты командной строки kubectl. Утилита командной строки kubectl предоставляет удобный способ взаимодействия с Kubernetes API. Вы можете создавать, изменять и удалять объекты, а также получать информацию о состоянии кластера, используя команды kubectl.
  • Программно. Вы можете использовать клиентские библиотеки, предоставляемые Kubernetes, чтобы взаимодействовать с API через программный код. Эти библиотеки предоставляют удобные методы для создания, чтения, обновления и удаления объектов Kubernetes.
  • Напрямую. Помимо использования клиентских библиотек, вы также можете взаимодействовать с Kubernetes API напрямую, отправляя HTTP-запросы на соответствующие конечные точки API. Это может актуально, когда необходимо реализовать более специфичное поведение или управление.

Kubernetes API предоставляет RESTful-интерфейс, который позволяет взаимодействовать с объектами через HTTP-запросы. Для некоторых языков программирования существуют официальные клиентские библиотеки, которые упрощают работу с API, а также предоставляют средства для авторизации и аутентификации.

Для хранения всей конфигурации и состояния кластера используется эталонное хранилище (etcd), которое обеспечивает надежность и согласованность данных. За размещение подов (контейнеров) на физические или виртуальные узлы, учитывая требования ресурсов, ограничения и аффинитеты, отвечает Планировщик (Scheduler).

Аффинитеты могут быть двух типов:

  • node affinity (аффинитеты узла);
  • pod affinity (аффинитеты пода).

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

Узлы (Node)

Рабочие машины в кластере, на которых запускаются контейнеры, называются Nodes (узлами). Nodes выполняют фактические задачи, они запускают и управляют контейнерами, а также передают состояние обратно на мастер-узел.

Каждый узел в кластере должен иметь установленный контейнерный движок (Container Runtime). Когда вы запускаете под в Kubernetes, он создает и управляет контейнерами, используя контейнерный движок на конкретном узле. Вот примеры популярных контейнерных движков, которые могут использоваться в Kubernetes:

  • Docker — один из самых популярных и используемых контейнерных движков. Он обеспечивает среду для запуска контейнеров и управление ими.
  • containerd — более низкоуровневый контейнерный движок, который был изначально разработан как часть проекта Docker. Он обеспечивает базовые функции для запуска и управления контейнерами.
  • CRI-O — отдельный контейнерный движок, высокопроизводительный и легковесный, оптимизированный под минимальные требования при работе с контейнерами. Рассчитан на стандарты Container Runtime Interface (CRI).

Также на каждом узле есть агент kubelet. Это своего рода «сторож», который поддерживает связь между мастер-узлом и узлами, следит за запуском подов и обеспечивает их состояние.

В паре с агентом и контейнерным движком работает компонент kubeproxy, который обеспечивает взаимодействие между подами и внешними сетями, управляет сетевым проксированием и балансировкой нагрузки. Также он позволяет подам использовать стабильные DNS-имена для обращения друг к другу, даже если их IP-адреса изменяются.

Services

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

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

Когда вы создаете службу, Kubernetes назначает ей уникальное имя и виртуальный IP-адрес. Этот виртуальный адрес будет использоваться, чтобы обращаться к службе, вместо того чтобы знать конкретные IP-адреса контейнеров.

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

Контроллеры

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

  • ReplicaSet — один из базовых типов контроллеров. Он обеспечивает желаемое количество экземпляров подов (подов с одинаковым образом) в кластере. Если число подов снижается или увеличивается, ReplicaSet автоматически корректирует количество, чтобы оно соответствовало заданному.
  • Deployment отвечает за управление репликами подов. Проще говоря, это абстракция поверх ReplicaSet, которая позволяет вам управлять обновлениями приложений. Он гарантирует возможность плавного обновления версии приложения, а также плавного отката к предыдущим версиям в случае проблем.
  • StatefulSet — это контроллер для управления подами с уникальными идентификаторами и стабильными сетевыми именами.
  • DaemonSet гарантирует, что на каждом узле в кластере будет работать по одному экземпляру пода. Он часто используется для приложений, которые должны быть запущены на каждом узле, например, сетевые плагины или мониторинговые агенты.
  • Job и CronJob. Job обеспечивает выполнение определенной задачи (пода) и завершает его успешно. Когда задача успешно завершается, Job считается выполненным. Если задача завершается с ошибкой, Kubernetes может автоматически перезапустить ее для обеспечения успешного выполнения. CronJob — это планировщик, позволяющий запускать задачи (поды) периодически, подобно планировщику задач в операционных системах.

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

Пример работы Kubernetes

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

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

  • веб-интерфейса;
  • службы заказов;
  • службы оплаты;
  • и службы уведомлений.

Автоматизированное развертывание

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

Помощь в автоматизированном масштабировании

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

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

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

Управление состоянием и отказоустойчивость

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

Управление сетевой связностью и балансировкой нагрузки

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

Пример синтаксиса Kubernetes

Kubernetes имеет собственный синтаксис для описания конфигурации и управления контейнеризированными приложениями в кластере. Этот синтаксис обычно представлен в виде YAML-файлов или JSON-файлов, в которых описываются различные аспекты приложения, такие как поды, сервисы, репликации и другие ресурсы.

Примером может быть описание пода (минимальной единицы развертывания в Kubernetes) в YAML-файле:

apiVersion: v1 # Указание на версию API Kubernetes, которая используется для описания данного объекта. В данном случае это первая версия API.
kind: Pod # Этот параметр определяет тип объекта, который мы хотим создать. В данном случае мы создаем объект типа Pod.
Metadata: # Начало блока метаданных для объекта
  name: food-order-pod # Задаем имя для создаваемого объекта Pod. В данном случае это имя будет food-order-pod.
spec: # Блок, определяющий параметры для объекта
  Containers: # Здесь начинается список контейнеров, которые будут запущены внутри Pod.
    — name: food-order-container # Минус перед name означает начало описания нового контейнера в списке. Здесь мы задаем имя контейнера — food-order-container.
      image: food-order-service:latest #  Указываем образ контейнера, который будет запущен внутри Pod. food-order-service — это имя образа, а latest — это тег образа, чтобы использовать последнюю версию.

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

Заключение

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

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

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

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

 

Ещё статьи
Экспертки о том, как оценивают кандидатов на нетехнических интервью
Часть 2. Работа с записями: вставка, чтение, изменение и удаление