Как обновить лицензию

Загрузка новой лицензии в платформу.

Общие шаги

  1. Получите лицензию от поставщика (CE — через Telegram-бот или форму; Enterprise — по договору).
  2. Обновите лицензию в платформе в зависимости от типа контура.
  3. Убедитесь, что лицензия применена (проверьте статус на странице «О системе»).

В закрытом контуре, пока лицензия действует, достаточно обновить ShturvalServicePatch (SSP) для shturval-backend. shturval-backend должен работать в режиме управления Авто (auto): при изменении конфигурации обновления сервиса применяются автоматически. В ручном (manual) режиме обновление лицензии не выполнится.

В открытом контуре и/или если срок действия лицензии истек, выполните шаги инструкции, описанные на вкладке Открытый контур/истёкшая лицензия. Если лицензия истекла, графический интерфейс может стать недоступным после применения SSP, поэтому остальные изменения выполните в консоли.

Пока срок действия лицензии не истек, для её обновления достаточно инструкции на этой вкладке. Если лицензия уже истекла, перейдите к инструкции на вкладке Открытый контур/истёкшая лицензия.

  1. Подключитесь к кластеру управления.
  2. Перейдите в Сервисы и репозитории → Установленные сервисы.
  3. Найдите Модуль программного управления Платформой (shturval-backend).
  4. Откройте Управлять → вкладка Сервис или Примененные ShturvalServicePatch.
  5. Создайте ShturvalServicePatch (SSP) для shturval-backend, указав новый номер лицензии в customvalues. Либо используйте Импорт манифестов для загрузки SSP с лицензией.
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-backend-license
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    license_token: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
license_tokenНовый лицензионный токен JSON Web Token (JWT), полученный от команды платформы «Штурвал»stringeyJhbm5lciI
  1. Дождитесь статуса сервиса Patched.
  2. Перезапустите поды shturval-backend. С дашборда неймспейса shturval-backend перейдите на страницу нагрузки с именем shturval-backend, откройте вкладку Pods. Удалите поды с именем shturval-backend.
  3. Дождитесь перезапуска подов.
  4. Проверьте лицензию на странице «О системе» (стартовая страница веб-интерфейса). Если узел передаёт лицензию в реестр, проверьте, что на нём применилась новая авторизация: на странице узла во вкладке Конфигурация узла нет статуса Не применено, а строка Authorization в /etc/containerd/certs.d/<имя-реестра>/hosts.toml совпадает с полем license в NCI. В выводе есть токен. В кластере у NodeConfig этого узла в колонке READY должно быть True:
kubectl get nodeconfig <имя-узла>

Если срок действия лицензии истек и/или платформа в открытом контуре:

  1. Примените SSP к shturval-backend.
  2. Снимите запрет на изменение лицензии в ClusterConfig.
  3. Замените лицензию в ClusterConfig.
  4. Верните проверку ClusterConfig.
  5. Замените лицензию в ClusterProfile.
  6. Для кластеров с провайдером Shturval v2 замените лицензию в ShturvalProvider.
  7. Замените лицензионный токен в NodeConfigItem.
  8. Замените лицензионный токен в /etc/std/nci.json на узлах и аннотацию NodeConfig.

Если в закрытом контуре срок действия лицензии истек, выполните шаги 1–5: SSP, ClusterConfig и ClusterProfile. При этом графический интерфейс после применения SSP и перезапуска подов может быть недоступен — используйте CLI.

Шаг 1. Применить SSP shturval-backend

  1. Подключитесь к кластеру управления в консоли.
  2. Сохраните манифест и примените SSP:
kubectl apply -f shturval-backend-license.yaml
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-backend-license
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    license_token: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
license_tokenНовый лицензионный токен JSON Web Token (JWT), полученный от команды платформы «Штурвал»stringeyJhbm5lciI
  1. Проверьте, что объект создан: kubectl get shturvalservicepatch shturval-backend-license.
  2. Перезапустите поды shturval-backend в неймспейсе shturval-backend и дождитесь, пока они станут готовы:
kubectl -n shturval-backend rollout restart deployment shturval-backend
kubectl -n shturval-backend rollout status deployment shturval-backend

Шаг 2. Снять запрет на смену лицензии в ClusterConfig

Изменение лицензии в ClusterConfig в кластере управления запрещают два webhook этого ресурса. Чтобы снять запрет, выполните:

  1. Сохраните YAML объектов, которые будете менять: webhook ClusterConfig, deployment shturval-cluster-manager-cluster-manager, ClusterConfig, ClusterProfile, ShturvalProvider (если кластер с провайдером Shturval v2), NodeConfigItem и NodeConfig (для закрытого контура).
kubectl get mutatingwebhookconfiguration,validatingwebhookconfiguration -o yaml > backup-webhooks.yaml
kubectl -n shturval-cluster-manager get deployment shturval-cluster-manager-cluster-manager -o yaml > backup-cluster-manager.yaml
kubectl get clusterconfig -A -o yaml > backup-clusterconfig.yaml
kubectl get clusterprofile -n kube-system -o yaml > backup-clusterprofile.yaml
kubectl get shturvalprovider -o yaml > backup-provider.yaml
kubectl get nodeconfigitem -o yaml > backup-nci.yaml
kubectl get nodeconfig -o yaml > backup-nodeconfig.yaml

Пропустите ShturvalProvider, если в платформе нет провайдера Shturval v2. NodeConfigItem и NodeConfig клиентского кластера получите теми же командами get с kubeconfig этого кластера.

  1. Снимите запрет и остановите cluster-manager. Запомните, что у обоих webhook было failurePolicy: Fail, и прежнее количество реплик. Webhook профиля в том же объекте не меняйте.
  1. Откройте Администрирование → Кастомные ресурсы → API-группа admissionregistration.k8s.io → MutatingWebhookConfiguration.
  2. Откройте shturval-cluster-manager-mutating-webhook-configuration.
  3. В манифесте найдите name: defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech. Строка failurePolicy этого webhook стоит над именем. Замените Fail на Ignore.
  4. Нажмите Проверить, затем Сохранить.
  5. Вернитесь на страницу Кастомные ресурсы и найдите ValidatingWebhookConfiguration → перейдите к shturval-cluster-manager-validating-webhook-configuration. У webhook vclusterconfig-v1beta1.kb.io замените failurePolicy на Ignore.
  6. Нажмите Проверить, затем Сохранить.
  7. Откройте Неймспейсы → shturval-cluster-manager → Нагрузки → Deployments → shturval-cluster-manager-cluster-manager.
  8. На вкладке Deployment запомните количество реплик, укажите 0 и сохраните.
  9. На вкладке Pods дождитесь, пока поды удалятся.
  1. Найдите webhook. Имя объекта — строка без отступа. Под ней перечислены его webhook. Если нужное имя стоит первым под объектом, в команде индекс 0. Если вторым — 1. Соседнюю строку с профилем не меняйте.
kubectl get mutatingwebhookconfiguration -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .webhooks[*]}{"  "}{.name}{"\t"}{.failurePolicy}{"\n"}{end}{end}'
kubectl get validatingwebhookconfiguration -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .webhooks[*]}{"  "}{.name}{"\t"}{.failurePolicy}{"\n"}{end}{end}'

В первой команде найдите defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech. Во второй — vclusterconfig-v1beta1.kb.io.

  1. Задайте failurePolicy: Ignore только этим двум webhook. Подставьте имя объекта и индекс:
kubectl patch mutatingwebhookconfiguration <имя> --type json -p '[{"op":"test","path":"/webhooks/<индекс>/name","value":"defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech"},{"op":"replace","path":"/webhooks/<индекс>/failurePolicy","value":"Ignore"}]'
kubectl patch validatingwebhookconfiguration <имя> --type json -p '[{"op":"test","path":"/webhooks/<индекс>/name","value":"vclusterconfig-v1beta1.kb.io"},{"op":"replace","path":"/webhooks/<индекс>/failurePolicy","value":"Ignore"}]'
  1. Запомните текущее количество реплик и остановите deployment:
kubectl -n shturval-cluster-manager get deployment shturval-cluster-manager-cluster-manager -o jsonpath='{.spec.replicas}{"\n"}'
kubectl -n shturval-cluster-manager scale deployment/shturval-cluster-manager-cluster-manager --replicas=0
  1. Дождитесь, пока поды этого deployment удалятся:
kubectl -n shturval-cluster-manager get pods

Шаг 3. Обновить лицензию в ClusterConfig

ClusterConfigs всех кластеров доступны в кластере управления. Имя объекта и его неймспейс совпадают с именем кластера. Лицензия — поле spec.license. Подробнее в Кастомные ресурсы платформы.

Замените spec.license в ClusterConfig кластера управления и каждого клиентского кластера. Если лицензия истекла, графический интерфейс недоступен — используйте CLI.

  1. Подключитесь к кластеру управления.
  2. Откройте Администрирование → Кастомные ресурсы → API-группа cluster.shturval.tech → ClusterConfig.
  3. В манифесте каждого ClusterConfig замените spec.license на новый токен.
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterConfig
metadata:
  name: clustername
  namespace: clustername
spec:
  license: <новый токен>
  1. Подключитесь к кластеру управления.
  2. Откройте список: kubectl get clusterconfig -A.
  3. Подставьте имя кластера вместо clustername и повторите команду для каждого кластера:
kubectl patch clusterconfig clustername -n clustername --type merge -p '{"spec":{"license":"<новый токен>"}}'

Шаг 4. Вернуть проверку ClusterConfig

Верните deployment и webhook в прежнее состояние.

  1. Откройте Неймспейсы → shturval-cluster-manager → Нагрузки → Deployments → shturval-cluster-manager-cluster-manager.
  2. На вкладке Deployment верните прежнее количество реплик и сохраните. Дождитесь, пока поды станут Ready.
  3. Откройте Администрирование → Кастомные ресурсы → API-группа admissionregistration.k8s.io → MutatingWebhookConfiguration.
  4. Найдите и перейдите к shturval-cluster-manager-mutating-webhook-configuration.
  5. В манифесте найдите name: defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech. Строка failurePolicy этого webhook стоит над именем. Замените Ignore на Fail.
  6. Нажмите Проверить, затем Сохранить.
  7. Откройте ValidatingWebhookConfiguration → shturval-cluster-manager-validating-webhook-configuration. У webhook vclusterconfig-v1beta1.kb.io замените failurePolicy на Fail.
  8. Нажмите Проверить, затем Сохранить.
  1. Проставьте прежнее количество реплик и дождитесь готовности:
kubectl -n shturval-cluster-manager scale deployment/shturval-cluster-manager-cluster-manager --replicas=<прежнее число>
kubectl -n shturval-cluster-manager rollout status deployment/shturval-cluster-manager-cluster-manager --timeout=180s
  1. Верните failurePolicy: Fail у webhook defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech в объекте shturval-cluster-manager-mutating-webhook-configuration и у webhook vclusterconfig-v1beta1.kb.io в объекте shturval-cluster-manager-validating-webhook-configuration. Подставьте имя объекта и индекс:
kubectl patch mutatingwebhookconfiguration <имя> --type json -p '[{"op":"test","path":"/webhooks/<индекс>/name","value":"defaulting-webhook-clusterconfig-v1beta1.cluster.shturval.tech"},{"op":"replace","path":"/webhooks/<индекс>/failurePolicy","value":"Fail"}]'
kubectl patch validatingwebhookconfiguration <имя> --type json -p '[{"op":"test","path":"/webhooks/<индекс>/name","value":"vclusterconfig-v1beta1.kb.io"},{"op":"replace","path":"/webhooks/<индекс>/failurePolicy","value":"Fail"}]'

Шаг 5. Обновить лицензию в ClusterProfile

Профили кластера (ClusterProfile) доступны в неймспейсе kube-system кластера управления. Лицензия — поле spec.license. Изменение spec.license в ClusterConfig не обновляет профили автоматически. См. Что такое профили кластеров (ClusterProfile).

Изменение профиля не применяет изменения в созданных клиентских кластерах.

В графическом интерфейсе изменение default-client-cluster-profile заблокировано. Этот профиль обновите в CLI. Остальные поля профиля не меняйте. Если лицензия истекла, графический интерфейс недоступен.

  1. Откройте Платформа → Профили кластеров → Профили конфигурации клиентских кластеров → на странице профиля вкладка Манифест.
  2. В каждом кастомном профиле, где spec.license заполнен, замените токен.
apiVersion: cluster.shturval.tech/v1beta1
kind: ClusterProfile
metadata:
  name: <имя-профиля>
  namespace: kube-system
spec:
  license: <новый токен>
  1. Откройте список профилей: kubectl get clusterprofile -n kube-system.
  2. Подставьте имя профиля вместо <имя-профиля> и повторите команду для каждого профиля, где spec.license заполнен, включая default-client-cluster-profile:
kubectl patch clusterprofile <имя-профиля> -n kube-system --type merge -p '{"spec":{"license":"<новый токен>"}}'

Шаг 6. Обновить лицензию в ShturvalProvider

Шаг только для провайдера Shturval v2. Новый хост скачивает пакет shturvald с реестра r.shturval.tech: логин user, пароль — spec.licenseToken. В файл /etc/std/nci.json на узле этот пароль не записывается. См. Создание ShturvalProvider.

Замените лицензию во всех ShturvalProvider в кластере управления.

  1. Подключитесь к кластеру управления.
  2. Откройте Администрирование → Кастомные ресурсы → API-группа infrastructure.cluster.x-k8s.io → ShturvalProvider.
  3. В каждом объекте, где spec.licenseToken отличается от нового токена, замените только это поле.
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: ShturvalProvider
metadata:
  name: <имя-провайдера>
spec:
  licenseToken: <новый токен>
  1. Подключитесь к кластеру управления.
  2. Откройте список: kubectl get shturvalprovider.
  3. Подставьте имя провайдера и повторите команду для каждого объекта, где токен отличается:
kubectl patch shturvalprovider <имя-провайдера> --type merge -p '{"spec":{"licenseToken":"<новый токен>"}}'

Шаг 7. Обновить токен в NodeConfigItem

В открытом контуре лицензия лежит в NodeConfigItem (NCI) generic-init-config, в разделе Container Runtime: реестр r.shturval.tech, поле Авторизация для репозитория (spec.runtimecfg.registries[].license).

В поле запишите Basic и через пробел результат команды. Кодируется строка user:<лицензия> целиком: логин реестра user, пароль — лицензия.

echo -n 'user:<лицензия>' | base64 -w 0

Изменения потребуется внести в NCI в кластере управления и в каждом клиентском кластере платформы. Kubeconfig клиентского кластера хранится в кластере управления Secret <имя-кластера>-kubeconfig неймспейса <имя-кластера>. См. Доступ к дочерним кластерам.

  1. Откройте кластер → Администрирование → Конфигурация узлов.
  2. Откройте NCI generic-init-config.
  3. В разделе Container Runtime у реестра r.shturval.tech в поле Авторизация для репозитория замените лицензию. Нажмите Сохранить.
  1. Откройте NCI generic-init-config.
kubectl get nodeconfigitem generic-init-config -o yaml
  1. В spec.runtimecfg.registries у реестра r.shturval.tech замените license на новое значение Basic и примените объект.

Шаг 8. Обновить файл на уже работающих узлах

В открытом контуре проверьте авторизацию узла в реестр и обновите лицензию в /etc/std/nci.json, если она отличается от новой. Выполните обновление для каждого узла во всех кластерах. Подключитесь к узлу кластера и проверьте авторизацию узла в реестр:

sudo grep -c Authorization /etc/containerd/certs.d/<имя-реестра>/hosts.toml

В открытом контуре <имя-реестра> - r.shturval.tech. Если команда вывела 0, узел не передаёт лицензию в реестр, внесение изменений в файл /etc/std/nci.json не требуются. shturvald берёт его из NCI и записывает в hosts.toml. Число больше нуля значит, что токен записан в файл. Тогда замените его в /etc/std/nci.json, как приведено далее:

  1. Перед заменой скопируйте /etc/std/nci.json.
  2. Откройте /etc/std/nci.json. Найдите старый токен и замените его на новый. Он записан в строке password, в адресе https://user:<токен>@ и в значении "license": "Basic ...".
  3. Запишите файл и выставьте права 0600.
  4. На узле посчитайте sha256 файла и запишите сумму. Аннотация node.shturval.tech/initchecksum стоит на NodeConfig с именем узла. Имя NodeConfig совпадает с именем узла. В команду подставьте саму сумму из вывода sha256sum, символы до пробела.

shturvald на каждом цикле считает sha256 файла /etc/std/nci.json и сверяет его с этой аннотацией. После правки файла сумма меняется, поэтому и необходимо записать новую сумму, иначе применение конфигурации останавливается (ConfigApplied=False, причина ChecksumMismatch). Подробнее — в разделе Цикл применения конфигурации сервиса shturval-node-config.

Выполните на узле:

sudo sha256sum /etc/std/nci.json

Выполните в кластере:

kubectl annotate nodeconfig <имя-узла> node.shturval.tech/initchecksum=<сумма> --overwrite

Проверьте лицензию на странице «О системе» (стартовая страница веб-интерфейса). Если узел передаёт лицензию в реестр, проверьте, что на нём применилась новая авторизация: на странице узла во вкладке Конфигурация узла нет статуса Не применено, а строка Authorization в /etc/containerd/certs.d/<имя-реестра>/hosts.toml совпадает с полем license в NCI. В выводе есть токен. В кластере у NodeConfig этого узла в колонке READY должно быть True:

kubectl get nodeconfig <имя-узла>

Дополнительно проверьте, что у обоих webhook ClusterConfig снова failurePolicy: Fail, а количество реплик deployment shturval-cluster-manager-cluster-manager прежнее.

Рекомендации

  • Обновляйте лицензию до истечения срока действия.
  • Сохраняйте копию лицензии в безопасном месте.
  • До истечения срока действия лицензии на платформе отображаются уведомления. Если срок действия лицензии истек, получите новую лицензию и выполните шаги 1–5 в консоли, как на вкладке Открытый контур или истёкшая лицензия.
  • Для кластера с провайдером Shturval v2 в открытом контуре и при истёкшей лицензии выполните также шаг 6. Новый хост скачивает shturvald с токеном из ShturvalProvider.
  • В закрытом контуре шаги 7 и 8 не требуются, даже если срок действия лицензии закончился: обновите SSP, ClusterConfig и ClusterProfile. В открытом контуре шаги 7 и 8 выполните, только если в hosts.toml реестра на узле есть Authorization. Если её нет, авторизацию не заполняйте. Токен в /etc/std/nci.json меняйте, только если он уже записан в этом файле.