Миграция монолитного веб-сайта на микросервисы в Google Kubernetes Engine

1. Введение

Зачем переходить от монолитного приложения к архитектуре микросервисов? Разбиение приложения на микросервисы имеет следующие преимущества: большинство из них связано с тем, что микросервисы слабо связаны.

  • Микросервисы можно тестировать и развертывать независимо. Чем меньше единица развертывания, тем проще развертывание.
  • Они могут быть реализованы на разных языках и платформах. Для каждого микросервиса вы можете выбрать лучшую технологию для конкретного случая использования.
  • Ими могут управлять разные команды. Граница между микросервисами упрощает выделение команды для одного или нескольких микросервисов.
  • Переходя на микросервисы, вы ослабляете зависимости между командами. Каждой команде приходится заботиться только об API микросервисов, от которых они зависят. Команде не нужно думать о том, как эти микросервисы реализованы, о циклах их выпуска и так далее.
  • Вам будет легче спроектировать неудачу. Имея четкие границы между службами, легче определить, что делать, если служба не работает.

Некоторые недостатки по сравнению с монолитами:

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

В этой лабораторной работе мы будем запускать микросервисы в Google Kubernetes Engine (GKE). Kubernetes — это платформа для управления, размещения, масштабирования и развертывания контейнеров. Контейнеры — это портативный способ упаковки и запуска кода. Они хорошо подходят для шаблона микросервисов, где каждый микросервис может работать в своем собственном контейнере.

В рамках этой лабораторной работы мы развернем существующее монолитное приложение в кластере Google Kubernetes Engine, а затем разобьем его на микросервисы!

Схема архитектуры наших микросервисов

Начнем с того, что разобьем наш монолит на три микросервиса, по одному за раз. К микросервисам относятся заказы, продукты и интерфейс. Мы создаем образ Docker для каждого микросервиса с помощью Cloud Build, который запускаем из Cloud Shell. Затем мы развернем и представим наши микросервисы в Google Kubernetes Engine (GKE) с типом службы Kubernetes LoadBalancer. Мы сделаем это для каждого сервиса, одновременно проводя рефакторинг их из нашего монолита. В ходе этого процесса и наш монолит, и наши микросервисы будут работать до самого конца, когда мы сможем удалить наш монолит.

636a2d58588b2b87.png

Что вы узнаете

  • Как разбить монолит на микросервисы
  • Как создать кластер Google Kubernetes Engine
  • Как создать образ Docker
  • Как развернуть образы Docker в Kubernetes

Предварительные условия

  • Учетная запись Google Cloud Platform с административным доступом для создания проектов или проект с ролью владельца проекта.
  • Базовое понимание Docker и Kubernetes.

2. Настройка среды

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вам необходимо ее создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

53dad2cefdae71da.png

Скриншот от 10.02.2016 12:45:26.png

Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID .

Далее вам необходимо включить выставление счетов в консоли разработчика, чтобы использовать ресурсы Google Cloud и включить API Container Engine .

Выполнение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их включенными (см. раздел «Очистка» в конце этого документа). Цены на Google Kubernetes Engine описаны здесь .

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Google Cloud Shell

Хотя Google Cloud и Kubernetes можно управлять удаленно с вашего ноутбука, в этой лаборатории мы будем использовать Google Cloud Shell , среду командной строки, работающую в облаке.

Эта виртуальная машина на базе Debian оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Это означает, что все, что вам понадобится для этой лаборатории кода, — это браузер (да, он работает на Chromebook).

  1. Чтобы активировать Cloud Shell из Cloud Console, просто нажмите «Активировать Cloud Shell». fEbHefbrRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X 3-й квартал (подготовка и подключение к среде займет всего несколько минут).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARE01A

Снимок экрана 14.06.2017, 22.13.43.png

После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен ваш PROJECT_ID .

gcloud auth list

Вывод команды

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если по какой-то причине проект не установлен, просто введите следующую команду:

gcloud config set project <PROJECT_ID>

Ищете свой PROJECT_ID ? Узнайте, какой идентификатор вы использовали на этапах настройки, или найдите его на панели управления Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell также по умолчанию устанавливает некоторые переменные среды, которые могут быть полезны при выполнении будущих команд.

echo $GOOGLE_CLOUD_PROJECT

Вывод команды

<PROJECT_ID>
  1. Наконец, установите зону по умолчанию и конфигурацию проекта.
gcloud config set compute/zone us-central1-f

Вы можете выбрать множество различных зон. Дополнительную информацию см. в разделе «Регионы и зоны» .

3. Репозиторий исходного кода клонирования

Мы используем существующее монолитное приложение воображаемого веб-сайта электронной коммерции с простой страницей приветствия, страницей продуктов и страницей истории заказов. Нам просто нужно будет клонировать исходный код из нашего репозитория git, чтобы мы могли сосредоточиться на его разбиении на микросервисы и развертывании в Google Kubernetes Engine (GKE).

Выполните следующие команды, чтобы клонировать репозиторий git в экземпляр Cloud Shell и перейти в соответствующий каталог. Мы также установим зависимости NodeJS, чтобы можно было протестировать наш монолит перед развертыванием. Запуск этого сценария может занять несколько минут.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

4. Создайте кластер GKE.

Теперь, когда у вас есть рабочая среда разработки, нам нужен кластер Kubernetes для развертывания нашего монолита и, в конечном итоге, наших микросервисов! Прежде чем мы сможем создать кластер, нам необходимо убедиться, что соответствующие API включены. Выполните следующую команду, чтобы включить API контейнеров, чтобы мы могли использовать Google Kubernetes Engine:

gcloud services enable container.googleapis.com

Теперь мы готовы создать наш кластер! Запустите команду ниже, чтобы создать кластер GKE с именем Fancy-cluster с 3 узлами.

gcloud container clusters create fancy-cluster --num-nodes 3

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

gcloud compute instances list

Выход:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Вы также можете просмотреть свой кластер Kubernetes и соответствующую информацию в консоли Google Cloud. Нажмите кнопку меню в левом верхнем углу, прокрутите вниз до Kubernetes Engine и нажмите «Кластеры». Вы должны увидеть свой кластер с именем Fancy-cluster .

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

Поздравляем! Вы только что создали свой первый кластер Kubernetes!

5. Развертывание существующего монолита

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

cd ~/monolith-to-microservices
./deploy-monolith.sh

Доступ к Монолиту

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

kubectl get service monolith

Вы должны увидеть вывод, аналогичный следующему:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

ПРИМЕЧАНИЕ. Для этого необходимо подготовить внешний балансировщик нагрузки и IP-адрес, поэтому это займет некоторое время. Если в вашем выводе внешний IP-адрес указан как

<pending> подождите несколько минут и повторите попытку.

После того, как вы определили внешний IP-адрес для своего монолита, скопируйте IP-адрес. Направьте свой браузер на этот URL-адрес (например, http://203.0.113.0), чтобы проверить, доступен ли ваш монолит.

9ed25c3f0cbe62fa.png

Вы должны увидеть страницу приветствия монолитного веб-сайта, как на картинке выше. Страница приветствия — это статическая страница, которая позже будет обслуживаться микросервисом Frontend. Теперь ваш монолит полностью работает в Kubernetes!

6. Перенос заказов в микросервис

Теперь, когда у нас есть существующий монолитный веб-сайт, работающий на GKE, мы можем начать разбивать каждый сервис на микросервис. Как правило, необходимо спланировать, какие службы разбить на более мелкие фрагменты, обычно вокруг конкретных частей приложения, например бизнес-сферы. В демонстрационных целях мы создали тривиальный пример и разбили каждую службу по бизнес-сфере: заказы, продукты и интерфейс. Код уже перенесен, и мы сосредоточимся на создании и развертывании сервисов в Google Kubernetes Engine (GKE).

Микросервис создания новых заказов

Первая услуга, которую мы представим, — это служба «Заказы». Мы воспользуемся отдельной предоставленной кодовой базой и создадим отдельный контейнер Docker для этого сервиса.

Создайте Docker-контейнер с помощью Google Cloud Build

Поскольку мы уже перенесли для вас кодовую базу, нашим первым шагом будет создание Docker-контейнера нашей службы заказов с помощью Google Cloud Build.

Обычно вам придется применить двухэтапный подход, который влечет за собой создание Docker-контейнера и отправку его в реестр для хранения образа, из которого GKE сможет извлечь данные. Но мы можем облегчить жизнь: мы можем использовать Google Cloud Build для создания Docker-контейнера и поместить его в реестр Google Cloud Container с помощью одной команды! Это позволяет нам выполнить одну команду для сборки и перемещения нашего образа в реестр контейнеров. Чтобы просмотреть ручной процесс создания файла Docker и его отправки, вы можете перейти сюда .

Google Cloud Build сожмет файлы из каталога и переместит их в корзину Google Cloud Storage. Затем процесс сборки возьмет все файлы из корзины и использует Dockerfile для запуска процесса сборки Docker. Поскольку мы указали флаг --tag с хостом gcr.io для образа Docker, полученный образ Docker будет отправлен в реестр контейнеров Google Cloud.

Выполните следующие команды, чтобы создать контейнер Docker и отправить его в реестр контейнеров Google:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

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

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

Чтобы просмотреть историю сборок или наблюдать за процессом в режиме реального времени, вы можете перейти в консоль Google Cloud. Нажмите кнопку меню в левом верхнем углу, прокрутите вниз до «Инструменты» → «Создание облака» и нажмите «История». Здесь вы можете увидеть список всех ваших предыдущих сборок, должна быть только одна, которую вы только что создали.

4c753ede203255f6.png

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

На странице сведений о сборке вы можете просмотреть созданный образ контейнера, щелкнув имя образа в разделе информации о сборке.

6e88ed1643dfe629.png

Развертывание контейнера в GKE

Теперь, когда мы контейнеризировали наш веб-сайт и поместили его в реестр контейнеров Google, пришло время развернуть его в Kubernetes!

Kubernetes представляет приложения как Pods — модули, представляющие контейнер (или группу тесно связанных контейнеров). Pod — это самая маленькая развертываемая единица в Kubernetes. В этом руководстве каждый модуль содержит только контейнер микросервисов.

Для развертывания приложений и управления ими в кластере GKE необходимо взаимодействовать с системой управления кластером Kubernetes. Обычно это делается с помощью инструмента командной строки kubectl из Cloud Shell.

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

Приведенная ниже команда kubectl create deployment заставляет Kubernetes создать в вашем кластере развертывание с именем Orders с 1 репликой.

Запустите следующую команду, чтобы развернуть приложение:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

Проверка развертывания

Чтобы убедиться, что развертывание было успешно создано, выполните следующую команду. Для изменения статуса модуля может потребоваться несколько секунд: «Выполняется»:

kubectl get all

Выход:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

Этот вывод показывает нам несколько вещей. Мы можем видеть наше текущее развертывание, наш ReplicaSet с желаемым количеством модулей, равным 1, и наш работающий модуль. Похоже, все создано успешно!

Открыть контейнер GKE

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

Когда мы развернули нашу службу Orders, мы открыли ее через порт 8081 внутри компании через развертывание Kubernetes. Чтобы предоставить доступ к этой службе извне, нам нужно создать службу Kubernetes типа LoadBalancer для маршрутизации трафика с порта 80 извне на внутренний порт 8081 для службы Orders. Запустите следующую команду, чтобы открыть доступ к вашему веб-сайту из Интернета:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

Доступ к услуге

GKE назначает внешний IP-адрес ресурсу службы, а не развертыванию. Если вы хотите узнать внешний IP-адрес, предоставленный GKE для вашего приложения, вы можете проверить Службу с помощью команды kubectl get service:

kubectl get service orders

Выход:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

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

Переконфигурировать Монолит

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

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

Нам нужно обновить файл конфигурации в нашем монолите, чтобы он указывал на новый IP-адрес микросервиса Orders. Используйте редактор nano, чтобы заменить локальный URL-адрес IP-адресом нашего нового микросервиса Orders. Запустите следующую команду, чтобы отредактировать

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Когда редактор откроется, ваш файл должен выглядеть так:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

Замените REACT_APP_ORDERS_URL на новый формат, заменив его IP-адресом микросервиса Orders, чтобы он соответствовал приведенному ниже:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Нажмите CTRL+O , нажмите ENTER , затем CTRL+X чтобы сохранить файл в редакторе nano.

Вы можете протестировать свой новый микросервис, перейдя по URL-адресу, который вы только что установили в этом файле. Веб-страница должна вернуть ответ JSON от нашего микросервиса Orders.

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

Восстановить файлы конфигурации Monolith

npm run build:monolith

Создайте Docker-контейнер с помощью Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Развертывание контейнера в GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Вы можете убедиться, что ваше приложение теперь использует новый микросервис Orders, перейдя в монолитное приложение в браузере и перейдя на страницу Orders. Все идентификаторы заказов должны заканчиваться суффиксом -MICROSERVICE, как показано ниже:

1cdd60bb0d4d1148.png

7. Миграция продуктов на микросервис

Создание новых продуктов Микросервис

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

Создайте Docker-контейнер с помощью Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

Развертывание контейнера в GKE

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

Открыть контейнер GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

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

kubectl get service products

Выход:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

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

Переконфигурировать Монолит

Используйте редактор nano, чтобы заменить локальный URL-адрес IP-адресом наших новых микросервисов продуктов:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Когда редактор откроется, ваш файл должен выглядеть так:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Замените REACT_APP_PRODUCTS_URL на новый формат, заменив его IP-адресом микросервиса вашего продукта, чтобы он соответствовал приведенному ниже:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

Нажмите CTRL+O , нажмите ENTER , затем CTRL+X чтобы сохранить файл в редакторе nano.

Вы можете протестировать свой новый микросервис, перейдя по URL-адресу, который вы только что установили в этом файле. Веб-страница должна вернуть ответ JSON от нашего микросервиса продуктов.

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

Восстановить файлы конфигурации Monolith

npm run build:monolith

Создайте Docker-контейнер с помощью Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

Развертывание контейнера в GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

Вы можете убедиться, что ваше приложение теперь использует новый микросервис «Продукты», перейдя к монолитному приложению в браузере и перейдя на страницу «Продукты». Все названия продуктов должны начинаться с префикса MS-, как показано ниже:

5389b29f4b8c7c69.png

8. Миграция внешнего интерфейса на микросервис

Последний шаг в процессе миграции — переместить код внешнего интерфейса в микросервис и завершить работу монолита! После завершения этого шага мы успешно перенесем наш монолит на микросервисную архитектуру!

Создать новый интерфейсный микросервис

Давайте выполним ту же процедуру, что и последние два шага, чтобы создать новый внешний микросервис.

Раньше, когда мы перестраивали наш монолит, мы обновляли нашу конфигурацию, чтобы она указывала на наш монолит, но теперь нам нужно использовать ту же конфигурацию для нашего микросервиса Frontend. Выполните следующие команды, чтобы скопировать файлы конфигурации URL-адресов наших микросервисов в базу кода микросервиса Frontend:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

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

Создайте Docker-контейнер с помощью Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

Развертывание контейнера в GKE

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

Открыть контейнер GKE

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

Удалить Монолит

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

kubectl delete deployment monolith
kubectl delete service monolith

Проверьте свою работу

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

kubectl get services

Ваш вывод должен выглядеть примерно так:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

Определив внешний IP-адрес для вашей внешней микрослужбы, скопируйте IP-адрес. Направьте свой браузер на этот URL-адрес (например, http://203.0.113.0), чтобы проверить, доступен ли ваш интерфейс. Ваш сайт должен быть таким же, каким был до того, как мы разбили монолит на микросервисы!

9. Очистка

Когда все будет готово, самый простой способ очистить все выполненные действия — удалить проект. При удалении проекта удаляются все ресурсы, созданные в рамках этой Codelab, чтобы исключить возникновение непредвиденных периодических расходов. Выполните следующую команду в Cloud Shell, где PROJECT_ID — это полный идентификатор проекта, а не только имя проекта.

gcloud projects delete [PROJECT_ID]

Подтвердите удаление, введя «Y» при появлении соответствующего запроса.

10. Поздравляем!

Вы успешно разбили свое монолитное приложение на микросервисы и развернули их в Google Kubernetes Engine!

Следующие шаги

Ознакомьтесь со следующими лабораториями кода, чтобы узнать больше о Kubernetes:

Дополнительные ресурсы