Разворачивание первого приложения с Kubernetes

050a18e205e9fc6a89188008df1591ef.png

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

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

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

d0a1b51cb86fa0f6f854aed6cc8811a3.png

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

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

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

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

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

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

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

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

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

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

57c06053a37fa823ebd9fb22a53eb7aa.png

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 — гайд

eec778a67db45fded144f87cbd4277c6.png

  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.

    8e7648acc5d88973eeeb56e834dc73a7.png
  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.

    a410c7217c78dce24ae15bd28a96d0a3.png
  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.         Теперь мы можем удалить сервис и деплоймент командами:

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

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

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

The secret of getting ahead is «getting-started» ©

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

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

b99c68b630b654f9e57ff1c21d45acd2.png

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

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

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

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

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

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

cf42e265d9ea187b683375b45a1a41bf.png

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

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

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

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

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

7ec5eab63f3ab54da94512c88ad8b3b9.png

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

e440cc0679fb8808565f62bf1ec9772c.png

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

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

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

© Habrahabr.ru