Stronghold Enterprise Edition (EE) можно обновить до Stronghold Certified Security Edition (CSE) одним из следующих способов:

Поддерживается обновление с Stronghold EE 1.15.x до Stronghold CSE 1.16.0. Если используется версия Stronghold EE ниже 1.15.x, сначала обновитесь до последней версии ветки.

При обновлении до Stronghold CSE возможна временная недоступность сервиса.

Обновление в исполнении DKP

Для перехода на Stronghold CSE требуется DKP CSE версии 1.73 и выше.

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

  1. Проверьте текущую версию Stronghold:

    stronghold version
  2. Сохраните unseal-ключи и root-токен в защищённое хранилище. Пример:

    d8 k -n d8-stronghold get secret stronghold-keys -o yaml > stronghold-keys.yaml
    chmod 600 stronghold-keys.yaml
  3. Создайте резервную копию или снимок (snapshot) кластера Stronghold. Пример:

    export STRONGHOLD_ADDR=https://$(d8 k -n d8-stronghold get ing stronghold -o json | jq -r '.spec.rules[0].host')
    d8 stronghold login -method=oidc -path=oidc_deckhouse
    # Либо через root-токен:
    ## d8 stronghold login -method=token
    d8 stronghold operator raft snapshot save stronghold-$(date +%F_%H-%M).snap

    Проверить снимок можно с помощью команды:

    ls -lh ./stronghold-*.snap

    Полученные файлы храните за пределами кластера DKP.

  4. Подготовьте пакет или бинарный файл Stronghold CSE 1.16.0 на каждом узле.

  5. Убедитесь, что ModuleConfig stronghold существует:

    d8 k get mc stronghold -o yaml

    Если ModuleConfig отсутствует, создайте его:

    cat | d8 k apply -f - <<EOF
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: stronghold
    spec:
      enabled: false
    EOF

Отключение автообновления модуля

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

  1. Определите текущий канал обновлений модуля stronghold:

    d8 k get module stronghold -o jsonpath='{.properties.releaseChannel}'

    Если команда не выводит значение, используйте канал stable в следующем шаге.

  2. Создайте ресурс ModuleUpdatePolicy c ручным режимом обновления, указав в поле releaseChannel текущий канал обновлений, и примените его:

    cat <<EOF > stronghold-mup.yaml
    apiVersion: deckhouse.io/v1alpha2
    kind: ModuleUpdatePolicy
    metadata:
      name: stronghold-update-policy
    spec:
      releaseChannel: <STRONGHOLD_RELEASE_CHANNEL>
      update:
        mode: Manual
    EOF
    d8 k apply -f stronghold-mup.yaml
    d8 k get mup stronghold-update-policy

    Ожидаемый вывод:

    NAME                       RELEASE CHANNEL   UPDATE MODE
    stronghold-update-policy   Stable            Manual
    
  3. Укажите созданный ресурс ModuleUpdatePolicy в ModuleConfig stronghold:

    d8 k patch moduleconfig stronghold --type merge --patch '{"spec":{"updatePolicy":"stronghold-update-policy"}}'
  4. Проверьте, что значение сохранилось:

    d8 k get mc stronghold -o jsonpath='{.spec.updatePolicy}'

    Ожидаемый вывод:

    stronghold-update-policy
  5. Убедитесь, что изменения применились в модуле stronghold:

    d8 k get module stronghold -o jsonpath='{.properties.updatePolicy}'

    Ожидаемый вывод:

    stronghold-update-policy

    Если используется DKP CSE 1.67 и ниже, либо если модуль ещё ни разу не запускался, вывод команды будет пустым. Дополнительные действия в таком случае не требуются.

Проверки перед началом обновления

  1. Проверьте версию DKP. Для перехода на Stronghold CSE требуется DKP CSE версии 1.73 и выше. Проверить версию DKP можно с помощью команды:

    d8 k -n d8-system get configmap d8-deckhouse-version-info -o yaml

    Также проверить версию DKP можно в веб-интерфейсе Deckhouse на главной странице панели управления кластером (https://console.<CLUSTER_DOMAIN>).

    Если понадобится обновить или переключить редакцию DKP, воспользуйтесь инструкциями:

  2. Убедитесь, что DKP работает штатно, leader-узел определён, очередь пуста:

    d8 k -n d8-system get deploy deckhouse
    d8 k -n d8-system get pod -l leader=true
    d8 system queue list

    Ожидаемый вывод:

    • Deployment deckhouse находится в состоянии Ready:

      NAME        READY   UP-TO-DATE   AVAILABLE   AGE
      deckhouse   3/3     3            3           1d
      
    • Есть рабочий под в статусе Running:

      NAME                        READY   STATUS    RESTARTS   AGE
      deckhouse-596d944f95-d82m8  2/2     Running   0          1d
      
    • Очередь задач пуста:

      Summary:
      - 'main' queue: empty.
      - 121 other queues (0 active, 121 empty): 0 tasks.
      - no tasks to handle.
      
  3. Убедитесь, что модуль stronghold включён и находится в рабочем состоянии:

    d8 k get module stronghold
    d8 k get moduleconfig stronghold -o yaml

    Проверьте, что:

    • для stronghold значения Enabled и Ready равны True;
    • объект ModuleConfig stronghold существует;
    • в spec.settings.license указан лицензионный ключ.
  4. Убедитесь, что используется Stronghold EE версии 1.15.x. Это можно сделать одним из следующих способов:

    • Через веб-интерфейс Deckhouse — откройте главную страницу панели управления кластером (https://console.<CLUSTER_DOMAIN>) и проверьте, что в нижней части страницы указана версия 1.15.x с суффиксом ee.

    • По манифесту или образу пода. Для этого выполните команду:

      d8 k -n d8-stronghold get pod -o yaml | grep version

      В лейблах подов должна быть указана версия 1.15.x с суффиксом ee.

    • По логам. Для этого выполните команду:

      d8 k -n d8-stronghold logs stronghold-0 | head -20

      В стартовых строках баннера должна быть указана версия с редакцией:

      Version: Stronghold v1.15.0+ee
      

Подготовка модуля к установке

  1. Подготовьте Stronghold CSE в вашем хранилище образов (выполняется на машине с доступом к загрузке образов в хранилище). Проверьте контрольную сумму архива и загрузите бандл модуля Stronghold CSE:

    # Проверьте контрольную сумму архива:
    gost12sum module-stronghold.tar
    
    # Переместите архив в директорию modules:
    mkdir modules
    mv module-stronghold.tar modules/.
    
    # Адрес хоста хранилища образов. Например, 10.129.0.18:5000 или my-registry.com
    export REGISTRY_HOST="<REGISTRY_HOST:PORT>"
    
    # Адрес хранилища образов DKP. Например, 10.129.0.18:5000/dkp-cse/stable
    export MODULES_MODULE_REPO="${REGISTRY_HOST}/<PATH_TO_DKP_REPO>"
    
    # Используйте учётную запись с правами на запись в хранилище образов.
    d8 mirror push modules $MODULES_MODULE_REPO -u <USERNAME> -p <PASSWORD>
  2. Создайте ModuleSource для Stronghold CSE. Убедитесь средствами вашей инфраструктуры, что хранилище образов доступно с каждого master-узла. Подготовьте и примените ModuleSource:

    # Путь к модулям в хранилище образов.
    MODULES_MODULE_SOURCE="$MODULES_MODULE_REPO/modules"
    
    # Имя пользователя, имеющего доступ на чтение образов.
    REGISTRY_USER="<REGISTRY_USER>"
    
    # Пароль пользователя.
    REGISTRY_PASSWORD="<REGISTRY_PASSWORD>"
    
    # Сертификат УЦ домена, используемого для хранилища образов.
    REGISTRY_CA_CERT="<CA_CERT_FOR_REGISTRY>"
    
    AUTH_STRING=$(echo -n "${REGISTRY_USER}:${REGISTRY_PASSWORD}" | base64)
    DOCKER_CFG=$(echo -n '{"auths":{"'${REGISTRY_HOST}'":{"username":"'${REGISTRY_USER}'","password":"'${REGISTRY_PASSWORD}'","auth":"'${AUTH_STRING}'"}}}' | base64 -w0)
    
    cat <<EOF > stronghold-cse-ms.yaml
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleSource
    metadata:
      name: stronghold-cse
    spec:
      registry:
        ca: "$REGISTRY_CA_CERT"
        dockerCfg: $DOCKER_CFG
        repo: $MODULES_MODULE_SOURCE
        scheme: HTTPS
    EOF
    
    # Проверьте конфигурацию.
    cat stronghold-cse-ms.yaml
    
    # Примените ресурс.
    d8 k apply -f stronghold-cse-ms.yaml
  3. Проверьте статус ModuleSource:

    d8 k get modulesource stronghold-cse -o yaml

    Проверьте, что в статусе отсутствуют ошибки, а поле status.message пустое:

    ...
    status:
      message: ""
    ...

Переключение модуля Stronghold с редакции EE на CSE

Обновите ModuleConfig stronghold для использования нового ModuleSource:

  1. Проверьте наличие ModuleConfig stronghold:

    d8 k get mc stronghold -o yaml
  2. Добавьте в ModuleConfig поле spec.source со значением stronghold-cse:

    d8 k patch moduleconfig stronghold --type merge --patch '{"spec":{"source":"stronghold-cse"}}'
    d8 k get moduleconfig stronghold -o yaml

    Проверьте, что изменения применились:

    • в ModuleConfig stronghold присутствует значение spec.source: stronghold-cse;
    • остальные поля в spec.settings не изменились.
  3. Если после переключения источника модуль сообщает о проблеме с лицензией, обновите только поле лицензии (CSE_LICENSE):

    d8 k patch moduleconfig stronghold --type merge --patch '{"spec":{"settings":{"license":"<CSE_LICENSE>"},"version":1}}'
  4. Если модуль ранее был выключен, включите его:

    d8 system module enable stronghold
  5. Дождитесь стабилизации DKP и пустой очереди:

    d8 k -n d8-system get pods -l app=deckhouse
    d8 system queue list

    Проверьте, что:

    • под deckhouse находится в состоянии Running/Ready;
    • очередь пуста.

Переключите ModuleUpdatePolicy в режим AutoPatch:

  1. Измените режим обновления:

    d8 k patch mup stronghold-update-policy --type merge --patch '{"spec":{"update":{"mode":"AutoPatch"}}}'
  2. Проверьте, что режим обновления изменился:

    d8 k get mup stronghold-update-policy

    Ожидаемый вывод:

    NAME                       RELEASE CHANNEL   UPDATE MODE
    stronghold-update-policy   Stable            AutoPatch
    

Проверьте завершение перехода на редакцию CSE:

  1. Проверьте состояние модуля:

    d8 k get modules stronghold

    Ожидаемый вывод:

    NAME            STAGE                  SOURCE           PHASE   ENABLED   READY
    stronghold      General Availability   stronghold-cse   Ready   True      True
    
  2. Проверьте источник модуля:

    d8 k get modulesource stronghold-cse -o yaml
    d8 k get moduleconfig stronghold -o yaml
    d8 k get module stronghold -o yaml

    Проверьте, что:

    • отсутствуют ошибки auth, tls, x509, timeout;
    • отсутствуют предупреждающие события;
    • в ModuleConfig stronghold указано spec.source: stronghold-cse;
    • в Module stronghold указано properties.source: stronghold-cse.
  3. Проверьте поды stronghold:

    d8 k -n d8-stronghold get po

    Проверьте, что:

    • отсутствуют состояния ImagePullBackOff, ErrImagePull, CrashLoopBackOff;
    • поды stronghold-* находятся в состоянии Running и имеют готовность 2/2.

Альтернативный способ через установку нового кластера требуемой версии

Если не удалось пройти проверки перед началом обновления, то есть привести текущий кластер DKP и модуль stronghold к требуемым версиям DKP CSE 1.73 и выше и Stronghold EE 1.15.x, можно перенести кластер Stronghold на новый кластер DKP CSE 1.73 путём восстановления резервной копии.

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

  1. Выполните резервное копирование данных кластера.

  2. Разверните кластер DKP CSE 1.73.

  3. Начиная с раздела Отключение автообновления модуля, последовательно выполните все шаги на новом кластере.

  4. Восстановите резервную копию, unseal-ключи и root-токен. Команды выполняются на хосте, где находятся файлы резервной копии stronghold-*.snap и ключи stronghold-keys.yaml. Пример восстановления резервной копии кластера Stronghold:

    • Восстановите снимок (snapshot):

      export STRONGHOLD_ADDR=https://$(d8 k -n d8-stronghold get ing stronghold -o json | jq -r '.spec.rules[0].host')
      d8 stronghold login -method=oidc -path=oidc_deckhouse
      # Либо через root-токен:
      ## d8 stronghold login -method=token
      d8 stronghold operator raft snapshot restore -force stronghold-<SNAPSHOT_DATE>.snap
    • Восстановите unseal-ключи и root-токен:

      d8 k -n d8-stronghold delete secret stronghold-keys
      d8 k -n d8-stronghold create -f stronghold-keys.yaml
    • Проверьте поды stronghold:

      d8 k -n d8-stronghold get po

      Проверьте, что:

      • отсутствуют состояния ImagePullBackOff, ErrImagePull, CrashLoopBackOff;
      • поды stronghold-* находятся в состоянии Running и имеют готовность 2/2.