Что такое профили кластеров (ClusterProfile)

Назначение профиля в платформе

ClusterProfile — кастомный ресурс API-группы cluster.shturval.tech (см. Кастомные ресурсы платформы). Управление профилями выполняется в кластере управления. По умолчанию предустановлен профиль default-client-cluster-profile.

Кастомные профили полезны для разных окружений и массового применения типовой конфигурации.

В платформе «Штурвал» с помощью кастомного профиля кластера (ClusterProfile) можно переопределить настройки конфигурации клиентских кластеров:

  • параметры репозитория образов, логирования, мониторинга, часового пояса и NTP;
  • конфигурации Cluster API, Kubelet и Kubeadm;
  • добавить YAML-манифесты объектов, которые будут созданы в клиентском кластере или в кластере управления при инициализации клиентского кластера.

Переопределять конфигурацию дефолтного ClusterProfile с именем default-client-cluster-profile строго запрещено. Это может привести к ошибкам создания клиентских кластеров.

Если конфигурация дефолтного профиля была изменена, верните её к исходным значениям в соответствии с данными из ClusterConfig кластера управления.

Пример дефолтного профиля default-client-cluster-profile
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterProfile
metadata:
  name: default-client-cluster-profile
  namespace: kube-system
  labels:
    shturval.tech/shturval-cluster-profile-config: ""
spec:
  license: '<license из ClusterConfig>'
  loggingEndpoint: '<loggingUrl из статуса ClusterConfig>'
  monitoringEndpoint: '<monitoringUrl из статуса ClusterConfig>'
  repositoryConfig: 
    commonUrl: '<systemRegistryConfig.commonUrl из ClusterConfig>'
  time_zone: Europe/Moscow
  ntpServers: []
  clusterAPIConfiguration:
    machineDeployment:
      nodeDeletionTimeout: 10m0s
      nodeDrainTimeout: 10m0s
      nodeVolumeDetachTimeout: 5m0s
  kubeadmControlPlaneConfiguration:
    MachineTemplate:
      nodeDeletionTimeout: 10m0s
      nodeDrainTimeout: 10m0s
      nodeVolumeDetachTimeout: 5m0s
    clusterConfiguration:
      apiServer:
        extraArgs:
          authorization-mode: Node,RBAC
          default-not-ready-toleration-seconds: '30'
          default-unreachable-toleration-seconds: '30'
          profiling: 'false'
      certificatesDir: /etc/kubernetes/pki
      controllerManager:
        extraArgs:
          bind-address: 0.0.0.0
          node-monitor-grace-period: 20s
          node-monitor-period: 2s
          profiling: 'false'
      etcd:
        local:
          dataDir: /var/lib/etcd
      imageRepository: <systemRegistryConfig.commonUrl из ClusterConfig кластера управления>
      networking:
        dnsDomain: cluster.local
        podSubnet: 172.16.0.0/16
        serviceSubnet: 10.96.0.0/12
      scheduler:
        extraArgs:
          bind-address: 0.0.0.0
          profiling: 'false'
    initConfiguration:
      nodeRegistration:
        criSocket: unix:///run/containerd/containerd.sock
        imagePullPolicy: IfNotPresent
      skipPhases:
        - addon/kube-proxy
    joinConfiguration:
      nodeRegistration:
        criSocket: unix:///run/containerd/containerd.sock
        imagePullPolicy: IfNotPresent
  kubeletConfiguration:
    cgroupDriver: systemd
    enableProfilingdeployers.Handler: false
    imageGCHighThresholdPercent: 70
    imageGCLowThresholdPercent: 65
    imageMinimumGCAge: 15m0s
    nodeStatusUpdateFrequency: 4s
    readOnlyPort: 0
    rotateCertificates: true
    tlsMinVersion: VersionTLS13

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

Как работает профиль кластера

ClusterProfile — это шаблон конфигурации клиентского кластера. Профиль выбирается при создании клиентского кластера и применяется во время его инициализации.

Если часть параметров в кастомном профиле не заполнена, они автоматически дозаполняются значениями из дефолтного профиля default-client-cluster-profile.

Профили создаются в неймспейсе kube-system кластера управления. Обновление конфигурации ClusterProfile не изменяет конфигурацию ранее созданных клиентских кластеров с этим профилем.

Secrets с YAML-манифестами

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

Эти объекты хранятся в Secrets неймспейса kube-system кластера управления.

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

В блоке customManifests селектор указывает, где должны применяться манифесты из Secret:

  • clientManifestsSelector — в клиентском кластере;
  • platformManifestsSelector — в неймспейсе клиентского кластера в кластере управления. Манифесты ресурсов, которыми управляет кластер управления, создаются только в неймспейсе клиентского кластера. Неймспейс, заданный в манифесте, в этом случае игнорируется.

Для манифестов, которые применяются в кластере управления через platformManifestsSelector, важны права shturval-cluster-manager. Если в профиль добавлен ресурс из разрешённой API-группы, но у cluster-manager нет прав на его создание или чтение, проверка Secret завершится ошибкой. Например, дополнительные права нужны для произвольного создания users.auth.shturval.tech или pods.

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

Фазу применения манифестов нельзя переопределить: deployPhase: postsscdeploy устанавливается по умолчанию.

Если в манифесте необходимо использовать имя создаваемого клиентского кластера, используйте плейсхолдер {{.ClusterName}}. При применении манифеста платформа заменит его на фактическое имя кластера.

apiVersion: cluster.x-k8s.io/v1beta2
kind: MachineHealthCheck
metadata:
  name: "{{.ClusterName}}-default-healthcheck"
  namespace: "{{.ClusterName}}"
spec:
  checks:
    nodeStartupTimeoutSeconds: 0
    unhealthyNodeConditions:
      - status: Unknown
        timeoutSeconds: 600
        type: Ready
      - status: 'False'
        timeoutSeconds: 600
        type: Ready
  clusterName: "{{.ClusterName}}"
  remediation:
    triggerIf:
      unhealthyLessThanOrEqualTo: 39%
  selector:
    matchLabels:
      cluster.x-k8s.io/deployment-name: "{{.ClusterName}}-default"
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterProfile
metadata:
  creationTimestamp: 2026-01-22T07:55:09Z
  generation: 1
  labels:
    k8slens-edit-resource-version: v1beta1
    shturval.tech/shturval-cluster-profile-config: ""
  name: cluster-profile
  namespace: kube-system
  resourceVersion: "29842860"
  uid: 44a09930-9728-418b-a8c6-51e791a2aa64
spec:
  customManifests:
    - clientManifestsSelector:
        matchExpressions:
          - key: cluster.shturval.tech/manifest
            operator: Exists
        matchLabels:
          clientcluster: clientcluster
      platformManifestsSelector:
        matchExpressions:
          - key: cluster.shturval.tech/manifest
            operator: Exists
        matchLabels: {}
# Здесь будут параметры конфигурации дефолтного профиля кластера
status:
  extraManifestsStatus:
    manifestsStatus:
      - clientManifestsStatus:
          - secretRef:
              name: secretname
              namespace: kube-system
            status: valid
        deployPhase: postsscdeploy
        platformManifestsStatus:
          - secretRef:
              name: secretname
              namespace: kube-system
            status: valid
    ready:
      status: "True"

Особенности работы профилей с манифестами

  1. Результаты валидации манифестов объектов, включённых в Secret, выводятся в статус ClusterProfile.
  2. Любые изменения Secrets, соответствующих селектору в профиле кластера, включая обновление и создание новых Secrets, приводят к автоматическому обновлению в профиле.
  3. Добавить в профиль ресурсы для применения в кластере управления возможно только из разрешённых API-групп.
Разрешённые API-группы для манифестов кластера управления
Категория API-группы
Kubernetes core core, apps, coordination.k8s.io
Cluster API cluster.x-k8s.io, bootstrap.cluster.x-k8s.io, controlplane.cluster.x-k8s.io, infrastructure.cluster.x-k8s.io
Платформа Штурвал auth.shturval.tech, cluster.shturval.tech, node.shturval.tech, ops.shturval.tech, permissions.shturval.tech, update.shturval.tech
Observability observability.kaasops.io, operator.victoriametrics.com
  1. Проверка платформенных манифестов учитывает не только API-группу, но и права cluster-manager на действие с ресурсом. При отсутствии прав в статусе профиля появится ошибка проверки Secret, а профиль нельзя будет выбрать при создании клиентского кластера. Как расширить права, см. в разделе Если не хватает прав на платформенные манифесты.
  2. Создание профиля не применяет манифесты сразу. Манифесты из профиля применяются только при создании клиентского кластера, в котором выбран этот профиль.

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

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

Статус Значение
True, сообщение custom manifests not configured, в GUI Not Ready Кастомные манифесты не заданы. Профиль можно использовать
True, в GUI Ready Все найденные Secrets с манифестами прошли проверку. Профиль можно использовать
False, в GUI Not Ready Один или несколько Secrets не прошли проверку, либо по селектору не удалось найти Secrets
Статус не отображается Контроллер ещё не обработал профиль

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