От разработки до разработки за три простых шага с Cloud Run

1. Введение

Почему так сложно управлять приложениями?

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

4d018476b4a73b47.png

Не знаю, как вы, а я не хочу об этом беспокоиться! О чем я действительно хочу подумать, так это о логике моего приложения:

6dfd143d20e5548b.png

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

Помимо административных проблем, упомянутых выше, вам также придется иметь дело с:

  • Зависимости . Среда, в которой работает ваше приложение, должна, насколько это возможно, точно соответствовать среде, в которой оно тестировалось. Это может охватывать несколько аспектов, включая операционную систему, библиотеки поддержки, интерпретатор или компилятор языка, конфигурацию оборудования и многие другие факторы.
  • Распространение . Переход от локальной версии приложения к той, которая широко распространена в Интернете, часто требует изменения среды выполнения, качественного скачка в сложности и длительного обучения.

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

Что ты сделаешь...

  • Вы создадите простое веб-приложение и убедитесь, что оно работает должным образом в вашей среде разработки.
  • Затем вы перейдете на контейнерную версию того же приложения. Попутно вы узнаете, что означает контейнеризация и почему она так полезна.
  • Наконец, вы развернете свое приложение в облаке и увидите, насколько легко управлять службой Cloud Run с помощью командной строки и Google Cloud Console.

Чему вы научитесь...

  • Как создать простое приложение веб-сервера на Python
  • Как упаковать ваше приложение в контейнер Docker, который работает где угодно
  • Как развернуть ваше приложение в облаке, чтобы каждый мог опробовать ваше новое творение
  • Как еще больше упростить описанные выше шаги с помощью Buildpacks
  • Как использовать инструмент командной строки Google Cloud и веб-интерфейс Cloud Console

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

  • Веб-браузер
  • Аккаунт Google

Эта лабораторная работа ориентирована на разработчиков всех уровней, включая новичков. Хотя вы будете использовать Python, вам не обязательно быть знакомым с программированием на Python, чтобы понять, что происходит, потому что мы объясним весь код, который вы используете.

2. Настройтесь

5110b5081a1e1c49.png

В этом разделе описано все, что вам нужно сделать, чтобы начать работу с этой лабораторной работой.

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

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

Запустить Cloud Shell

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

704a7b7491bd157.png

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». 4292cbf4971c9786.png .

bce75f34b2c53987.png

Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:

70f315d7b402b476.png

Подготовка и подключение к Cloud Shell займет всего несколько минут.

fbe3a0674c982259.png

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

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

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list

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

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

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

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью этой команды:

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

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

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

Включите API

На последующих шагах вы увидите, где эти службы необходимы (и почему), а пока запустите эту команду, чтобы предоставить вашему проекту доступ к службам Cloud Build, Container Registry и Cloud Run:

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       run.googleapis.com          

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

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

3. Создайте простое веб-приложение

eef530b56b8e93a3.png

Начните с нажатия кнопки Open Editor в верхней части панели Cloud Shell. Это выглядит так:

9b81c8a37a6bcdd8.png

После этого вы окажетесь в среде IDE, похожей на Visual Studio Code, в которой вы сможете создавать проекты, редактировать исходный код, запускать программы и т. д. Если ваш экран слишком тесный, вы можете расширить или сжать разделительную линию между консоли и окна редактирования/терминала, перетащив горизонтальную полосу между этими двумя областями, выделенными здесь:

8dea35450851af53.png

Вы можете переключаться между редактором и терминалом, нажимая кнопки Open Editor и Open Terminal соответственно. Попробуйте сейчас переключаться между этими двумя средами.

Затем создайте папку, в которой будет храниться ваша работа для этой лабораторной работы, выбрав «Файл» -> «Новая папка», введите hello » и нажмите OK . Все файлы, которые вы создаете в этой лабораторной работе, и вся работа, которую вы выполняете в Cloud Shell, будут выполняться в этой папке.

Теперь создайте файл requirements.txt . Это сообщает Python, от каких библиотек зависит ваше приложение. Для этого простого веб-приложения вы будете использовать популярный модуль Python для создания веб-серверов под названием Flask и инфраструктуру веб-сервера под названием gunicorn . В окне Cloud Editor щелкните меню Файл->Новый файл, чтобы создать новый файл. Когда будет предложено ввести имя нового файла, введите requirements.txt и нажмите кнопку OK . Убедитесь, что новый файл находится в папке проекта hello .

Введите следующие строки в новый файл, чтобы указать, что ваше приложение зависит от пакета Python Flask и веб-сервера Gunicorn .

Flask
gunicorn

Вам не нужно явно сохранять этот файл, поскольку Cloud Editor автоматически сохранит изменения.

Версия 1: Привет, мир!

Используя ту же технику, создайте еще один новый файл с именем main.py Это будет основной (и единственный) исходный файл Python вашего приложения. Еще раз убедитесь, что новый файл находится в папке проекта hello .

Вставьте в этот файл следующий код:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Вернитесь в терминал и перейдите в папку проекта с помощью этой команды:

cd hello

Запустите следующую команду, чтобы установить зависимости вашего проекта:

pip3 install -r requirements.txt

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

python3 main.py

На этом этапе ваше приложение работает на виртуальной машине, выделенной для сеанса облачной оболочки. Cloud Shell включает в себя механизм прокси, который позволяет вам получить доступ к веб-серверам (например, к тому, который вы только что запустили), работающим на вашей виртуальной машине, из любой точки глобального Интернета.

Нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 как показано ниже:

fe45e0192080efd6.png

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

b1f06501509aefb9.png

Версия 2: Повторение URL-пути

Вернитесь в Cloud Editor (с помощью кнопки Open Editor ) и добавьте поддержку отображения дополнительного суффикса URL-адреса, обновив файл main.py следующим образом:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Вернитесь к терминалу (с помощью кнопки Open Terminal ) и введите control-C (удерживайте клавишу управления, одновременно нажимая «C»), чтобы остановить работающее приложение, а затем перезапустите его, введя:

python3 main.py

Снова нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 чтобы открыть вкладку веб-браузера для вашего работающего приложения. Вы должны снова увидеть сообщение «Hello world!» сообщение, но теперь замените текст URL-адреса, следующий за косой чертой, на любую строку по вашему выбору (например /your-name ) и убедитесь, что вы видите что-то вроде этого:

93b87996f88fa370.png

Версия 3: случайные цвета

Теперь добавьте поддержку случайных цветов фона, вернувшись в Cloud Editor (с помощью кнопки Open Editor ») и обновив файл main.py следующим образом:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Вернитесь к терминалу (с помощью кнопки Open Terminal ) и введите control-C (удерживайте клавишу управления, одновременно нажимая «C»), чтобы остановить работающее приложение, а затем перезапустите его, введя:

python3 main.py

Снова нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 чтобы открыть вкладку веб-браузера для вашего работающего приложения. Вы должны увидеть сгенерированный текст с любым указанным суффиксом или значением по умолчанию «Hello world!» строка, отображаемая на фоне случайного цвета, например:

baf8d028f15ea7f4.png

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

На этом ваше приложение готово — поздравляем! На следующем шаге вы узнаете, как упаковать приложение в контейнер и почему это полезно.

4. Контейнеризируйте свое приложение

17cc234ec3325a8a.png

Что такое контейнер?

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

Говоря о зависимостях, на предыдущем шаге, когда вы запускали свое приложение в среде разработчика, вам нужно было запустить pip3 install -r requirements.txt и убедиться, что файл require.txt содержит все ваши зависимые библиотеки и соответствующие версии. В случае с контейнерами эти требования устанавливаются при создании образа контейнера, поэтому потребителю контейнера не нужно беспокоиться об установке чего-либо .

Этот образ контейнера станет основным строительным блоком для развертывания вашего приложения в Cloud Run. Поскольку контейнеры можно использовать практически на любом виртуальном или реальном сервере, это дает нам возможность развернуть ваше приложение где угодно и переместить его от одного поставщика услуг к другому или из локальной среды в облако.

Контейнеры помогают сделать ваши приложения:

  • воспроизводимость - контейнеры автономны и комплектны
  • переносимость — контейнеры представляют собой межотраслевые строительные блоки, которые обеспечивают переносимость приложений между облачными поставщиками и средами.

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

Хватит разговоров — давайте сделаем контейнер! Вы собираетесь использовать определенную технологию для создания контейнера под названием Docker .

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

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

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

gcloud builds submit --tag $TAG

После отправки в реестр вы увидите сообщение SUCCESS , содержащее имя образа, которое должно выглядеть примерно так: gcr.io/<project-id>/hello . Теперь изображение хранится в реестре контейнеров Google, и его можно повторно использовать в любое время и в любом месте.

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

gcloud container images list

Теперь запустите и протестируйте приложение локально из Cloud Shell, используя следующие команды docker :

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

Параметр -p $PORT:$PORT указывает Docker сопоставить внешний порт $PORT (вышеуказанный как 8080) в среде хоста с тем же номером порта внутри работающего контейнера. Это облегчает жизнь, поскольку код сервера, который вы пишете, и номер внешнего порта, к которому вы подключаетесь при тестировании приложения, будут одинаковыми (8080), но вы можете так же легко использовать опцию -p для сопоставления любого произвольного внешнего порта на хост к любому желаемому внутреннему порту внутри контейнера.

Параметр -e PORT=$PORT сообщает Docker сделать переменную среды $PORT (установленную на 8080 выше) доступной для вашего приложения, работающего внутри контейнера.

Теперь вы готовы протестировать свое приложение, указав в веб-браузере код Python, выполняющийся внутри контейнера. В окне Cloud Shell щелкните значок «Предварительный просмотр в Интернете» и выберите «Предварительный просмотр на порту 8080», как вы это сделали на предыдущем шаге.

Результат должен выглядеть знакомо — вы должны увидеть сгенерированный текст на случайно окрашенном фоне, как это было при запуске приложения непосредственно в терминале Cloud Shell. Перезагрузите страницу несколько раз, чтобы увидеть, что случайный цвет фона меняется каждый раз, когда вы посещаете приложение.

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

5. В облако...

1b0665d94750ded6.gif

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

  • работает надежно — вы получаете автоматическую отказоустойчивость в случае сбоя компьютера, на котором работает ваше приложение.
  • автоматически масштабируется — ваше приложение будет справляться с огромными объемами трафика и автоматически уменьшать занимаемое пространство, когда оно не используется.
  • минимизирует ваши расходы, не взимая с вас плату за ресурсы, которые вы не используете - вы платите только за ресурсы, израсходованные при реагировании на трафик
  • доступен через собственное доменное имя — у вас есть доступ к решению, позволяющему одним щелчком мыши назначить собственное доменное имя для вашего сервиса.
  • обеспечивает превосходное время отклика — холодный запуск достаточно отзывчив, но вы можете настроить это, указав минимальную конфигурацию экземпляра.
  • поддерживает сквозное шифрование с использованием стандартной веб-безопасности SSL/TLS — при развертывании службы вы получаете стандартное веб-шифрование и соответствующие необходимые сертификаты бесплатно и автоматически.

Развернув свое приложение в Google Cloud Run, вы получите все вышеперечисленное и даже больше.

Разверните свое приложение в Cloud Run

Во-первых, давайте изменим ваше приложение, чтобы вы могли отличить новую версию от старой. Сделайте это, изменив файл main.py так, чтобы сообщение по умолчанию изменилось с «Hello world!» на «Привет из Cloud Run!». Другими словами, измените эту строку в main.py на следующую:

def say_hello(name="world"):

на это:

def say_hello(name="from Cloud Run"):

Cloud Run является региональным. Это означает, что инфраструктура, на которой работают ваши сервисы Cloud Run, расположена в определенном регионе и управляется Google, чтобы быть резервно доступной во всех зонах в этом регионе. В разделе «Настройка» выше вы определили регион по умолчанию с помощью переменной среды REGION .

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

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • Вы также можете определить регион по умолчанию с помощью gcloud config set run/region $REGION .
  • Опция --allow-unauthenticated делает службу общедоступной. Чтобы избежать неаутентифицированных запросов, используйте вместо этого --no-allow-unauthenticated .

Указанное здесь изображение — это образ Docker, который вы создали на последнем шаге. Благодаря сервису Cloud Build, который сохранил полученный образ в реестре контейнеров Google, сервис Cloud Run сможет найти его и развернуть за вас.

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

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

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

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

Это должно отобразить что-то вроде:

https://hello-....a.run.app

Эта ссылка представляет собой выделенный URL-адрес с защитой TLS для вашего сервиса Cloud Run. Эта ссылка является постоянной (до тех пор, пока вы не отключите свою службу) и ее можно использовать в любом месте в Интернете. Он не использует упомянутый ранее механизм прокси-сервера Cloud Shell, который зависел от временной виртуальной машины.

Нажмите на выделенный Service URL , чтобы открыть вкладку веб-браузера для вашего работающего приложения. В результате должно появиться сообщение «Привет из Cloud Run!». сообщение на случайно окрашенном фоне.

Поздравляем! Ваше приложение теперь работает в облаке Google. Даже не задумываясь об этом, ваше приложение становится общедоступным, с шифрованием TLS (HTTPS) и автоматическим масштабированием до ошеломляющего уровня трафика.

Но я думаю, что этот процесс мог бы быть еще проще...

6. Автоматическое создание контейнера

Это все довольно круто, но что, если я не хочу даже думать о Dockerfiles и контейнерах. Что, если, как и большинство разработчиков, я просто хочу сосредоточиться на написании кода приложения и позволить кому-то другому позаботиться о его контейнеризации? Что ж, вам повезло, потому что Cloud Run поддерживает стандарт с открытым исходным кодом под названием Buildpacks , который существует именно по этой причине: для автоматизации процесса изготовления контейнера из коллекции исходных файлов.

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

Во-первых, давайте изменим ваше приложение, чтобы вы могли отличить новую версию от старой. Сделайте это, изменив файл main.py так, чтобы сообщение по умолчанию изменилось с «Привет из Cloud Run!» на «Привет от Cloud Run с пакетами сборки!». Другими словами, измените эту строку в main.py на следующую:

def say_hello(name="from Cloud Run"):

на это:

def say_hello(name="from Cloud Run with Buildpacks"):

Теперь давайте воспользуемся преимуществами сборочных пакетов, создав новый файл с именем Procfile . Создайте этот файл в Cloud Editor и вставьте одну строку текста:

web: python3 main.py

Это сообщает системе сборки, как запускать ваше приложение в автоматически созданном контейнере. Благодаря этой инструкции вам даже не понадобится Dockerfile. Чтобы убедиться в этом, удалите Dockerfile и выполните следующую команду в терминале Cloud Shell:

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

Это похоже на команду, которую вы выполнили для развертывания приложения на последнем шаге, но на этот раз вы заменили параметр --image на --source . вариант. Это сообщает команде gcloud , что вы хотите, чтобы она использовала пакеты сборки для создания образа контейнера на основе исходных файлов, которые она находит в текущем каталоге ( dot в --source . является сокращением текущего каталога). Поскольку служба неявно заботится об образе контейнера, вам не нужно указывать изображение в этой команде gcloud .

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

Обратите внимание: используя пакеты сборки для создания Dockerfile , вы существенно сократили три простых шага до двух:

  1. Создайте приложение в своей среде разработки.
  2. Разверните тот же код в облаке с помощью одной команды.

7. Нужно ли мне использовать командную строку?

Нет! Как и почти с любым сервисом Google Cloud, с Cloud Run можно взаимодействовать тремя способами:

  • Инструмент командной строки gcloud, который вы только что видели.
  • Богатый веб-интерфейс пользователя через облачную консоль, который поддерживает интуитивно понятный стиль взаимодействия «укажи и щелкни».
  • Программно с использованием клиентских библиотек Google, доступных для многих популярных языков, включая Java, C#, Python, Go, Javascript, Ruby, C/C++ и другие.

Давайте развернем дополнительный экземпляр вашего приложения Cloud Run с помощью пользовательского интерфейса консоли. Перейдите на целевую страницу Cloud Run Service через меню в верхнем левом углу:

e2b4983b38c81796.png

Затем вы должны увидеть сводную информацию о своих службах Cloud Run, например:

b335e7bf0a3af845.png

Нажмите ссылку «Создать сервис», чтобы начать процесс развертывания:

51f61a8ddc7a4c0b.png

Введите «hello-again» в качестве имени службы, выберите платформу и регион развертывания по умолчанию и нажмите «Далее».

8a17baa45336c4c9.png

Введите этот URL-адрес для образа контейнера: gcr.io/cloudrun/hello , который представляет собой контейнер, созданный Google для целей тестирования, и щелкните раскрывающийся список «Дополнительные настройки», чтобы просмотреть некоторые из множества доступных вам настроек конфигурации. Вот лишь некоторые из них, которые вы можете настроить:

  • номер порта и точка входа в контейнер (которая переопределяет точку входа, указанную при создании контейнера)
  • аппаратное обеспечение: память и количество процессоров
  • масштабирование: минимальное и максимальное количество экземпляров
  • переменные среды
  • другие: настройка таймаута запроса, максимальное количество запросов на контейнер, HTTP/2.

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

e78281d1cff3418.png

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

Теперь нажмите кнопку Create , чтобы создать службу Cloud Run. Через несколько секунд вы увидите, что ваша новая служба появится в сводном списке служб Cloud Run. В строке сводки представлены данные о самом последнем развертывании (дата/время и автор) и некоторые ключевые параметры конфигурации. Нажмите на ссылку с названием службы, чтобы получить подробную информацию о вашей новой услуге.

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

6c35cf0636dddc51.png

Вы должны увидеть что-то вроде этого:

3ba6ab4fe0da1f84.png

Теперь, когда вы развернули новую службу Cloud Run, выберите вкладку REVISIONS , чтобы увидеть некоторые способы управления несколькими развертываниями.

2351ee7ec4a356f0.png

Чтобы развернуть новые версии непосредственно из консоли, вы можете нажать кнопку EDIT & DEPLOY NEW REVISION , как показано на примере снимка экрана ниже:

а599fa88d00d6776.png

Нажмите эту кнопку сейчас, чтобы создать новую ревизию. Рядом с URL-адресом контейнера нажмите кнопку SELECT , как показано ниже:

5fd1b1f8e1f11d40.png

В появившемся диалоговом окне найдите простое веб-приложение, которое вы ранее развернули из Cloud Build с помощью Buildpacks, а затем нажмите «Выбрать». Убедитесь, что вы выбрали образ контейнера под

gcr.io/<project>/cloud-run-source-deploy

папка , вот так:

8a756c6157face3a.png

После выбора прокрутите вниз и нажмите кнопку DEPLOY . Вы развернули новую версию своего приложения. Чтобы проверить, еще раз посетите URL-адрес своей службы и убедитесь, что теперь вы видите красочное сообщение «Привет из облака, работайте со сборочными пакетами!» веб-приложение.

Как видите, на вкладке «Редакции» представлена ​​сводная информация о каждой развернутой вами ревизии, и теперь вы должны увидеть две ревизии для этой службы. Вы можете выбрать данную редакцию, щелкнув переключатель слева от имени ревизии, при этом в правой части экрана отобразится сводная информация о ревизии. Нажав эти кнопки, вы увидите, что две ваши ревизии получены из двух разных образов контейнеров.

Кнопка MANAGE TRAFFIC позволяет изменить распределение входящих запросов, отправленных на данную ревизию. Эта возможность точно настроить объем трафика, отправляемого на данную ревизию, позволяет использовать несколько ценных вариантов:

  • canary тестирует новую версию вашего приложения с небольшой долей входящего трафика
  • вернуть трафик из проблемного выпуска в предыдущую версию
  • А/Б тестирование

Найдите кнопку MANAGE TRAFFIC здесь:

519d3c22ae028287.png

Настройте разделение трафика 50/50 между двумя вашими ревизиями, указав разделение трафика 50/50 следующим образом:

8c37d4f115d9ded4.png

Теперь нажмите кнопку «СОХРАНИТЬ» и проверьте соотношение 50/50, неоднократно посещая URL-адрес вашего сервиса, и убедитесь, что в среднем половина ваших запросов обслуживается текущей версией («Привет из Cloud Run с пакетами сборки!»), а половина — обслуживается. предыдущей ревизией («Он работает!»).

Другие вкладки на странице «Сведения о сервисе» позволяют отслеживать производительность, трафик и журналы, что дает ценную информацию о том, насколько усердно и хорошо работает ваш сервис. У вас также есть возможность точно настроить доступ к вашему сервису через вкладку «Разрешения». Уделите несколько минут изучению вкладок на этой странице, чтобы получить представление о доступных здесь возможностях.

Программный интерфейс

Как отмечалось ранее, у вас также есть возможность создавать, развертывать и управлять службами Cloud Run программным способом. Для задач, выполняемых вручную, этот вариант более продвинут, чем командная строка или веб-консоль, но он определенно подходит для автоматизации служб Cloud Run. У вас есть возможность использовать клиентские библиотеки Google на нескольких популярных языках программирования.

8. Проверьте свое приложение

198ada162d1f0bf1.png

На этом последнем этапе вы запустите искусственный нагрузочный тест для стресс-тестирования вашего приложения и посмотрите, как оно масштабируется в зависимости от входящего спроса. Вы собираетесь использовать инструмент под названием hey , который предварительно установлен в Cloud Shell и дает нам возможность запускать нагрузочные тесты и представлять результаты.

Запустить тест

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

hey -q 1000 -c 200 -z 30s https://hello-...run.app

Аргументы команды интерпретируются следующим образом:

  • -q 1000 — попытаться увеличить нагрузку примерно на 1000 запросов в секунду.
  • -c 200 — выделить 200 параллельных воркеров
  • -z 30s — запустить нагрузочный тест на 30 секунд
  • обязательно используйте URL-адрес вашего сервиса в качестве последнего аргумента в этой командной строке.

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

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

Это резюме сообщает нам несколько интересных моментов:

  • Было отправлено 32 918 запросов со скоростью примерно 1 КБ в секунду в течение 30 секунд.
  • Ошибок не было (всего 200 HTTP-ответов).
  • Средняя задержка составила 180 мс.
  • Минимальная задержка составила 107 мс, в худшем случае — 3,3 с.
  • Задержка 90-го процентиля составила 244 мс.

Если вы проверите вкладку METRICS в консоли Cloud Run, вы увидите историю производительности со стороны сервера:

e635c6831c468dd3.png

9. Уборка

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

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

gcloud container images delete $TAG

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

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

10. Вы сделали это!

9a31f4fdbbf1ddcb.png

Поздравляем! Вы успешно создали и развернули рабочее приложение Cloud Run. Попутно вы узнали о контейнерах и о том, как создать собственный контейнер. И вы увидели, как легко развернуть ваше приложение с помощью Cloud Run, используя как инструмент командной строки gcloud так и Cloud Console. Теперь вы знаете, как поделиться своими гениальными творениями со всем миром!

Хочу задать вам один важный вопрос:

После того как ваше приложение заработало в среде разработки, сколько строк кода вам пришлось изменить, чтобы развернуть его в облаке со всеми атрибутами производственного уровня, предлагаемыми Cloud Run?

Ответ, конечно, ноль. :)

Codelabs, чтобы проверить...

Другие интересные функции, которые стоит изучить...

Справочные документы...

11. Призыв к действию

Логотип облака Google

Если вам понравилась эта лаборатория кода и вы, вероятно, будете уделять больше времени практическому использованию Google Cloud, тогда вам действительно стоит присоединиться к Google Cloud Innovators уже сегодня!

Логотип генерального члена «Новаторов»

Google Cloud Innovators бесплатна и включает в себя:

  • Живые дискуссии , конференции AMA и сеансы планов действий, позволяющие узнавать последние новости непосредственно от сотрудников Google.
  • последние новости Google Cloud прямо в вашем почтовом ящике
  • Цифровой бейдж и фон видеоконференции
  • 500 кредитов лабораторных исследований и обучения в программе Skills Boost

Нажмите здесь , чтобы зарегистрироваться!