Перейти до вмісту

Модуль 2.7: GCP Cloud Run (Безсерверні контейнери)

Складність: [COMPLEX] | Час на виконання: 2.5 год | Передумови: Модуль 2.1 (IAM), Модуль 2.6 (Artifact Registry)

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

На початку 2023 року стартап у сфері медичних технологій запускав свій API на кластері Kubernetes, яким керувала команда з двох людей. Кластер потребував постійної уваги: оновлення вузлів, налаштування автомасшабування, продовження сертифікатів. Коли один із інженерів звільнився, інший не впорався з навантаженням. Під час оновлення GKE на вихідних щось пішло не так, і портал пацієнтів “лежав” 6 годин. Аналіз показав, що команда витрачала 70% часу на інфраструктуру замість розробки фіч. Вони перейшли на Cloud Run за три тижні. Час на управління інфраструктурою впав майже до нуля, а рахунок за хмару зменшився на 40%, бо Cloud Run просто вимикався вночі, коли не було пацієнтів.

Cloud Run — це, мабуть, найкращий сервіс у Google Cloud. Його ідея проста: запускайте контейнери, не думаючи про сервери, кластери чи мережі. Ви даєте йому образ контейнера, а він робить усе інше: масштабування, TLS-сертифікати, балансування навантаження. Він масштабується до нуля, коли трафіку немає (ви не платите нічого), і виростає до тисяч екземплярів за секунди при сплесках.

У цьому модулі ви навчитеся деплоїти сервіси, розберетеся з конкурентністю (concurrency), навчитеся ділити трафік між версіями для безпечних релізів та підключати Cloud Run до вашої приватної мережі VPC.


Концепції Knative: Фундамент

Розділ «Концепції Knative: Фундамент»

Cloud Run побудований на базі Knative — відкритого стандарту для безсерверних систем у Kubernetes.

  • Service (Сервіс): Головний ресурс. Має постійну URL-адресу.
  • Revision (Ревізія): Незмінний “знімок” вашого коду та налаштувань. Кожен деплой створює нову ревізію.
  • Instance (Екземпляр): Запущений контейнер. Cloud Run сам вирішує, скільки їх потрібно зараз.

Деплой вашого першого сервісу

Розділ «Деплой вашого першого сервісу»

Ви можете деплоїти готовий образ або прямо з вихідного коду.

Terminal window
# Деплой з образу
gcloud run deploy my-api \
--image=us-central1-docker.pkg.dev/my-project/my-repo/api:v1 \
--region=us-central1 \
--allow-unauthenticated

Після завершення ви отримаєте посилання на кшталт https://my-api-abc123-uc.a.run.app.


Конкурентність (Concurrency): Ключ до економії

Розділ «Конкурентність (Concurrency): Ключ до економії»

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

  • Lambda (AWS): 1 запит = 1 функція. Це дорого і створює багато “холодних стартів”.
  • Cloud Run: За замовчуванням 80 запитів = 1 контейнер. Це дозволяє одному маленькому контейнеру обробляти сотні користувачів, що радикально зменшує ваш рахунок.

Ревізії та розділення трафіку

Розділ «Ревізії та розділення трафіку»

Cloud Run дозволяє робити “розумні” деплої без ризику.

  1. Blue/Green: Ви деплоїте нову версію, тестуєте її за окремим посиланням, а потім миттєво перемикаєте 100% трафіку.
  2. Canary: Ви направляєте лише 5% трафіку на нову версію, перевіряєте логи, а потім поступово збільшуєте частку.
Terminal window
# Направити 90% на стару версію і 10% на нову
gcloud run services update-traffic my-api \
--to-revisions=REV_OLD=90,REV_NEW=10

  • Throttled (дефолт): Ви платите тільки поки контейнер обробляє запит. Між запитами CPU “заморожується”.
  • Always-on: CPU доступний завжди. Потрібно для WebSockets або фонових задач. Ви платите за час роботи контейнера, незалежно від запитів.

ПомилкаЧому це стаєтьсяЯк виправити
Concurrency = 1Думка, що так “чистіше”Це в десятки разів дорожче. Використовуйте значення 80+, якщо додаток не дуже важкий
Використання default SA”Так простіше”Створіть окремий сервісний акаунт із мінімальними правами для кожного сервісу
Відсутність лімітів (Max instances)“Хай масштабується”Завжди ставте розумну стелю (напр. 10-50), щоб баг у коді або DDoS не з’їли бюджет
Холодні стартиScale-to-zero за замовчуваннямВстановіть --min-instances=1 для критичних API, щоб перший юзер не чекав 2 секунди

1. Чим відрізняється Cloud Run від AWS Lambda?

Cloud Run запускає будь-який Docker-образ і дозволяє одному контейнеру обробляти багато запитів одночасно (concurrency). Lambda запускає тільки код конкретною мовою і обробляє рівно 1 запит за раз. Cloud Run зазвичай дешевший і гнучкіший для веб-додатків.

2. Як підключити Cloud Run до бази даних, що знаходиться в приватній мережі VPC?

Потрібно налаштувати VPC Egress (Direct VPC Egress або VPC Access Connector). Це створить “міст” між безсерверним середовищем Google та вашою приватною мережею.


Практична вправа: Canary деплой

Розділ «Практична вправа: Canary деплой»
  1. Деплой v1: Запустіть сервіс із тегом v1.
  2. Деплой v2: Запустіть нову версію з прапорцем --no-traffic. Переконайтеся, що вона працює за прямим посиланням ревізії.
  3. Split: Налаштуйте розділення трафіку 50/50 між версіями.
  4. Rollback: Миттєво поверніть 100% на v1, якщо помітили “помилку”.

Переходьте до Модуля 2.8: Cloud Functions та Event-Driven Architecture — ви навчитеся створювати легкі функції, що реагують на завантаження файлів, повідомлення в чергах та інші події у вашій хмарі.