Размещайте и масштабируйте веб-приложение в Google Cloud с помощью Compute Engine.

1. Введение

Существует множество способов развертывания веб-сайтов в Google Cloud, причем каждое решение предлагает разные функции, возможности и уровни контроля. Compute Engine предлагает глубокий уровень контроля над инфраструктурой, используемой для работы веб-сайта, но также требует немного большего оперативного управления по сравнению с такими решениями, как Google Kubernetes Engine, App Engine или другими. Благодаря Compute Engine вы получаете детальный контроль над аспектами инфраструктуры, включая виртуальные машины, балансировщик нагрузки и многое другое. Сегодня вы развернете пример приложения — веб-сайт электронной коммерции Fancy Store — чтобы показать, как веб-сайт можно легко развернуть и масштабировать с помощью Compute Engine.

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

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

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

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

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

  1. Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Включить API Compute Engine

Далее вам необходимо включить API Compute Engine . Для включения API необходимо принять условия обслуживания и принять ответственность за выставление счетов за API.

В Cloud Shell выполните следующие действия, чтобы включить API Compute Engine:

gcloud services enable compute.googleapis.com

Облачная оболочка

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

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

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

b532b2f19ab85dda.png

Снимок экрана 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:

2485e00c1223af09.png

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

echo $GOOGLE_CLOUD_PROJECT

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

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

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

Создать сегмент облачного хранилища

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

gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID

3. Клонировать исходный репозиторий

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

Вы можете автоматически клонировать репозиторий кода в проект, а также открыть Cloud Shell и встроенный редактор кода по следующей ссылке: Открыть в Cloud Shell .

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

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

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

./setup.sh

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

cd microservices
npm start

Выход:

Products microservice listening on port 8082!
Frontend microservice listening on port 8080!
Orders microservice listening on port 8081!

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

6634c06dd0b9172c.png

Откроется новое окно, в котором вы сможете увидеть интерфейс Fancy Store в действии!

abf2ca314bf80d03.png

Вы можете закрыть это окно после просмотра сайта. Чтобы остановить процесс веб-сервера, нажмите Control+C ( Command+C на Macintosh) в окне терминала.

4. Создайте экземпляры Compute Engine.

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

  1. Создайте сценарий запуска для настройки экземпляров.
  2. Клонируйте исходный код и загрузите его в Cloud Storage.
  3. Разверните экземпляр Compute Engine для размещения серверных микросервисов.
  4. Перенастройте код внешнего интерфейса для использования экземпляра серверной микрослужбы.
  5. Разверните экземпляр Compute Engine для размещения внешнего микросервиса.
  6. Настройте сеть, чтобы разрешить связь.

Создать сценарий запуска

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

Нажмите значок карандаша на ленте Cloud Shell, чтобы открыть редактор кода.

Перейдите в папку монолит-микросервисы. Нажмите «Файл» > «Новый файл» и создайте файл с именем start-script.sh.

439553c934139b82.png

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

#!/bin/bash

# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &

# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc

# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm

# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/

# Install app dependencies.
cd /fancy-store/
npm install

# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app

# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF

supervisorctl reread
supervisorctl update

Теперь в редакторе кода найдите текст [DEVSHELL_PROJECT_ID] и замените его выводом следующей команды:

echo $DEVSHELL_PROJECT_ID

Пример вывода:

my-gce-codelab-253520

Строка кода в файле start-script.sh теперь должна выглядеть примерно так:

gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/

Сценарий запуска выполняет следующие задачи:

  • Установка агента журналирования, который автоматически собирает журналы из системного журнала.
  • Установка Node.js и Supervisor, который запускает приложение как демон.
  • Клонирование исходного кода приложения из корзины Cloud Storage и установка зависимостей.
  • Конфигурация Supervisor, который запускает приложение, гарантирует, что приложение перезапускается, если оно неожиданно завершает работу или останавливается администратором или процессом, и отправляет стандартный вывод и стандартный вывод приложения в системный журнал для сбора агентом ведения журнала.

Теперь скопируйте созданный файл start-script.sh в ранее созданную корзину Cloud Storage:

gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID

Теперь он доступен по адресу https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh . [BUCKET_NAME] представляет имя сегмента Cloud Storage. По умолчанию он будет доступен для просмотра только авторизованным пользователям и учетным записям служб, поэтому он будет недоступен через веб-браузер. Экземпляры Compute Engine автоматически получат доступ к нему через свои сервисные учетные записи.

Скопируйте код в корзину Cloud Storage

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

Скопируйте клонированный код в корзину Cloud Storage:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Развертывание серверного экземпляра

Первым экземпляром, который вы развернете, будет серверный экземпляр, в котором будут размещены микросервисы заказов и продуктов.

Выполните следующую команду в Cloud Shell, чтобы создать экземпляр f1-micro, настроенный на использование ранее созданного сценария запуска и помеченный как внутренний экземпляр, чтобы вы могли позже применить к нему определенные правила брандмауэра:

gcloud compute instances create backend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=backend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh

Настроить подключение к бэкэнду

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

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

gcloud compute instances list

Пример вывода:

NAME     ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
backend  us-central1-a  f1-micro                   10.128.0.2   34.68.223.88  RUNNING

В редакторе кода Cloud Shell перейдите в папку monolith-to-microservices > response-app . В меню редактора кода выберите «Вид» > «Переключить скрытые файлы», чтобы просмотреть файл .env .

e7314ceda643e16.png

Отредактируйте файл .env , чтобы он указывал на внешний IP-адрес серверной части. [BACKEND_ADDRESS] ниже представляет внешний IP-адрес внутреннего экземпляра, определенный с помощью предыдущей команды в инструменте gcloud.

REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products

Сохраните файл.

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

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Скопируйте код приложения в корзину Cloud Storage:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Развертывание экземпляра внешнего интерфейса

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

gcloud compute instances create frontend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=frontend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh 

Настроить сеть

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

gcloud compute firewall-rules create fw-fe \
    --allow tcp:8080 \
    --target-tags=frontend
gcloud compute firewall-rules create fw-be \
    --allow tcp:8081-8082 \
    --target-tags=backend

Теперь веб-сайт должен работать. Определите внешний IP-адрес внешнего интерфейса. Адрес можно определить, найдя EXTERNAL_IP экземпляра внешнего интерфейса:

gcloud compute instances list

Пример вывода:

NAME      ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
backend   us-central1-a  f1-micro                   10.128.0.2   104.198.235.171  RUNNING
frontend  us-central1-a  f1-micro                   10.128.0.3   34.69.141.9      RUNNING

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

watch -n 5 curl http://[EXTERNAL_IP]:8080 

Как только вы увидите вывод, подобный следующему, веб-сайт должен быть готов. Нажмите Control+C ( Command+C на Macintosh) в командной строке, чтобы отменить команду просмотра.

80dc8721dc08d7e4.png

Перейдите по адресу http://[FRONTEND_ADDRESS]:8080 с новой вкладкой веб-браузера для доступа к веб-сайту, где [FRONTEND_ADDRESS] — это EXTERNAL_IP, определенный выше.

Попробуйте перейти на страницы «Продукты» и «Заказы», ​​это также должно работать.

a11460a1fffb07d8.png

5. Создайте группы управляемых экземпляров.

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

Группа управляемых экземпляров содержит идентичные экземпляры, которыми можно управлять как единым объектом в одной зоне. Управляемые группы экземпляров поддерживают высокую доступность ваших приложений, заранее поддерживая доступность ваших экземпляров, то есть в состоянии РАБОТАЕТ. Вы будете использовать управляемые группы экземпляров для своих внешних и внутренних экземпляров, чтобы обеспечить автоматическое восстановление, балансировку нагрузки, автоматическое масштабирование и чередующиеся обновления.

Создать шаблон экземпляра из исходного экземпляра

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

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

Во-первых, вы должны остановить оба экземпляра.

gcloud compute instances stop frontend
gcloud compute instances stop backend

Теперь создайте шаблон экземпляра из исходных экземпляров.

gcloud compute instance-templates create fancy-fe \
    --source-instance=frontend
gcloud compute instance-templates create fancy-be \
    --source-instance=backend

Подтвердите, что шаблоны экземпляров были созданы:

gcloud compute instance-templates list

Пример вывода:

NAME      MACHINE_TYPE  PREEMPTIBLE  CREATION_TIMESTAMP
fancy-be  f1-micro                   2019-09-12T07:52:57.544-07:00
fancy-fe  f1-micro                   2019-09-12T07:52:48.238-07:00

Создать группу управляемых экземпляров

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

gcloud compute instance-groups managed create fancy-fe-mig \
    --base-instance-name fancy-fe \
    --size 2 \
    --template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
    --base-instance-name fancy-be \
    --size 2 \
    --template fancy-be

В вашем приложении внешний микросервис работает через порт 8080, а серверные микросервисы — через порт 8081 для заказов и порт 8082 для продуктов. Учитывая, что это нестандартные порты, для их идентификации вы укажете именованные порты. Именованные порты — это метаданные пары ключ:значение, представляющие имя службы и порт, на котором она работает. Именованные порты можно назначить группе экземпляров, что указывает на то, что служба доступна на всех экземплярах группы. Эта информация используется балансировщиком нагрузки, который вы настроите позже.

gcloud compute instance-groups set-named-ports fancy-fe-mig \ 
    --named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
    --named-ports orders:8081,products:8082

Настройка автоисправления

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

Политика автоматического восстановления основана на проверке работоспособности приложения, чтобы убедиться, что приложение реагирует должным образом. Проверка ответа приложения является более точной, чем простая проверка того, что экземпляр находится в состоянии РАБОТАЕТ , что является поведением по умолчанию.

Создайте проверку работоспособности, которая восстанавливает экземпляр, если он трижды подряд возвращается как неработоспособный для внешнего и внутреннего интерфейса:

gcloud compute health-checks create http fancy-fe-hc \
    --port 8080 \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
    --port 8081 \
    --request-path=/api/orders \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3

Создайте правило брандмауэра, чтобы разрешить зондам проверки работоспособности подключаться к микросервисам через порты 8080 и 8081:

gcloud compute firewall-rules create allow-health-check \
    --allow tcp:8080-8081 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 \
    --network default

Примените проверки работоспособности к соответствующим службам:

gcloud compute instance-groups managed update fancy-fe-mig \
    --health-check fancy-fe-hc \
    --initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
    --health-check fancy-be-hc \
    --initial-delay 300

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

6. Создайте балансировщик нагрузки

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

Дополнительную информацию о возможностях балансировки нагрузки, доступных в Google Cloud, см. в разделе Обзор балансировки нагрузки .

Создание балансировки нагрузки HTTP(S)

Google Cloud предлагает множество различных типов балансировки нагрузки, но для своего трафика вы будете использовать балансировку нагрузки HTTP(S). Балансировка нагрузки HTTP(S) структурирована следующим образом:

  1. Правило пересылки направляет входящие запросы на целевой HTTP-прокси.
  2. Целевой HTTP-прокси проверяет каждый запрос на сопоставление URL-адресов, чтобы определить подходящую серверную службу для запроса.
  3. Внутренняя служба направляет каждый запрос на соответствующую серверную часть в зависимости от мощности обслуживания, зоны и состояния экземпляра подключенных к ней серверных частей. Работоспособность каждого экземпляра серверной части проверяется с помощью проверки работоспособности HTTP. Если серверная служба настроена на использование проверки работоспособности HTTPS или HTTP/2, запрос будет зашифрован на пути к серверному экземпляру.
  4. Сеансы между балансировщиком нагрузки и экземпляром могут использовать протокол HTTP, HTTPS или HTTP/2. Если вы используете HTTPS или HTTP/2, каждый экземпляр серверных служб должен иметь сертификат SSL.

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

gcloud compute http-health-checks create fancy-fe-frontend-hc \
  --request-path / \
  --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \
  --request-path /api/orders \
  --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \
  --request-path /api/products \
  --port 8082

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

gcloud compute backend-services create fancy-fe-frontend \
  --http-health-checks fancy-fe-frontend-hc \
  --port-name frontend \
  --global
gcloud compute backend-services create fancy-be-orders \
  --http-health-checks fancy-be-orders-hc \
  --port-name orders \
  --global
gcloud compute backend-services create fancy-be-products \
  --http-health-checks fancy-be-products-hc \
  --port-name products \
  --global

Добавьте серверные службы.

gcloud compute backend-services add-backend fancy-fe-frontend \
  --instance-group fancy-fe-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-orders \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-products \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global

Создайте карту URL-адресов. Карта URL-адресов определяет, какие URL-адреса направляются на какие серверные службы.

gcloud compute url-maps create fancy-map \
  --default-service fancy-fe-frontend

Создайте средство сопоставления путей, чтобы позволить путям /api/orders и /api/products маршрутизироваться к соответствующим службам.

gcloud compute url-maps add-path-matcher fancy-map \
   --default-service fancy-fe-frontend \
   --path-matcher-name orders \
   --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"

Создайте прокси-сервер, который будет привязан к созданной карте URL-адресов.

gcloud compute target-http-proxies create fancy-proxy \
  --url-map fancy-map

Создайте глобальное правило переадресации, которое привязывает общедоступный IP-адрес и порт к прокси-серверу.

gcloud compute forwarding-rules create fancy-http-rule \
  --global \
  --target-http-proxy fancy-proxy \
  --ports 80

Обновить конфигурацию

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

В Cloud Shell перейдите в папку реакции-приложения, в которой находится файл .env, содержащий конфигурацию.

cd ~/monolith-to-microservices/react-app/

Найдите IP-адрес балансировщика нагрузки:

gcloud compute forwarding-rules list --global

Пример вывода:

NAME                    REGION  IP_ADDRESS     IP_PROTOCOL  TARGET
fancy-http-rule          34.102.237.51  TCP          fancy-proxy

Отредактируйте файл .env с помощью предпочитаемого вами текстового редактора (например, GNU nano), чтобы он указывал на общедоступный IP-адрес балансировщика нагрузки. [LB_IP] представляет внешний IP-адрес внутреннего экземпляра.

REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products

Пересоберите приложение реакции, которое обновит код внешнего интерфейса.

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Скопируйте код приложения в корзину GCS.

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Обновите экземпляры внешнего интерфейса

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

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable 100%

Протестируйте сайт

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

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

После того как элементы появятся в списке, выйдите из команды просмотра, нажав Control+C ( Command+C на Macintosh).

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

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Пример вывода:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

Как только элементы появятся в списке, выйдите из команды watch , нажав Control+C ( Command+C на Macintosh).

После этого приложение будет доступно через http://[LB_IP], где [LB_IP] — это IP_ADDRESS, указанный для балансировщика нагрузки, который можно найти с помощью следующей команды:

gcloud compute forwarding-rules list --global

7. Масштабирование вычислительной машины

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

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

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

gcloud compute instance-groups managed set-autoscaling \
  fancy-fe-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
  fancy-be-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60

Включить сеть доставки контента

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

gcloud compute backend-services update fancy-fe-frontend \
    --enable-cdn --global

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

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

8. Обновить сайт

Обновление шаблона экземпляра

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

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

Вы измените тип компьютера в шаблоне экземпляра, переключившись со стандартного типа компьютера f1-micro на пользовательский тип компьютера с 4 виртуальными ЦП и 3840 МБ ОЗУ.

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

gcloud compute instances set-machine-type frontend --machine-type custom-4-3840

Создайте новый шаблон экземпляра:

gcloud compute instance-templates create fancy-fe-new \
    --source-instance=frontend \
    --source-instance-zone=us-central1-a

Разверните обновленный шаблон экземпляра в группе управляемых экземпляров:

gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
    --version template=fancy-fe-new

Следите за статусом обновления:

watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig

Если у вас более 1 экземпляра в состоянии RUNNING, ACTION установлено в None и INSTANCE_TEMPLATE установлено в качестве нового имени шаблона ( fancy-fe-new ), скопируйте имя одного из перечисленных компьютеров для использования в следующей команде.

Control+S ( Command+S на Macintosh), чтобы выйти из процесса просмотра.

Выполните следующую команду, чтобы проверить, использует ли виртуальная машина новый тип машины (custom-4-3840), где [VM_NAME] — вновь созданный экземпляр:

gcloud compute instances describe [VM_NAME] | grep machineType

Ожидаемый пример вывода:

machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840

Внести изменения на сайт

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

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

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Результирующий код должен выглядеть следующим образом:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

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

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Затем снова отправьте код в корзину Cloud Storage.

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Вносите изменения с помощью непрерывных обновлений

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

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable=100%

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

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

Как только элементы появятся в списке, выйдите из команды просмотра, нажав Control+S ( Command+S на Macintosh).

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

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Пример вывода:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

После появления элементов в списке выйдите из команды просмотра, нажав Control+S ( Command+S на Macintosh).

Чтобы сделать недействительным кэшированный контент в сети доставки контента и обеспечить отображение свежего контента, выполните следующее:

gcloud compute url-maps invalidate-cdn-cache fancy-map \
    --path "/*"

Перейдите на веб-сайт через http://[LB_IP], где [LB_IP] — это IP_ADDRESS, указанный для балансировщика нагрузки, который можно найти с помощью следующей команды:

gcloud compute forwarding-rules list --global

Теперь новые изменения на веб-сайте должны быть видны.

b081b8e885bf0723.png

Имитировать отказ

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

gcloud compute instance-groups list-instances fancy-fe-mig

Оттуда выполните безопасную оболочку в один из экземпляров, где INSTANCE_NAME — это один из экземпляров из списка:

gcloud compute ssh [INSTANCE_NAME]

В этом случае используйте Supervisorctl, чтобы остановить приложение.

sudo supervisorctl stop nodeapp; sudo killall node

Выйдите из экземпляра.

exit

Контролировать ход ремонтных работ.

watch -n 5 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'

Найдите следующий пример вывода:

NAME                                                  TYPE                                       TARGET                                 HTTP_STATUS  STATUS  TIMESTAMP
repair-1568314034627-5925f90ee238d-fe645bf0-7becce15  compute.instances.repair.recreateInstance  us-central1-a/instances/fancy-fe-1vqq  200          DONE    2019-09-12T11:47:14.627-07:00

После обнаружения исправления Control+C ( Command+S на Macintosh), чтобы выйти из команды просмотра. На этом этапе группа управляемых экземпляров воссоздает экземпляр для его восстановления.

9. Очистка

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

gcloud projects delete [PROJECT_ID]

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

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

Вы развернули, масштабировали и обновили свой веб-сайт на Compute Engine. Теперь у вас есть опыт работы с Compute Engine, управляемыми группами экземпляров, балансировкой нагрузки и проверками работоспособности!