Развертывание веб-сайта с помощью 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.
  • Версия этого контейнера, которая находится в реестре контейнеров.
  • Развертывание Cloud Run для вашего статического веб-сайта

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

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

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

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

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

53dad2cefdae71da.png

faab21976aabeb4c.png

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

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

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARE01A

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

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

gcloud auth list

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

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

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

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

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

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

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

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

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

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

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

4c753ede203255f6.png

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

6e88ed1643dfe629.png

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

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

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

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

cd ~/monolith-to-microservices/react-app
npm run build:monolith

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

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

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