Размещайте и масштабируйте веб-приложение в 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

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов 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, что значительно повышает производительность сети и аутентификацию. Это означает, что для выполнения этого практического задания вам понадобится только браузер (да, он работает и на Chromebook).

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

b532b2f19ab85dda.png

Screen Shot 2017-06-14 at 10.13.43 PM.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 ? Проверьте, какой 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, созданный на основе репозитория monolith-to-microservices. Вы клонируете исходный код из своего репозитория, чтобы сосредоточиться на аспектах развертывания в 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. Клонируйте исходный код и загрузите его в облачное хранилище.
  3. Разверните экземпляр Compute Engine для размещения серверных микросервисов.
  4. Перенастройте код фронтенда для использования экземпляра микросервисов бэкенда.
  5. Разверните экземпляр Compute Engine для размещения микросервиса на стороне клиента.
  6. Настройте сеть для обеспечения связи.

Создайте скрипт запуска.

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

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

Перейдите в папку monolith-to-microservices. Нажмите «Файл» > «Новый файл» и создайте файл с именем startup-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

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

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

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

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

Теперь скопируйте созданный файл startup-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 > react-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

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

Для пересборки react-app используйте следующую команду, которая обновит код фронтенда:

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/

Развернуть экземпляр фронтенда

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

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. Создайте группы управляемых экземпляров.

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

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

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

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

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

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

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

Настройте автоматическое восстановление

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

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

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

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 перейдите в папку react-app, где находится файл .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

Пересоберите react-app, что обновит код фронтенда.

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-адрес, указанный для балансировщика нагрузки, который можно узнать с помощью следующей команды:

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

Если у вас более одного экземпляра в статусе 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 и скопировать его в директорию public монолита:

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

Затем снова загрузите код в свой облачный накопитель.

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-адрес, указанный для балансировщика нагрузки, который можно узнать с помощью следующей команды:

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 на Mac), чтобы выйти из команды watch. После этого группа управляемых экземпляров создаст новый экземпляр для его восстановления.

9. Уборка

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

gcloud projects delete [PROJECT_ID]

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

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

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