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

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

Подходы 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-репозиторием в Nova Container Platform
Рисунок 1. Взаимодействие с OCI-репозиторием в Nova Container Platform

Параметры источника 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

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 служба 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).


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