Развертывание веб-сайта с помощью Cloud Run

1. Прежде чем начать

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

С помощью Cloud Run, реализации Knative в Google Cloud, вы можете управлять своим веб-сайтом и развертывать его без каких-либо дополнительных затрат, необходимых для развертывания на основе виртуальных машин или Kubernetes. Это не только упрощает управление, но и позволяет масштабировать систему до нуля, когда на ваш веб-сайт не поступают запросы.

В этом практическом занятии вы начнете с образа Docker, созданного с помощью Cloud Build, который вы запускаете в Cloud Shell. Затем вы развернете этот образ в Cloud Run с помощью команды в Cloud Shell.

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

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

  • Как создать образ Docker с помощью Cloud Build и загрузить его на gcr.io
  • Как развернуть образы Docker в Cloud Run
  • Как управлять развертываниями Cloud Run
  • Как настроить конечную точку для приложения в Cloud Run

Что вы построите

  • Статический веб-сайт, работающий внутри контейнера Docker.
  • Версия этого контейнера, размещенная в реестре контейнеров (Container Registry).
  • Развертывание вашего статического веб-сайта в Cloud Run.

Что вам понадобится

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

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

Настройка среды для самостоятельного обучения

Если у вас еще нет учетной записи Google, вам необходимо ее создать . Затем войдите в консоль Google Cloud и нажмите «Проект» > «Создать проект» .

53dad2cefdae71da.png

faab21976aabeb4c.png

Запомните идентификатор проекта, который автоматически заполняется под названием вашего проекта. Идентификатор проекта — это уникальное имя для всех проектов Google Cloud, поэтому имя на скриншоте уже занято и вам не подойдёт. В дальнейшем оно будет обозначаться как PROJECT_ID .

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

Включите API Cloud Run

Нажмите меню навигации ☰ > API и сервисы > Панель управления > Включить API и сервисы . .

5dbb2e6e27a55fcf.png

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

f1fd486174a744cf.png

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

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

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

Хотя Google Cloud и Cloud Run можно запускать удаленно с ноутбука, вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud. Эта среда предварительно настроена и содержит все необходимые клиентские библиотеки и фреймворки.

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

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

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

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

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

3. Клонируйте репозиторий исходного кода.

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

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

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

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

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

Теперь, когда ваши исходные файлы готовы, пришло время контейнеризировать ваше приложение с помощью Docker!

Обычно для этого требуется двухэтапный подход, включающий создание контейнера Docker и его отправку в реестр для хранения образа, который затем будет использоваться GKE. Однако вы можете упростить себе задачу, используя Cloud Build для создания контейнера Docker и размещения образа в Container Registry одной командой! Чтобы ознакомиться с процессом создания Dockerfile и его отправки вручную, см. раздел «Быстрый старт для Container Registry» .

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

Для начала необходимо убедиться, что API Cloud Build включен. Для этого выполните следующую команду:

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

4c753ede203255f6.png

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

6e88ed1643dfe629.png

5. Разверните контейнер в Cloud Run.

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

Существует два подхода к развертыванию в Cloud Run:

  • Cloud Run (полностью управляемая) — это модель PaaS, в которой управляется весь жизненный цикл контейнера. В этом практическом занятии вы будете использовать именно этот подход.
  • Cloud Run for Anthos — это Cloud Run с дополнительным уровнем управления, позволяющим переносить кластеры и поды из GKE. Для получения дополнительной информации см. раздел «Настройка Cloud Run for Anthos в Google Cloud» .

Примеры командной строки будут показаны в Cloud Shell с использованием переменных среды, которые вы настроили ранее.

Командная строка

Выполните следующую команду для развертывания вашего приложения:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

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

d52d9419c5166674.png

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

3a57b32f133dad61.png

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

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

6. Создайте новую версию с меньшим количеством параллельных запросов.

Теперь снова разверните приложение, но на этот раз измените один из параметров.

По умолчанию для приложения 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 щелкните по монолитному сервису, чтобы просмотреть подробную информацию.

7d1eed2e4728a4f2.png

Перейдите на вкладку «Ревизии» . Вы должны увидеть две созданные ревизии. Щелкните monolith-00002 и просмотрите подробности. Вы должны увидеть, что значение параллельного доступа уменьшилось до 1.

217185c0eccc87dd.png ]

4ad481b8bcd0343d.png

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

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

Для обновления текущей версии выполните следующую команду в Cloud Shell:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Обратите внимание, что создана еще одна ревизия, трафик перенаправлен, и количество одновременных запросов снова достигло 80.

7. Внесите изменения на веб-сайт.

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

Похоже, один из ваших разработчиков уже внес изменения в файл с именем 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 run build:monolith

Теперь, когда ваш код обновлен, вам нужно пересобрать контейнер Docker и опубликовать его в Container Registry. Вы можете использовать ту же команду, что и раньше, только на этот раз вам нужно будет обновить метку версии!

Выполните следующую команду, чтобы запустить новую сборку 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 .

В следующем разделе вы используете это изображение для обновления вашего приложения без простоя.

8. Обновление веб-сайта без простоев.

Изменения внесены, и маркетинговая команда довольна вашими обновлениями! Пришло время обновить сайт без помех для пользователей.

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

Теперь на вашем сайте должен отображаться текст, который вы добавили в компонент главной страницы!

451ca252acae6928.png

9. Уборка

Удалить образы из реестра контейнеров

# 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 из Cloud Storage.

# 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

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

Вы развернули, масштабировали и обновили свой веб-сайт с помощью Cloud Run.

Узнать больше