Модуль 9.3: Взаємодія з Serverless (Lambda / Cloud Functions / Knative)
Складність: [COMPLEX] | Час на виконання: 2 год | Передумови: Модуль 9.2 (Брокери повідомлень), основи Kubernetes Services
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»У 2023 році медичний стартап запускав усю свою платформу на EKS — 42 мікросервіси, 180 подів. Їхній місячний рахунок за Kubernetes складав $18 000. Під час аналізу витрат інженер помітив, що 11 із цих сервісів обробляють менше 100 запитів на день. Один сервіс — генератор PDF-звітів — викликався рівно 23 рази на добу, але потребував 2 поди (для надійності), що працювали 24/7. Інший сервіс перевіряв страховки о 3 годині ночі, а решту 23 години просто стояв пустим.
Вони перенесли ці 11 сервісів на AWS Lambda. Місячна вартість цих компонентів впала з $4 200 до $38. Це не одрук — тридцять вісім доларів. Решта 31 сервіс залишилися на EKS, де стабільний трафік виправдовував постійну роботу серверів. Урок був не в тому, що “serverless кращий” чи “Kubernetes кращий”. А в тому, що найкраща архітектура поєднує обидва підходи.
Цей модуль навчить вас будувати міст між світом Kubernetes та Serverless. Ви дізнаєтеся, коли виносити логіку в Lambda/Cloud Functions, як запускати функції у відповідь на події в кластері, та як Knative приносить безсерверні можливості прямо всередину вашого Kubernetes.
Коли Serverless, а коли Kubernetes?
Розділ «Коли Serverless, а коли Kubernetes?»Це не релігійна війна, а економічне рішення.
| Фактор | Обирайте Serverless | Обирайте Kubernetes |
|---|---|---|
| Тип трафіку | Різкі сплески, довгі паузи | Стабільне, передбачуване навантаження |
| Обсяг запитів | < 1 млн на місяць | > 10 млн на місяць |
| Час роботи | < 15 хвилин | Довгі процеси, WebSockets |
| Стан (State) | Stateless (без стану) | Stateful, складні бази даних |
| Холодний старт | Допустима затримка (0.5с) | Недопустима (миттєвий респонс) |
| Вартість у масштабі | Дорого за кожен виклик | Дешевше на Spot/Reserved інстансах |
Патерни інтеграції
Розділ «Патерни інтеграції»1. Виклик функцій через черги
Розділ «1. Виклик функцій через черги»Це найбезпечніший спосіб. Ваш под у Kubernetes кладе повідомлення в SQS (AWS) або Pub/Sub (GCP), а хмара автоматично запускає функцію для його обробки. Kubernetes не чекає на відповідь, система працює асинхронно.
2. Гібридний API Gateway
Розділ «2. Гібридний API Gateway»Ви ставите Cloud API Gateway перед усім проектом. Запити /api/* він направляє на ваш балансувальник у Kubernetes, а запити /reports/* — прямо на Lambda-функції. Для користувача це один сайт, для вас — дві різні системи.
3. Kubernetes Job запускає функції
Розділ «3. Kubernetes Job запускає функції»Іноді вам треба обробити 10 000 картинок за раз. Замість того, щоб забивати свій кластер подами, ви запускаєте один Job, який “нацьковує” 10 000 паралельних Lambda-функцій на ці файли. Хмара обробить їх за секунди, а ваш кластер залишиться вільним.
Knative: Serverless всередині Kubernetes
Розділ «Knative: Serverless всередині Kubernetes»Якщо ви хочете можливості Lambda (масштабування до нуля, ревізії), але хочете тримати все у своєму кластері — використовуйте Knative.
Що дає Knative:
- Scale-to-zero: Поди видаляються, коли немає запитів. Коли приходить новий юзер — под запускається автоматично.
- Traffic Splitting: Ви можете направити 90% юзерів на стару версію і 10% на нову прямо в маніфесті Kubernetes.
- Eventing: Стандартний спосіб передачі подій між сервісами (CloudEvents).
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це стається | Як виправити |
|---|---|---|
| Перенос всього на Lambda | Думка, що це “простіше” | При великому трафіку Lambda стане в рази дорожчою за кластер |
| Ігнорування холодних стартів | Тестували тільки на “розігрітих” функціях | Використовуйте Provisioned Concurrency (AWS) або --min-instances (GCP) для критичних шляхів |
| Безкінечні рекурсії | Lambda пише в S3, що знову запускає ту саму Lambda | Завжди використовуйте різні бакети або префікси для вхідних та вихідних даних |
| Довгі таймаути в Knative | ”Хай працює, скільки треба” | Безсерверні компоненти мають бути швидкими. Якщо процес триває > 5 хв, використовуйте стандартні K8s Jobs |
Тест
Розділ «Тест»1. Що таке "Scale-to-Zero" і чому це важливо?
Це здатність системи повністю видаляти всі працюючі копії додатка, коли немає трафіку. Це важливо, бо ви перестаєте платити за обчислювальні ресурси (CPU/RAM) у періоди простою.
2. У чому головна архітектурна різниця між AWS Lambda та EKS Fargate?
Lambda — це запуск коду (функції), де ви не бачите навіть контейнера. Fargate — це запуск стандартних подів Kubernetes, де AWS просто керує серверами за вас. Lambda — це рівень коду, Fargate — це рівень контейнерів.
Практична вправа: Knative Service
Розділ «Практична вправа: Knative Service»- Встановіть Knative Serving у ваш кластер.
- Розгорніть сервіс (ksvc), який повертає “Hello World”.
- Налаштуйте
min-scale: 0таmax-scale: 5. - Зачекайте 2 хвилини і перевірте
kubectl get pods— їх має бути нуль. - Зробіть запит через
curlі подивіться, як под миттєво з’явиться знову.
Наступний модуль
Розділ «Наступний модуль»Переходьте до Модуля 9.4: Патерни об’єктних сховищ — ви навчитеся підключати S3, GCS та Azure Blob прямо до ваших подів як диски та використовувати підписані посилання для безпечної видачі файлів.