Как создавать и применять профили кластеров (ClusterProfile)

Справочная информация о назначении и особенностях профилей: Что такое профили кластеров (ClusterProfile).

Создание кастомного профиля

Создание и работа с профилем в графическом интерфейсе

Чтобы создать новый профиль в GUI:

  1. В Платформе перейдите на страницу Профили конфигурации клиентских кластеров одним из способов:
    • в Платформе выберите раздел Профили кластеров → страница Профили конфигурации клиентских кластеров;
    • на вкладке Платформа перейдите по кнопке Профили кластеров.
  2. Нажмите + Создать профиль.
  3. Укажите Имя профиля.

При необходимости добавьте Лейблы и Аннотации. Например, в аннотациях вы можете указать для каких окружения и требований создаётся профиль. Это поможет в дальнейшем быстрее выбирать и редактировать нужные профили.

Скриншот: создание профиля конфигурации

Cоздание профиля конфигурации

  1. В блоке Спецификация заполните нужные параметры. Для создания профиля должен быть задан минимум один параметр спецификации. Недостающие параметры будут заполнены значениями дефолтного профиля default-client-cluster-profile.
Поле Описание
Репозиторий Адрес репозитория образов
Адрес внешнего сервиса сбора логов По умолчанию логи во внешний сервис отправляются по протоколу Elasticsearch v8 в формате json. Если не задан адрес внешнего сервиса - проставляется FQDN логирования платформы
Адрес внешнего сервиса мониторинга По умолчанию метрики во внешний сервис отправляются по протоколу Prometheus/VictoriaMetrics RemoteWrite в формате json. Если не задан адрес внешнего сервиса - проставляется FQDN мониторинга платформы
Часовой пояс Часовой пояс, например, Europe/Moscow. По умолчанию — Europe/Moscow
Список серверов NTP Адреса корпоративных серверов. IP-адрес или FQDN NTP-серверов
  1. При необходимости на вкладках:
  • Кастомные манифесты добавьте YAML-манифесты объектов;
  • переопределите конфигурацию:
    • Cluster API;
    • Kubelet;
    • Kubeadm.

Вкладка Кастомные манифесты

На вкладке Кастомные манифесты задаются YAML-манифесты объектов, которые должны быть созданы при инициализации клиентского кластера.

Вкладка содержит две подвкладки:

  • Клиентский кластер — манифесты должны быть созданы в клиентском кластере;
  • Кластер управления — манифесты должны быть созданы в неймспейсе клиентского кластера в кластере управления.

Если манифесты были добавлены, при создании профиля в неймспейсе kube-system кластера управления будет создан Secret с загруженными манифестами.

Подвкладки устроены идентично.

Требования к манифестам

Загруженные манифесты проверяются перед использованием профиля. Поддерживаются как одиночные, так и многообъектные YAML-манифесты (через разделитель ---).

Манифест считается корректным, если выполняются условия:

  • содержимое манифеста не пустое;
  • YAML синтаксически корректен;
  • для манифестов на подвкладке Кластер управления используются только ресурсы разрешённых API-групп.

Проверить список прав для применения манифестов в GUI: кластер управления → АдминистрированиеКастомные ресурсы → API-группа rbac.authorization.k8s.ioClusterRole - shturval-cluster-manager-role.

Если нужных прав нет, см. раздел Если не хватает прав на платформенные манифесты.

Разрешённые API-группы для манифестов кластера управления
Категория API-группы Разрешённые ресурсы
Kubernetes core core, apps, authorization.k8s.io, coordination.k8s.io configmaps, events, namespaces, secrets; deployments; selfsubjectaccessreviews; leases
Cluster API cluster.x-k8s.io, bootstrap.cluster.x-k8s.io, controlplane.cluster.x-k8s.io, infrastructure.cluster.x-k8s.io все ресурсы cluster.x-k8s.io; kubeadmconfigs; kubeadmcontrolplanes; ipaddresses, ippools, ippools/status, ovirtproviders, shturvalproviders, vcdclusters, vsphereclusteridentities
Платформа Штурвал auth.shturval.tech, cluster.shturval.tech, node.shturval.tech, ops.shturval.tech, permissions.shturval.tech, update.shturval.tech authoidcclients ; clusterconfigs, clusterconfigs/finalizers, clusterconfigs/status, clusterinfoes, clusterinfoes/finalizers, clusterinfoes/status, clusterprofiles, clusterprofiles/finalizers, clusterprofiles/status; nodeconfigitems; shturvalserviceconfigs; grouproles, tenants; shturvalupdates
Observability observability.kaasops.io, operator.victoriametrics.com vectorpipelines; vlsingles, vmagents, vmalertmanagerconfigs, vmalerts, vmrules, vmusers

В манифестах можно использовать плейсхолдер:

{{ .ClusterName }}

При применении манифеста плейсхолдер будет заменен на имя создаваемого клиентского кластера.

Режимы управления манифестами в профиле

Доступны два режима:

  • Базовый — позволяет только загрузить манифесты объектов. Лейблы создаваемым Secrets с манифестами и селектор Secrets в профиле присваиваются автоматически.
  • Расширенный — позволяет дополнительно:
    • управлять лейблами создаваемого Secret;
    • гибко настраивать селектор Secrets для добавления в профиль.

По умолчанию выбран базовый режим. При переключении между режимами загруженные манифесты не сбрасываются. Если повторно добавить в созданный профиль манифест того же объекта, он будет сохранён в новом Secret, но при применении профиля появится ошибка.

Имя Secret с манифестами при загрузке через графический интерфейс формируется автоматически. Для объектов внутри YAML-манифестов действуют стандартные требования Kubernetes.

В базовом режиме можно загрузить манифесты объектов.

Чтобы добавить манифесты:

  1. В блоке Манифесты объектов нажмите +.
  2. В открывшемся окне добавьте один или несколько YAML-манифестов. Если манифестов несколько, разделите их строкой ---.
  3. Проверьте, что YAML валиден.
  4. Нажмите Добавить. Чтобы закрыть окно без сохранения, нажмите Отменить.

После добавления манифесты отображаются в таблице. По каждому объекту отображаются API-группа, Kind, Имя, Namespace и Лейблы. Нажатие на строку с манифестом открывает окно просмотра и редактирования манифеста.

Создаваемым Secrets автоматически присваиваются лейблы:

  • служебный cluster.shturval.tech/manifest - обязателен. Проверяет наличие ключа этого лейбла, его значение не используется;
  • дополнительный:
    • cluster.shturval.tech/profile: client-<имя-профиля> — если манифесты загружены на подвкладке Клиентский кластер;
    • cluster.shturval.tech/profile: platform-<имя-профиля> — если манифесты загружены на подвкладке Кластер управления.

При создании профиля лейблы создаваемых Secrets с манифестами автоматически проставляются в:

  • clientManifestsSelector, если манифесты загружены на подвкладке Клиентский кластер;
  • platformManifestsSelector, если манифесты загружены на подвкладке Кластер управления.

При просмотре профиля доступен блок Secrets со списком Secrets с манифестами для деплоя при создании клиентского кластера. После создания профиля загруженные манифесты не отображаются в блоке Манифесты объектов. Для просмотра загруженных манифестов перейдите на страницу Secret по нажатию на имя в списке.

Скриншот: базовый режим управления манифестами в профиле

Базовый режим

Если в расширенном режиме были внесены изменения, при переключении в базовый режим они сбрасываются.

Чтобы загрузить манифесты в расширенном режиме:

  1. В блоке Манифесты объектов нажмите +.
  2. В открывшемся окне добавьте один или несколько YAML-манифестов. Если манифестов несколько, разделите их строкой ---.
  3. Проверьте, что YAML валиден.
  4. Нажмите Добавить.

В блоке Лейблы Secret можно управлять лейблами создаваемого Secret с манифестами. По умолчанию отображаются:

  • служебный cluster.shturval.tech/manifest: profile — его нельзя удалить;
  • кастомный cluster.shturval.tech/profile: client-<имя-профиля> или cluster.shturval.tech/profile: platform-<имя-профиля> — его можно удалить.

Нажатие на + в блоке Лейблы Secret открывает стандартное окно управления лейблами.

В блоке Селектор Secrets в совпадающих выражениях по умолчанию отображается выражение cluster.shturval.tech/manifest Exists — его нельзя удалить.

Не используйте только служебный лейбл cluster.shturval.tech/manifest в селекторе. Такой селектор может выбрать Secrets других профилей. Добавляйте дополнительный уникальный лейбл профиля.

В совпадающих лейблах по умолчанию отображается лейбл Secret:

  • cluster.shturval.tech/profile: client-<имя-профиля> — на подвкладке Объекты для добавления в клиентский кластер;
  • cluster.shturval.tech/profile: platform-<имя-профиля> — на подвкладке Объекты для добавления в кластер управления.

Этот лейбл можно удалить.

Поиск Secrets выполняется, когда добавлен хотя бы один совпадающий лейбл или одно совпадающее выражение.

Если манифесты загружены, но лейблы и селектор Secrets не указаны, Secret будет создан с манифестами, но не будет добавлен в профиль.

Чтобы управлять добавлением Secrets с манифестами в профиль через Селектор Secrets:

  1. В блоке Лейблы Secret добавьте необходимый лейбл Secret.
  2. В блоке Селектор Secrets задайте совпадающие лейблы или совпадающие выражения.
  3. Проверьте список Secrets, соответствующих селектору.

Все манифесты из Secrets, попавших в выборку, применятся на этапе создания клиентского кластера.

Скриншот: расширенный режим управления манифестами в профиле

Расширенный режим

Вкладка Cluster API

На вкладке Cluster API задаются параметры конфигурации Cluster API в формате YAML. По умолчанию отображаются параметры и их значения. Переопределить можно только значения существующих параметров. Добавление нового неизвестного параметра будет проигнорировано.

Скриншот: вкладка «Cluster API»

Вкладка «Cluster API»

Вкладка Kubelet

На вкладке Kubelet задаются параметры конфигурации Kubelet в формате YAML. По умолчанию отображаются параметры и их значения. Переопределить можно только значения существующих параметров. Добавление нового неизвестного параметра будет проигнорировано.

Скриншот: вкладка «Kubelet»

Вкладка «Kubelet»

Вкладка Kubeadm

На вкладке Kubeadm задаются параметры конфигурации Kubeadm в формате YAML. По умолчанию отображаются параметры и их значения. Переопределить можно только значения существующих параметров. Добавление нового неизвестного параметра будет проигнорировано.

Скриншот: вкладка «Kubeadm»

Вкладка «Kubeadm»

Для создания профиля нажмите Сохранить. После создания профиля проверьте его статус. Если профиль содержит кастомные манифесты, будут найдены Secrets по селектору и отображены результаты проверки каждого Secret.

Шаг 1. Подготовьте манифесты объектов

Подготовьте YAML-манифесты объектов, которые должны быть созданы при инициализации клиентского кластера.

Если необходимо подставить имя создаваемого клиентского кластера, используйте плейсхолдер:

{{ .ClusterName }}

Шаг 2. Создайте Secret с манифестами

В неймспейсе kube-system кластера управления создайте Secret типа Opaque. Добавьте ключи, в значениях которых укажите подготовленные манифесты.

Secret должен иметь служебный лейбл cluster.shturval.tech/manifest. Secrets без этого лейбла будут проигнорированы в профилях.

Дополнительно добавьте уникальный лейбл, по которому будут выбираться только нужные Secrets в профиле.

Пример Secret с манифестами NCI и Namespace

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: secret-for-profile
  namespace: kube-system
  labels:
    cluster.shturval.tech/manifest: ""
    cluster.shturval.tech/profile: client-cluster-profile
stringData:
  nci.yaml: |
    apiVersion: node.shturval.tech/v1beta2
    kind: NodeConfigItem
    metadata:
      name: admin-user
    spec:
      nodeconfigselector:
        kubernetes.io/os: linux
      priority: 100
      users:
        - group: someusergroup
          homedir: ""
          shell: /bin/bash
          username: someuser    
  namespace.yaml: |
    apiVersion: v1
    kind: Namespace
    metadata:
      name: ns-by-clusterprofile    

Примечание: В примере используется stringData, поэтому значения не нужно кодировать в base64. Если используется поле data, значения должны быть закодированы в base64.

Сохраните Secret в файл, например secret-for-profile.yaml, и примените в кластере управления:

kubectl apply -f secret-for-profile.yaml

Шаг 3. Подготовьте манифест ClusterProfile

В манифесте ClusterProfile:

  1. Укажите имя профиля и неймспейс kube-system.
  2. В блоке customManifests задайте селектор для выбора Secret, указав, где должны деплоиться манифесты из Secret:
    • clientManifestsSelector — в клиентском кластере;
    • platformManifestsSelector — в неймспейсе клиентского кластера в кластере управления.

Не рекомендуется использовать в селекторе профиля только служебный лейбл Secret, потому что он может выбрать Secrets других профилей.

Если в селектор не указан служебный лейбл cluster.shturval.tech/manifest, он будет добавлен автоматически при создании или обновлении профиля.

apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterProfile
metadata:
  name: cluster-profile
  namespace: kube-system
spec:
  customManifests:
    - deployPhase: postsscdeploy
      clientManifestsSelector:
        matchLabels:
          cluster.shturval.tech/profile: client-cluster-profile

Если необходимо применить манифесты в кластере управления, используйте platformManifestsSelector:

apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterProfile
metadata:
  name: cluster-profile
  namespace: kube-system
spec:
  customManifests:
    - deployPhase: postsscdeploy
      platformManifestsSelector:
        matchLabels:
          cluster.shturval.tech/profile: client-cluster-profile

Сохраните ClusterProfile в файл cluster-profile.yaml и примените в кластере управления:

kubectl apply -f cluster-profile.yaml

После создания проверьте статус профиля:

kubectl get clusterprofile cluster-profile -n kube-system -o yaml

Если не хватает прав на платформенные манифесты

Манифесты, добавленные в GUI на подвкладке Кластер управления или через CLI в platformManifestsSelector, применяются в кластере управления shturval-cluster-manager. Если в профиле указан ресурс из разрешённой API-группы, но у ClusterRole shturval-cluster-manager-role нет прав на создание такого ресурса, проверка Secret c манифестами в созданном профиле завершится ошибкой.

Пример проверки статуса:

kubectl get clusterprofile cluster-profile -n kube-system -o yaml

Пример ошибки:

status:
  extraManifestsStatus:
    manifestsStatus:
      - deployPhase: postsscdeploy
        platformManifestsStatus:
          - message: >
              1 error occurred:
                * key manifest-1: validate key manifests error: 1 error occurred:
                * no permission to create auth.shturval.tech/User (resource="users"): access denied              
            secretRef:
              name: for-role
              namespace: kube-system
            status: incorrect
Скриншот: статус в профиле

Статус профиля

Статус секрета профиля

Пока статус профиля Not Ready, а Secret имеет статус incorrect, профиль недоступен для выбора при создании клиентского кластера.

Дополнительные права могут потребоваться для создания, например:

  • users платформы в API-группе auth.shturval.tech;
  • произвольных Pod в API-группе core.

Что сделать

Выдайте cluster-manager минимальные права только на те ресурсы и действия, которые необходимы для применения манифестов профиля в кластере управления, одним из способов:

  • создать ClusterRole с лейблом rbac.shturval.tech/shturval-cluster-manager-aggregated-role: "true"
  • создать ClusterRole с кастомным лейблом, который проставить в customvalues shturval-cluster-manager.

В результате права будут добавлены в агрегирующую роль shturval-cluster-manager-role.

В кластере управления создайте ClusterRole с лейблом rbac.shturval.tech/shturval-cluster-manager-aggregated-role: "true".

Пример роли для создания и чтения Pod:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-manager-pods-create-get
  labels:
    rbac.shturval.tech/shturval-cluster-manager-aggregated-role: "true"
rules:
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - create
      - get

Примените роль в кластере управления командой или с помощью импорта манифестов.

Пример команды:

kubectl apply -f cluster-manager-pods-create-get.yaml

Этот вариант удобен, если вы хотите управлять набором ролей, которые попадают в агрегирующую роль shturval-cluster-manager-role.

  1. В кластере управления создайте ClusterRole с произвольным лейблом, например, custom/auth-user-role: “true”.

Пример роли для создания и чтения внутренних пользователей платформы:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-manager-auth-users
  labels:
    custom/auth-user-role: "true"
rules:
  - apiGroups:
      - auth.shturval.tech
    resources:
      - users
    verbs:
      - create
      - get
  1. Создайте ShturvalServicePatch для применения к SSC shturval-cluster-manager, где укажите кастомный лейбл в roleAggregateLabels.
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: cluster-manager-auth-users
spec:
  shturvalServiceConfigName: shturval-cluster-manager
  customvalues:
    roleAggregateLabels:
      custom/auth-user-role: "true"
  1. Примените ClusterRole и ShturvalServicePatch в кластере управления в CLI или через импорт манифестов в GUI.
kubectl apply -f cluster-manager-auth-users-role.yaml
kubectl apply -f cluster-manager-auth-users-rbac-ssp.yaml

Как проверить

После применения ClusterRole проверьте, что права созданной роли попали в агрегирующую роль:

kubectl get clusterrole shturval-cluster-manager-role -o yaml

Затем повторно проверьте статус профиля:

kubectl get clusterprofile cluster-profile -n kube-system -o yaml

Статус должен измениться на Ready, а Secret с манифестами — на valid.

Применение профиля

После создания профиля выберите его при создании клиентского кластера в режиме расширенных настроек.

Перед созданием кластера проверьте, что профиль имеет статус True. Дефолтный профиль всегда доступен для выбора и применяется по умолчанию, если поле “Профиль кластера” оставлено пустым.