Модуль управления конфигурациями узлов (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.

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

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

Компоненты

Компонент Тип Kubernetes Назначение
NodeConfigReconciler Controller Управляет дрейном и перезагрузкой узла
NodeConfigItemReconciler Controller Распределяет шаблоны NodeConfigItem по NodeConfig
NodeReconciler Controller Поддерживает соответствие NodeNodeConfig
NodeCSRReconciler Controller Автоматически одобряет CSR kubelet-serving
NodeConfigItemAdmitter MutatingWebhook Добавляет служебные аннотации к NodeConfigItem

Демон std

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

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

Характеристика Значение
Имя бинарника std
Имя systemd unit shturvald.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
ServiceAccount ServiceAccount Учётная запись процесса оператора
Права доступа ClusterRole / ClusterRoleBinding Доступ к CRD, Node, CSR и связанным объектам
Webhook endpoint Mutating webhook Аннотирует NodeConfigItem при CREATE и UPDATE
ConfigMap nci-controller-params ConfigMap Передаёт обязательные переменные окружения для 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, затем выдаётся разрешение на перезагрузку

Финалайзеры

Ресурс Финалайзер Назначение
NodeConfig node.shturval.tech/finalizer Очистка owner reference и корректное завершение удаления
NodeConfigItem node.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-address 0 Адрес endpoint метрик; 0 отключает метрики
--health-probe-bind-address :8081 Адрес health probe
--leader-elect false Включение leader election
--metrics-secure true Публикация метрик по HTTPS
--enable-http2 false Включение HTTP/2
--debug false Режим отладочного логирования

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

Переменная Обязательность Значение по умолчанию Назначение
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 узла
-v 0 Уровень подробности логирования
--logtostderr false Вывод логов в stderr
--stderrthreshold 2 Минимальный уровень логов для 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 name nc
Scope Cluster
Назначение Представляет конфигурацию и статус применения для конкретного узла

spec

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

status

Поле Тип Описание
ncistate []NodeConfigItemReference Состояние применения каждого NCI: updatepending, scheduled, applied, orphaned
rebootrequired bool Демон сообщил о необходимости перезагрузки
rebootscheduled bool Оператор поставил узел в очередь на перезагрузку
rebootallowed bool Оператор разрешил перезагрузку
updateinitnode bool Узел выбран первым для Kubernetes upgrade
ready bool Все NCI применены, перезагрузка не требуется
lastdrainstarted metav1.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 name nci
Scope Cluster
Назначение Шаблон конфигурации, который применяется к набору NodeConfig по селектору

spec

Поле Тип Обязательное Описание
nodeconfigselector map[string]string Да Селектор выбора NodeConfig
priority uint Нет Приоритет слияния конфигураций
kubeversion string Нет Версия Kubernetes для upgrade по схеме init-node first
repositories Repos Нет Репозитории пакетов ОС
packages Packages Нет Пакеты ОС
files Files Нет Файлы и директории
ntp *NTP Нет NTP-серверы и часовой пояс
certificates Certificates Нет CA/TLS сертификаты ОС
runtimecfg *ContainerRuntimeConfig Нет Конфигурация containerd
kernelarguments KernelArguments Нет Параметры ядра
kernelmodules KernelModules Нет Модули ядра
sysctl *Sysctl Нет Параметры sysctl
systemdunits SystemdUnits Нет Управление systemd unit
users Users Нет Пользователи ОС
swap *Swap Нет Управление swap
iptables *Iptables Нет Настройки iptables
selinux *Selinux Нет Режим SELinux
kubecerts *KubeCerts Нет Ротация сертификатов Kubernetes
kubelet *Kubelet Нет Параметры kubelet
kubeapi *KubeAPI Нет Параметры kube-apiserver

status

Поле Тип Описание
selectednodeconfigs []string Список NodeConfig, подходящих по селектору
updatednodeconfigs []string Список NodeConfig, на которых NCI уже применён
ready bool Все выбранные NodeConfig обновлены и список не пуст
applied string Строка формата 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

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

Аннотации

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

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

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