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

Яркие примеры таких приложений: YouTube или Google. Естественно, на одной машине такие сервисы не развернуть, поэтому в архитектуре используются тысячи компьютеров, именуемых Нодами (worker node). Однако эти Ноды, как части общего механизма, могут выходить из строя, и тогда их нужно заново поднимать, более того, хорошо бы вообще постоянно мониторить каждый Нод и считывать его состояние. Выполнять такие задачи становится очень сложно вручную. И, возможно, именно для этих площадок, а может быть и нет, но Google разработала технологию Kubernetes, которая выполняет роль оркестрации контейнеров. Kubernetes следит за Нодами и поднимает те, что выходят из строя, но это не единственная ее задача. Технология также может отключать неиспользуемые Ноды, оптимизируя расход ресурсов.

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

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

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

  1. Узнаем, как работает Kubernetes.

  2. Разберем архитектуру этой технологии.

  3. Развернем кластер из одной машины, где и запустим простое приложение на локальном компьютере с помощью Kubernetes.

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

И еще пару слов в пользу технологии для еще большей мотивации:

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

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

Архитектура: как все устроено

  1. У нас есть интерфейс (User Interface), который позволяет управлять приложением.

  2. Чуть ниже на схеме сервис kubectl, который управляет управляющей командой Нодов (кластером Kubernetes master), и говорит, что нужно делать.

  3. Слева серые мы видим Мастер-Ноды (API Server, Sheduler, Controller-Manager, etcd) - они думают, распределяют и управляют всем остальным дальше по схеме.

  4. Далее справа в кластере разворачиваются рабочие Ноды (Worker node), т.е. уже те Ноды, внутри которых разворачивается приложение.

  5. На каждый из Нодов (Worker node) также установлен Докер и уже известный нам kubectl, который всем управляет.

  6. В Ноды (Worker node) также устанавливается Kube-proxy, который отвечает за остальное взаимодействие.

Именно так выглядит правильная сложная архитектура Kubernetes, но для примера мы запустим простой кластер внутри одной машины – внутри компьютера. В этом приложении и Мастер-Нода, и Worker Node, и kubectl будут размещены на нашем локальном компьютере.

Что мы сейчас сделаем?

  • Запустим локальный кластер Minikube;

  • Остановим его;

  • Развернем простое приложение Getting-Started.

Установка и остановка minikube – гайд

  1. Приложение «Docker Desktop»

Скачиваем, устанавливаем и запускаем как приложение «Docker Desktop». Здесь все просто, вот ссылка: https://www.docker.com/products/docker-desktop/.    

  1. Запуск minikube        

    2.1. Скачиваем и устанавливаем minikube по ссылке: https://minikube.sigs.k8s.io/docs/start/.

    2.2. На открывшейся странице выбираем параметры компьютера, проверяем системные требования, освобождаем 20GB места, если у вас на компьютере сейчас меньше свободной памяти, и нажимаем на ссылку для скачивания.

    2.3. Копируем код для добавления переменного окружения и вводим эту команду в PowerShell.

  2. 2.4. Теперь командой «minikube start» запускаем кластер.

    2.5. Открываем окно приложения «Docker Desktop», чтобы увидеть, что в нем появился запущенный контейнер.

  3. Запуск Kubectl

    3.1. Переходим по ссылке https://kubernetes.io/docs/tasks/tools/#kubectl.

    3.2. На появившейся странице выбираем ОС и скачиваем kubectl.exe.

    3.3. Запускаем kubectl.exe через терминал через папку, куда был скачан файл.

    3.4. Далее копируем этот файл из папки, куда он был скачан в корневую папку приложения minikube (обычно это папка на диске C), это мы делаем для того, чтобы этот kubectl был доступен независимо от директории, в которой он лежит.

    3.5. На всякий случай можно перепроверить, все ли получилось, зайдя в Мой компьютер – дополнительные параметры системы – переменные среды – Path – Изменить. И там среди списка путей должен быть путь к папке C:\\minikube. Если его нет – нужно добавить.

Теперь у нас развернут кластер, и осталось только развернуть приложение…

  1. Запуск дашборда

    С помощью команды «minikube dashboard» запускаем через терминал веб-интерфейс приложения, ждем загрузки, и в браузере появится новая вкладка с дашбордом.

  2. Создание Deployment’а

    Деплоймент – это штука, которая будет проверять здоровье Подов. Поды – это структура, объединяющая в себе контейнеры. Переходим по ссылке: https://kubernetes.io/ru/docs/tutorials/hello-minikube/. Находим раздел «Создание деплоймента», копируем код из окошка и вводим в PowerShell.

    Для проверки можно зайти в запущенный в п. 4 дашборд в бразуере, и слева во вкладке Deployments мы должны увидеть созданный Deployment.

    Там же во вкладке Pods можно будет увидеть один созданный Pod.

  3. Создание и запуск Service

    (Этот шаг нужен, чтобы приложение стало доступно не только по внутреннему IP Кубернетеса)

    6.1. С помощью команды указываем, какой порт использует приложение, чтобы мы потом могли его опубликовать во вне «kubectl expose deployment hello-node --type=LoadBalancer --port=8080».

    Теперь, если мы зайдем во вкладку Services, мы увидим незапущенный (оранжевый кружок) сервис «hello-node».

    6.2. Запускаем сервис с помощью команды «minikube service hello-node».

Поздравляю! Мы только что запустили первое простое приложение внутри Kubernetes! Оно пока что мало чего умеет, но тем не менее!

  1. Очистка

    7.1. Теперь мы можем удалить сервис и деплоймент командами:

    • «kubectl delete service hello-node»;

    • «kubectl delete deployment hello-node».

    Внимание! Эти команды выполняются в новом окна терминала, так как старый загружен процессом запуска Service из п.6.2.

    7.2. Дальше мы можем остановить кластер командой «minikube stop».

    7.3. И еще можем удалить этот локальный кластер Кубернетеса командой «minikube delete».

The secret of getting ahead is «getting-started» (с)

Перевод: «Секрет продвижения вперед в том, чтобы начать». Автор - Марк Твен.

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

Сначала обзаведемся образом приложения. Его можно скачать из Docker Hub, открытого реестра образов. Образ – это, по сути, готовое к старту приложение.

  1. Зная название приложения и то, что в моем каталоге оно загружено в Docker Hub, выполняем в терминале команду для скачивания «docker pull amelinvd/getting-started».

  2. После скачивания в приложении «Docker Desktop» в разделе «Images» мы должны увидеть скачанный образ «amelinvd/getting-started».

Для запуска приложения осталось всего ничего, наберитесь терпения.

  1. Снова создаем локальный контейнер командой «minikube start» (это займет немного времени).

  2. Затем обращаемся к инструкции по ссылке https://minikube.sigs.k8s.io/docs/start/, и находим раздел по разворачиванию приложений «Deploy applications».

  1. Наша задача взять первую команду и изменить ее, заменив название приложение на «getting-started», а путь к образу на «amelinvd/getting-started». Получится следующая команда, которую надо ввести в терминале: «kubectl create deployment getting-started –image=amelinvd/getting-started» 

В PowerShell мы увидим сообщение, что деплоймент создан.

  1. Дальше берем вторую команду из инструкции и тоже меняем название приложения на getting-started, а порт меняем на используемый нашим приложением 3000. Получится следующая команда: «kubectl expose deployment getting-started  --type=NodePort --port=3000»

  2. Создаем уже знакомый нам Service. Берем третью команду из инструкции и меняем название приложения на «getting-started». Должно получиться вот так: «kubectl get services getting-started» 

  3. Запускаем сервис командой «minikube service getting-started». Должны увидеть вот такую картинку в PowerShell.

Теперь в стандартном браузере у нас уже работает простое приложение планировщик задач!

Выводы и рекомендации

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

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

Комментарии (10)


  1. saboteur_kiev
    11.11.2023 00:43
    +6

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

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

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

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


    1. semenovs
      11.11.2023 00:43

      Говорят, когда кто то называет докер виртуальной машиной, где то происходить утечка персональных данных :-)


    1. DesertEagle
      11.11.2023 00:43
      +1

      И на секундочку это все писал

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


  1. trabl
    11.11.2023 00:43

    Минигайд по установке и использованию minicube, не более того.


    1. slonopotamus
      11.11.2023 00:43
      +1

      И непонятно зачем, главное. В Docker Desktop и так из коробки есть кубер.


  1. Vaitek
    11.11.2023 00:43
    +1

    Команды в картинках. Эээ, вы издеваетесь?


    1. Dominux
      11.11.2023 00:43

      Он просто пользователь винды, ему так удобнее


      1. Vaitek
        11.11.2023 00:43

        Спасибо, что скриншот не в PowerPoint файле?


  1. rusik2293
    11.11.2023 00:43
    +1

    Кубер на windows

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

    Наверное Поды, а не Ноды


  1. TheRealSova
    11.11.2023 00:43

    Автор путает kubectl и kubelet, так же ноды и поды, дальше читать не стал особо, бегло пробежался, так как автор банально не разбирается в том, о чем он пишет