Переключение DKP с EE на CSE

Переключение DKP с EE на CSE может быть выполнено одним из следующих способов:

Инструкция подразумевает использование публичного адреса container registry: registry-cse.deckhouse.ru.

В DKP CSE не поддерживается работа облачных кластеров и некоторых модулей. Подробнее о поддерживаемых модулях можно узнать на странице сравнения редакций.

Миграция на DKP CSE возможна только с версии DKP EE 1.58, 1.64 или 1.67.

Актуальные версии DKP CSE: 1.58.2 для релиза 1.58, 1.64.1 для релиза 1.64 и 1.67.0 для релиза 1.67. Эти версии потребуется использовать далее для указания переменной DECKHOUSE_VERSION.

Переход поддерживается только между одинаковыми минорными версиями, например, с DKP EE 1.64 на DKP CSE 1.64. Переход с версии EE 1.58 на CSE 1.67 потребует промежуточной миграции: сначала на EE 1.64, затем на EE 1.67, и только после этого — на CSE 1.67. Попытки обновить версию на несколько релизов сразу могут привести к неработоспособности кластера.

Deckhouse CSE 1.58 и 1.64 поддерживает Kubernetes версии 1.27, DKP CSE 1.67 поддерживает Kubernetes версий 1.27 и 1.29.

При переключении на DKP CSE возможна временная недоступность компонентов кластера.

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

Для переключения кластера Deckhouse Enterprise Edition на Certified Security Edition нужным способом выполните описанные ниже действия (все команды выполняются на master-узле кластера от имени пользователя с настроенным контекстом kubectl или от имени суперпользователя).

Переключение с использованием модуля registry

  1. Убедитесь, что кластер был переключен на использование модуля registry. Если модуль не задействован, перейдите к инструкции по переключению без модуля registry.
  2. Настройте кластер на использование необходимой версии Kubernetes (информация о версионности приведена в разделе Переключение DKP с EE на CSE). Для этого:
    • Выполните команду:

      d8 platform edit cluster-configuration
      
    • Измените параметр kubernetesVersion на необходимое значение, например, "1.27" (в кавычках) для Kubernetes 1.27.
    • Сохраните изменения. Узлы кластера начнут последовательно обновляться.
    • Дождитесь окончания обновления. Отслеживать ход обновления можно с помощью команды d8 k get no. Обновление можно считать завершенным, когда в выводе команды у каждого узла кластера в колонке VERSION появится обновленная версия.
  3. Подготовьте переменные с лицензионным ключом:

    LICENSE_TOKEN=<PUT_YOUR_LICENSE_TOKEN_HERE>
    
  4. Запустите временный под Deckhouse новой редакции, чтобы получить актуальные дайджесты и список модулей:

    d8 k create secret docker-registry cse-image-pull-secret \
     --docker-server=registry-cse.deckhouse.ru \
     --docker-username=license-token \
     --docker-password=${LICENSE_TOKEN}
    
    DECKHOUSE_VERSION=$(d8 k -n d8-system get deploy deckhouse -ojson | jq -r '.spec.template.spec.containers[] | select(.name == "deckhouse") | .image' | awk -F: '{print $NF}')
    d8 k run cse-image \
     --image=registry-cse.deckhouse.ru/deckhouse/cse/install:$DECKHOUSE_VERSION \
     --overrides="{\"spec\": {\"imagePullSecrets\":[{\"name\": \"cse-image-pull-secret\"}]}}" \
     --command sleep -- infinity
    

    Как только под перейдёт в статус Running, выполните следующие команды:

    CSE_MODULES=$(d8 k exec cse-image -- ls -l deckhouse/modules/ | awk {'print $9'} |grep -oP "\d.*-\w*" | cut -c5-)
    USED_MODULES=$(d8 k get modules -o custom-columns=NAME:.metadata.name,SOURCE:.properties.source,STATE:.properties.state,ENABLED:.status.phase | grep Embedded | grep -E 'Enabled|Ready' | awk {'print $1'})
    MODULES_WILL_DISABLE=$(echo $USED_MODULES | tr ' ' '\n' | grep -Fxv -f <(echo $CSE_MODULES | tr ' ' '\n'))
    
  5. Убедитесь, что используемые в кластере модули поддерживаются в Deckhouse CSE. Например, в Deckhouse CSE 1.58 и 1.64 отсутствует модуль cert-manager. Поэтому, перед отключением модуля cert-manager необходимо перевести режим работы HTTPS некоторых компонентов (например user-authn или prometheus) на альтернативные варианты работы, либо изменить глобальный параметр, отвечающий за режим работы HTTPS в кластере.

    Отобразить список модулей, которые не поддерживаются в Deckhouse CSE и будут отключены, можно следующей командой:

    echo $MODULES_WILL_DISABLE
    

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

    Отключите неподдерживаемые в Deckhouse CSE модули:

    echo $MODULES_WILL_DISABLE | 
      tr ' ' '\n' | awk {'print "d8 k -n d8-system exec deploy/deckhouse -- deckhouse-controller module disable",$1'} | bash
    

    В Deckhouse CSE не поддерживается компонент earlyOOM. Отключите его с помощью настройки.

    Дождитесь перехода пода Deckhouse в статус Ready и выполнения всех задач в очереди.

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Проверьте, что отключенные модули перешли в состояние Disabled.

    d8 k get modules
    
  6. Удалите созданный секрет и под:

    d8 k delete pod/cse-image
    d8 k delete secret/cse-image-pull-secret
    
  7. Выполните переключение на новую редакцию. Для этого укажите следующие параметры в ModuleConfig deckhouse (для подробной настройки ознакомьтесь с конфигурацией модуля deckhouse):

    ---
    # Пример для Direct-режима.
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: deckhouse
    spec:
      version: 1
      enabled: true
      settings:
        registry:
          mode: Direct
          direct:
            # Relax mode используется для проверки наличия текущей версии Deckhouse в указанном registry.
            # Для переключения между редакциями необходимо использовать данный режим проверки registry.
            checkMode: Relax
            imagesRepo: registry-cse.deckhouse.ru/deckhouse/cse
            scheme: HTTPS
            # Укажите свой параметр <LICENSE_TOKEN>.
            license: <LICENSE_TOKEN>
    ---
    # Пример для Unmanaged-режима.
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: deckhouse
    spec:
      version: 1
      enabled: true
      settings:
        registry:
          mode: Unmanaged
          unmanaged:
            # Relax mode используется для проверки наличия текущей версии Deckhouse в указанном registry.
            # Для переключения между редакциями необходимо использовать данный режим проверки.
            checkMode: Relax
            imagesRepo: registry-cse.deckhouse.ru/deckhouse/cse
            scheme: HTTPS
            # Укажите свой параметр <LICENSE_TOKEN>.
            license: <LICENSE_TOKEN>
    
  8. Дождитесь переключения registry. Для проверки выполнения переключения воспользуйтесь инструкцией.

    Пример вывода:

    conditions:
      - lastTransitionTime: "..."
        message: |-
          Mode: Relax
          registry-cse.deckhouse.ru: all 1 items are checked
        reason: Ready
        status: "True"
        type: RegistryContainsRequiredImages
    # ...
      - lastTransitionTime: "..."
        message: ""
        reason: ""
        status: "True"
        type: Ready
    
  9. После переключения, удалите из ModuleConfig deckhouse параметр checkMode: Relax, чтобы активировать выполнение проверки по умолчанию. Удаление запустит проверку наличия критически важных компонентов в registry.

  10. Дождитесь выполнения проверки. Статус переключения режима registry можно получить, воспользовавшись инструкцией.

    Пример вывода:

    conditions:
      - lastTransitionTime: "..."
        message: |-
          Mode: Default
          registry-cse.deckhouse.ru: all 155 items are checked
        reason: Ready
        status: "True"
        type: RegistryContainsRequiredImages
    # ...
      - lastTransitionTime: "..."
        message: ""
        reason: ""
        status: "True"
        type: Ready
    
  11. Проверьте, не осталось ли в кластере подов с адресом registry для Deckhouse EE:

    Для Unmanaged-режима:

    d8 k get pods -A -o json | jq -r '.items[] | select(.spec.containers[]
      | select(.image | contains("deckhouse.ru/deckhouse/ee"))) | .metadata.namespace + "\t" + .metadata.name' | sort | uniq
    

    Для других режимов, использующих фиксированный адрес (данная проверка не учитывает внешние модули):

    # Получаем список актуальных дайджестов из файла images_digests.json внутри Deckhouse.
    IMAGES_DIGESTS=$(d8 k -n d8-system exec -i svc/deckhouse-leader -c deckhouse -- cat /deckhouse/modules/images_digests.json | jq -r '.[][]' | sort -u)
    
    # Проверяем, есть ли поды, использующие образы Deckhouse по адресу `registry.d8-system.svc:5001/system/deckhouse`
    # с дайджестом, отсутствующим в списке актуальных дайджестов из IMAGES_DIGESTS.
    d8 k get pods -A -o json |
    jq -r --argjson digests "$(printf '%s\n' $IMAGES_DIGESTS | jq -R . | jq -s .)" '
      .items[]
      | {name: .metadata.name, namespace: .metadata.namespace, containers: .spec.containers}
      | select(.containers != null)
      | select(
          .containers[]
          | select(.image | test("registry.d8-system.svc:5001/system/deckhouse") and test("@sha256:"))
          | .image as $img
          | ($img | split("@") | last) as $digest
          | ($digest | IN($digests[]) | not)
        )
      | .namespace + "\t" + .name
    ' | sort -u
    

    Если в выводе присутствуют поды модуля chrony, заново включите данный модуль (в Deckhouse CSE этот модуль по умолчанию выключен):

    d8 k -n d8-system exec deploy/deckhouse -- deckhouse-controller module enable chrony
    

Переключение без модуля registry

  1. Если модуль registry включен, отключите его с помощью инструкции.

  2. Настройте кластер на использование необходимой версии Kubernetes (информация о версионности приведена в разделе Переключение DKP с EE на CSE). Для этого:
    • Выполните команду:

      d8 platform edit cluster-configuration
      
    • Измените параметр kubernetesVersion на необходимое значение, например, "1.27" (в кавычках) для Kubernetes 1.27.
    • Сохраните изменения. Узлы кластера начнут последовательно обновляться.
    • Дождитесь окончания обновления. Отслеживать ход обновления можно с помощью команды d8 k get no. Обновление можно считать завершенным, когда в выводе команды у каждого узла кластера в колонке VERSION появится обновленная версия.
  3. Подготовьте переменные с лицензионным ключом и создайте ресурс NodeGroupConfiguration для переходной авторизации в registry-cse.deckhouse.ru:

    Перед созданием ресурса ознакомьтесь с разделом Как добавить конфигурацию для дополнительного registry

    LICENSE_TOKEN=<PUT_YOUR_LICENSE_TOKEN_HERE>
    AUTH_STRING="$(echo -n license-token:${LICENSE_TOKEN} | base64 )"
    d8 k apply -f - <<EOF
    ---
    apiVersion: deckhouse.io/v1alpha1
    kind: NodeGroupConfiguration
    metadata:
      name: containerd-cse-config.sh
    spec:
      nodeGroups:
      - '*'
      bundles:
      - '*'
      weight: 30
      content: |
        _on_containerd_config_changed() {
          bb-flag-set containerd-need-restart
        }
        bb-event-on 'containerd-config-file-changed' '_on_containerd_config_changed'
    
        mkdir -p /etc/containerd/conf.d
        bb-sync-file /etc/containerd/conf.d/cse-registry.toml - containerd-config-file-changed << "EOF_TOML"
        [plugins]
          [plugins."io.containerd.grpc.v1.cri"]
            [plugins."io.containerd.grpc.v1.cri".registry]
              [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
            [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry-cse.deckhouse.ru"]
              endpoint = ["https://registry-cse.deckhouse.ru"]
            [plugins."io.containerd.grpc.v1.cri".registry.configs]
              [plugins."io.containerd.grpc.v1.cri".registry.configs."registry-cse.deckhouse.ru".auth]
                auth = "$AUTH_STRING"
        EOF_TOML
    EOF
    

    Дождитесь завершения синхронизации и появления файла /etc/containerd/conf.d/cse-registry.toml на узлах.

    Статус синхронизации можно отследить по значению UPTODATE (отображаемое число узлов в этом статусе должно совпадать с общим числом узлов (NODES) в группе):

    d8 k get ng -o custom-columns=NAME:.metadata.name,NODES:.status.nodes,READY:.status.ready,UPTODATE:.status.upToDate -w
    

    Пример вывода:

    NAME     NODES   READY   UPTODATE
    master   1       1       1
    worker   2       2       2
    

    В журнале systemd-сервиса bashible должно появиться сообщение Configuration is in sync, nothing to do в результате выполнения следующей команды:

    journalctl -u bashible -n 5
    

    Пример вывода:

    Aug 21 11:04:28 master-ee-to-cse-0 bashible.sh[53407]: Configuration is in sync, nothing to do.
    Aug 21 11:04:28 master-ee-to-cse-0 bashible.sh[53407]: Annotate node master-ee-to-cse-0 with annotation node.deckhouse.io/configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master-ee-to-cse-0 bashible.sh[53407]: Successful annotate node master-ee-to-cse-0 with annotation node.deckhouse.io/configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master-ee-to-cse-0 systemd[1]: bashible.service: Deactivated successfully.
    
  4. Выполните следующие команды для запуска временного пода Deckhouse CSE для получения актуальных дайджестов и списка модулей:

    DECKHOUSE_VERSION=v<ВЕРСИЯ_DECKHOUSE_CSE>
    # Например, DECKHOUSE_VERSION=v1.58.2
    d8 k run cse-image --image=registry-cse.deckhouse.ru/deckhouse/cse/install:$DECKHOUSE_VERSION --command sleep -- infinity
    

    Как только под перейдёт в статус Running, выполните следующие команды:

    CSE_SANDBOX_IMAGE=$(d8 k exec cse-image -- cat deckhouse/candi/images_digests.json | grep pause | grep -oE 'sha256:\w*')
    CSE_K8S_API_PROXY=$(d8 k exec cse-image -- cat deckhouse/candi/images_digests.json | grep kubernetesApiProxy | grep -oE 'sha256:\w*')
    CSE_MODULES=$(d8 k exec cse-image -- ls -l deckhouse/modules/ | awk {'print $9'} |grep -oP "\d.*-\w*" | cut -c5-)
    USED_MODULES=$(d8 k get modules -o custom-columns=NAME:.metadata.name,SOURCE:.properties.source,STATE:.properties.state,ENABLED:.status.phase | grep Embedded | grep -E 'Enabled|Ready' | awk {'print $1'})
    MODULES_WILL_DISABLE=$(echo $USED_MODULES | tr ' ' '\n' | grep -Fxv -f <(echo $CSE_MODULES | tr ' ' '\n'))
    CSE_DECKHOUSE_KUBE_RBAC_PROXY=$(d8 k exec cse-image -- cat deckhouse/candi/images_digests.json | jq -r ".common.kubeRbacProxy")
    

    Дополнительная команда, которая необходима только при переключении на Deckhouse CSE версии 1.64:

    CSE_DECKHOUSE_INIT_CONTAINER=$(d8 k exec cse-image -- cat deckhouse/candi/images_digests.json | jq -r ".common.init")
    
  5. Убедитесь, что используемые в кластере модули поддерживаются в Deckhouse CSE. Например, в Deckhouse CSE 1.58 и 1.64 отсутствует модуль cert-manager. Поэтому, перед отключением модуля cert-manager необходимо перевести режим работы HTTPS некоторых компонентов (например user-authn или prometheus) на альтернативные варианты работы, либо изменить глобальный параметр, отвечающий за режим работы HTTPS в кластере.

    Отобразить список модулей, которые не поддерживаются в Deckhouse CSE и будут отключены, можно следующей командой:

    echo $MODULES_WILL_DISABLE
    

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

    Отключите неподдерживаемые в Deckhouse CSE модули:

    echo $MODULES_WILL_DISABLE | 
      tr ' ' '\n' | awk {'print "d8 k -n d8-system exec deploy/deckhouse -- deckhouse-controller module disable",$1'} | bash
    

    В Deckhouse CSE не поддерживается компонент earlyOOM. Отключите его с помощью настройки.

    Дождитесь перехода пода Deckhouse в статус Ready и выполнения всех задач в очереди.

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Проверьте, что отключенные модули перешли в состояние Disabled.

    d8 k get modules
    
  6. Создайте ресурс NodeGroupConfiguration:

    d8 k apply -f - <<EOF
    apiVersion: deckhouse.io/v1alpha1
    kind: NodeGroupConfiguration
    metadata:
      name: cse-set-sha-images.sh
    spec:
      nodeGroups:
      - '*'
      bundles:
      - '*'
      weight: 50
      content: |
         _on_containerd_config_changed() {
           bb-flag-set containerd-need-restart
         }
         bb-event-on 'containerd-config-file-changed' '_on_containerd_config_changed'
    
         bb-sync-file /etc/containerd/conf.d/cse-sandbox.toml - containerd-config-file-changed << "EOF_TOML"
         [plugins]
           [plugins."io.containerd.grpc.v1.cri"]
             sandbox_image = "registry-cse.deckhouse.ru/deckhouse/cse@$CSE_SANDBOX_IMAGE"
         EOF_TOML
    
         sed -i 's|image: .*|image: registry-cse.deckhouse.ru/deckhouse/cse@$CSE_K8S_API_PROXY|' /var/lib/bashible/bundle_steps/051_pull_and_configure_kubernetes_api_proxy.sh
         sed -i 's|crictl pull .*|crictl pull registry-cse.deckhouse.ru/deckhouse/cse@$CSE_K8S_API_PROXY|' /var/lib/bashible/bundle_steps/051_pull_and_configure_kubernetes_api_proxy.sh
    EOF
    

    Дождитесь завершения синхронизации bashible на всех узлах.

    Состояние синхронизации можно отследить по значению UPTODATE статуса (отображаемое число узлов в этом статусе должно совпадать с общим числом узлов (NODES) в группе):

    d8 k get ng -o custom-columns=NAME:.metadata.name,NODES:.status.nodes,READY:.status.ready,UPTODATE:.status.upToDate -w
    

    В журнале systemd-сервиса bashible на узлах должно появиться сообщение Configuration is in sync, nothing to do в результате выполнения следующей команды:

    journalctl -u bashible -n 5
    

    Пример вывода:

    Aug 21 11:04:28 master-ee-to-cse-0 bashible.sh[53407]: Configuration is in sync, nothing to do.
    Aug 21 11:04:28 master-ee-to-cse-0 bashible.sh[53407]: Annotate node master-ee-to-cse-0 with annotation node.deckhouse.io/configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master-ee-to-cse-0 bashible.sh[53407]: Successful annotate node master-ee-to-cse-0 with annotation node.deckhouse.io/configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master-ee-to-cse-0 systemd[1]: bashible.service: Deactivated successfully.
    
  7. Актуализируйте секрет доступа к registry Deckhouse CSE, выполнив следующую команду:

    d8 k -n d8-system create secret generic deckhouse-registry \
      --from-literal=".dockerconfigjson"="{\"auths\": { \"registry-cse.deckhouse.ru\": { \"username\": \"license-token\", \"password\": \"$LICENSE_TOKEN\", \"auth\": \"$AUTH_STRING\" }}}" \
      --from-literal="address"=registry-cse.deckhouse.ru \
      --from-literal="path"=/deckhouse/cse \
      --from-literal="scheme"=https \
      --type=kubernetes.io/dockerconfigjson \
      --dry-run='client' \
      -o yaml | d8 k -n d8-system exec -i svc/deckhouse-leader -c deckhouse -- d8 k replace -f -
    
  8. Измените образ Deckhouse на образ Deckhouse CSE:

    Команда для Deckhouse CSE версии 1.58:

    d8 k -n d8-system set image deployment/deckhouse kube-rbac-proxy=registry-cse.deckhouse.ru/deckhouse/cse@$CSE_DECKHOUSE_KUBE_RBAC_PROXY deckhouse=registry-cse.deckhouse.ru/deckhouse/cse:$DECKHOUSE_VERSION
    

    Команда для Deckhouse CSE версии 1.64 и 1.67:

    d8 k -n d8-system set image deployment/deckhouse init-downloaded-modules=registry-cse.deckhouse.ru/deckhouse/cse@$CSE_DECKHOUSE_INIT_CONTAINER kube-rbac-proxy=registry-cse.deckhouse.ru/deckhouse/cse@$CSE_DECKHOUSE_KUBE_RBAC_PROXY deckhouse=registry-cse.deckhouse.ru/deckhouse/cse:$DECKHOUSE_VERSION
    
  9. Дождитесь перехода пода Deckhouse в статус Ready и выполнения всех задач в очереди. Если в процессе возникает ошибка ImagePullBackOff, подождите автоматического перезапуска пода.

    Чтобы узнать статус пода Deckhouse, используйте следующую команду:

    d8 k -n d8-system get po -l app=deckhouse
    

    Чтобы проверить состояние очереди Deckhouse, используйте следующую команду:

    d8 k -n d8-system exec deploy/deckhouse -c deckhouse -- deckhouse-controller queue list
    

    Пример вывода (очереди пусты):

    Summary:
    - 'main' queue: empty.
    - 88 other queues (0 active, 88 empty): 0 tasks.
    - no tasks to handle.
    
  10. Проверьте, не осталось ли в кластере подов с адресом registry для Deckhouse EE:

    d8 k get pods -A -o json | jq -r '.items[] | select(.spec.containers[]
      | select(.image | contains("deckhouse.ru/deckhouse/ee"))) | .metadata.namespace + "\t" + .metadata.name' | sort | uniq
    

    Если в выводе присутствуют поды модуля chrony, заново включите данный модуль (в Deckhouse CSE этот модуль по умолчанию выключен):

    d8 k -n d8-system exec deploy/deckhouse -- deckhouse-controller module enable chrony
    
  11. Очистите временные файлы, ресурс NodeGroupConfiguration и переменные:

    • Удалите временный файл:

      rm /tmp/cse-deckhouse-registry.yaml
      
    • Удалите ресурс NodeGroupConfiguration:

      d8 k delete ngc containerd-cse-config.sh cse-set-sha-images.sh
      
    • Удалите под:

      d8 k delete pod cse-image
      
    • Создайте и примените временный ресурс NodeGroupConfiguration для очистки:

      d8 k apply -f - <<EOF
      apiVersion: deckhouse.io/v1alpha1
      kind: NodeGroupConfiguration
      metadata:
        name: del-temp-config.sh
      spec:
        nodeGroups:
        - '*'
        bundles:
        - '*'
        weight: 90
        content: |
          if [ -f /etc/containerd/conf.d/cse-registry.toml ]; then
            rm -f /etc/containerd/conf.d/cse-registry.toml
          fi
          if [ -f /etc/containerd/conf.d/cse-sandbox.toml ]; then
            rm -f /etc/containerd/conf.d/cse-sandbox.toml
          fi
      EOF
      

    После синхронизации (статус синхронизации на узлах можно отследить по значению UPTODATE у NodeGroup) удалите созданный ресурс NodeGroupConfiguration:

    d8 k delete ngc del-temp-config.sh
    

Переключение DKP на CE/BE/SE/SE+/EE

Переключение DKP на CE/BE/SE/SE+/EE может быть выполнено одним из следующих способов:

  • Работоспособность инструкции подтверждена только для версий Deckhouse от v1.70. Если ваша версия младше, используйте соответствующую ей документацию.
  • Для коммерческих изданий требуется действующий лицензионный ключ с поддержкой нужного издания. При необходимости можно запросить временный ключ.
  • Инструкция подразумевает использование публичного адреса container registry: registry.deckhouse.ru. В случае использования другого адреса container registry измените команды или воспользуйтесь инструкцией по переключению Deckhouse на использование стороннего registry.
  • В редакциях Deckhouse CE/BE/SE/SE+ не поддерживается работа облачных провайдеров Dynamix, Openstack, VCD, vSphere (vSphere поддерживается в редакции SE+) и ряда модулей.
  • Все команды выполняются на master-узле существующего кластера под пользователем root.
  • Если в процессе переключения образ какого-либо модуля не загрузился заново и не модуль переустановился, для устранения проблемы воспользуйтесь инструкцией.

Ниже описаны шаги для переключения кластера с любой редакцию на одну из поддерживаемых: Community Edition, Basic Edition, Standard Edition, Standard Edition+, Enterprise Edition.

Переключение с помощью модуля registry

  1. Убедитесь, что кластер был переключен на использование модуля registry. Если модуль не используется, перейдите к инструкции.

  2. Подготовьте переменные с лицензионным ключом и названием новой редакции:

    Заполнять переменную LICENSE_TOKEN при переключении на редакцию CE не требуется. Значение переменной NEW_EDITION должно быть равно желаемой редакции DKP, например для переключения на редакцию:

    • CE, переменная должна быть ce;
    • BE, переменная должна быть be;
    • SE, переменная должна быть se;
    • SE+, переменная должна быть se-plus;
    • EE, переменная должна быть ee.
    NEW_EDITION=<PUT_YOUR_EDITION_HERE>
    LICENSE_TOKEN=<PUT_YOUR_LICENSE_TOKEN_HERE>
    
  3. Проверьте, чтобы очередь Deckhouse была пустой и без ошибок:

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Пример вывода (очереди пусты):

    Summary:
    - 'main' queue: empty.
    - 88 other queues (0 active, 88 empty): 0 tasks.
    - no tasks to handle.
    
  4. Запустите временный под Deckhouse новой редакции, чтобы получить актуальные дайджесты и список модулей:

    Для CE редакции:

    DECKHOUSE_VERSION=$(d8 k -n d8-system get deploy deckhouse -ojson | jq -r '.spec.template.spec.containers[] | select(.name == "deckhouse") | .image' | awk -F: '{print $NF}')
    d8 k run $NEW_EDITION-image --image=registry.deckhouse.ru/deckhouse/$NEW_EDITION/install:$DECKHOUSE_VERSION --command sleep -- infinity
    

    Для других редакций:

    d8 k create secret docker-registry $NEW_EDITION-image-pull-secret \
     --docker-server=registry.deckhouse.ru \
     --docker-username=license-token \
     --docker-password=${LICENSE_TOKEN}
    
    DECKHOUSE_VERSION=$(d8 k -n d8-system get deploy deckhouse -ojson | jq -r '.spec.template.spec.containers[] | select(.name == "deckhouse") | .image' | awk -F: '{print $NF}')
    d8 k run $NEW_EDITION-image \
     --image=registry.deckhouse.ru/deckhouse/$NEW_EDITION/install:$DECKHOUSE_VERSION \
     --overrides="{\"spec\": {\"imagePullSecrets\":[{\"name\": \"$NEW_EDITION-image-pull-secret\"}]}}" \
     --command sleep -- infinity
    

    Как только под перейдёт в статус Running, выполните следующие команды:

    NEW_EDITION_MODULES=$(d8 k exec $NEW_EDITION-image -- ls -l deckhouse/modules/ | grep -oE "\d.*-\w*" | awk {'print $9'} | cut -c5-)
    USED_MODULES=$(d8 k get modules -o custom-columns=NAME:.metadata.name,SOURCE:.properties.source,STATE:.properties.state,ENABLED:.status.phase | grep Embedded | grep -E 'Enabled|Ready' | awk {'print $1'})
    MODULES_WILL_DISABLE=$(echo $USED_MODULES | tr ' ' '\n' | grep -Fxv -f <(echo $NEW_EDITION_MODULES | tr ' ' '\n'))
    
  5. Убедитесь, что используемые в кластере модули поддерживаются в желаемой редакции.

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

    echo $MODULES_WILL_DISABLE
    

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

    Отключите неподдерживаемые новой редакцией модули:

    echo $MODULES_WILL_DISABLE | tr ' ' '\n' | awk {'print "d8 platform module disable",$1'} | bash
    

    Дождитесь, пока под Deckhouse перейдёт в состояние Ready и убедитесь в выполнении всех задач в очереди:

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Пример вывода (очереди пусты):

    Summary:
    - 'main' queue: empty.
    - 88 other queues (0 active, 88 empty): 0 tasks.
    - no tasks to handle.
    
  6. Удалите созданный секрет и под:

    d8 k delete pod/$NEW_EDITION-image
    d8 k delete secret/$NEW_EDITION-image-pull-secret
    
  7. Выполните переключение на новую редакцию. Для этого укажите следующие параметры в ModuleConfig deckhouse (для подробной настройки ознакомьтесь с конфигурацией модуля deckhouse):

    ---
    # Пример для Direct режима
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: deckhouse
    spec:
      version: 1
      enabled: true
      settings:
        registry:
          mode: Direct
          direct:
            # Relax mode используется для проверки наличия текущей версии Deckhouse в указанном registry
            # Для переключения между редакциями необходимо использовать данный режим проверки registry
            checkMode: Relax
            # Укажите свой параметр <NEW_EDITION>
            imagesRepo: registry.deckhouse.ru/deckhouse/<NEW_EDITION>
            scheme: HTTPS
            # Укажите свой параметр <LICENSE_TOKEN>
            # Если переключение выполняется на CE редакцию, удалите данный параметр
            license: <LICENSE_TOKEN>
    ---
    # Пример для Unmanaged режима
    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: deckhouse
    spec:
      version: 1
      enabled: true
      settings:
        registry:
          mode: Unmanaged
          unmanaged:
            # Relax mode используется для проверки наличия текущей версии Deckhouse в указанном registry
            # Для переключения между редакциями необходимо использовать данный режим проверки
            checkMode: Relax
            # Укажите свой параметр <NEW_EDITION>
            imagesRepo: registry.deckhouse.ru/deckhouse/<NEW_EDITION>
            scheme: HTTPS
            # Укажите свой параметр <LICENSE_TOKEN>
            # Если переключение выполняется на CE редакцию, удалите данный параметр
            license: <LICENSE_TOKEN>
    
  8. Дождитесь переключения registry. Для проверки выполнения переключения воспользуйтесь инструкцией.

    Пример вывода:

    conditions:
      - lastTransitionTime: "..."
        message: |-
          Mode: Relax
          registry.deckhouse.ru: all 1 items are checked
        reason: Ready
        status: "True"
        type: RegistryContainsRequiredImages
    # ...
      - lastTransitionTime: "..."
        message: ""
        reason: ""
        status: "True"
        type: Ready
    
  9. После переключения, удалите из ModuleConfig deckhouse параметр checkMode: Relax, чтобы активировать выполнение проверки по умолчанию. Удаление запустит проверку наличия критически важных компонентов в registry.

  10. Дождитесь выполнения проверки. Статус переключения режима registry можно получить, воспользовавшись инструкцией.

    Пример вывода:

    conditions:
      - lastTransitionTime: "..."
        message: |-
          Mode: Default
          registry.deckhouse.ru: all 155 items are checked
        reason: Ready
        status: "True"
        type: RegistryContainsRequiredImages
    # ...
      - lastTransitionTime: "..."
        message: ""
        reason: ""
        status: "True"
        type: Ready
    
  11. Проверьте, нет ли в неймспейсах d8-* подов в состоянии ошибки, которые не могут загрузить образы. Это необходимо сделать вручную, так как в настоящий момент модули Deckhouse не переинициализируются автоматически после изменений, описанных выше.

    Получите список подов:

    d8 k get po -A
    

    Получите детальную информацию о проблемных подах:

    d8 k describe po <pod_name> <namespace>
    

    Повторно загрузите соответствующие проблемным подам модули, выполнив на всех master-узлах команду:

    rm -rf /var/lib/deckhouse/downloaded/<module-name>/
    

    Для получения <module-name> выполните команду:

    d8 k get modules
    

    После удаления данных нужных модулей перезапустите Deckhouse:

    d8 k rollout restart deploy -n d8-system deckhouse
    
  12. Проверьте, не осталось ли в кластере подов со старым адресом registry, где <YOUR-PREVIOUS-EDITION> — название вашей прошлой редакции:

    Для Unmanaged-режима:

    d8 k get pods -A -o json | jq -r '.items[] | select(.spec.containers[] | select(.image | contains("deckhouse.ru/deckhouse/<YOUR-PREVIOUS-EDITION>"))) | .metadata.namespace + "\t" + .metadata.name' | sort | uniq
    

    Для других режимов, использующих фиксированный адрес (данная проверка не учитывает внешние модули):

    # Получаем список актуальных digest'ов из файла images_digests.json внутри Deckhouse
    IMAGES_DIGESTS=$(d8 k -n d8-system exec -i svc/deckhouse-leader -c deckhouse -- cat /deckhouse/modules/images_digests.json | jq -r '.[][]' | sort -u)
    
    # Проверяем, есть ли поды, использующие образы Deckhouse по адресу `registry.d8-system.svc:5001/system/deckhouse`
    # с digest'ом, отсутствующим в списке актуальных digest'ов из IMAGES_DIGESTS
    d8 k get pods -A -o json |
    jq -r --argjson digests "$(printf '%s\n' $IMAGES_DIGESTS | jq -R . | jq -s .)" '
      .items[]
      | {name: .metadata.name, namespace: .metadata.namespace, containers: .spec.containers}
      | select(.containers != null)
      | select(
          .containers[]
          | select(.image | test("registry.d8-system.svc:5001/system/deckhouse") and test("@sha256:"))
          | .image as $img
          | ($img | split("@") | last) as $digest
          | ($digest | IN($digests[]) | not)
        )
      | .namespace + "\t" + .name
    ' | sort -u
    

Переключение без использования модуля registry

  1. Если модуль registry включен, отключите его с помощью инструкции.

  2. Подготовьте переменные с лицензионным ключом и названием новой редакции:

    Заполнять переменные NEW_EDITION и AUTH_STRING при переключении на редакцию CE не требуется. Значение переменной NEW_EDITION должно быть равно желаемой редакции DKP, например для переключения на редакцию:

    • CE, переменная должна быть ce;
    • BE, переменная должна быть be;
    • SE, переменная должна быть se;
    • SE+, переменная должна быть se-plus;
    • EE, переменная должна быть ee.
    NEW_EDITION=<PUT_YOUR_EDITION_HERE>
    LICENSE_TOKEN=<PUT_YOUR_LICENSE_TOKEN_HERE>
    AUTH_STRING="$(echo -n license-token:${LICENSE_TOKEN} | base64 )"
    
  3. Проверьте, чтобы очередь Deckhouse была пустой и без ошибок:

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Пример вывода (очереди пусты):

    Summary:
    - 'main' queue: empty.
    - 88 other queues (0 active, 88 empty): 0 tasks.
    - no tasks to handle.
    
  4. Создайте ресурс NodeGroupConfiguration для переходной авторизации в registry.deckhouse.ru:

    Перед созданием ресурса ознакомьтесь с разделом Как добавить конфигурацию для дополнительного registry.

    При переходе на редакцию Deckhouse CE пропустите этот шаг.

    d8 k apply -f - <<EOF
    apiVersion: deckhouse.io/v1alpha1
    kind: NodeGroupConfiguration
    metadata:
      name: containerd-$NEW_EDITION-config.sh
    spec:
      nodeGroups:
      - '*'
      bundles:
      - '*'
      weight: 30
      content: |
        _on_containerd_config_changed() {
          bb-flag-set containerd-need-restart
        }
        bb-event-on 'containerd-config-file-changed' '_on_containerd_config_changed'
        mkdir -p /etc/containerd/conf.d
        bb-sync-file /etc/containerd/conf.d/$NEW_EDITION-registry.toml - containerd-config-file-changed << "EOF_TOML"
        [plugins]
          [plugins."io.containerd.grpc.v1.cri"]
            [plugins."io.containerd.grpc.v1.cri".registry.configs]
              [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.deckhouse.ru".auth]
                auth = "$AUTH_STRING"
        EOF_TOML
    EOF
    

    Дождитесь появления файла /etc/containerd/conf.d/$NEW_EDITION-registry.toml на узлах и завершения синхронизации bashible. Чтобы отследить статус синхронизации, проверьте значение UPTODATE (число узлов в этом статусе должно совпадать с общим числом узлов (NODES) в группе):

    d8 k get ng -o custom-columns=NAME:.metadata.name,NODES:.status.nodes,READY:.status.ready,UPTODATE:.status.upToDate -w
    

    Пример вывода:

    NAME     NODES   READY   UPTODATE
    master   1       1       1
    worker   2       2       2
    

    Также в журнале systemd-сервиса bashible должно появиться сообщение Configuration is in sync, nothing to do в результате выполнения следующей команды:

    journalctl -u bashible -n 5
    

    Пример вывода:

    Aug 21 11:04:28 master-ee-to-se-0 bashible.sh[53407]: Configuration is in sync, nothing to do.
    Aug 21 11:04:28 master-ee-to-se-0 bashible.sh[53407]: Annotate node master-ee-to-se-0 with annotation node.deckhouse.io/   configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master ee-to-se-0 bashible.sh[53407]: Successful annotate node master-ee-to-se-0 with annotation node.deckhouse.io/   configuration-checksum=9cbe6db6c91574b8b732108a654c99423733b20f04848d0b4e1e2dadb231206a
    Aug 21 11:04:29 master-ee-to-se-0 systemd[1]: bashible.service: Deactivated successfully.
    
  5. Запустите временный под Deckhouse новой редакции, чтобы получить актуальные дайджесты и список модулей:

    DECKHOUSE_VERSION=$(d8 k -n d8-system get deploy deckhouse -ojson | jq -r '.spec.template.spec.containers[] | select(.name == "deckhouse") | .image' | awk -F: '{print $NF}')
    d8 k run $NEW_EDITION-image --image=registry.deckhouse.ru/deckhouse/$NEW_EDITION/install:$DECKHOUSE_VERSION --command sleep -- infinity
    
  6. После перехода пода в статус Running выполните следующие команды:

    NEW_EDITION_MODULES=$(d8 k exec $NEW_EDITION-image -- ls -l deckhouse/modules/ | grep -oE "\d.*-\w*" | awk {'print $9'} | cut -c5-)
    USED_MODULES=$(d8 k get modules -o custom-columns=NAME:.metadata.name,SOURCE:.properties.source,STATE:.properties.state,ENABLED:.status.phase | grep Embedded | grep -E 'Enabled|Ready' | awk {'print $1'})
    MODULES_WILL_DISABLE=$(echo $USED_MODULES | tr ' ' '\n' | grep -Fxv -f <(echo $NEW_EDITION_MODULES | tr ' ' '\n'))
    
  7. Убедитесь, что используемые в кластере модули поддерживаются в желаемой редакции.

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

    echo $MODULES_WILL_DISABLE
    

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

    Отключите неподдерживаемые новой редакцией модули:

    echo $MODULES_WILL_DISABLE | tr ' ' '\n' | awk {'print "d8 platform module disable",$1'} | bash
    

    Дождитесь, пока под Deckhouse перейдёт в состояние Ready и убедитесь в выполнении всех задач в очереди:

    d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller queue list
    

    Пример вывода (очереди пусты):

    Summary:
    - 'main' queue: empty.
    - 88 other queues (0 active, 88 empty): 0 tasks.
    - no tasks to handle.
    
  8. Выполните команду deckhouse-controller helper change-registry из пода Deckhouse с параметрами новой редакции:

    Для переключения на BE/SE/SE+/EE издания:

    DOCKER_CONFIG_JSON=$(echo -n "{\"auths\": {\"registry.deckhouse.ru\": {\"username\": \"license-token\", \"password\": \"${LICENSE_TOKEN}\", \"auth\": \"${AUTH_STRING}\"}}}" | base64 -w 0)
    d8 k --as system:sudouser -n d8-cloud-instance-manager patch secret deckhouse-registry --type merge --patch="{\"data\":{\".dockerconfigjson\":\"$DOCKER_CONFIG_JSON\"}}"  
    d8 k -n d8-system exec -ti svc/deckhouse-leader -c deckhouse -- deckhouse-controller helper change-registry --user=license-token --password=$LICENSE_TOKEN --new-deckhouse-tag=$DECKHOUSE_VERSION registry.deckhouse.ru/deckhouse/$NEW_EDITION
    

    Для переключения на CE издание:

    d8 k -n d8-system exec -ti svc/deckhouse-leader -c deckhouse -- deckhouse-controller helper change-registry --new-deckhouse-tag=$DECKHOUSE_VERSION registry.deckhouse.ru/deckhouse/ce
    
  9. Проверьте, не осталось ли в кластере подов со старым адресом registry, где <YOUR-PREVIOUS-EDITION> — название вашей прошлой редакции:

    d8 k get pods -A -o json | jq -r '.items[] | select(.spec.containers[] | select(.image | contains("deckhouse.ru/deckhouse/<YOUR-PREVIOUS-EDITION>"))) | .metadata.namespace + "\t" + .metadata.name' | sort | uniq
    
  10. Удалите временные файлы, ресурс NodeGroupConfiguration и переменные:

    При переходе на редакцию CE пропустите этот шаг.

    d8 k delete ngc containerd-$NEW_EDITION-config.sh
    d8 k delete pod $NEW_EDITION-image
    d8 k apply -f - <<EOF
        apiVersion: deckhouse.io/v1alpha1
        kind: NodeGroupConfiguration
        metadata:
          name: del-temp-config.sh
        spec:
          nodeGroups:
          - '*'
          bundles:
          - '*'
          weight: 90
          content: |
            if [ -f /etc/containerd/conf.d/$NEW_EDITION-registry.toml ]; then
              rm -f /etc/containerd/conf.d/$NEW_EDITION-registry.toml
            fi
    EOF
    

    После завершения синхронизации bashible (статус синхронизации на узлах отображается по значению UPTODATE у NodeGroup) удалите созданный ресурс NodeGroupConfiguration:

    d8 k delete ngc del-temp-config.sh