Бывают релизы, а бывают релизы. Cozystack 1.7.0 из вторых. В нем не просто набор новых фичей, а такие фичи, которые снимают сразу несколько блокеров миграции на это решение. Этот релиз понравится тем, кто уже использует Proxmox, собирается переезжать с VMware, не хочет выставлять базы данных в мир без шифрования, а бэкапить планирует не только PostgreSQL. Но обо всем по порядку.

Что такое Cozystack

Cozystack — это Open Source‑платформа для построения облака на bare metal. Она позволяет разворачивать managed Kubernetes, Database as a Service, Applications as a Service и виртуальные машины на базе KubeVirt. Внутри платформы можно запускать базы данных, объектные хранилища, брокеры сообщений, Kubernetes‑кластеры и другие сервисы через единый API и интерфейс управления. Проект входит в CNCF Sandbox и распространяется под лицензией Apache 2.0.

Тенантный Kubernetes поверх Proxmox

Если у вас уже работает кластер Proxmox VE, от него больше не нужно избавляться: воркеры тенантных кластеров Kubernetes теперь можно запускать прямо на нём, а не только поверх KubeVirt. Для этого в приложении kubernetes или kubernetes-nodes указывается substrate: proxmox. Значением по умолчанию остаётся kubevirt, поэтому в существующих инсталляциях ничего не поменяется. Провайдер Cluster API для Proxmox вместе с механизмом выдачи IP‑адресов подключается через bundles.enabledPackages, а тенант сразу стыкуется с драйвером дисков Proxmox CSI и cloud‑controller‑manager, так что постоянные тома работают без ручной настройки.

Группы воркеров стали отдельными ресурсами

Раньше группы воркеров описывались списком внутри ресурса Kubernetes, и изменение любой из них означало изменение общего описания кластера. Теперь каждая группа представляет собой отдельный ресурс KubernetesNodes со своими проверками состояния и лимитом времени на появление нового узла при автомасштабировании. Группу можно держать в отдельном файле в GitOps‑репозитории, передать другой команде и менять, не затрагивая остальные группы.

У групп появились и новые настройки. В kernelModules перечисляются модули ядра, которые Talos загружает на узлах; на узлах с видеокартами модули NVIDIA подгружаются автоматически. Для процессора можно задать requests и limits, вывод серийной консоли гостевой системы сохранять в журнал, а для закрытых контуров без доступа в интернет указать зеркало реестра образов. Если включить golden image Talos, хранилище будет клонировать его для каждого нового узла, а не загружать один и тот же образ заново.

Существующие группы переходят на новый формат автоматически во время обновления, но каждая из них один раз пересоздаст свои виртуальные машины, и это стоит учесть при планировании работ.

Переезд с VMware

Для тех, кто после смены условий лицензирования VMware переносит машины на другую платформу, в релизе появился импорт из vSphere на базе Forklift: тенант описывает источник ресурсом VMImportSource, а сам перенос ресурсом VMImportTask. По умолчанию эта возможность выключена. Кроме того, в интерфейсе виртуальных машин появилась вкладка с серийной консолью, а в VNC‑консоль теперь можно вставлять текст из буфера обмена, что упрощает, например, ввод длинных паролей.

Маркетплейс приложений, который можно пополнять

Раньше каталог приложений Cozystack состоял только из того, что в него добавили разработчики платформы. Теперь к нему можно подключать сторонние репозитории, свои или чужие. Репозиторий подключается командой cozypkg tap, поиск по нему выполняется через cozypkg search, а приложение устанавливается через cozypkg add. Чтобы убедиться, что пакет подписан правильно, есть cozypkg validate --require-signature, который проверяет подпись через cosign. В дашборде всё это можно найти в разделе Admin → Repositories. Само подключение репозитория ничего не устанавливает: приложение попадает в каталог только после явного cozypkg add, поэтому лишнее в кластер случайно не попадёт. Хостинг‑провайдер может собрать поверх платформы собственный каталог сервисов и предлагать его своим клиентам. Подробности в документации.

Изменился и сам дашборд. Теперь он открывается на вкладке Console, Marketplace по умолчанию показывает список всех приложений, а управление тенантами убрано в отдельный административный портал, где видна вся их иерархия. Консоль можно переверстать под себя, заменив логотипы и другие элементы.

Бэкапы для баз данных

Единый механизм резервного копирования на основе BackupJob, RestoreJob и BackupClass теперь работает не только с PostgreSQL. Для MongoDB он делает логические бэкапы, восстанавливает их в инстанс с другим именем и умеет возвращать базу к заданному моменту времени. Redis и Valkey сохраняются по одной схеме. В RabbitMQ сохраняется вся конфигурация (definitions): очереди, обменники, привязки и права доступа, а у Kafka метаданные топиков. PostgreSQL теперь можно восстановить на конкретный момент, указав нужное время в spec.options.recoveryTime. Всё это работает со стандартным классом cozy-default и не требует дополнительной настройки.

Появилась и защита от ошибок, которые особенно опасны во время аварии: платформа не запустит два восстановления одновременно, не позволит восстановить бэкап PostgreSQL в другую мажорную версию и не удалит бэкап, пока из него идёт восстановление.

Шифрование для баз данных и безопасный доступ снаружи

MariaDB, RabbitMQ, MongoDB и Redis получили поддержку TLS. Тенанту выдаётся сертификат удостоверяющего центра в секрете <release>.tenant-ca без закрытого ключа, только для того, чтобы клиент мог проверить подлинность сервера. То же самое сделано для NATS и Qdrant.

Кроме того, платформа больше не позволяет выставить базу наружу без шифрования. Redis публикуется только с включённым TLS, а PostgreSQL отклоняет нешифрованные подключения. по‑другому себя ведет только Valkey: TLS у него ещё нет, поэтому его лучше держать внутри кластера. Если нужно шифровать трафик и между узлами кластера, используйте настройку networking.encryption.enabled, которая включает IPsec для стандартной сети на Kube‑OVN.

VictoriaTraces и новые сервисы

В мониторинге появилась распределённая трассировка запросов: хранилище VictoriaTraces, источник данных под него в Grafana и отдельный OTLP‑коллектор для каждого тенанта. По умолчанию трассировка выключена и включается записью в tracingStorages. Трейсы всех тенантов можно собирать в единое хранилище в tenant-root, ограничив каждому тенанту скорость записи, чтобы какой‑либо из них не перегружал хранилище для остальных.

Расширился и список управляемых сервисов. Появилась Valkey, совместимое с Redis хранилище под свободной лицензией BSD, Valkey подойдёт тем, кому в силу лицензии не подходит Redis. Модуль ComputePlane предназначен для приложений, выполняющих недоверенный код. Реплики PostgreSQL для чтения теперь масштабируются автоматически с помощью KEDA, а для работы с геоданными появился образ с PostGIS. Kafka работает без ZooKeeper, в режиме KRaft, и существующие кластеры переводятся на него автоматически, без пересоздания. Для локальных дисков узлов можно включить класс хранения OpenEBS LocalPV hostpath.

ARM и облегчённая установка

Образы пакетов теперь собираются не только под amd64, но и под arm64. Кроме того, появились облегчённые варианты установки isp-slim, isp-slim-generic и isp-hosted-slim. Они разворачивают только базовую платформу с сетью на Cilium, а приложения, операторы, мониторинг, бэкапы и хранилище подключаются по мере необходимости через bundles.enabledPackages. Такой вариант удобен для небольших площадок и для первого знакомства с платформой.

Перед обновлением

Релиз меняет поведение уже работающих кластеров, поэтому раздел о несовместимых изменениях нужно прочитать до обновления (ссылка на полун версию в конце анонса). Здесь приведем лишь гланые моменты:

На Talos v1.14.2 нужно добавить модуль drbd_transport_tcp в machine.kernel.modules рядом с drbd, иначе DRBD не сможет соединиться с соседними узлами. Группы воркеров переходят на KubernetesNodes и при этом один раз пересоздают свои виртуальные машины. Группы, которые не удалось перенести автоматически, перечислены в ConfigMap cozy-system/cozystack-migration-56-unadopted, а дополнение addons.fluxcd удалено. API‑серверы всех тенантных кластеров будут перезапущены, поэтому окно обслуживания лучше запланировать заранее. Клиентов баз данных, которые подключались с sslmode=disable или не проверяли сертификат, придётся перенастроить. Пароли пользователей PostgreSQL и MariaDB теперь всегда генерируются автоматически, а пароли, заданные вручную, игнорируются. Маршруты HTTPRoute, TLSRoute и GRPCRoute в тенантах должны явно указывать spec.hostnames, иначе следующее их изменение будет отклонено. На дисках нод нужно освободить место: на тестовом стенде во время обновления узлам его не хватало. ** Журнал миграций стоит прочитать сразу после обновления командой kubectl logs -n cozy-system job/cozystack-migration-hook, потому что через некоторое время он становится недоступен.

Над этой версией работали 29 человек, для тринадцати из них это первый вклад в проект. Спасибо всем контрибьюторам и мейнтейнерам за вклад в проект.