OpenFaaS и Knative: serverless на своих серверах

Serverless без облака: зачем и когда

Компания «ДатаПайп» — обработка данных, 200+ событийных функций. Текущий стек: AWS Lambda (150 функций) + собственный Kubernetes (50 функций на обычных pods). Проблемы:

  • Стоимость Lambda: $8,000/мес за event-driven обработку, растёт линейно
  • Cold starts: Lambda на Java — 3-5 секунд первый запуск
  • Vendor lock-in: функции используют AWS-specific SDK, миграция — переписывание
  • Kubernetes-функции: нет auto-scale-to-zero, pods работают 24/7 даже без нагрузки

On-premise serverless: функции масштабируются от 0 до N pod-ов автоматически. Нет нагрузки = 0 pod-ов = 0 ресурсов. Есть нагрузка = автоматический запуск.

КритерийOpenFaaSKnative
Сложность установки5 минут30-60 минут
Scale to zeroДа (с idler)Да (нативно)
Event sourcesConnector patterns80+ Eventing sources
CLIfaas-cli (отличный DX)kn CLI
Язык функцийЛюбой (Docker)Любой (Knative Serving)
Overhead на кластер~200 MB RAM~1.5 GB RAM

OpenFaaS: простой serverless за 5 минут

# Установка OpenFaaS через arkade
curl -sLS https://get.arkade.dev | sh
arkade install openfaas

# Или через Helm
helm repo add openfaas https://openfaas.github.io/faas-netes/
helm install openfaas openfaas/openfaas \
  --namespace openfaas --create-namespace \
  --set functionNamespace=openfaas-fn \
  --set generateBasicAuth=true

# Получение пароля
PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 -d)

# Логин
faas-cli login --username admin --password $PASSWORD --gateway http://gateway.openfaas:8080

Создание и деплой функции:

# Создание функции на Python
faas-cli new process-order --lang python3-http
# Создаст:
# process-order/handler.py — код функции
# process-order.yml — конфигурация

# handler.py
def handle(event, context):
    order = event.body
    # Обработка заказа...
    result = {"status": "processed", "order_id": order.get("id")}
    return {"statusCode": 200, "body": result}

# Сборка и деплой
faas-cli build -f process-order.yml
faas-cli push -f process-order.yml
faas-cli deploy -f process-order.yml

# Вызов
curl -X POST http://gateway:8080/function/process-order \
  -H "Content-Type: application/json" \
  -d '{"id": 12345, "items": [{"sku": "A1", "qty": 2}]}'

Knative: enterprise-grade serverless

# Установка Knative Serving
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.14.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.14.0/serving-core.yaml

# Networking (Kourier — лёгкий вариант)
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.14.0/kourier.yaml
kubectl patch configmap/config-network -n knative-serving \
  --type merge -p '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

# Knative Eventing (для event-driven)
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.14.0/eventing-core.yaml

Деплой функции через Knative Service:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: order-processor
  namespace: production
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: "0"    # Scale to zero
        autoscaling.knative.dev/max-scale: "50"   # Max 50 pods
        autoscaling.knative.dev/target: "100"     # 100 concurrent requests per pod
    spec:
      containers:
      - image: registry.datapipe.ru/order-processor:v1.2
        resources:
          requests:
            memory: 128Mi
            cpu: 100m
          limits:
            memory: 512Mi
            cpu: 500m
        env:
        - name: DB_HOST
          value: postgres.production.svc
# Knative автоматически:
# 1. Масштабирует от 0 до 50 pod-ов по нагрузке
# 2. Создаёт route и traffic splitting для canary
# 3. Убивает pod-ы через 30 сек без трафика

Event-driven: Kafka → функции

Knative Eventing подключает функции к источникам событий: Kafka, RabbitMQ, Cron, GitHub webhooks.

# KafkaSource → функция order-processor
apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
  name: orders-source
spec:
  consumerGroup: order-processors
  bootstrapServers:
  - kafka.production.svc:9092
  topics:
  - new-orders
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: order-processor

Результат: при появлении сообщения в Kafka topic «new-orders» Knative автоматически запускает pod order-processor (если был в zero), передаёт событие, обрабатывает, масштабирует по нагрузке.

Результаты «ДатаПайп»

МетрикаAWS LambdaOpenFaaS/Knative
Стоимость/мес$8,000$0 (свои серверы)
Cold start (Python)200-500 мс50-100 мс
Cold start (Java)3-5 сек1-2 сек
Vendor lock-inAWS SDKСтандартные HTTP
Max execution time15 минБез ограничений
DebuggingCloudWatchkubectl logs, локальный запуск
Рекомендация: OpenFaaS — для маленьких команд, быстрого старта, простого DX. Knative — для enterprise, сложных event-driven систем, Kafka/RabbitMQ интеграции. Можно комбинировать: OpenFaaS для HTTP-функций, Knative Eventing для event sources.

Часто задаваемые вопросы

Cold start: Python/Go/Node — 50-200 мс, Java — 1-3 сек. Для HTTP API это заметно. Решение: min-scale=1 для критичных функций (всегда 1 pod), scale-to-zero для batch/event-driven. GraalVM native image сокращает Java cold start до 100-200 мс.

OpenFaaS значительно проще: установка за 5 минут, faas-cli для сборки/деплоя, минимальный overhead (200 МБ). Knative сложнее: множество CRD, зависимость от networking layer, 1.5 ГБ overhead. Для старта — OpenFaaS, для масштаба — Knative.

OpenFaaS работает без Kubernetes — через faasd (standalone, использует containerd). Идеально для одного сервера. Knative требует Kubernetes. Для bare-metal без K8s: faasd или Fn Project.

OpenFaaS: встроенные Prometheus-метрики (invocations, duration, errors). Knative: метрики через Knative Observability + Grafana dashboards. Оба поддерживают OpenTelemetry для distributed tracing.

Функции работают как pods в Kubernetes — применяются все стандартные механизмы: NetworkPolicy, PodSecurityStandards, RBAC. OpenFaaS поддерживает аутентификацию через API key. Knative — через Istio/Kourier policies. Плюс: данные не покидают вашу инфраструктуру.

Нужна помощь с внедрением?

Настроим, оптимизируем и возьмём на поддержку вашу инфраструктуру. 15+ лет опыта, 8 серверов Dell Xeon в дата-центре МТС.

📞 Связаться с нами

Комментарии 0

Оставить комментарий

9 + 6 =