Непрерывное развертывание и доставка компонентов
Подходы IaaC и GitOps для управления конфигурациями в Nova Container Platform применяются и к ресурсам Kubernetes, входящим в состав модулей платформы. Непрерывная доставка модулей осуществляется с помощью службы (системы) FluxCD.
1. GitOps в Nova Container Platform
GitOps является одним из способов управления инфраструктурой или приложениями в инфраструктуре, когда вся их конфигурация декларативно описана, а версия конфигураций хранится и контролируется в Git-репозитории. Развертывание данной инфраструктуры является автоматизированным процессом, при котором состояние приложений в инфраструктуре приводится к состоянию, описанному в конфигурациях Git-репозитория.
Nova Container Platform использует основные принципы GitOps в управлении модулями платформы, а именно:
-
Хранит всю конфигурацию базового модуля в OCI-артефакте, который размещается в хранилище образов.
-
Каждая версия OCI-артефакта помечена тегом, соответствующим версии базового модуля.
-
OCI-артефакт неизменяемый: конфигурация из него только считывается.
-
Служба FluxCD постоянно проверяет источник OCI-артефакта на наличие изменений.
-
Служба FluxCD постоянно отслеживает изменения компонентов в кластере Kubernetes и поддерживает их состояние в соответствии с конфигурацией в OCI-артефакте.
2. Репозитории
Репозиторий является единым источником всех конфигураций, которые описывают желаемое состояние объектов в Kubernetes. В системе FluxCD поддерживается несколько типов репозиториев:
-
GitRepository: Git-репозитории, в которых содержатся конфигурации и манифесты для развертывания объектов в Kubernetes. -
OCIRepository: OCI-репозитории артефактов, часто используются для хранения образов контейнеров, Helm-чартов, а также пакетов. -
HelmRepository: Репозитории Helm-чартов для развертывания в Kubernetes. -
Bucket: Бакеты в S3-хранилище, в которых содержатся конфигурации и манифесты для развертывания объектов в Kubernetes.
Nova Container Platform получает базовый модуль из источника OCIRepository с именем oci-release-base. Базовый модуль поставляется в виде OCI-артефакта и хранится в хранилище образов так же, как образы контейнеров: при установке платформы из сети Интернет — в публичном хранилище hub.nova-platform.io, при установке в закрытом сетевом контуре — в хранилище образов Nova Universe.
Параметры источника oci-release-base:
-
Адрес OCI-артефакта имеет вид
oci://<hubRegistryURL>/base, где<hubRegistryURL>— адрес хранилища образов. -
Тег OCI-артефакта совпадает с версией базового модуля.
-
FluxCD опрашивает источник раз в 5 минут и кеширует полученную информацию.
После того, как OCI-артефакт успешно получен FluxCD, Configuration Manager создает ресурсы Kustomization для каждого из устанавливаемых компонентов. В данных ресурсах описываются следующие параметры:
-
Путь к манифестам компонента внутри OCI-артефакта
-
Зависимости от других устанавливаемых компонентов
-
Параметры и переменные для генерации финального манифеста компонента
-
Имя служебного аккаунта (Service Account) для развертывания компонента
-
Перечень ресурсов для проверки доступности компонента
Далее FluxCD обрабатывает ресурсы Kustomization и выполняет их реконсиляцию - устанавливает компоненты и приводит их действительное состояние в описанное в OCI-артефакте. По умолчанию интервал реконсиляции составляет 10 минут.
При обновлении Nova Container Platform для установки новой версии модулей FluxCD переключается на новую версию OCI-артефакта.
3. Kustomize и Kustomization
Наряду с использованием ресурсов Kustomization в API kustomization.kustomize.toolkit.fluxcd.io, в Nova Container Platform также используется API kustomization.kustomize.config.k8s.io для управления параметрами Kustomize.
Kustomize – это инструмент нативного управления конфигурациями в Kubernetes, позволяющий настраивать простые YAML-манифесты без использования шаблонов. При этом, оригинальные YAML-манифесты остаются без изменений, а конечные YAML-манифесты генерируются в отдельный слой с использованием пользовательских параметров. Kustomize существует как отдельная утилита, но также встроен в инструментарий FluxCD.
С помощью Kustomize в Nova Container Platform решаются следующие задачи:
-
Контролируется перечень конфигураций (YAML-манифестов), которые могут быть установлены для компонента модуля.
-
Устанавливаются общие метки и аннотации на ресурсы Kubernetes.
-
Применяются strategic merge и JSON6902 патчи для адаптации конфигурации компонента под тип и метод установки платформы.
Параметры Kustomize, как правило, указываются в YAML-манифестах, хранимых в репозиториях (для базового модуля — в OCI-артефакте), в то время как манифесты Kustomization являются ресурсами Kubernetes и в первую очередь обрабатываются контроллерами FluxCD. При этом некоторые из параметров Kustomize доступны в рамках спецификации Kustomization.
Вы можете получить подробную информацию о Kustomize и Kustomization по ссылкам ниже:
После добавления слоя Kustomize для YAML-манифестов какого-либо компонента добавляется еще один дополнительный PostBuild-слой. В данном слое выполняется замена переменных, обозначенных в YAML-манифестах на значения ключей из существующих в Kubernetes объектов ConfigMap или Secret.
В Nova Container Platform в пространстве имен nova-gitops хранятся объекты ConfigMap, задающие базовые параметры для развертывания модулей платформы. Переменные подставляются из двух ConfigMap:
-
nova-gitops-common-substitute-config— общие параметры кластера. -
platform-images-config— ссылки на образы компонентов платформы (около 180 ключей вида<компонент>_image). ConfigMap помечен версией платформы и версией Kubernetes.
Пример ConfigMap nova-gitops-common-substitute-config представлен ниже:
apiVersion: v1
data:
clusterId: a836c40c-1f77-4c81-a43b-3e69269442d2
cniProvider: cilium
controlPlaneTopology: SingleReplica
dnsBaseDomain: apps.mycompany.local
imageRepository: hub.universe.mycompany.local/nova-universe
infraNodesCount: '"1"'
k8sDefaultDnsZone: cluster.local
nodeLocalGatewayRealIps: <IP-адреса узлов>
kind: ConfigMap
metadata:
name: nova-gitops-common-substitute-config
namespace: nova-gitops
Оба ConfigMap указываются в ресурсах Kustomization компонентов базового модуля:
sourceRef:
kind: OCIRepository
name: oci-release-base
postBuild:
substituteFrom:
- kind: ConfigMap
name: nova-gitops-common-substitute-config
- kind: ConfigMap
name: platform-images-config
Таким образом, в OCI-артефакте хранятся универсальные 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 служба FluxCD используется не только для нужд самой платформы, но также может применяться и конечными пользователями для настройки собственных процессов непрерывной доставки приложений и сервисов. FluxCD поддерживает работу множества пользователей или команд в пределах одного кластера Kubernetes путем сегментации и изоляции ресурсов на уровне пространств имен и RBAC.[1]
5.1. Использование RBAC
В Nova Container Platform контроллеры 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).