Непрерывное развертывание и доставка
Подходы 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-репозиторием.
При каждом запуске хранилище 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 |
|---|---|---|
Контроллер, выполняющий задачи управления артефактами из различных репозиториев. |
GitRepository CRD |
|
Контроллер, обеспечивающий непрерывную доставку и развертывание ресурсов в Kubernetes. В качестве источника данных использует репозитории под управлением Source Controller. |
||
Контроллер, обеспечивающий непрерывную доставку и развертывание Helm-чартов в Kubernetes. В качестве источника данных использует репозитории под управлением Source Controller. |
||
Контроллер, выполняющий задачи обработки входящих и исходящих событий в FluxCD и отправки нотификаций во внешние системы. |
||
Контроллер, работающий в паре с Image Reflector Controller. Выполняет задачи обновления версий образов в YAML-манифестах в Git-репозитории. |
||
Контроллер, работающий в паре с Image Automation Controller. Сканирует хранилища образов контейнеров с целью поиска новых версий. |
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).