Выпуск Cozystack 1.4, открытой PaaS-платформы на базе K8s: новый UI, бэкапы БД и другие изменения

от автора

Вышел 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/

Что учитывать при обновлении

Большинство миграций выполняется автоматически, но есть несколько вещей, которые стоит учесть:

  1. Worker-узлы tenant Kubernetes будут один раз заменены, потому что переходят с ephemeral disk на PVC-backed persistent disk. Нужен запас capacity на время rolling replacement.

  2. ВМ KubeVirt, которые уже были запущены до обновления платформы, нужно холодно перезапустить после перехода на KubeVirt 1.8.2. Из-за изменения версии QEMU live migration таких старых процессов может не пройти. Новые ВМ, созданные после обновления, не затрагиваются.

  3. Старые resource presets продолжают работать, но будут помечаться как deprecated. Лучше постепенно переходить на имена вида s1.medium или u1.large.

  4. PostgreSQL parameters теперь типизированы. Опасные параметры вроде archive_command, restore_command, dynamic_library_path и *_preload_libraries запрещены denylist’ом.

  5. 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.

Подробности по релизу и документации

Присоединяйтесь к нашему сообществу

ссылка на оригинал статьи https://habr.com/ru/articles/1040386/