Модуль 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 сам вирішує, скільки їх потрібно зараз.
Деплой вашого першого сервісу
Розділ «Деплой вашого першого сервісу»Ви можете деплоїти готовий образ або прямо з вихідного коду.
# Деплой з образу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 дозволяє робити “розумні” деплої без ризику.
- Blue/Green: Ви деплоїте нову версію, тестуєте її за окремим посиланням, а потім миттєво перемикаєте 100% трафіку.
- Canary: Ви направляєте лише 5% трафіку на нову версію, перевіряєте логи, а потім поступово збільшуєте частку.
# Направити 90% на стару версію і 10% на новуgcloud run services update-traffic my-api \ --to-revisions=REV_OLD=90,REV_NEW=10CPU: Throttled vs Always-On
Розділ «CPU: Throttled vs Always-On»- 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 деплой»- Деплой v1: Запустіть сервіс із тегом
v1. - Деплой v2: Запустіть нову версію з прапорцем
--no-traffic. Переконайтеся, що вона працює за прямим посиланням ревізії. - Split: Налаштуйте розділення трафіку 50/50 між версіями.
- Rollback: Миттєво поверніть 100% на v1, якщо помітили “помилку”.
Наступний модуль
Розділ «Наступний модуль»Переходьте до Модуля 2.8: Cloud Functions та Event-Driven Architecture — ви навчитеся створювати легкі функції, що реагують на завантаження файлів, повідомлення в чергах та інші події у вашій хмарі.