Конфигурация узлов (NCI)

На странице Конфигурация узлов кластера отображается перечень объектов Node Config Item (NCI) клиентского кластера. По умолчанию отображаются controlplane-init-config и generic-init-config, т.е. конфигурация, с которой был развернут кластер.

Создание NCI

Скриншот

ncimeta

Задайте название и приоритет NCI. Приоритет возрастает с увеличением числового значения.

Для применения NCI для всех Master-узлов в селекторе узлов добавьте лейбл с ключом node-role.kubernetes.io/control-plane. Поле “Значение” оставьте незаполненным.

Скриншот

ncinodeselect

Node Config Item (NCI) включает один или несколько элементов конфигурации. Визуально элементы представлены в виде настраиваемых блоков. Доступны следующие блоки:

  • NTP;
  • Container Runtime;
  • Параметры sysctl;
  • Репозитории пакетов;
  • Пакеты для установки;
  • Файлы и директории;
  • Системные сертификаты (настройка периода ротации системных сертификатов Kubecerts);
  • Доверенные сертификаты;
  • Параметры загрузчика ядра (grub);
  • Модули ядра (kernel modules);
  • Systemd-юниты;
  • Kubelet;
  • Пользователи.

Часть из этих элементов могут быть только в одном экземпляре (например, NTP), а часть – во множественном (например, директории или файлы).

Скриншот

ncis

После создания вы сможете отредактировать созданный NCI, добавить или удалить элементы конфигурации, а также изменить значения лейблов и приоритета.

Добавление NCI

Выполните следующие действия:

  1. На вкладке Узлы кластера нажмите кнопку Добавить NCI. Откроется форма настройки конфигурации.
  2. Введите название.
  3. Укажите список лейблов узлов, к которым будет применена конфигурация.

Для узлов ControlPlane пропишите в ключ node-role.kubernetes.io/control-plane. Если необходимо создать NCI для Worker-узлов, назначьте нужным Worker-узлам лейбл, затем добавьте этот лейбл в виде ключа в селекторе узлов конфигурации узлов (NCI). Это можно сделать из интерфейса клиентского кластера на странице Конфигурация узлов в разделе Администрирование или с помощью командного интерфейса.

Команда для установки лейбла: kubectl label node node-role.kubernetes.io/worker=""

Команда для просмотра лейблов узлов: kubectl get nodes --show-labels

  1. Введите приоритет конфигурации NCI. Значение по умолчанию – 100. Приоритет необходим для разрешения конфликта значений элементов разных NCI.
  2. Выберите те разделы, которые хотите конфигурировать из перечня.
  3. Нажмите Продолжить для перехода к заполнению данных каждого из выбранных разделов.

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

Для изменения перечня изменяемых объектов перейдите на шаг “Основные данные” и выделите дополнительные разделы/снимите выделение нажатием кнопки мыши на соответствующие названия разделов.

Конфигурация разделов NCI

NTP

Скриншот

ntp

В блоке NTP в поле “Список серверов NTP” необходимо добавить адреса корпоративных серверов: не менее одного сервера NTP. Для этого введите в поле IP-адрес или FDQN сервера. При необходимости измените значение по умолчанию для часового пояса.

Задайте имя сервиса NTP.

Для настройки NTP на узлах кластера при инсталляции (stc) можно указать параметры –timezone и –ntp-servers

Пример

--timezone=Europe/Moscow --ntp-servers=10.255.245.2,10.255.245.3

Кроме NTP также может быть использован chrony. Тогда в конфигурации вместо ntp.conf используется chrony.conf, при этом формат файла остаётся таким же.

Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  finalizers:
  - node.shturval.tech/finalizer
  name: ntp-example
spec:
  ntp:
    servers:
    - 0.ru.pool.ntp.org
    - 1.ru.pool.ntp.org
    timezone: "Europe/Moscow"
    ntpconfig: "/etc/ntp.conf"
  nodeconfigselector:
    kubernetes.io/os: linux

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Container Runtime

Скриншот

containerruntime

Container Runtime должен быть установлен на каждом узле кластера для обеспечения возможности kubelet запускать поды и контейнеры в них. Выполните следующие действия:

  1. Раскройте блок Container Runtime.
  2. Введите адрес и версию образа контейнера Pause.
  3. Настройте конфигурацию реестров контейнеров:
  • Раскройте блок Конфигурация реестров контейнеров. Реестр контейнеров позволяет хранить образы и управлять ими:
  • добавлять новые (push);
  • извлекать (pull);
  • преобразовывать имя образа в репозитории в его цифровое (digest) представление (resolve).
  • В качестве адреса локального репозитория введите FQDN репозитория, используемого в качестве зеркала для внешнего репозитория.
  • Введите ключ авторизации в локальном репозитории.
  • Введите адрес внешнего репозитория.
  • Нажмите кнопку Добавить.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: runtime
spec:
  nodeconfigselector:
    kubernetes.io/os: linux
  runtimecfg:
    cgroupdriver: systemd
    pauseimage: r.shturval.tech/pause:3.9
    registries:
    - capabilities:
      - resolve
      - pull
      host: https://yourhostname:443
      name: r.shturval.tech
  priority: 100

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Параметры sysctl

Скриншот

sysctl

Выполните следующие действия:

  1. Раскройте блок Параметры sysctl.
  2. Укажите список значений sysctl в формате ключ-значение.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: sysctl
spec:
  nodeconfigselector:
    kubernetes.io/os: linux
  sysctl:
    file: /etc/sysctl.d/90-shturval.conf
    param:
      kernel.panic: "10"
      kernel.panic_on_oops: "1"
      net.bridge.bridge-nf-call-iptables: "1"
      net.ipv4.ip_forward: "1"
      vm.max_map_count: "262144"
      vm.overcommit_memory: "1"
  priority: 100

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Репозитории пакетов

Скриншот

repositories

Выполните следующие действия:

  1. Раскройте блок Репозитории пакетов. В этом разделе настраивается подключение сетевых репозиториев, которые работают по протоколам HTTP, HTTPS, FTP.
  2. Выберите целевое состояние репозитория: Present или Absent.
  3. Введите URL-адрес репозитория.
  4. Введите значение публичного ключа репозитория.
  5. Введите URL-адрес ключа репозитория пакетов для получения публичного ключа.
  6. Включите проверку публичного ключа репозитория и использование SSL соединения для подключения к репозиторию – нажмите кнопку Да.
  7. Введите описание репозитория.
  8. Укажите файл, в котором был найден репозиторий.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  finalizers:
  - node.shturval.tech/finalizer
  name: repositories-example
spec:
  repositories:
  - name: corp-repo
    description: "Corp Linux repo"
    address: "https://repo.corp.domain.tld/repository/rpm"
    state: present
  nodeconfigselector:
    kubernetes.io/os: linux

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Пакеты для установки

Скриншот

forinstall

Для добавления пакетов для установки выполните следующие действия:

  1. Раскройте блок Пакеты для установки.
  2. Введите название пакета.
  3. Выберите целевое состояние пакета: Present или Absent.
  4. Введите необходимую версию пакета.
  5. Включите запрет обновления пакета или снятие запрета обновления перед установкой.
  6. Введите команды, которые должны будут быть запущены после установки пакета. При нажатии на + появится строка для ввода команды.
  7. Определите, есть ли обязательное условие, что команды, запущенные после установки пакета, должны выполниться успешно.
  8. Введите команды, которые должны будут быть запущены перед установкой пакета. При нажатии на + появится строка для ввода команды.
  9. Определите, есть ли обязательное условие, что команды, запущенные после перед установкой пакета, должны выполниться успешно.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  finalizers:
  - node.shturval.tech/finalizer
  name: packages-example
spec:
  packages:
  - name: jq
    state: present
  - name: mc
    state: absent
  nodeconfigselector:
    kubernetes.io/os: linux

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Файлы и директории

Скриншот

filesanddirectories

Для добавления файла или директории выполните следующие действия:

  1. Раскройте блок Файлы и директории.
  2. Введите путь к файлу или директории.
  3. Выберите тип: Файл или Директория.
  4. Введите значения прав доступа.
  5. Укажите владельца и группу.
  6. Введите содержимое файла, если выбран тип “Файл”.
  7. Введите необходимую версию пакета.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: directory
spec:
  files:
  - group: root
    mode: "0600"
    owner: root
    path: /etc/kubernetes
    type: directory
  nodeconfigselector:
    kubernetes.io/os: linux

Обратите внимание! При изменении имени директории происходит процесс создания новой директории с измененным именем. Директория с прежним именем не будет удалена.

Для заполнения других разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Обратите внимание! При размещении AuditPolicy KubeAPI-сервер будет перезапущен автоматически. Перед размещением проверяйте валидность YAML манифеста.

Чтобы настроить seccomp профиль воспользуйтесь инструкцией.

Системные сертификаты

Скриншот

kubecerts

Определите период ротации системных сертификатов Kubernetes. Это должно быть целочисленное значение в пределах от 7 до 365, по умолчанию период ротации 30 дней.

Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
    shturval.tech/name: kubecerts
spec:
  kubecerts:
    rotationperiod: 30
  nodeconfigselector:
    kubernetes.io/os: linux
  priority: 100

Доверенные сертификаты

Скриншот

certs

Для добавления доверенного сертификата выполните следующие действия:

  1. Нажмите Добавить доверенный сертификат.
  2. Выберите один из способов добавления сертификата: Из источника или Ручная загрузка.
    • Если выбрано Из источника, необходимо загрузить файл сертификата и указать имя.
    • Если выбрано Ручная загрузка, укажите URL-адрес и имя сертификата. Вы можете указать URL с указанием протокола (доступен https) или без прямого указания протокола. Если протокол не указан, укажите порт. Если протокол и порт не указаны, будет автоматически добавлен порт 443.
  3. Выберите статус сертификата: Подтвержден или Не подтвержден.
  4. Введите имя сертификата.

Использование центрами сертификации корневого сертификата будет возможно, если статус сертификата Подтвержден. Центры сертификации не смогут использовать корневой сертификат для подписания SSL-сертификатов, если статус корневого сертификата Не подтвержден.

Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: certs
spec:
  certificates:
  - exist: true
    name: cert.crt
    url: https://example.com/corp_ca.crt
  nodeconfigselector:
    kubernetes.io/os: linux

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Параметры загрузчика ядра

Эта конфигурация меняет (добавляя или удаляя параметры) файл /etc/default/grub, генерирует конфигурацию grub и перезапускает узел для применения настроек.

Скриншот

args

Для добавления загрузочных параметров ядра выполните следующие действия:

  1. Нажмите Добавить аргумент ядра.
  2. Выберите наличие или отсутствие параметров ядра в загрузчике.
  3. Введите название и значение параметра ядра.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  finalizers:
  - node.shturval.tech/finalizer
  name: kernelarg-example
spec:
  kernelarguments:
  - param: "GRUB_TIMEOUT"
    value: "1"
    exist: true
  nodeconfigselector:
    kubernetes.io/os: linux

Модули ядра

Скриншот

modules

  1. Нажмите Добавить модуль ядра.
  2. Задайте имя модуля ядра. Это обязательное поле.
  3. Задайте имя файла с опциями.
  4. Определите, заблокирован ли модуль ядра.
  5. Определите, включена ли автозагрузка модуля ядра.

Пример параметра ядра в загрузчике GRUB_DISABLE_RECOVERY

Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  finalizers:
  - node.shturval.tech/finalizer
  name: kernelmodule-example
spec:
  kernelmodules:
  - name: "br_netfilter"
    autoload: true
  - name: "zram"
    blacklist: true
  nodeconfigselector:
    kubernetes.io/os: linux

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Systemd-юниты

Скриншот

systemd

Для добавления настройки systemd-юнитов выполните следующие действия:

  1. Раскройте блок Systemd-юниты.
  2. Включите запуск сервиса, в том числе при запуске ОС.
  3. Введите название systemd unit.
  4. Нажмите кнопку Добавить
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
spec:
  nodeconfigselector:
    kubernetes.io/os: linux
  systemdunits:
  - active: true
    enabled: true
    name: containerd
  - active: true
    enabled: true
    name: kubelet

Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Kubelet

Скриншот

kubelet

В разделе Kubelet доступны следующие поля для заполнения:

  1. Политика управления CPU. Это поле представляет стратегию, применяемую kubelet для управления распределением ресурсов процессора для запущенных на узле контейнеров.

Например:

  • none - должен распределять CPU по принципу совместного использования, CPU может быть использован подами в соответствии с их ограничениями, без каких-либо гарантий привязки CPU.
  • static - предоставлять уникальные CPU-ядра для подов.
  1. Политика управления RAM. Это поле представляет стратегию, применяемую kubelet для управления распределением ресурсов памяти для запущенных на узле контейнеров.

Например:

  • none - общий способ управления памятью.
  • static - гарантирует строгое соответствие адресного пространства памяти.
  1. Параметры управления CPU. Это поле позволяет установить дополнительные параметры для управления процессором, например, использование определенных ядер.

Например:

  • “cpu_hard_limit” : “2” - устанавливает жесткое ограничение на использование CPU в 2.
  • “cpu_soft_limit” : “1” - устанавливает мягкое ограничение на использование CPU в 1. Здесь левая часть вводится в виде ключа, правая в виде значения. Использование кавычек не требуется.
  1. HairpinMode. Это поле определяет, как Kubelet настроит контейнерный мост для обработки hairpin-пакетов, которые идут между двумя подами на одном и том же узле.

Доступные значения:

  • HairpinVeth - hairpin мод канала включается;
  • HairpinNone - hairpin мод канала выключен;
  • PromiscuousBridge - все внутренние трафик устройства помещается в promiscuous mode (Включено по умолчанию).
  1. MaxPods. Это поле задает максимальное количество подов, которые могут быть запущены с этой настройкой Kubelet.

Например:

  • 150 - Максимальное количество подов - 150.
  • 200 - Максимальное количество подов - 200.
  1. nodeStatusUpdateFrequency. Это поле определяет частоту, с которой kubelet вычисляет и обновляет состояние узла.

Например:

  • 10 s - обновление статуса узла каждые 10 секунд;
  • 1 m - обновление статуса узла каждую минуту;
  1. HTTPCheckFrequency. Это поле определяет период между проверками http для получения новых данных.

Например:

  • 30 s - Период между проверками http для получения новых данных - 30 секунд.
  • 1 m - Период между проверками http для получения новых данных - 1 минута.
  1. StaticPodURL. URL для доступа к настройкам статических подов. Например: http://example.com/static_pods.

  2. ProtectKernelDefaults. Если этот параметр включен, Kubelet выдаст ошибку, если флаги ядра не соответствуют ожиданиям.

Доступные значения:

  • да - ошибка Kubelet, если флаги ядра не соответствуют ожиданиям;
  • нет - нет проверки флагов ядра.
  1. ServerTLSBootstrap. При включении этого параметра kubelet будет автоматически запускать серверные сертификаты. Включение этого параметра приведет к включению параметра RotateCertificates.

Доступные значения:

  • да - включает автозапуск сертификата сервера.
  • нет - отключает автозапуск сертификата сервера.
  1. Способ управления. Это поле определяет стратегию, которую Kubelet должен применять при принятии решений о привязке ресурсов.

Доступные значения:

  • restricted: Нестандартные поды будут отклонены, которые не могут удовлетворить правильное выполнения карты вычислений топологии, если таковой имеется.
  • best-effort: Нестандартные поды будут запущены в режиме best-effort. Они будут ограничены в ресурсах, если их не хватит для удовлетворения распределения по узлам kubelet.
  • none: Топология ресурсов не будет учитываться при запуске подов.
  • single-numa-node: Поды будут размещены так, чтобы их ресурсы были распределены внутри одного NUMA узла.
  1. Стратегия обнаружения изменения ресурсов. Это поле определяет стратегию для отслеживания изменений в ConfigMaps и Secrets.

Доступные значения:

  • Get: настройка считывает ресурсы при каждом событии обновления.
  • Cache: Ресурсы кэшируются при обновлении ресурса для дальнейшего использования.
  • Watch: Сервер APIServer Kubernetes шлет уведомления о доступных обновлениях.
  1. EnableServer. При включении этого параметра Kubelet будет работать в безопасном режиме сервера.

Доступные значения:

  • Да: Включает защищенный сервер Kubelet.
  • Нет: Отключает защищенный сервер Kubelet.
  1. StaticPodPath. Это поле задает путь к статическому поду или репозиторию со статическим подом.

Например:

  • /мой/путь/к/static/pod: определяет путь к каталогу, где располагаются манифесты статических подов.
  • /home/user/my_static_pods: указывает каталог, в котором хранятся манифесты статических подов.
  1. SyncFrequency. Это поле определяет максимальное время между синхронизацией контейнеров и конфигураций.

Например:

  • 30 s: Время между синхронизаций контейнеров и конфигураций составляет 30 секунд.
  • 2 m: Время между синхронизаций контейнеров и конфигураций составляет 2 минуты.
  1. FileCheckFrequency. Это поле задает время между проверками файлов конфигурации на наличие изменений.

Например:

  • 10 s: Время между проверками файлов конфигураций на наличие изменений составляет 10 секунд.
  • 1 m: Время между проверками файлов конфигураций на наличие изменений составляет 1 минуту.
  1. StaticPodURLHeader. Это поле позволяет настроить заголовки HTTP, используемые для доступа к URL статического пода.

Например:

  • {“X-Api-Key”: “123xyz” }: заголовки HTTP для доступа к URL статического пода содержат ключ API.
  • {“Authorization”: “Basic QWxhZGRpbjpPcGVuU2VzYW1l”}: заголовки HTTP для доступа к URL статического пода содержат базовую авторизацию.
  1. Address. Это поле определяет IP-адрес, на котором должен работать Kubelet.

Например:

  • 192.168.1.1: Kubelet будет работать на IP-адресе 192.168.1.1.
  • 10.0.0.1: Kubelet будет работать на IP-адресе 10.0.0.1.
  1. CgroupDriver. Это поле определяет, какой драйвер CGroups должен использовать Kubelet.
  • systemd: Kubelet использует систему systemd для управления группами.

  • cgroupfs: Kubelet использует файловую систему cgroupfs для управления группами.

  • RotateCertificates. Включение этого параметра активирует автоматическую ротацию сертификатов для Kubelet.

Доступные значения:

  • Да: Включает ротацию сертификатов для Kubelet.
  • Нет: Отключает ротацию сертификатов для Kubelet.
  1. EnableProfilingHandler. При включении этого параметра, профилирование через хост host:port/debug/pprof/ становится доступным.

Доступные значения:

  • Да: Включает профилирование через хост host:port/debug/pprof/
  • Нет: Отключает профилирование.
  1. TLSMinVersion. Это поле определяет минимальную поддерживаемую версию протокола TLS.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: cpu-pinning
spec:
  kubelet:
    cpuManagerPolicy: static
    featureGates:
      CPUManager: true
      CPUManagerPolicyOptions: true
      CPUManagerPolicyAlphaOptions: true
      CPUManagerPolicyBetaOptions: true 
    cpuManagerPolicyOptions:
      align-by-socket: "true"
      distribute-cpus-across-numa: "true"
      full-pcpus-only: "true"
    reservedSystemCPUs: 0-1
  nodeconfigselector:
    node-role.kubernetes.io/control-plane: ""
  priority: 100

Чтобы настроить CPU Pinning воспользуйтесь инструкцией. Для продолжения заполнения разделов нажмите “Продолжить”. Если вы закончили заполнение разделов, нажмите “Завершить”.

Пользователи

Скриншот

users

В этом разделе можно создать одного или нескольких пользователей. Нажмите + для добавления нового пользователя.

Доступны поля для заполнения:

  • Введите имя пользователя. Это обязательное поле. Здесь запрашивается имя пользователя для подключения к узлу по SSH.
  • Путь до домашней директории пользователя
  • Shell. Определите путь до командной оболочки. Например, /bin/bash.
  • Группа. Введите название локальной группы в Linux.
  • Добавить публичный SSH ключ пользователя. Поле появляется при нажатии на +. Можно добавить несколько ключей.
Пример
apiVersion: node.shturval.tech/v1beta2
kind: NodeConfigItem
metadata:
  name: users
spec:
  nodeconfigselector:
    node-role.kubernetes.io/control-plane: ""
  users:
  - group: etcd
    homedir: ""
    shell: /sbin/nologin
    username: etcd
  priority: 100    

Просмотр и изменение конфигурации узлов (NCI)

Созданные NCI отображаются в виде списка на странице Конфигурация узлов в разделе Кластер/Администрирование.

Для просмотра нажмите на название NCI в списке.

Вкладка NCI содержит разделы, в которых есть пользовательские настройки, отображаются доступными для управления/просмотра. Незаполненные разделы отображаются отключенными. При необходимости изменения данных раздела нажмите Управлять в блоке с названием раздела. Вы попадете на страницу, содержащую сведения о разделах.

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

Для сохранения изменений в NCI необходимо на странице NCI нажать кнопку Сохранить. Обратите внимание, название NCI неизменяемое.

NCI можно изменить с помощью YAML манифеста. Для этого перейдите на вкладку Манифест и внесите изменения. После изменения манифеста выполните проверку. Результат проверки будет доступен в правой части экрана. Раскройте блок результата проверки, чтобы увидеть полный манифест. Если валидация формата манифеста NCI не пройдена, проверка манифеста будет недоступна.

Сохраните изменения, внесенные в манифест. Несохраненные данные не будут применены.

На вкладке Узлы приведен перечень узлов кластера, для которых настроена конфигурация (NCI). Информация на вкладке позволяет убедиться в применении или возникновении ошибок применения NCI на запланированных узлах кластера. По нажатию на имя узла вы можете перейти на страницу просмотра узла.