Мы рады представить новую экспериментальную функцию 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 не сравнивает их, просто считает самую новую активной.
Как деплоить новую версию
-
Соберите образ (
myapp:v43). -
Создайте Deployment и Service:
-
Тот же лейбл
app.kubernetes.io/name(= то же приложение). -
Новый лейбл
plt.dev/version(= новая версия). -
Новое имя Deployment и Service.
-
-
kubectl apply -f myapp-v43.yaml.
ICC автоматически обнаруживает новую версию через watt-extra-регистрацию подов. v43 становится Active, v42 уходит в draining.
Начало работы с 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.