Skew Protection в Kubernetes: безопасные деплои уровня Vercel в вашем кластере

Защита от несоответствия версий в Kubernetes

Мы рады представить новую экспериментальную функцию Platformatic — Skew Protection в Intelligent Command Center (ICC). Она приносит в Kubernetes безопасность деплоя в стиле Vercel: разворачивайтесь без простоев и без проблем с расхождением версий.

Воспринимайте это как аналог Skew Protection в Vercel, но работающий прямо внутри вашего существующего Kubernetes: никаких миграций или изменений в CI/CD-пайплайне и политиках безопасности — готовое «из коробки» закрепление версий для ваших фронтенд-приложений.

Проблема: Version Skew в Kubernetes

Когда вы обновляете веб-приложение, пользователи, загрузившие старый фронтенд, могут отправлять запросы новому бэкенду. Это «version skew», и он ломает работу, если API, ассеты или схемы данных изменились.

Эта проблема ещё острее для современных фронтенд-приложений, где один и тот же код выполняется и на клиенте, и на сервере. Next.js, Remix и монорепозитории часто разделяют между фронтом и бэком TypeScript-типы, описания API или бизнес-логику. Возникают:

  • Hydration-ошибки и сломанный UI: React Server Components жёстко связывают клиент и сервер. Новая версия → новые RSC-payloads, которые старые клиентские бандлы не могут согласовать.

  • Нарушение API-контрактов: OpenAPI или protobuf меняются между версиями, ломая сериализацию.

  • Расхождение типов: общие TypeScript-интерфейсы или zod-схемы ломаются при расхождении версий.

  • Взаимозависимые фичи: фронтенд-компоненты, опирающиеся на бэкенд-функциональность, перестают работать при её изменении.

Для пользователя это API-ошибки, отсутствующие поля, потеря или порча данных. Для команд поддержки — координация между несколькими фиче-командами, чтобы распутать инцидент.

Version Skew — пример того, как распределённые системы без правильных ограждений тормозят скорость разработки: страх ломающих изменений приводит к более крупным и более редким деплоям с высоким риском.

Решение: ICC Skew Protection

Новая функция гарантирует, что пользователи остаются на версии, с которой начали сессию, даже когда деплоятся новые версии. Сессия N → запросы версии N.

Как это работает

Skew protection использует Kubernetes Gateway API для version-aware маршрутизации, а ICC выступает control plane’ом. Каждая версия приложения — отдельный неизменяемый Deployment, который пользователи создают сами стандартными k8s-workflow.

ICC автоматически обнаруживает новые версии через label-discovery и управляет HTTPRoute-ресурсами, которые маршрутизируют запросы по cookie __plt_dpl, закрепляющему пользователя за версией.

Когда деплоится новая версия, предыдущая переходит в режим draining: существующие сессии продолжают работать, новые сессии идут в активную версию. ICC мониторит трафик и автоматически чистит старые версии по grace-периоду.

Ключевые компоненты Platformatic

Platformatic Watt — Node.js application server, запускающий приложение как worker thread внутри Kubernetes. Hot-reload, healthchecks, метрики из коробки.

watt-extra — extension layer поверх Watt, мост между приложением и ICC. При старте регистрирует приложение с метаданными (pod ID, имя, версия), что позволяет ICC:

  • обнаруживать лейблы app.kubernetes.io/name, plt.dev/version;

  • автомасштабировать на реал-тайм Node.js-метриках;

  • реализовывать version-aware маршрутизацию;

  • мониторить здоровье.

Архитектура системы

Четыре слоя. Каждая версия — отдельный k8s Deployment. Gateway API маршрутизирует на ingress-уровне по правилам HTTPRoute, которыми управляет ICC.

Архитектура системы

Client Layer

  • __plt_dpl=dep-v42 — пользователь, начавший сессию на версии 42; cookie закрепляет за этой версией.

  • __plt_dpl=dep-v43 — пользователь на версии 43; маршрутизируется на активную.

  • New visitor без cookie — первый запрос идёт на активную версию, выдаётся cookie.

Gateway API Layer

  • GatewayClass — шаблон шлюзов (Envoy, Contour, Cilium и т.п.).

  • Gateway Resource — собственно инстанс шлюза, обрабатывающий HTTP/HTTPS.

  • HTTPRoute — ключевое правило version-aware маршрутизации, управляемое ICC.

ICC (Namespace: platformatic)

  • Control Plane Service — ядро: обнаруживает версии, управляет HTTPRoute, держит реестр версий.

  • PostgreSQL — персистентное состояние: реестр версий, история деплоев, политики.

App Versions (Namespace: myapp)

  • myapp-v42 (draining) — выводится из эксплуатации, обслуживает только cookie-привязанные сессии.

  • myapp-v43 (active) — текущая активная.

  • Service у каждой версии свой, селектится по plt.dev/version.

  • Pods (Watt + watt-extra) — приложение + ICC-агент.

Observability

  • Prometheus — метрики со всех подов; ICC опрашивает их, чтобы решить когда draining-версию помечать как Expired.

Жизненный цикл деплоя

State machine:

  • Active — обслуживает новые сессии. Default rule HTTPRoute указывает на её Service. Новые посетители получают cookie этой версии.

  • Draining — стала Draining, когда появилась более новая активная. Новые сессии не назначаются; cookie-привязанные продолжают работать.

  • Expired — нет трафика traffic-window (по умолч. 30 мин) или истёк grace period (по умолч. 24 часа). ICC удаляет матчи из HTTPRoute, скейлит до нуля, опционально удаляет Deployment и Service.

Состояния жизненного цикла

Version labels — opaque-строки: числа, semver, git SHA — что угодно. ICC не сравнивает их, просто считает самую новую активной.

Как деплоить новую версию

  1. Соберите образ (myapp:v43).

  2. Создайте Deployment и Service:

    1. Тот же лейбл app.kubernetes.io/name (= то же приложение).

    2. Новый лейбл plt.dev/version (= новая версия).

    3. Новое имя Deployment и Service.

  3. kubectl apply -f myapp-v43.yaml.

ICC автоматически обнаруживает новую версию через watt-extra-регистрацию подов. v43 становится Active, v42 уходит в draining.

Начало работы с ICC

Скриншот ICC
  • Установить ICC на кластер по Installation Guide.

  • Добавить @platformatic/watt-extra, выставить PLT_ICC_URL.

  • Включить PLT_FEATURE_SKEW_PROTECTION + Gateway API CRD (k8s 1.27+) + совместимый контроллер (Envoy/Contour/Cilium/Traefik/NGINX/Kong).

labels:
  app.kubernetes.io/name: myapp
  plt.dev/version: "43"
  # Опционально: префикс пути / hostname
  # plt.dev/path: "/api/leads"
  # plt.dev/hostname: "myapp.example.com"

Vercel-уровень безопасности деплоя в вашем Kubernetes

Skew Protection доступен в ICC. Zero-downtime деплои и version-aware маршрутизация, которые держат каждую сессию консистентной. Команды, готовые попробовать в продакшене — Luca Maraschi или Matteo Collina в LinkedIn, либо info@platformatic.dev.