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

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

Предпосылки

Н/Д

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

Если у вас ещё нет учётной записи Google (Gmail или Google Apps), необходимо её создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 2016-02-10 12:45:26.png

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

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

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

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

Cloud Shell

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

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

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

activateCloudShell.png

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

Скриншот 2017-06-14 в 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

Вы можете выбрать различные зоны. Подробнее см. в документации «Регионы и зоны» .

Включить API Cloud Run

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

gcloud services enable run.googleapis.com

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

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

Вы создадите простое приложение 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 . Теперь ваше приложение готово к контейнеризации, тестированию и загрузке в Container Registry.

Чтобы контейнеризировать пример приложения, создайте новый файл с именем 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 нажмите «Веб-просмотр» . и выберите Предварительный просмотр на порту 8080 .

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

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

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

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

Хотя 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

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

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

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

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

Дополнительную информацию о Knative, базовом проекте с открытым исходным кодом, можно найти на странице Knative .