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

Модуль 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 не чекає на відповідь, система працює асинхронно.

Ви ставите 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»
  1. Встановіть Knative Serving у ваш кластер.
  2. Розгорніть сервіс (ksvc), який повертає “Hello World”.
  3. Налаштуйте min-scale: 0 та max-scale: 5.
  4. Зачекайте 2 хвилини і перевірте kubectl get pods — їх має бути нуль.
  5. Зробіть запит через curl і подивіться, як под миттєво з’явиться знову.

Переходьте до Модуля 9.4: Патерни об’єктних сховищ — ви навчитеся підключати S3, GCS та Azure Blob прямо до ваших подів як диски та використовувати підписані посилання для безпечної видачі файлів.