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

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

В двух словах, Cloud Run — это то, что позволяет вам сосредоточиться на своем приложении, а все административные и технические задачи оставить кому-то другому, а именно Google, который вложил миллионы часов в совершенствование своих навыков в этой области.
Помимо упомянутых выше административных трудностей, вам также придется иметь дело со следующими вопросами:
- Зависимости — среда, в которой работает ваше приложение, должна, по возможности, точно соответствовать среде, в которой оно тестировалось. Это может включать в себя несколько аспектов, в том числе операционную систему, вспомогательные библиотеки, интерпретатор или компилятор языка, конфигурацию оборудования и многие другие факторы.
- Распространение — переход от локальной версии приложения к версии, широко распространяемой в интернете, часто требует изменения среды выполнения, резкого увеличения сложности и значительного освоения новых функций.
Cloud Run позаботится об этих и многих других проблемах за вас. Но вместо того, чтобы верить мне на слово, давайте вместе создадим приложение и посмотрим, как легко всего за несколько простых шагов перейти от локальной среды разработки к облачному приложению производственного уровня.
Что вы будете делать...
- Вам предстоит создать простое веб-приложение и убедиться, что оно работает должным образом в вашей среде разработки.
- Затем вы перейдете к контейнеризированной версии того же приложения. Попутно вы узнаете, что такое контейнеризация и почему она так полезна.
- Наконец, вы развернете свое приложение в облаке и увидите, как легко управлять службой Cloud Run с помощью командной строки и консоли Google Cloud.
Что вы узнаете...
- Как создать простое веб-приложение на Python
- Как упаковать ваше приложение в контейнер Docker, который будет работать где угодно.
- Как развернуть приложение в облаке, чтобы любой желающий мог попробовать ваше новое творение.
- Как еще больше упростить описанные выше шаги с помощью Buildpacks
- Как использовать инструмент командной строки Google Cloud и веб-интерфейс Cloud Console
Что вам понадобится...
- веб-браузер
- Аккаунт Google
Этот практический урок предназначен для разработчиков всех уровней, включая начинающих. Хотя вы будете использовать Python, вам не обязательно быть знакомым с программированием на Python, чтобы понять происходящее, потому что мы объясним весь используемый код.
2. Настройка

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



Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .
- Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
В этой лабораторной работе вы будете работать в сеансе Cloud Shell , который представляет собой интерпретатор команд, размещенный на виртуальной машине, работающей в облаке Google. Вы с таким же успехом могли бы выполнить этот раздел локально на своем компьютере, но использование Cloud Shell обеспечивает всем доступ к воспроизводимому опыту в согласованной среде. После завершения лабораторной работы вы можете повторить этот раздел на своем компьютере.

Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

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

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

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.
После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.
- Выполните следующую команду в 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`
- Выполните следующую команду в 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. Создайте простое веб-приложение

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

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

Вы можете переключаться между редактором и терминалом, нажимая кнопки « Open Editor и Open Terminal соответственно. Попробуйте переключиться между этими двумя средами прямо сейчас.
Далее создайте папку для хранения ваших работ по этой лабораторной работе, выбрав Файл -> Создать папку, введите hello и нажмите OK . Все файлы, которые вы создадите в этой лабораторной работе, и вся работа, которую вы будете выполнять в Cloud Shell, будут храниться в этой папке.
Теперь создайте файл requirements.txt . Он укажет Python, от каких библиотек зависит ваше приложение. Для этого простого веб-приложения вы будете использовать популярный модуль Python для создания веб-серверов под названием Flask и фреймворк веб-сервера gunicorn . В окне Cloud Editor щелкните меню File->New File, чтобы создать новый файл. Когда появится запрос на имя нового файла, введите requirements.txt и нажмите кнопку OK . Убедитесь, что новый файл находится в папке проекта hello .
В новый файл добавьте следующие строки, чтобы указать, что ваше приложение зависит от пакета Python Flask и веб-сервера gunicorn .
Flask gunicorn
Вам не нужно сохранять этот файл вручную, поскольку облачный редактор автоматически сохранит изменения.
Версия 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. Cloud Shell включает в себя механизм прокси, который позволяет вам получать доступ к веб-серверам (например, к тому, который вы только что запустили), работающим на вашей виртуальной машине, из любой точки глобального интернета.
Нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 следующим образом:

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

Версия 2: Отображение пути URL-адреса
Вернитесь в облачный редактор (с помощью кнопки 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 (удерживайте клавишу Ctrl, одновременно нажимая клавишу «C»), чтобы остановить запущенное приложение, а затем перезапустите его, введя:
python3 main.py
Снова нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 , чтобы открыть вкладку веб-браузера с запущенным приложением. Вы снова должны увидеть сообщение «Hello world!», но теперь замените текст URL-адреса после символа косой черты любой строкой по вашему выбору (например /your-name ) и убедитесь, что вы видите что-то подобное:

Версия 3: Случайные цвета
Теперь добавьте поддержку случайных цветов фона, вернувшись в Облачный редактор (через кнопку 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 (удерживайте клавишу Ctrl, одновременно нажимая клавишу «C»), чтобы остановить запущенное приложение, а затем перезапустите его, введя:
python3 main.py
Снова нажмите кнопку web preview , а затем пункт меню Preview on Port 8080 , чтобы открыть вкладку веб-браузера с запущенным приложением. Вы должны увидеть сгенерированный текст с любым указанным суффиксом или строкой по умолчанию «Hello world!», отображаемый на фоне случайного цвета, примерно так:

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

Что такое контейнер?
Контейнеры в целом, и Docker в частности, позволяют создавать модульную среду для запуска приложения со всеми его зависимостями, объединенными в один пакет. Полученный результат мы называем образом контейнера. В этом разделе вы создадите образ контейнера, который будете использовать для инкапсуляции вашего приложения и всех его зависимостей.
Говоря о зависимостях, на предыдущем шаге, когда вы запускали приложение в среде разработки, вам нужно было выполнить команду pip3 install -r requirements.txt и убедиться, что файл requirements.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 Terminal создайте образ контейнера с помощью 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. В облако...

Теперь, когда вы контейнеризировали свое приложение, вам захочется поделиться этой потрясающей штукой со всем миром, поэтому пришло время развернуть его в облаке. Но вам бы хотелось сделать больше, чем просто поделиться им. Вы бы хотели убедиться, что оно:
- Работает надежно — обеспечивается автоматическая отказоустойчивость в случае сбоя компьютера, на котором запущено ваше приложение.
- Автоматическое масштабирование — ваше приложение будет справляться с огромными объемами трафика и автоматически уменьшать свой объем занимаемой памяти, когда не используется.
- Это минимизирует ваши затраты, поскольку не взимает плату за ресурсы, которые вы не используете — с вас взимается плата только за ресурсы, потребленные во время обработки трафика.
- Доступ к сервису осуществляется через собственное доменное имя — у вас есть возможность назначить вашему сервису собственное доменное имя одним щелчком мыши.
- Обеспечивает отличное время отклика — холодные запуски достаточно быстрые, но это можно точно настроить, указав минимальную конфигурацию экземпляра.
- Поддерживает сквозное шифрование с использованием стандартной веб-безопасности SSL/TLS — при развертывании сервиса вы получаете стандартное веб-шифрование и соответствующие необходимые сертификаты бесплатно и автоматически.
Развернув свое приложение в Google Cloud Run, вы получаете все вышеперечисленное и многое другое.
Разверните ваше приложение в Cloud Run.
Для начала давайте изменим ваше приложение, чтобы вы могли отличить новую версию от старой. Для этого измените файл main.py так, чтобы сообщение по умолчанию изменилось с "Hello world!" на "Hello from 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. Автоматическое создание контейнера
Всё это довольно круто, но что, если я даже не хочу думать о Docker-файлах и контейнерах? Что, если, как и большинство разработчиков, я просто хочу сосредоточиться на написании кода своего приложения, а кто-то другой позаботится о его контейнеризации? Вам повезло, потому что Cloud Run поддерживает стандарт с открытым исходным кодом под названием Buildpacks , который существует именно для этого: для автоматизации процесса создания контейнера из набора исходных файлов.
Обратите внимание, что в некоторых случаях разработчик может предпочесть использовать явный Dockerfile, например, если ему нужна высокая степень кастомизации сборки контейнера. Но для распространенных случаев, подобных этому упражнению, buildpacks отлично подходят и избавляют от необходимости создавать Dockerfile вручную. Давайте изменим ваш код, чтобы использовать buildpacks.
Для начала давайте изменим ваше приложение, чтобы вы могли отличить новую версию от старой. Для этого измените файл main.py таким образом, чтобы сообщение по умолчанию изменилось с "Hello from Cloud Run!" на "Hello from Cloud Run with Buildpacks!". Другими словами, измените эту строку в main.py на следующую:
def say_hello(name="from Cloud Run"):
к этому:
def say_hello(name="from Cloud Run with Buildpacks"):
Теперь воспользуемся преимуществами 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 , что вы хотите использовать buildpacks для создания образа контейнера на основе исходных файлов, которые она найдет в текущем каталоге ( dot в --source . это сокращение для текущего каталога). Поскольку служба автоматически создает образ контейнера, вам не нужно указывать образ в этой команде gcloud .
Ещё раз убедитесь, что развертывание прошло успешно, щелкнув по выделенному Service URL , чтобы открыть вкладку веб-браузера с запущенным приложением, и убедитесь, что ваша служба отображает сообщение «Привет из Cloud Run с Buildpacks!» на фоне случайного цвета.
Обратите внимание, что, используя buildpacks для создания Dockerfile , вы, по сути, сократили три простых шага до двух:
- Создайте приложение в своей среде разработки.
- Разверните тот же самый код в облаке одной командой.
7. Обязательно ли использовать командную строку?
Нет! Как и практически для всех сервисов Google Cloud, с Cloud Run можно взаимодействовать тремя способами:
- Инструмент командной строки gcloud, который вы только что видели.
- Многофункциональный веб-интерфейс пользователя, доступный через облачную консоль, поддерживает интуитивно понятный стиль взаимодействия «наведи и щелкни».
- Программным способом можно использовать клиентские библиотеки Google, доступные для многих популярных языков, включая Java, C#, Python, Go, Javascript, Ruby, C/C++ и другие.
Давайте развернем дополнительный экземпляр вашего приложения Cloud Run, используя консольный интерфейс. Перейдите на главную страницу службы Cloud Run через меню в левом верхнем углу:

После этого вы увидите сводку по вашим службам Cloud Run, примерно такую:

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

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

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

Это наиболее либеральные настройки, поскольку они позволяют любому получить доступ к вашему приложению Cloud Run из любой точки общедоступного интернета без указания учетных данных для аутентификации. Возможно, вам потребуются более строгие настройки для вашего приложения, но давайте для простоты рассмотрим этот пример.
Теперь нажмите кнопку Create , чтобы создать службу Cloud Run. Через несколько секунд ваша новая служба должна появиться в сводном списке служб Cloud Run. В сводной строке отображается информация о последнем развертывании (дата/время и кто его выполнил), а также некоторые ключевые параметры конфигурации. Щелкните ссылку с именем службы, чтобы получить подробную информацию о вашей новой службе.
Для подтверждения услуги нажмите на URL-адрес, указанный в верхней части страницы сводки, как показано в примере ниже:

Вы должны увидеть что-то подобное:

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

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

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

В появившемся диалоговом окне найдите простое веб-приложение, которое вы развернули ранее из Cloud Build с помощью Buildpacks, и нажмите «Выбрать». Убедитесь, что вы выбрали образ контейнера в разделе
gcr.io/<project>/cloud-run-source-deploy
папка , вот так:

После выбора прокрутите вниз и нажмите кнопку DEPLOY . Теперь вы развернули новую версию своего приложения. Для проверки снова перейдите по URL-адресу вашей службы и убедитесь, что теперь вы видите свое красочное веб-приложение «Привет из Cloud Run с Buildpacks!».
Как видите, вкладка «Ревизии» содержит сводку по каждой развернутой вами ревизии, и теперь вы должны видеть две ревизии для этой службы. Вы можете выбрать нужную ревизию, щелкнув переключатель слева от названия ревизии, после чего в правой части экрана отобразится сводка сведений о ревизии. Выбрав эти кнопки, вы увидите, что ваши две ревизии созданы на основе двух разных образов контейнеров.
Кнопка « MANAGE TRAFFIC позволяет изменять распределение входящих запросов, отправляемых на определенную ревизию. Возможность точной настройки объема трафика, направляемого на конкретную ревизию, открывает ряд важных возможностей:
- Канареечное тестирование новой версии вашего приложения на небольшой части входящего трафика.
- откатить трафик с проблемного релиза к предыдущей версии
- A/B-тестирование
Кнопку MANAGE TRAFFIC можно найти здесь:

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

Теперь нажмите кнопку СОХРАНИТЬ и проверьте соотношение 50/50, многократно посещая URL-адрес вашего сервиса и убедившись, что в среднем половина ваших запросов обрабатывается текущей версией («Привет из Cloud Run с Buildpacks!»), а половина — предыдущей версией («Он работает!»).
На странице «Подробности о сервисе» есть вкладки, позволяющие отслеживать производительность, трафик и журналы, что дает ценную информацию о том, насколько эффективно и с какой нагрузкой работает ваш сервис. Также вы можете настроить доступ к своему сервису через вкладку «Разрешения». Уделите несколько минут изучению вкладок на этой странице, чтобы оценить доступные здесь возможности.
Программный интерфейс
Как отмечалось ранее, у вас также есть возможность создавать, развертывать и управлять сервисами Cloud Run программным способом. Для ручных задач этот вариант более продвинут, чем командная строка или веб-консоль, но это определенно лучший способ автоматизации сервисов Cloud Run. Вы можете использовать клиентские библиотеки Google на нескольких популярных языках программирования.
8. Протестируйте свое приложение
На заключительном этапе вы проведете искусственное нагрузочное тестирование, чтобы проверить работоспособность вашего приложения и посмотреть, как оно масштабируется в зависимости от входящего спроса. Вы будете использовать инструмент под названием 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, вы увидите данные о производительности сервера:

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. У тебя получилось!

Поздравляем! Вы успешно создали и развернули рабочее приложение Cloud Run. В процессе вы узнали о контейнерах и о том, как создавать собственные контейнеры. И вы увидели, как легко развернуть приложение с помощью Cloud Run, используя как инструмент командной строки gcloud , так и Cloud Console. Теперь вы знаете, как поделиться своими замечательными творениями со всем миром!
В заключение я хочу задать вам один важный вопрос:
После того, как ваше приложение заработало в среде разработки, сколько строк кода вам пришлось изменить, чтобы развернуть его в облаке со всеми функциями Cloud Run, предназначенными для производственной среды?
Ответ, конечно же, ноль. :)
Codelabs, которые стоит посмотреть...
- Создайте бота для Slack на Node.js в Cloud Run.
- Запуск Cloud Run с использованием событий из Eventarc
- Hello Cloud Run для Anthos Codelab
- Развертывание и запуск контейнера с помощью Cloud Run на Node.js
- Другие интерактивные онлайн-лаборатории Cloud Run Codelabs
Другие интересные функции, которые стоит изучить...
- Непрерывная развертка из Git с использованием Cloud Build.
- Использование секретов из Secret Manager
- Представляем двунаправленные потоки WebSockets, HTTP/2 и gRPC для Cloud Run.
- Cloud Run min instances: Минимизируйте холодные запуски бессерверных приложений
- Обслуживание трафика из нескольких регионов
Справочные документы...
11. Призыв к действию
Если вам понравился этот практический урок и вы планируете проводить больше времени за работой с Google Cloud, то вам обязательно стоит присоединиться к программе Google Cloud Innovators уже сегодня!

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