Вышел Cozystack v1.4.0 — очередной релиз open source-платформы для построения облаков на базе Kubernetes. В этот раз мы сфокусировались на вещах, которые особенно важны для эксплуатации платформы в продакшене: новый интерфейс управления, надёжные worker-узлы для tenant Kubernetes, нормальная модель ресурсных пресетов, бэкапы managed-приложений, дробное использование GPU, аккуратная работа с PROXY protocol и несколько важных исправлений для bootstrap и upgrade-сценариев.

Что
Cozystack — это Open Source-платформа для построения облака на bare metal. Она позволяет разворачивать managed Kubernetes, Database as a Service, Applications as a Service и виртуальные машины на базе KubeVirt. Внутри платформы можно запускать базы данных, объектные хранилища, брокеры сообщений, Kubernetes-кластеры и другие сервисы через единый API и интерфейс управления. Проект входит в CNCF Sandbox и распространяется под лицензией Apache 2.0.
Привет, Хабр!
Вышел Cozystack v1.4.0 — очередной релиз open source-платформы для построения облаков на базе Kubernetes. В этот раз мы сфокусировались на вещах, которые особенно важны для эксплуатации платформы в продакшене: новый интерфейс управления, надёжные worker-узлы для tenant Kubernetes, нормальная модель ресурсных пресетов, бэкапы managed-приложений, дробное использование GPU, аккуратная работа с PROXY protocol и несколько важных исправлений для bootstrap и upgrade-сценариев.
Cozystack — это open source-платформа для построения облака на bare metal. Она позволяет разворачивать managed Kubernetes, Database as a Service, Applications as a Service и виртуальные машины на базе KubeVirt. Проект входит в CNCF Sandbox и распространяется под лицензией Apache-2.0.
Главные изменения
-
новый dashboard на базе cozystack-ui, React 19 и TypeScript, без отдельного BFF-слоя;
-
постоянные диски для worker-узлов tenant Kubernetes вместо ephemeral storage;
-
40 ресурсных пресетов в формате instance types:
t1,c1,s1,u1,m1и размеры отnanoдо4xlarge; -
декларативные backup strategies для PostgreSQL, MariaDB, ClickHouse и FoundationDB;
-
HAMi как опциональный системный пакет для fractional GPU sharing;
-
единый переключатель
publishing.proxyProtocolдля PROXY protocol и автоматическое включение Ouroboros для hairpin-NAT; -
отдельные HelmRelease timeouts и более спокойный bootstrap tenant Kubernetes;
-
kubelet reservations для worker-узлов и более точные allocatable-ресурсы для cluster-autoscaler;
-
обновления Talos, KubeVirt, Cilium, cert-manager, NVIDIA GPU Operator, etcd-operator и других компонентов.
Новый dashboard без BFF
В Cozystack 1.4 мы заменили старый openapi-ui + BFF стек на новый dashboard из проекта cozystack-ui. Теперь frontend на React 19 и TypeScript работает напрямую с Kubernetes API.
Это изменение не только про UI. Мы убрали лишний промежуточный слой, упростили путь запросов и сохранили schema-driven модель, благодаря которой интерфейс знает о доступных приложениях и их параметрах из Kubernetes API.

Что стало лучше:
-
VNC для виртуальных машин теперь использует динамические WebSocket URL и больше не завязан на
localhost:8001. -
Дашборд получил доступ к
ApplicationDefinition, поэтому каталог приложений и marketplace работают через платформенную API-модель. -
Брендинг можно задавать через ConfigMap: логотипы, имена, цвета. Для white-label сценариев больше не нужно пересобирать образ.
-
Старые ссылки
/openapi-ui/*перенаправляются в новый интерфейс. -
Пакет теперь называется
cozy-dashboard, в едином стиле с остальными компонентами Cozystack.

Документация: https://cozystack.io/docs/v1.4/getting-started/deploy-app/, https://cozystack.io/docs/v1.4/cozystack-api/application-definitions/, https://cozystack.io/docs/v1.4/operations/configuration/white-labeling/
Worker-узлы тенантного Kubernetes теперь могут пережить reboot
Раньше worker-узлы tenant Kubernetes использовали ephemeral emptyDisk. Это было неприятно: после перезапуска ВМ могли теряться kubelet-сертификаты, kubeconfig и состояние containerd. Узел фактически забывал свою идентичность и мог потребовать ручного rejoin.
В v1.4 worker-узлы используют PVC-backed persistent disks через KubeVirt dataVolumeTemplates. Состояние kubelet и containerd теперь сохраняется после перезапуска ВМ.
С этим связано одно breaking-переименование в конфигурации NodeGroup:
-
было:
ephemeralStorage; -
стало:
diskSize.
Миграция автоматически переписывает старое поле, азменяя его новым. Ещё появился параметр storageClass на уровне NodeGroup. По умолчанию используется storage class кластера, но для worker-дисков мы рекомендуем явно подумать о выборе класса. В большинстве случаев local выглядит предпочтительно, потому что диски теперь переживают рестарт, а репликация DRBD для таких volume’ов может давать лишние эксплуатационные эффекты во время перезапуска LINSTOR satellite.
При обновлении существующие tenant Kubernetes-кластеры один раз прокатят worker-узлы, потому что изменится KubeVirtMachineTemplate. Это штатная миграция, но под неё стоит заложить capacity.
Документация: https://cozystack.io/docs/v1.4/kubernetes/
Resource presets как instance types
Мы переработали ресурсные пресеты. Вместо плоского набора имён теперь используется модель, похожая на instance types у облачных провайдеров:
-
t1— маленькие и low-memory workload’ы; -
c1— compute-balanced; -
s1— standard, например proxy и cache; -
u1— universal, например базы данных и messaging; -
m1— memory-heavy workload’ы вроде search и analytics.
Каждая серия имеет восемь размеров: от nano до 4xlarge. Всего получается 40 пресетов с понятным соотношением CPU и памяти.
Старые имена nano, micro, small, medium, large, xlarge и 2xlarge остаются как deprecated aliases. Важный момент: CPU и memory сохраняются 1:1. Если у вас был small, он не станет внезапно другим по ресурсам. Миграция перепишет значения, а API будет предупреждать о deprecated-именах при create/update.
Документация по новым пресетам: https://cozystack.io/docs/v1.4/guides/resource-management/
Бэкапы managed-приложений
В v1.4 backupstrategy-controller получил новые стратегии для:
-
PostgreSQL / CNPG;
-
MariaDB;
-
ClickHouse / Altinity Operator;
-
FoundationDB.
Tenant описывает стратегию, BackupClass, Plan, BackupJob и RestoreJob, а контроллер уже собирает нужные backend-specific ресурсы. Поддерживаются ad-hoc snapshots, scheduled backups, in-place restore и restore-to-copy в S3-совместимое объектное хранилище.
Мы отдельно сделали акцент на безопасности: credentials передаются ссылкой на Kubernetes Secret, а не хранятся inline. RBAC контроллера ограничен так, чтобы он не мог читать все secrets в кластере, а работал только с явно указанными.
Так мы закрываем важный кусок managed application catalog: backup/restore становится не внешней инструкцией “соберите сами”, а частью платформенной модели.
Документация: https://cozystack.io/docs/v1.4/operations/services/managed-app-backup-configuration/ https://cozystack.io/docs/v1.4/applications/backup-and-recovery/
Fractional GPU sharing через HAMi
Ещё одно изменение для AI/ML и GPU-нагрузок — опциональный системный пакет hami. HAMi v2.8.1 позволяет дробно делить NVIDIA GPU между workload’ами в tenant Kubernetes-кластерах.
После включения tenant workload’ы могут запрашивать:
-
nvidia.com/gpu; -
nvidia.com/gpumem; -
nvidia.com/gpucores.
Это позволяет нескольким pod’ам использовать одну физическую GPU с явным разделением памяти и вычислительных долей. В интеграцию входят device plugin, scheduler extender, mutating webhook и RuntimeClass. Включение делается через hami.enabled, требуется NVIDIA GPU Operator.
Ограничение тоже важно знать заранее: compute isolation в HAMi-core зависит от приватного символа glibc, который удалён в glibc 2.34. Поэтому для compute isolation нужны образы с glibc старее 2.34. Memory enforcement работает шире, но Alpine/musl для HAMi-core не поддерживается.
Документация: https://cozystack.io/docs/v1.4/kubernetes/gpu-sharing/
PROXY protocol и hairpin-NAT одной настройкой
Для сценариев с внешними балансировщиками и сохранением реального IP клиента появился единый переключатель:
publishing.proxyProtocol: true
Он включает PROXY protocol на host ingress-nginx и автоматически разворачивает Ouroboros. Это важно из-за hairpin-NAT: когда сервис внутри кластера обращается к публичному имени этого же кластера, трафик может прийти в ingress-nginx без PROXY-заголовка, хотя ingress уже ждёт его после включения PROXY protocol.
Ouroboros решает проблему через CoreDNS rewrite snippets. На стороне tenant Kubernetes это доступно через addon:
addons.ouroboros.enabled
По умолчанию поведение не меняется. Если PROXY protocol не включён, новые ресурсы не появляются.
Документация: https://cozystack.io/docs/v1.4/networking/hairpin-proxy-protocol/
Меньше боли при установке и обновлении
В cozystack-operator появились настройки генерации HelmRelease:
-
helmrelease-interval; -
helmrelease-retry-interval; -
helmrelease-install-timeout; -
helmrelease-upgrade-timeout; -
helmrelease-max-history.
Стратегия повторных попыток переведена на RetryOnFailure, чтобы медленный первый install не превращался в цикл uninstall/reinstall.
Для отдельных ApplicationDefinition можно задавать timeout через аннотацию:
release.cozystack.io/helm-install-timeout
Tenant Kubernetes использует 15-минутный timeout, чтобы parent HelmRelease не падал раньше, чем Kamaji успеет подготовить control plane и admin-kubeconfig на холодном bootstrap.
Документация: https://cozystack.io/docs/v1.4/kubernetes/ https://cozystack.io/docs/v1.4/operations/troubleshooting/flux-cd/
Kubelet reservations и autoscaler
Worker-узлы tenant Kubernetes теперь получают автоматически рассчитанные kube/system reservations для CPU и памяти. Это нужно, чтобы kubelet не становился случайной жертвой OOM killer, а scheduler видел более честную картину доступных ресурсов.
Cluster-autoscaler annotations теперь показывают allocatable CPU и memory, а не raw capacity. Это ближе к тому, что реально может быть запланировано в Kubernetes.
Документация: https://cozystack.io/docs/v1.4/kubernetes/
Обновления компонентов
В v1.4 обновлены ключевые компоненты платформы:
-
Talos: 1.12.7 -> 1.13.0;
-
cert-manager: 1.19.3 -> 1.20.2;
-
Cilium: 1.19.1 -> 1.19.3;
-
NVIDIA GPU Operator: 25.3.0 -> 26.3.1;
-
etcd-operator: 0.4.2 -> 0.4.3;
-
KubeVirt: 1.6.3 -> 1.8.2;
-
cozy-proxy: 0.2.0 -> 0.3.0;
-
linstor-csi: 1.10.6;
-
HAMi: 2.8.1;
-
Ouroboros: 0.7.2.
Также подтянуты Go-зависимости, builder-образы переведены на golang:1.26, а first-party scratch images запускаются от non-root UID 65532.
Документация: https://cozystack.io/docs/v1.4/guides/platform-stack/ https://cozystack.io/docs/v1.4/operations/cluster/upgrade/
Что учитывать при обновлении
Большинство миграций выполняется автоматически, но есть несколько вещей, которые стоит учесть:
-
Worker-узлы tenant Kubernetes будут один раз заменены, потому что переходят с ephemeral disk на PVC-backed persistent disk. Нужен запас capacity на время rolling replacement.
-
ВМ KubeVirt, которые уже были запущены до обновления платформы, нужно холодно перезапустить после перехода на KubeVirt 1.8.2. Из-за изменения версии QEMU live migration таких старых процессов может не пройти. Новые ВМ, созданные после обновления, не затрагиваются.
-
Старые resource presets продолжают работать, но будут помечаться как deprecated. Лучше постепенно переходить на имена вида
s1.mediumилиu1.large. -
PostgreSQL parameters теперь типизированы. Опасные параметры вроде
archive_command,restore_command,dynamic_library_pathи*_preload_librariesзапрещены denylist’ом. -
cert-manager 1.20 запускает контейнеры с UID/GID 65532. Если у вас есть кастомные PodSecurityPolicy, imagePullSecrets или файловые сертификаты с ownership под старый UID, это нужно проверить.
Документация: https://cozystack.io/docs/v1.4/operations/cluster/upgrade/, https://cozystack.io/docs/v1.4/kubernetes/, https://cozystack.io/docs/v1.4/virtualization/, https://cozystack.io/docs/v1.4/guides/resource-management/, https://cozystack.io/docs/v1.4/applications/postgres/
Спасибо всем, кто участвовал в релизе: androndo, Arsolitt, dislogical, dvc, IvanHunters, kvaps, lexfrei, matthieu-robin, mattia-eleuteri, myasnikovdaniil, sirktulhu и tym83. Отдельно приветствуем новых контрибьюторов dvc и dislogical.
Подробности по релизу и документации
-
Cozystack v1.4.0: https://github.com/cozystack/cozystack/releases/tag/v1.4.0
-
Полный changelog v1.4.0: https://github.com/cozystack/cozystack/compare/v1.3.0…v1.4.0
-
Документация Cozystack: https://cozystack.io/docs/
Присоединяйтесь к нашему сообществу
-
Telegram: https://t.me/cozystack
-
Slack: https://kubernetes.slack.com/archives/C07JQ694WPE (сначала необходимо добавиться в пространство https://slack.kubernetes.io/)
-
YouTube: https://www.youtube.com/@cozystack
ссылка на оригинал статьи https://habr.com/ru/articles/1040386/