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

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

С 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 с помощью Cloud Build и загрузить его на gcr.io
  • Как развернуть образы Docker в Cloud Run
  • Как управлять развертываниями Cloud Run
  • Как настроить конечную точку для приложения в Cloud Run

Что вы будете строить

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

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

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

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

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

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

Затем вам нужно включить выставление счетов в Cloud Console, чтобы использовать ресурсы Google Cloud и включить API Cloud Run.

Включить Cloud Run API

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

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

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

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

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

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

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

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

активироватьCloudShell.png

Нажмите кнопку «Запустить Cloud Shell»:

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

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

Project_ID.png

ВАЖНО: Наконец, установите зону по умолчанию и конфигурацию проекта:

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 и размещения образа в Container Registry с помощью одной команды! Чтобы просмотреть ручной процесс создания Dockerfile и его отправки, см. Quickstart for Container Registry .

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

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

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

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

Учить больше