Работать с веб-сайтами может быть сложно из-за всех накладных расходов, связанных с созданием и управлением экземплярами виртуальных машин (ВМ), кластерами, модулями, службами и т. д. Это приемлемо для крупных многоуровневых приложений, но если вам нужно только развернуть и сделать веб-сайт видимым, то это потребует значительных накладных расходов.
С Cloud Run, облачной реализацией Knative от Google, вы можете управлять своим сайтом и разворачивать его без каких-либо дополнительных затрат, необходимых для развёртываний на базе виртуальных машин или Kubernetes. Это не только более простой подход с точки зрения управления, но и позволяет масштабировать его до нуля, когда на ваш сайт не поступает запросов.
Cloud Run не только позволяет разрабатывать бессерверные приложения в контейнерах, но и может работать как на ваших собственных кластерах Google Kubernetes Engine (GKE), так и на полностью управляемом решении «платформа как услуга» (PaaS), предоставляемом Cloud Run. В этой лабораторной работе вы протестируете последний вариант.
На следующей схеме показан процесс развертывания и хостинга в Cloud Run. Вы начинаете с создания образа Docker с помощью Cloud Build, который запускается в Cloud Shell. Затем вы разворачиваете этот образ в Cloud Run с помощью команды в Cloud Shell.

Предпосылки
- Общее знакомство с Docker (см. раздел « Начало работы » на веб-сайте Docker ).
Чему вы научитесь
- Как создать образ Docker с помощью Cloud Build и загрузить его на gcr.io
- Как развернуть образы Docker в Cloud Run
- Как управлять развертываниями Cloud Run
- Как настроить конечную точку для приложения в Cloud Run
Что вы построите
- Статический веб-сайт, работающий внутри контейнера Docker.
- Версия этого контейнера, находящаяся в Реестре контейнеров
- Развертывание Cloud Run для вашего статического веб-сайта
Что вам понадобится
- Учетная запись Google с правами администратора для создания проектов или проекта с ролью владельца проекта.
Настройка среды для самостоятельного обучения
Если у вас ещё нет учётной записи Google, вам необходимо её создать . Затем войдите в Google Cloud Console и нажмите «Проект» > «Создать проект» .


Запомните идентификатор проекта, который автоматически подставляется под его названием. Идентификатор проекта уникален для всех проектов Google Cloud, поэтому имя на скриншоте уже занято и вам не подойдёт. Далее оно будет называться PROJECT_ID .
Далее вам необходимо включить биллинг в Cloud Console для использования ресурсов Google Cloud и включить Cloud Run API.
Включить API Cloud Run
Нажмите Меню навигации ☰ > API и службы > Панель управления > Включить API и службы .

Найдите «Cloud Run API», затем нажмите Cloud Run API > Включить .

Выполнение этой лабораторной работы не должно обойтись вам дороже нескольких долларов, но может обойтись дороже, если вы решите использовать больше ресурсов или оставите их запущенными (см. раздел «Очистка» в конце). Подробнее см. в разделе «Цены» .
Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Cloud Shell
Хотя Google Cloud и Cloud Run можно управлять удалённо с ноутбука, вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud. Эта среда уже настроена и содержит все необходимые клиентские библиотеки и фреймворки.
Эта виртуальная машина на базе Debian оснащена всеми необходимыми инструментами разработки. Она предлагает постоянный домашний каталог объёмом 5 ГБ и работает в облаке Google Cloud, что значительно повышает производительность сети и аутентификацию. Это значит, что для этой лабораторной работы вам понадобится только браузер (да, он работает на Chromebook).
Чтобы активировать Google Cloud Shell, в консоли разработчика просто нажмите кнопку в правом верхнем углу (подготовка и подключение к среде займет всего несколько минут):
Нажмите кнопку «Запустить Cloud Shell»:
После подключения к облачной оболочке вы должны увидеть, что вы уже аутентифицированы и что проекту уже присвоен ваш PROJECT_ID :
gcloud auth list
Вывод команды
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Вывод команды
[core] project = <PROJECT_ID>
Cloud Shell также устанавливает некоторые переменные среды по умолчанию, которые могут быть полезны при запуске будущих команд.
echo $GOOGLE_CLOUD_PROJECT
Вывод команды
<PROJECT_ID>
Если по какой-то причине проект не установлен, просто выполните следующую команду:
gcloud config set project <PROJECT_ID>
Ищете свой PROJECT_ID ? Проверьте, какой идентификатор вы использовали при настройке, или найдите его на панели управления консоли:
ВАЖНО: Наконец, задайте зону по умолчанию и конфигурацию проекта:
gcloud config set compute/zone us-central1-f
Вы можете выбрать различные зоны. Подробнее см. в документации «Регионы и зоны» .
Учитывая, что вы развертываете существующий веб-сайт, вам нужно только клонировать исходный код из вашего репозитория, чтобы вы могли сосредоточиться на создании образов Docker и развертывании в Cloud Run.
Выполните следующие команды, чтобы клонировать репозиторий в свой экземпляр Cloud Shell и перейти в соответствующий каталог. Вы также установите зависимости Node.js, чтобы иметь возможность протестировать приложение перед развертыванием.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
Это клонирует ваш репозиторий, изменит каталог и установит зависимости, необходимые для локального запуска приложения. Выполнение скрипта может занять несколько минут.
Проявите должную осмотрительность и протестируйте своё приложение. Выполните следующую команду для запуска веб-сервера:
cd ~/monolith-to-microservices/monolith npm start
Выход:
Monolith listening on port 8080!
Вы можете просмотреть свое приложение, нажав «Веб-просмотр».
и выбрав Предварительный просмотр на порту 8080 .

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

После просмотра веб-сайта это окно можно закрыть. Чтобы остановить процесс веб-сервера, нажмите CONTROL+C ( Command+C на Macintosh) в окне терминала.
Теперь, когда ваши исходные файлы готовы к использованию, пришло время Dockerize ваше приложение!
Обычно вам пришлось бы использовать двухэтапный подход, включающий сборку Docker-контейнера и его отправку в реестр для хранения образа, из которого GKE будет извлекать данные. Однако вы можете упростить задачу, используя Cloud Build для сборки Docker-контейнера и размещения образа в реестре контейнеров одной командой! Чтобы ознакомиться с процессом создания Dockerfile и его отправки вручную, см. статью «Краткое руководство по реестру контейнеров» .
Cloud Build сжимает файлы из каталога и перемещает их в контейнер Cloud Storage. Затем процесс сборки извлекает все файлы из контейнера и использует Dockerfile, находящийся в том же каталоге, для запуска процесса сборки Docker. Учитывая, что вы указали флаг --tag с хостом gcr.io для образа Docker, полученный образ Docker будет отправлен в реестр контейнеров.
Для начала убедитесь, что у вас включён Cloud Build API. Для этого выполните следующую команду:
gcloud services enable cloudbuild.googleapis.com
После включения API выполните следующую команду в Cloud Shell, чтобы начать процесс сборки:
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith: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>/monolith:1.0.0 SUCCESS
Чтобы просмотреть историю сборок или наблюдать за процессом в режиме реального времени, перейдите в Cloud Console, выберите меню навигации ☰ > Cloud Build > History . Там вы увидите список всех ваших предыдущих сборок, но среди них должна быть только та, которую вы создали.

Нажав на идентификатор сборки (Build ID) , вы увидите всю информацию об этой сборке, включая вывод журнала. Вы можете просмотреть созданный образ контейнера, нажав на ссылку рядом с изображением (Image) .

Теперь, когда вы контейнеризировали свой веб-сайт и перенесли его в Container Registry, пришло время развернуть его в Cloud Run!
Существует два подхода к развертыванию в Cloud Run:
- Cloud Run (полностью управляемый) — это PaaS-модель, в которой управляется весь жизненный цикл контейнера. Этот подход будет использоваться в этой практической работе.
- Cloud Run для Anthos — это Cloud Run с дополнительным уровнем контроля, который позволяет переносить кластеры и модули из GKE. Подробнее см. в статье «Настройка Cloud Run для Anthos в Google Cloud» .
Примеры командной строки будут в Cloud Shell с использованием переменных среды, которые вы настроили ранее.
Командная строка
Выполните следующую команду для развертывания приложения:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed Вам будет предложено указать, в каком регионе вы хотели бы работать. Выберите ближайший к вам регион, а затем примите предложенное по умолчанию имя службы (monolith).

Для тестирования разрешите неаутентифицированные запросы к приложению. Введите y в приглашении.

Проверить развертывание
Чтобы убедиться, что развертывание было успешно создано, выполните следующую команду. Может пройти несколько минут, прежде чем Pod status изменится на Running :
gcloud run services list
Выберите [1] Cloud Run (полностью управляемый).
Выход:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
В выводе отображается несколько данных. Вы видите ваше развёртывание, а также пользователя, который его развёрнул (ваш адрес электронной почты), и URL-адрес, по которому можно получить доступ к приложению. Похоже, всё было успешно создано!
Откройте URL-адрес, указанный в списке служб, в своем веб-браузере, и вы увидите тот же веб-сайт, который вы просматривали локально.
Теперь снова разверните свое приложение, но на этот раз измените один из параметров.
По умолчанию приложение Cloud Run имеет значение параллелизма 80, что означает, что каждый экземпляр контейнера будет обслуживать до 80 запросов одновременно. Это существенно отличается от модели «функции как услуги» (FaaS), в которой один экземпляр обрабатывает один запрос за раз.
Повторно разверните тот же образ контейнера со значением параллелизма 1 (только в целях тестирования) и посмотрите, что произойдет.
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1Ответьте на последующие вопросы так же, как и в первый раз. После успешного выполнения команды проверьте результат в Cloud Console.
На панели управления Cloud Run щелкните монолитную службу, чтобы просмотреть подробную информацию.

Перейдите на вкладку «Ревизии» . Вы увидите две созданные ревизии. Щелкните monolith-00002 и просмотрите информацию. Значение параллелизма должно уменьшиться до 1.
]

Хотя эта конфигурация достаточна для тестирования, в большинстве производственных сценариев у вас будут контейнеры, поддерживающие несколько одновременных запросов.
Теперь восстановите исходный параллелизм без повторного развертывания. Вы можете установить значение параллелизма по умолчанию 80 или 0, что снимет все ограничения параллелизма и установит его на максимальное значение по умолчанию (которое на момент написания статьи составляло 80).
Выполните следующую команду в Cloud Shell, чтобы обновить текущую версию:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80Обратите внимание, что была создана еще одна ревизия, трафик был перенаправлен, а параллелизм вернулся к 80.
Ваш отдел маркетинга попросил вас изменить главную страницу сайта вашей компании. Они считают, что она должна быть более информативной о том, чем занимается компания и что продаётся. В этом разделе вы добавите текст на главную страницу, чтобы порадовать отдел маркетинга!
Похоже, один из ваших разработчиков уже внёс изменения в файл 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 & 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 run build:monolith
Теперь, когда ваш код обновлён, вам нужно пересобрать Docker-контейнер и опубликовать его в реестре контейнеров. Для этого используйте ту же команду, что и раньше, но на этот раз обновите метку версии!
Выполните следующую команду, чтобы запустить новую сборку Cloud Build с обновленной версией образа 2.0.0:
cd ~/monolith-to-microservices/monolith
#Feel free to test your application
npm start
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .В следующем разделе вы будете использовать это изображение для обновления своего приложения с нулевым временем простоя.
Изменения завершены, и отдел маркетинга доволен вашими обновлениями! Пришло время обновить сайт, не мешая пользователям.
Cloud Run обрабатывает каждое развертывание как новую версию, которая будет запущена в сеть, а затем на нее будет перенаправлен трафик.
Следуйте следующим инструкциям по обновлению вашего веб-сайта.
Командная строка
Из командной строки вы можете повторно развернуть службу для обновления образа до новой версии с помощью следующей команды:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managedПроверить развертывание
Проверьте обновление развертывания, выполнив следующую команду:
gcloud run services describe monolith --platform managed
Вывод выглядит так:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
annotations:
client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...
Вы увидите, что ваша служба теперь использует последнюю версию вашего образа, развернутую в новой ревизии.
Чтобы проверить изменения, снова перейдите по внешнему URL-адресу вашей службы Cloud Run и обратите внимание, что название вашего приложения обновилось.
Выполните следующую команду, чтобы вывести список служб и просмотреть IP-адрес, если вы его забыли:
gcloud run services list
Теперь на вашем сайте должен отображаться текст, который вы добавили на главную страницу!

Удалить образы реестра контейнеров
# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet
# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quietУдалить артефакты Cloud Build из облачного хранилища
# The following command will take all source archives from all builds and delete them from cloud storage
# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'
gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; doneУдалить службу Cloud Run
gcloud run services delete monolith --platform managed
Вы развернули, масштабировали и обновили свой веб-сайт с помощью Cloud Run.