Переключение 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