Разворачивание первого приложения с Kubernetes
Во времена популярности микросервисной архитектуры появляется все больше потребности в платформах и решениях для автоматизации сложных или нереализуемых вручную процессов. Например, когда нам нужно работать с высоконагруженными приложениями, имеющими свои крутые пики и просадки посещаемости, было бы очень сложно построить архитектуру без использования Docker-контейнеров (виртуальных машин), которые позволяют разбивать приложение на части, взаимодействующие друг с другом. Однако задача становится еще более сложной, если мы работаем с приложением, которое делится на другие приложения, которые в свою очередь разделены на контейнеры, и вся эта система обрабатывает миллионы запросов пользователей и хранит невообразимый объем информации.
Яркие примеры таких приложений: YouTube или Google. Естественно, на одной машине такие сервисы не развернуть, поэтому в архитектуре используются тысячи компьютеров, именуемых Нодами (worker node). Однако эти Ноды, как части общего механизма, могут выходить из строя, и тогда их нужно заново поднимать, более того, хорошо бы вообще постоянно мониторить каждый Нод и считывать его состояние. Выполнять такие задачи становится очень сложно вручную. И, возможно, именно для этих площадок, а может быть и нет, но Google разработала технологию Kubernetes, которая выполняет роль оркестрации контейнеров. Kubernetes следит за Нодами и поднимает те, что выходят из строя, но это не единственная ее задача. Технология также может отключать неиспользуемые Ноды, оптимизируя расход ресурсов.
Занимательным также является факт, что около 50% компаний и команд уже используют относительно новую технологию Kubernetes в своих проектах.
Коллеги, всем привет! Меня зовут Владимир Амелин, и я технический руководитель направления в компании Quillis, и сегодня я попробую помочь вам разобраться в логике работы Kubernetes.
Теперь, когда в актуальности данной технологии мало у кого могут остаться сомнения, я хотел бы немного успокоить тех, кто считает, что дальше будет очень сложно… Обещаю, что все будет достаточно легко, и мы даже сможем самостоятельно запустить первое приложение, хоть Kubernetes — это и не самое простое в реализации решение. Однако в этой статье мы начнем с малого:
Узнаем, как работает Kubernetes.
Разберем архитектуру этой технологии.
Развернем кластер из одной машины, где и запустим простое приложение на локальном компьютере с помощью Kubernetes.
Отвечая на вопрос, для кого будет полезно осваивание этой технологии, можно с уверенностью сказать о DevOps«ах любого уровня, а также об инженерах, которым было бы полезно понять технологию для взаимодействия с ней на проектах.
И еще пару слов в пользу технологии для еще большей мотивации:
С Kubernetes можно создавать Pipeline«ы, то есть объединять весь процесс разработки в единую систему, когда разработчик пишет код, отправляет его в Git в основную ветку, администратор нажимает кнопку, и этот код автоматически отправляется на тестовый стенд. В результате, в день может быть опубликовано несколько новых версий продукта, и это очень сильно упрощает разработку и автоматизирует ее.
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 — гайд
Приложение «Docker Desktop»
Скачиваем, устанавливаем и запускаем как приложение «Docker Desktop». Здесь все просто, вот ссылка: https://www.docker.com/products/docker-desktop/.
Запуск minikube
2.1. Скачиваем и устанавливаем minikube по ссылке: https://minikube.sigs.k8s.io/docs/start/.
2.2. На открывшейся странице выбираем параметры компьютера, проверяем системные требования, освобождаем 20GB места, если у вас на компьютере сейчас меньше свободной памяти, и нажимаем на ссылку для скачивания.
2.3. Копируем код для добавления переменного окружения и вводим эту команду в PowerShell.
2.4. Теперь командой «minikube start» запускаем кластер.
2.5. Открываем окно приложения «Docker Desktop», чтобы увидеть, что в нем появился запущенный контейнер.
Запуск 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. Если его нет — нужно добавить.
Теперь у нас развернут кластер, и осталось только развернуть приложение…
Запуск дашборда
С помощью команды «minikube dashboard» запускаем через терминал веб-интерфейс приложения, ждем загрузки, и в браузере появится новая вкладка с дашбордом.
Создание Deployment«а
Деплоймент — это штука, которая будет проверять здоровье Подов. Поды — это структура, объединяющая в себе контейнеры. Переходим по ссылке: https://kubernetes.io/ru/docs/tutorials/hello-minikube/. Находим раздел «Создание деплоймента», копируем код из окошка и вводим в PowerShell.
Для проверки можно зайти в запущенный в п. 4 дашборд в бразуере, и слева во вкладке Deployments мы должны увидеть созданный Deployment.
Там же во вкладке Pods можно будет увидеть один созданный Pod.
Создание и запуск Service
(Этот шаг нужен, чтобы приложение стало доступно не только по внутреннему IP Кубернетеса)
6.1. С помощью команды указываем, какой порт использует приложение, чтобы мы потом могли его опубликовать во вне «kubectl expose deployment hello-node --type=LoadBalancer --port=8080».
Теперь, если мы зайдем во вкладку Services, мы увидим незапущенный (оранжевый кружок) сервис «hello-node».
6.2. Запускаем сервис с помощью команды «minikube service hello-node».
Поздравляю! Мы только что запустили первое простое приложение внутри Kubernetes! Оно пока что мало чего умеет, но тем не менее!
Очистка
7.1. Теперь мы можем удалить сервис и деплоймент командами:
Внимание! Эти команды выполняются в новом окна терминала, так как старый загружен процессом запуска 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».
Для запуска приложения осталось всего ничего, наберитесь терпения.
3. Снова создаем локальный контейнер командой «minikube start» (это займет немного времени).
4. Затем обращаемся к инструкции по ссылке https://minikube.sigs.k8s.io/docs/start/, и находим раздел по разворачиванию приложений «Deploy applications».
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.
Теперь в стандартном браузере у нас уже работает простое приложение планировщик задач!
Выводы и рекомендации
То, что мы разобрали выше, является самым элементарным примером использования архитектуры технологии Kubernetes, которую я постарался объяснить максимально простым языком. Для развертывания более сложных решений потребуются кратно большие усилия и кратно большие компетенции. Однако по этому примеру можно научиться понимать логику работы решения на практике. В качестве домашнего задания я бы рекомендовал повторить все пройденные шаги самостоятельно.
А если вам хочется освоить более тонкие и редкие технологии, то я рекомендую вам подписаться на наш блог и следить за обновлениями, потому что следующими своими уроками я планирую выпустить серию роликов по RealTime-аналитике.