Модуль управления конфигурациями узлов (shturval-node-config)

О сервисе

ПараметрЗначение
Название в интерфейсеМодуль управления конфигурациями узлов
Системное название (идентификатор)shturval-node-config
Назначение в кластереПрименение конфигурации узлов (NCI, NodeConfigItem) к машинам кластера: NTP, Container Runtime (в т. ч. реестры), sysctl, Kubelet, доверенные сертификаты и др.
КритическийДа
Публичный репозиторий— (компонент платформы «Штурвал»)
Зависимостиshturval-node-config-crds, shturval-networking
Неймспейсshturval-node-config-system

Настройка NCI в интерфейсе, селекторы, приоритеты и примеры разделов — на странице Конфигурация узлов (NCI).

Состояние сервиса можно посмотреть в интерфейсе: Сервисы и репозитории → Установленные сервисы → Модуль управления конфигурациями узлов (shturval-node-config) → Управлять.

Скриншоты страницы сервиса

Сервис shturval-node-config в списке установленных сервисов Страница управления сервисом shturval-node-config

Содержание

  1. Обзор
  2. Архитектура
  3. Установка / развёртывание
  4. Диагностика
  5. Жизненный цикл
  6. Параметры оператора и демона
  7. Справочник CRD/API

1. Обзор

shturval-node-config обеспечивает доставку и применение конфигурации узлов Kubernetes-кластера. Оператор управляет объектами конфигурации и безопасной перезагрузкой, а демон std применяет конфигурацию на узле, сообщает о необходимости перезагрузки и завершает её после разрешения со стороны оператора.

Место в цепочке управления

Администратор создаёт и изменяет объекты NodeConfigItem, оператор сопоставляет их с NodeConfig конкретных узлов, а демон std на каждом узле получает итоговую конфигурацию, применяет её и отражает состояние обратно в NodeConfig.status. При необходимости оператор выполняет cordon/drain и только после этого разрешает перезагрузку узла.

Сквозная последовательность (NCI → NodeConfig → демон, дрейн, перезагрузка, CSR) на схеме ниже; подробные шаги — в §5.

Сквозной сценарий (E2E)

2. Архитектура

В рабочей среде контроллер представлен двумя SSC:

  • shturval-node-config-crds — чарт CRD группы node.shturval.tech;
  • shturval-node-config — основной чарт модуля. (см. скриншот ниже)

Общая схема архитектуры, см. иллюстрацию ниже.

Архитектура <code>shturval-node-config</code>

Оператор shturval-node-config

Оператор управляет конфигурацией узлов кластера через CRD NodeConfig и NodeConfigItem, оркестрирует дрейн и перезагрузку и автоматически одобряет CSR для kubelet-serving.

Ключевые характеристики

ХарактеристикаЗначение
Группа APInode.shturval.tech
Версия APIv1beta2
Namespace развёртыванияshturval-node-config-system
Scope ресурсовCluster для NodeConfig и NodeConfigItem
Leader electionУправляется флагом --leader-elect, идентификатор nci.shturval.tech
МетрикиАдрес задаётся --metrics-bind-address, по умолчанию отключены (0)
Health probe:8081
WebhookMutating webhook, путь /mutate-node-shturval-tech-nodeconfig
HTTP/2По умолчанию отключён
Реплики по умолчанию2

Компоненты

КомпонентТип KubernetesНазначение
NodeConfigReconcilerControllerУправляет дрейном и перезагрузкой узла
NodeConfigItemReconcilerControllerРаспределяет шаблоны NodeConfigItem по NodeConfig
NodeReconcilerControllerПоддерживает соответствие Node ↔ NodeConfig
NodeCSRReconcilerControllerАвтоматически одобряет CSR kubelet-serving
NodeConfigItemAdmitterMutatingWebhookДобавляет служебные аннотации к NodeConfigItem

Демон std

std (shturvald) работает на каждом Linux-узле кластера. Он применяет объединённую конфигурацию узла, следит за локальным init-конфигом, синхронизирует состояние с объектом NodeConfig и выполняет перезагрузку только после разрешения от оператора.

Ключевые характеристики

ХарактеристикаЗначение
Имя бинарникаstd
Имя systemd unitshturvald.service
Путь unit-файла/etc/systemd/system/shturvald.service
Требуемые праваЗапуск только с root-доступом
kubeconfig по умолчанию/etc/kubernetes/kubelet.conf
Локальный init NCI/etc/std/nci.json
Кеш NCI/etc/std/caches/
Состояние применённых NCI/etc/std/applied/
Объединённый конфиг/etc/std/merged.json
Рабочая директория/etc/std/

Основные задачи

КомпонентНазначение
DaemonОсновной рабочий цикл, обработка сигналов и очереди
NodeReaderЧтение NodeConfig и NCI из кластера
NodeWriterЗапись статуса и условий в NodeConfig
WorkQueueОчередь синхронизации с периодическим повтором
fsnotifyОтслеживание изменений /etc/std/nci.json
configsyncerСинхронизация NCI из кластера в локальный кеш

Объекты в кластере

ОбъектыТипНазначение
Основной процесс оператораDeploymentВыполняет контроллеры и webhook
ServiceAccountServiceAccountУчётная запись процесса оператора
Права доступаClusterRole / ClusterRoleBindingДоступ к CRD, Node, CSR и связанным объектам
Webhook endpointMutating webhookАннотирует NodeConfigItem при CREATE и UPDATE
ConfigMap nci-controller-paramsConfigMapПередаёт обязательные переменные окружения для webhook

Внешние зависимости

СистемаНазначение
Kubernetes APIЧтение и обновление Node, NodeConfig, NodeConfigItem, CSR
Узлы кластераCordon, drain, uncordon и координация перезагрузки
cert-managerВыпуск TLS-сертификатов webhook при соответствующем варианте развёртывания

Демон shurvald (std)

Демон развёртывается непосредственно на Linux-узле и работает как системная служба. Он использует локальные файлы в /etc/std/, kubeconfig kubelet и очередь синхронизации для применения конфигурации и обмена состоянием с оператором.

Схемы демона

Логическая архитектура демона std на узле, см. иллюстрацию ниже.

Логическая архитектура демона <code>std</code> на узле

Схема показывает внутреннюю архитектуру демона на Linux-узле: systemd unit shturvald.service и fsnotify-наблюдатель за /etc/std/nci.json ставят задачи в rate-limited WorkQueue; worker goroutine через NodeReader читает NodeConfig и NCI из API кластера, объединяет конфигурацию в /etc/std/merged.json, применяет её к ОС (пакеты, файлы, kubelet, runtime, sysctl), а NodeWriter записывает статус и условия обратно в NodeConfig.

Поток обработки: конфигурация, применение, взаимодействие с NodeConfig, см. иллюстрацию ниже.

Поток обработки: конфигурация, применение, взаимодействие с <code>NodeConfig</code>

Компоненты на узле

КомпонентНазначение
shturvald.serviceПостоянный запуск демона как systemd unit
/etc/std/nci.jsonЛокальный стартовый NCI до подключения к кластеру
/etc/std/caches/Кеш NCI, полученных из кластера
/etc/std/applied/Локальное подтверждение уже применённых NCI
/etc/std/merged.jsonИтоговая объединённая конфигурация
/etc/kubernetes/kubelet.confДоступ к API кластера после присоединения узла

Связь оператора и демона

НаправлениеМеханизм
Оператор → демонПоля NodeConfig.spec, флаги rebootallowed и список nodeconfigitems
Демон → операторПоля NodeConfig.status, condition ConfigApplied, аннотация node.shturval.tech/initchecksum
Координация перезагрузкиЧерез rebootrequired, rebootscheduled, rebootallowed и состояние ncistate

3. Установка / развёртывание

shturval-node-config — критический сервис платформы. Включение и жизненный цикл контроллера в кластере обеспечивает cluster-manager (сервис платформы); объекты ShturvalServiceConfig (SSC) для связанных чартов создаются и сопровождаются как часть платформенной конфигурации, а не как произвольная ручная установка Helm-чарта администратором.

Агент std (shturvald) устанавливается платформой на узлы автоматически в рамках процесса подготовки узла (bootstrap). Отдельной ручной установки агента не требуется.

CRD, контроллеры и владение ресурсами:

Иллюстрация: 3. Установка / развёртывание

CRD, контроллеры и владение ресурсами


4. Диагностика

Оператор shturval-node-config

Быстрые проверки

kubectl get nc
kubectl get nci

Оператор публикует следующие печатаемые колонки для NodeConfig:

КолонкаСмысл
APPLY GROUPГруппа координации перезагрузок
READYВсе NCI применены, перезагрузка не требуется
REBOOT REQUIREDДемон запросил перезагрузку
REBOOT SCHEDULEDОператор поставил узел в очередь
REBOOT ALLOWEDОператор разрешил перезагрузку

Для NodeConfigItem доступны колонки:

КолонкаСмысл
PRIORITYПриоритет мержа
APPLIEDСоотношение UpdatedNodes/SelectedNodes
READYВсе выбранные NodeConfig обновлены
SELECTORСелектор сопоставления NodeConfig

Conditions ресурса NodeConfig

ConditionЧто означает TrueЧто означает False / что проверить
NodeDrainedДрейн завершён, не требуется или превышен таймаут дрейнаДрейн ещё идёт или завершился ошибкой
RebootScheduledУзел поставлен в очередь на перезагрузкуСлоты заняты или возник конфликт планирования
ConfigAppliedКонфигурация успешно примененаКонфигурация ещё применяется, завершилась ошибкой, обнаружено расхождение checksum, ошибка слияния или ожидание разрешения на перезагрузку

Обратите внимание! NodeDrained появляется только при rebootscheduled=true, а RebootScheduled появляется только при rebootrequired=true.

Демон std

Быстрые проверки

systemctl status shturvald
std node status
std node info

Если демон ещё не присоединился к кластеру, дополнительным ориентиром служит наличие файлов /etc/std/nci.json и /etc/kubernetes/kubelet.conf.

Состояния демона

СостояниеЗначение
WorkingВыполняется применение конфигурации
DoneКонфигурация успешно применена
UnreconcilableКонфигурацию нельзя привести в требуемое состояние
DegradedЗафиксирована ошибка, не связанная напрямую с конфигурацией

Аннотации, влияющие на диагностику

АннотацияНазначение
node.shturval.tech/initchecksumКонтрольная сумма /etc/std/nci.json для выявления расхождений между локальным init NCI и состоянием в кластере

Типичные эксплуатационные ситуации

СимптомВозможная причинаДействие
ConfigApplied=False с причиной ChecksumMismatchЛокальный /etc/std/nci.json не совпадает с checksum, записанной в NodeConfigСверить локальный init NCI и ожидаемую конфигурацию кластера
RebootScheduled=False с причиной SlotsOccupiedВ applygroup уже выполняется другая перезагрузкаДождаться освобождения слота и повторной попытки оператора
NodeDrained=False с причиной DrainFailedОператор не смог завершить дрейнПроверить блокирующие workload на узле и повторить обработку
Демон долго не выходит в рабочий режимОтсутствует /etc/std/nci.jsonПодготовить локальный init NCI
Демон не начинает синхронизацию с кластеромОтсутствует /etc/kubernetes/kubelet.confЗавершить присоединение узла к кластеру
std завершается сразу после запускаПроцесс запущен не от rootЗапустить демон от root или через systemd unit

Если после сверки локального init NCI и ожидаемой конфигурации кластера требуется повторно запустить применение конфигурации, удалите аннотацию node.shturval.tech/initchecksum, записанную в NodeConfig:

kubectl get nodeconfig <node-name> -o jsonpath='{.status}'
kubectl annotate nodeconfig <node-name> node.shturval.tech/initchecksum-

5. Жизненный цикл

Оператор shturval-node-config

Полный сценарий на одной схеме: см. также §1 — место в цепочке.

Контур Node → NodeConfig

АкторДействие
NodeReconcilerДля каждого Node поддерживает NodeConfig с тем же именем
NodeReconcilerКопирует метки узла в NodeConfig, назначает applygroup (workers или controlplane)
NodeReconcilerДля единственного control-plane узла устанавливает donotdrain=true
NodeReconcilerПри удалении Node удаляет связанный NodeConfig

Согласование Node и NodeConfig, см. иллюстрацию ниже.

Согласование <code>Node</code> и <code>NodeConfig</code>

Контур NodeConfigItem → NodeConfig

АкторДействие
АдминистраторСоздаёт или обновляет NodeConfigItem
NodeConfigItemReconcilerНаходит все NodeConfig, подходящие по nodeconfigselector
NodeConfigItemReconcilerДобавляет имя NCI в spec.nodeconfigitems выбранных NodeConfig
NodeConfigItemReconcilerОбновляет status.selectednodeconfigs, status.updatednodeconfigs, status.applied, status.ready
NodeConfigItemReconcilerПри удалении убирает имя NCI из соответствующих NodeConfig и снимает finalizer

Согласование NodeConfigItem и выбранных NodeConfig, см. иллюстрацию ниже.

Согласование <code>NodeConfigItem</code> и выбранных <code>NodeConfig</code>

Контур применения и перезагрузки

ШагАкторДействие
1ДемонПрименяет конфигурацию и при необходимости выставляет ncistate=updatepending
2ДемонУстанавливает rebootrequired=true
3ОператорОценивает политику дрейна по меткам узла и spec.donotdrain
4ОператорПланирует перезагрузку внутри applygroup; одновременно в группе допускается один узел
5ОператорВыполняет cordon и drain, после чего выставляет rebootallowed=true
6ДемонВыполняет перезагрузку или повторное применение без физической перезагрузки
7ДемонПосле возврата узла выставляет ncistate=applied
8ОператорСнимает reboot-флаги, выполняет uncordon и возвращает ready=true

Согласование NodeConfig в контуре применения и перезагрузки, см. иллюстрацию ниже.

Согласование <code>NodeConfig</code>

Согласование NodeConfig: дрейн:

Согласование NodeConfig: очередь перезагрузок:

Согласование NodeConfig: условия:

Политика дрейна

УсловиеПоведение
На Node есть метка node.shturval.tech/apply-as-isУзел не дренируется, перезагрузка разрешается сразу
На Node есть метка node.shturval.tech/disable-drainДрейн не выполняется, немедленная перезагрузка не разрешается
В NodeConfig.spec.donotdrain=trueУзел не дренируется, перезагрузка разрешается сразу
Особых условий нетВыполняются cordon и drain, затем выдаётся разрешение на перезагрузку

Финалайзеры

РесурсФиналайзерНазначение
NodeConfignode.shturval.tech/finalizerОчистка owner reference и корректное завершение удаления
NodeConfigItemnode.shturval.tech/finalizerУдаление ссылки на NCI из связанных NodeConfig

Демон std

Порядок запуска

ШагДействие
1Настраивает обработку сигналов
2Запускает commworker с периодом 60 секунд
3Начинает отслеживать /etc/std/nci.json через fsnotify
4При отсутствии /etc/std/nci.json переходит в цикл ожидания с опросом каждые 10 секунд
5Если nci.json уже есть, но kubeconfig отсутствует, выполняет NodePrepare()
6Запускает основной worker с периодом 60 секунд
7Ждёт появления /etc/kubernetes/kubelet.conf
8Проверяет доступ к API кластера
9Запускает NodeReader и NodeWriter

Цикл применения конфигурации

ШагДействие
1При наличии kubeconfig синхронизирует NodeConfig и кеш NCI из кластера
2Считает checksum локального /etc/std/nci.json
3Сверяет checksum с аннотацией node.shturval.tech/initchecksum
4Объединяет локальный init NCI и кешированные NCI в /etc/std/merged.json
5Применяет итоговую конфигурацию
6При результате NotRequired помечает NCI как Applied и ставит ConfigApplied=True
7При результате Reboot или DrainOnly помечает NCI как UpdatePending, выставляет rebootrequired=true и ждёт rebootallowed=true

Перезагрузка и повторное применение

СценарийПоведение
FullRebootДемон выполняет системную перезагрузку после разрешения от оператора
DrainOnlyПосле разрешения от оператора повторно применяет конфигурацию без физической перезагрузки

6. Параметры оператора и демона

Оператор shturval-node-config

Флаги процесса

ПараметрПо умолчаниюНазначение
--metrics-bind-address0Адрес endpoint метрик; 0 отключает метрики
--health-probe-bind-address:8081Адрес health probe
--leader-electfalseВключение leader election
--metrics-securetrueПубликация метрик по HTTPS
--enable-http2falseВключение HTTP/2
--debugfalseРежим отладочного логирования

Переменные окружения

ПеременнаяОбязательностьЗначение по умолчаниюНазначение
namespaceОбязательна—Namespace оператора для формирования имени ServiceAccount в webhook
serviceAccountNameОбязательна—Имя ServiceAccount оператора
disable-drain-label-keyНеобязательнаnode.shturval.tech/disable-drainКлюч метки отключения дрейна
apply-as-is-label-keyНеобязательнаnode.shturval.tech/apply-as-isКлюч метки немедленного reboot без дрейна

Демон std

Глобальные флаги CLI

ПараметрПо умолчаниюНазначение
--kubeconfig/etc/kubernetes/kubelet.confАльтернативный путь к kubeconfig; в рабочей эксплуатации используется системный kubeconfig узла
-v0Уровень подробности логирования
--logtostderrfalseВывод логов в stderr
--stderrthreshold2Минимальный уровень логов для stderr

Основные команды

КомандаНазначение
std daemonЗапуск основного цикла демона
std node init -f /etc/std/init.yamlПрисоединение узла к кластеру
std node prepareЛокальное применение init NCI без подключения к кластеру
std node preinitПодготовка init-файлов
std node resetСброс узла
std node statusПросмотр статуса применения конфигурации
std node infoПросмотр информации об узле
std versionПросмотр версии бинарника

Эксплуатационные ограничения

ОграничениеСледствие для администратора
Запуск std требует root-доступаДемон должен выполняться от root или через systemd unit
Файл /etc/kubernetes/kubelet.conf фиксирован как основной kubeconfigИзменение этого пути не относится к штатной эксплуатации и требует выпуска новой версии
При отсутствии /etc/std/nci.json демон только ожидает файлПеред вводом узла в работу нужно подготовить локальный init NCI
Повтор синхронизации очереди выполняется каждые 60 секундМежду изменением конфигурации и повторной попыткой может быть технологическая задержка

7. Справочник CRD/API

Группа API контура: node.shturval.tech, версия v1beta2.

NodeConfig

NodeConfig создаётся автоматически для каждого Node и не предназначен для ручного создания.

Характеристики ресурса

СвойствоЗначение
Short namenc
ScopeCluster
НазначениеПредставляет конфигурацию и статус применения для конкретного узла

spec

ПолеТипОбязательноеОписание
applygroupstringДаГруппа координации перезагрузок: workers или controlplane
donotdrainboolНетЗапрещает дрейн перед перезагрузкой
nodeconfigitems[]stringНетСписок имён NodeConfigItem, которые должны быть применены к узлу

status

ПолеТипОписание
ncistate[]NodeConfigItemReferenceСостояние применения каждого NCI: updatepending, scheduled, applied, orphaned
rebootrequiredboolДемон сообщил о необходимости перезагрузки
rebootscheduledboolОператор поставил узел в очередь на перезагрузку
rebootallowedboolОператор разрешил перезагрузку
updateinitnodeboolУзел выбран первым для Kubernetes upgrade
readyboolВсе NCI применены, перезагрузка не требуется
lastdrainstartedmetav1.TimeВремя начала последнего дрейна
conditions[]metav1.ConditionУсловия применения и перезагрузки

Conditions

ConditionЗначение TrueЗначение False
NodeDrainedДрейн завершён, не требуется или превысил таймаутДрейн ещё идёт или завершился ошибкой
RebootScheduledПерезагрузка запланированаСлоты заняты или возник конфликт планирования
ConfigAppliedКонфигурация примененаИдёт применение, произошла ошибка, обнаружено расхождение checksum, ошибка слияния или ожидание разрешения на перезагрузку

Пример

apiVersion: node.shturval.tech/v1beta2
kind: NodeConfig
metadata:
  name: node-1
  labels:
    kubernetes.io/os: linux
    node.shturval.tech/applygroup: workers
spec:
  applygroup: workers
  donotdrain: false
  nodeconfigitems:
    - packages-basic-install
    - kubelet-basic

NodeConfigItem

NodeConfigItem создаётся администратором и задаёт переиспользуемый шаблон конфигурации для группы узлов, выбранных по меткам.

Характеристики ресурса

СвойствоЗначение
Short namenci
ScopeCluster
НазначениеШаблон конфигурации, который применяется к набору NodeConfig по селектору

spec

ПолеТипОбязательноеОписание
nodeconfigselectormap[string]stringДаСелектор выбора NodeConfig
priorityuintНетПриоритет слияния конфигураций
kubeversionstringНетВерсия Kubernetes для upgrade по схеме init-node first
repositoriesReposНетРепозитории пакетов ОС
packagesPackagesНетПакеты ОС
filesFilesНетФайлы и директории
ntp*NTPНетNTP-серверы и часовой пояс
certificatesCertificatesНетCA/TLS сертификаты ОС
runtimecfg*ContainerRuntimeConfigНетКонфигурация containerd
kernelargumentsKernelArgumentsНетПараметры ядра
kernelmodulesKernelModulesНетМодули ядра
sysctl*SysctlНетПараметры sysctl
systemdunitsSystemdUnitsНетУправление systemd unit
usersUsersНетПользователи ОС
swap*SwapНетУправление swap
iptables*IptablesНетНастройки iptables
selinux*SelinuxНетРежим SELinux
kubecerts*KubeCertsНетРотация сертификатов Kubernetes
kubelet*KubeletНетПараметры kubelet
kubeapi*KubeAPIНетПараметры kube-apiserver, в том числе OIDC и authenticationConfiguration.jwt

status

ПолеТипОписание
selectednodeconfigs[]stringСписок NodeConfig, подходящих по селектору
updatednodeconfigs[]stringСписок NodeConfig, на которых NCI уже применён
readyboolВсе выбранные NodeConfig обновлены и список не пуст
appliedstringСтрока формата UpdatedNodes/SelectedNodes

Примеры

Минимальный пример установки пакетов:

apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: packages-basic-install
spec:
  nodeconfigselector:
    node-role.kubernetes.io/worker: ""
  packages:
    - name: chrony
      state: present
    - name: curl
      state: present

Пример настройки kubelet:

apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: kubelet-basic
spec:
  nodeconfigselector:
    node-role.kubernetes.io/worker: ""
  kubelet:
    cpuManagerPolicy: none
    memoryManagerPolicy: None
    maxPods: 110
    hairpinMode: promiscuous-bridge

OIDC и AuthenticationConfiguration

kube-apiserver проверяет пользователей по JWT-токену внешнего OIDC-провайдера.

Раньше OIDC в kube-apiserver настраивали флагами запуска: --oidc-issuer-url, --oidc-client-id и другими --oidc-*. Так можно было подключить только одного провайдера.

С Kubernetes 1.34 те же настройки задают файлом AuthenticationConfiguration (apiserver.config.k8s.io/v1). В файле список jwt: каждый элемент — отдельный провайдер со своим адресом издателя (issuer.url) и при необходимости своим адресом discovery (issuer.discoveryURL).

Флаги --oidc-* и путь к этому файлу (--authentication-config) нельзя задать одновременно: kube-apiserver не запустится.

Поля одного провайдера доступно задать в интерфейсе на странице Конфигурация узлов (NCI). Несколько провайдеров могут быть заданы только в манифесте.

В NCI:

  • spec.kubeapi.oidc — один провайдер, как в интерфейсе. Поле поддерживается, но конвертируется в одну запись JWT.
  • spec.kubeapi.authenticationConfiguration.jwt — список провайдеров.

Через API платформы в oidc можно передать несколько провайдеров: каждый элемент списка — отдельный издатель. У элемента могут быть несколько идентификаторов клиента (clientid), признак exist и discoveryURL. В объекте NCI в кластере эти элементы записываются в authenticationConfiguration.jwt.

Файл конфигурации в Kubernetes доступен с версии 1.34. Конфигурация с флагов --oidc-* на файл переодится только при обновлении Kubernetes до 1.36 или новее (версия — из образа kube-apiserver). Вне обновления режим не меняется. Ниже 1.36 остаются флаги.

После перехода на файл демон делает на узле следующее:

  1. Записывает конфигурацию в /etc/kubernetes/auth-config/authentication-config.yaml.
  2. В манифесте kube-apiserver указывает путь к этому файлу аргументом --authentication-config= и подключает каталог /etc/kubernetes/auth-config/, чтобы API-сервер читал файл.
  3. Удаляет старые флаги --oidc-*.

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

Если к узлу привязано несколько NCI, списки JWT из них объединяются.

  • Один и тот же issuer.url в двух NCI — в итоге остаётся описание из NCI с большим приоритетом.
  • Новый issuer.url — провайдер добавляется в список.
  • exist: false у записи с нужным URL — этого провайдера в итоговой конфигурации не будет. Если exist не указан или true — провайдер остаётся.

В одном NCI нельзя указать два одинаковых issuer.url. Сертификат CA должен быть в формате PEM. Иначе объект не сохранится.

Поле jwt[]Описание
existtrue или не задано — провайдер должен быть в файле; false — удалить запись с этим issuer.url
issuer.urlURL издателя токена (iss). То же, что oidc.issuerurl. В одном NCI значения уникальны
issuer.discoveryURLЕсли задан, документ OpenID Discovery берётся с этого адреса, а не с {issuer.url}/.well-known/openid-configuration. В URL нужно указать полный путь, включая /.well-known/openid-configuration. Должен отличаться от issuer.url
issuer.audiencesКто может быть аудиторией токена (aud). То же, что oidc.clientid
issuer.certificateAuthorityCA издателя в PEM. То же содержимое, что у oidc.cafile (там сертификат в base64)
claimMappings.usernameClaim и префикс имени пользователя. То же, что oidc.usernameclaim / usernameprefix
claimMappings.groupsClaim и префикс групп. То же, что oidc.groupsclaim / groupsprefix

Пример с одним oidc — на странице Конфигурация узлов (NCI). Несколько провайдеров:

apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: auth-config-nci
spec:
  nodeconfigselector:
    node-role.kubernetes.io/control-plane: ""
  kubeapi:
    authenticationConfiguration:
      jwt:
        - issuer:
            url: https://auth.example.com
            discoveryURL: https://discovery.example.com/.well-known/openid-configuration
            audiences:
              - backend
          claimMappings:
            username:
              claim: sub
              prefix: "shturval:"
            groups:
              claim: groups
              prefix: "shturval:"
        - issuer:
            url: https://sso.example.com
            audiences:
              - backend
          claimMappings:
            username:
              claim: sub
        - exist: false
          issuer:
            url: https://old-idp.example.com
          claimMappings:
            username:
              claim: sub
  priority: 100

Данные, которые демон пишет в NodeConfig

Аннотации

АннотацияНазначение
node.shturval.tech/initchecksumКонтроль расхождения между локальным init NCI и состоянием в кластере

Состояния применения

ЗначениеСмысл
WorkingКонфигурация применяется
DoneКонфигурация успешно применена
UnreconcilableКонфигурация не может быть приведена к требуемому состоянию
DegradedЗафиксирована эксплуатационная ошибка вне самой конфигурации