Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Непрерывное развертывание и доставка

Подходы IaaC и GitOps для управления конфигурациями в Nova Container Platform SE применяются и к ресурсам Kubernetes, входящим в состав модулей платформы. Непрерывная доставка модулей осуществляется с помощью службы (системы) FluxCD.

1. GitOps в Nova Container Platform SE

GitOps является одним из способов управления инфраструктурой или приложениями в инфраструктуре, когда вся их конфигурация декларативно описана, а версия конфигураций хранится и контролируется в Git-репозитории. Развертывание данной инфраструктуры является автоматизированным процессом, при котором состояние приложений в инфраструктуре приводится к состоянию, описанному в конфигурациях Git-репозитория.

Nova Container Platform SE использует основные принципы GitOps в управлении модулями платформы, а именно:

  • Хранит всю конфигурацию модулей в локальном Git-репозитории Gitea.

  • Git-репозиторий содержит необходимые ветки и теги, соответствующие версиям платформы.

  • Git-репозиторий неизменяемый и поддерживает только одностороннюю синхронизацию.

  • Служба FluxCD постоянно проверяет Git-репозиторий на наличие новых версий конфигураций.

  • Служба FluxCD постоянно отслеживает изменения компонентов в кластере Kubernetes и поддерживает их состояние в соответствии с конфигурацией в Git-репозитории.

2. Репозитории

Репозиторий является единым источником всех конфигураций, которые описывают желаемое состояние объектов в Kubernetes. В системе FluxCD поддерживается несколько типов репозиториев:

  • GitRepository: Git-репозитории, в которых содержатся конфигурации и манифесты для развертывания объектов в Kubernetes.

  • OCIRepository: OCI-репозитории артефактов, частно используются для хранения образов контейнеров, Helm-чартов, а также пакетов.

  • HelmRepository: Репозитории Helm-чартов для развертывания в Kubernetes.

  • Bucket: Бакеты в S3-хранилище, в которых содержатся конфигурации и манифесты для развертывания объектов в Kubernetes.

Nova Container Platform SE использует Git-репозиторий (GitRepository), размещаемый в локальном хранилище Gitea. Gitea устанавливается в кластер Kubernetes на этапе развертывания платформы и автоматически настраивается. На схеме ниже представлен процесс взаимодействия с Git-репозиторием.

Взаимодействие с Git-репозиторием в Nova Container Platform SE
Рисунок 1. Взаимодействие с Git-репозиторием в Nova Container Platform SE

При каждом запуске хранилище Gitea настраивается автоматически:

  • Выполняется настройка учетной записи администратора через интеграцию с StarVault.

  • Выполняется настройка учетной записи для FluxCD через интеграцию с StarVault

  • Выполняется настройка параметров входа в Gitea по протоколу OIDC через интеграцию с StarVault.

  • Выполняется настройка внутренней организации.

  • Выполняется настройка зеркалирования релизного Git-репозитория: при установке платформы через Интернет зеркалируется репозиторий из хранилища code.nova-platform.io, при установке платформы в закрытом контуре - из хранилища Nova Universe.

Для хранилища Gitea не требуется и не используется персистентное хранилище. Каждый перезапуск Gitea приводит к переинициализации и синхронизации релизного репозитория. Релизный репозиторий доступен в Gitea только на чтение учетной записи FluxCD.

Для подключения репозитория Gitea к FluxCD используется конфигурация GitRepository, в которой определяется URL Git-репозитория, версия релиза, набор устанавливаемых модулей, интервал синхронизации и параметры учетной записи.

Релизный Git-репозиторий в Gitea доступен только на чтение учетной записи FluxCD. Изменение какой-либо информации в репозитории невозможно.

FluxCD выполняет постоянную синхронизацию Git-репозитория каждые 10 минут и кеширует полученную информацию. После того, как Git-репозиторий успешно синхронизирован в FluxCD, Configuration Manager создает ресурсы Kustomization для каждого из устанавливаемых компонентов. В данных ресурсах описываются следующие параметры:

  • Путь к манифестам в репозитории Gitea

  • Зависимости от других устанавливаемых компонентов

  • Параметры и переменные для генерации финального манифеста компонента

  • Имя служебного аккаунта (Service Account) для развертывания компонента

  • Перечень ресурсов для проверки доступности компонента

Далее FluxCD обрабатывает ресурсы Kustomization и выполняет их реконсиляцию - устанавливает компоненты и приводит их действительное состояние в описанное в Git-репозитории. По умолчанию интервал реконсиляции составляет 10 минут.

При обновлении Nova Container Platform SE для установки новой версии модулей выполняется переключение FluxCD на новую версию релизного репозитория.

3. Kustomize и Kustomization

Наряду с использованием ресурсов Kustomization в API kustomization.kustomize.toolkit.fluxcd.io, в Nova Container Platform SE также используется API kustomization.kustomize.config.k8s.io для управления параметрами Kustomize.

Kustomize – это инструмент нативного управления конфигурациями в Kubernetes, позволяющий настраивать простые YAML-манифесты без использования шаблонов. При этом, оригинальные YAML-манифесты остаются без изменений, а конечные YAML-манифесты генерируются в отдельный слой с использованием пользовательских параметров. Kustomize существует как отдельная утилита, но также встроен в инструментарий FluxCD.

С помощью Kustomize в Nova Container Platform SE решаются следующие задачи:

  • Контролируется перечень конфигураций (YAML-манифестов), которые могут быть установлены для компонента модуля.

  • Устанавливаются общие метки и аннотации на ресурсы Kubernetes.

  • Применяются strategic merge и JSON6902 патчи для адаптации конфигурации компонента под тип и метод установки платформы.

Параметры Kustomize, как правило, указываются в YAML-манифестах, хранимых в Git-репозиториях, в то время как манифесты Kustomization являются ресурсами Kubernetes и в первую очередь обрабатываются контроллерами FluxCD. При этом некоторые из параметров Kustomize доступны в рамках спецификации Kustomization.

Вы можете получить подробную информацию о Kustomize и Kustomization по ссылкам ниже:

После добавления слоя Kustomize для YAML-манифестов какого-либо компонента добавляется еще один дополнительный PostBuild-слой. В данном слое выполняется замена переменных, обозначенных в YAML-манифестах на значения ключей из существующих в Kubernetes объектов ConfigMap или Secret.

В Nova Container Platform SE в пространстве имен nova-gitops хранятся объекты ConfigMap, задающие базовые параметры для развертывания модулей платформы. Пример одного из общих ConfigMap представлен ниже:

apiVersion: v1
data:
  clusterId: a836c40c-1f77-4c81-a43b-3e69269442d2
  controlPlaneTopology: SingleReplica
  dnsBaseDomain: apps.nova.internal
  imageRepository: hub.universe.nova.internal/nova-universe
  infraNodesCount: '"1"'
  k8sDefaultDnsZone: cluster.local
  mirrorRepoType: gitea
kind: ConfigMap
metadata:
  name: nova-gitops-common-substitute-config
  namespace: nova-gitops

Таким образом, в Git-репозитории хранятся универсальные YAML-манифесты без чувствительной информации, которые описывают базовый сценарий установки. FluxCD “на лету” адаптирует манифесты и устанавливает их в Kubernetes, в дальнейшем постоянно поддерживая их консистентность.

4. Контроллеры FluxCD

Служба FluxCD состоит из шести основных контроллеров. Описание данных контроллеров и обслуживаемые ими ресурсы CRD представлены в таблице ниже.

Наименование Назначение Обслуживаемые CRD

Source Controller

Контроллер, выполняющий задачи управления артефактами из различных репозиториев.

GitRepository CRD
OCIRepository CRD
HelmRepository CRD
HelmChart CRD
Bucket CRD

Kustomize Controller

Контроллер, обеспечивающий непрерывную доставку и развертывание ресурсов в Kubernetes. В качестве источника данных использует репозитории под управлением Source Controller.

Kustomization CRD

Helm Controller

Контроллер, обеспечивающий непрерывную доставку и развертывание Helm-чартов в Kubernetes. В качестве источника данных использует репозитории под управлением Source Controller.

HelmRelease CRD

Notification Controller

Контроллер, выполняющий задачи обработки входящих и исходящих событий в FluxCD и отправки нотификаций во внешние системы.

Provider CRD
Alert CRD
Receiver CRD

Image Automation Controller

Контроллер, работающий в паре с Image Reflector Controller. Выполняет задачи обновления версий образов в YAML-манифестах в Git-репозитории.

ImagePolicy CRD
ImageUpdateAutomation CRD

Image Reflector Controller

Контроллер, работающий в паре с Image Automation Controller. Сканирует хранилища образов контейнеров с целью поиска новых версий.

ImageRepository CRD

5. Мультитенантность

В Nova Container Platform SE служба FluxCD используется не только для нужд самой платформы, но также может применяться и конечными пользователями для настройки собственных процессов непрерывной доставки приложений и сервисов. FluxCD поддерживает работу множества пользователей или команд в пределах одного кластера Kubernetes путем сегментации и изоляции ресурсов на уровне пространств имен и RBAC.[1]

5.1. Использование RBAC

В Nova Container Platform SE контроллеры FluxCD работают в режиме Multi-tenancy lockdown, полностью опираясь на политики Kubernetes RBAC. Контроллеры вносят изменения в среду Kubernetes (развертывают и изменяют ресурсы и приложения), имперсонируя служебный аккаунт (ServiceAccount), указанный в спецификациях Kustomization или HelmRelease.

По умолчанию, все системные объекты Kustomization запускаются от служебного аккаунта kustomize-controller в пространстве имен nova-gitops, который имеет роль cluster-admin в Kubernetes.

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

5.2. Роли пользователей

Глобально при работе с FluxCD роли пользователей можно разделить на две группы:

  • Администраторы платформы Nova Container Platform

  • Команды (тенанты) FluxCD

5.2.1. Администраторы

Администраторы платформы, как правило, имеют неограниченный доступ к Kubernetes API. В их зоне ответственности могут находиться такие задачи как, например:

  • Подключение Git, Helm, OCI репозиториев к FluxCD, в том числе репозиториев команд.

  • Установка CRD в кластер Kubernetes.

  • Установка и настройка дополнительных пространств имен.

  • Настройка RBAC для служебных пользователей команд.

5.2.2. Команды

Пользователи команд обычно имеют ограниченный доступ к Kubernetes API, контролируемый с помощью RBAC администраторами платформы. Примеры операций, которые могут выполняться командами, представлены далее:

  • Регистрация собственных репозиториев (GitRepositories, HelmRepositories, Buckets).

  • Развертывание собственных сервисов и приложений через FluxCD с помощью Kustomizations и HelmReleases с использованием согласованного служебного аккаунта.

  • Настройка автоматизации обновления приложений с помощью ImageRepositories, ImagePolicies, ImageUpdateAutomations.

  • Настройка веб-хуков и оповещений через FluxCD (Receivers, Alerts).


1. Функционал мультитенантности доступен с версии Nova Container Platform SE v3.0.0 и выше.