Развертывание и запуск контейнера с помощью Cloud Run на Node.js

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

6a5cf23c8e20491f.png

Cloud Run — это управляемая вычислительная платформа, которая позволяет запускать контейнеры без отслеживания состояния, которые можно вызвать с помощью HTTP-запросов. Cloud Run является бессерверным; это устраняет необходимость в управлении инфраструктурой, поэтому вы можете сосредоточиться на самом важном — создании отличных приложений. Он создан на основе Knative и позволяет вам запускать контейнеры с помощью Cloud Run (полностью управляемого) или Cloud Run для Anthos. Цель этой лаборатории кода — помочь вам создать образ контейнера и развернуть его в Cloud Run.

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

Н/Д

2. Настройка и требования

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

  1. Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

  1. Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

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

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

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

Включите API Cloud Run

В Cloud Shell включите API Cloud Run.

gcloud services enable run.googleapis.com

Это должно привести к успешному сообщению, похожему на это:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Напишите пример приложения

Вы создадите простое приложение Node.js на основе Express, отвечающее на HTTP-запросы.

Чтобы создать приложение, используйте Cloud Shell, чтобы создать новый каталог с именем helloworld-nodejs и перейти в него.

mkdir helloworld-nodejs
cd helloworld-nodejs

Создайте файл package.json со следующим содержимым:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

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

Затем в том же каталоге создайте файл index.js и скопируйте в него следующее содержимое:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Этот код создает базовый веб-сервер, который прослушивает порт, определенный переменной среды PORT . Теперь ваше приложение готово к контейнеризации, тестированию и загрузке в реестр контейнеров.

4. Поместите свое приложение в контейнер и загрузите его в реестр контейнеров.

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

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Теперь создайте образ контейнера с помощью Cloud Build, выполнив следующую команду из каталога, содержащего Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT — это переменная среды, содержащая идентификатор вашего проекта Google Cloud при запуске в Cloud Shell. Вы также можете получить его, запустив gcloud config get-value project .

После отправки в реестр вы увидите сообщение SUCCESS содержащее имя образа ( gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld ). Образ хранится в реестре контейнеров и при желании может быть использован повторно.

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

gcloud container images list

Если вы хотите запустить и протестировать приложение локально из Cloud Shell, вы можете запустить его с помощью этой стандартной команды docker :

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

В Cloud Shell нажмите «Предварительный просмотр в Интернете». 170b7a95be8c6296.png и выберите «Предварительный просмотр на порту 8080» .

3618ca3a4a135570.png

Откроется окно браузера с надписью Hello World!

a0307f34cacf9e6a.png

Вы также можете просто использовать curl localhost:8080 .

5. Развертывание в Cloud Run

Развертывание контейнерного приложения в Cloud Run выполняется с помощью следующей команды (обязательно укажите правильное имя образа для созданного вами приложения или используйте предварительно созданный образ gcr.io/cloudrun/hello ):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

Опция развертывания --allow-unauthenticated позволяет получить доступ к приложению без аутентификации. Параметр --platform managed \ Deploy означает, что вы запрашиваете полностью управляемую среду (а не инфраструктуру Kubernetes через Anthos).

Подождите несколько минут, пока развертывание не завершится. Когда это будет сделано, в командной строке отобразится URL-адрес службы.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Теперь вы можете посетить развернутый контейнер, открыв URL-адрес службы в веб-браузере:

63260b4d3aee42b8.png

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

6. Очистка

Хотя Cloud Run не взимает плату, когда служба не используется, с вас все равно может взиматься плата за хранение созданного образа контейнера.

Вы можете либо удалить свой проект Google Cloud, чтобы избежать взимания платы, которая приведет к прекращению выставления счетов за все ресурсы, используемые для этого проекта, либо просто удалить свое изображение helloworld с помощью этой команды:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Чтобы удалить службу Cloud Run, используйте следующую команду:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. Поздравления

Поздравляем! Вы развернули приложение, упакованное в образ контейнера, в Cloud Run.

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

Следующим хорошим шагом будет ознакомление с Quickstart: Deploy to Cloud Run for Anthos в Google Cloud .

Дополнительные сведения о создании HTTP-контейнера без отслеживания состояния, подходящего для Cloud Run, из источника кода и его отправке в реестр контейнеров см. в следующих ресурсах:

Чтобы узнать больше о Knative, базовом проекте с открытым исходным кодом, см. Knative .