Миграция на Nexus CE 3.77.2
Миграция заключается в переносе данных из Nexus OSS версии 3.68.1, установленного на виртуальных машинах (ВМ), в Nexus CE версии 3.77.2, который устанавливается в Kubernetes.
-
Есть SSH-доступ к ВМ
nexus-wс master-инстансом Nexus OSS. -
Есть доступ к кластеру Kubernetes с ролью
cluster admin. -
Обновлены Zalando Postgres Operator до 1.14 и кластер Postgres до 17.
-
Объем свободного дискового пространства в файловой системе ВМ
nexus-wпревышает суммарный объем файлов blob-хранилища.Для проверки выполните команды в терминале ВМ
nexus-w:$ sudo df -h /data$ sudo du -sh /data/nexus/blobs/Если объем недостаточен, увеличьте размер диска, смонтированного в каталог
/data, или подключите дополнительный диск. -
В конфигурации инсталлятора VK Dev Platform 1.7.0 размер Persistent Volume (PV) для хранения данных Nexus как минимум в два раза превышает суммарный объем файлов blob-хранилища.
-
Сохраните Ingress
nexus-oidc-proxyв файл:$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> get ing nexus-oidc-proxy -o yaml > nexus-oidc-proxy-ingress.yamlПри необходимости резервная копия позволит восстановить исходное состояние приложения.
-
Запустите редактирование Ingress
nexus-oidc-proxy.$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> edit ing nexus-oidc-proxy -
Удалите из списка
rulesфрагмент:- host: nexus.<ДОМЕН>http:paths:- backend:service:name: nexus-oidc-proxyport:number: 8080path: /pathType: Prefix- host: nx.<ДОМЕН>http:paths:- backend:service:name: nexus-oidc-proxyport:number: 8080path: /pathType: Prefix- host: nxa.<ДОМЕН>http:paths:- backend:service:name: nexus-oidc-proxyport:number: 8080path: /pathType: PrefixПричины удаления:
- Хосты
nx.<ДОМЕН>иnxa.<ДОМЕН>будут использоваться в Ingress нового экземпляра Nexus. - Хост
nexus.<ДОМЕН>будет использоваться во временном Ingress, который будет создан далее. - Веб-интерфейс старого экземпляра Nexus (его master-инстанса) будет доступен на хосте
nexus-master.<ДОМЕН>.
Это позволит установить новый экземпляр Nexus без удаления компонентов старого, а также создать Ingress для миграции данных, используя существующие DNS-записи и SSL-сертификаты.
- Хосты
-
Сохраните изменения.
Установка выполняется инсталлятором VK Dev Platform Shepherd. Подготовка и запуск инсталлятора описана в документе Руководство по установке VK Dev Platform.
Новый экземпляр Nexus CE устанавливается в то же пространство имен Kubernetes, где находятся компоненты старого экземпляра.
Чтобы избежать конфликта имен, для нового экземпляра используется имя Helm-релиза nexusce.
После установки:
-
В административной консоли Keycloak в домене
dev-platformоткройте свойства клиентаnexus-sso-clientи добавьте в список Valid Redirect URIs записьhttps://nexus-master.<ДОМЕН>/*.После установки в этом списке остается только запись для хоста
nx.<ДОМЕН>. Добавление записи для хостаnexus-master.<ДОМЕН>позволит восстановить доступ к веб-интерфейсу старого экземпляра Nexus. -
Создайте манифест временного Ingress
ingress.yamlдля доступа к новому экземпляру Nexus в обход OIDC-прокси.Шаблон манифеста временного Ingress
ingress.yaml:apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: nexuscespec:ingressClassName: nginxrules:- host: nexus.<ДОМЕН>http:paths:- backend:service:name: "nexusce-nxrm-ha"port:number: 8081path: /pathType: Prefixtls:- secretName: wildcard-tls-secrethosts:- "*.<ДОМЕН>"Здесь
<ДОМЕН>— основной домен, в котором существует конечное доменное имя Nexus. Пример: дляnexus.example.comосновной домен —example.com.При необходимости отредактируйте блок
tls: имя секрета, список имен хостов. -
Создайте временный Ingress:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> create -f ingress.yaml -
Остановите бэкенд VK Dev Platform:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_DEV_PLATFORM> scale deployment samsara --replicas=0
Для копирования данных используйте скрипт, который копирует объекты сериями запросов к REST API старого и нового экземпляров Nexus.
Ограничения:
-
Nexus API не позволяет выгружать пароли пользователей, а также пароли из настроек HTTP-аутентификации в прокси-репозиториях.
При миграции всем пользователям устанавливается одинаковый пароль, который можно найти в коде скрипта.
В настройках HTTP-аутентификации прокси-репозиториев устанавливается пустой пароль — пустая строка.
-
Пользователям без ролей при миграции назначается системная роль
nx-anonymous.
Чтобы скопировать данные:
-
Убедитесь, что установлен интерпретатор Python 3, который нужен для запуска скрипта.
Подробнее — в официальной документации Python 3.
-
Получите скрипт для копирования
nexus-migrator.pyв разделе Скрипт nexus-migrator.py. -
Запустите скрипт на хосте, который имеет сетевой доступ:
- по HTTP к внутреннему IP-адресу ВМ
nexus-wна порту 8081; - по HTTPS к балансировщику Ingress-контроллера в кластере Kubernetes.
Для этой задачи лучше всего подходит сама ВМ
nexus-w.Пример запуска скрипта:
$ python3 nexus-migrator.py \--source-url "http://<IP_АДРЕС>:8081" \--source-user "admin" \--source-password "<ПАРОЛЬ_АДМИНИСТРАТОРА>" \--target-url "https://nexus.<ДОМЕН>" \--target-user "admin" \--target-password "<ПАРОЛЬ_АДМИНИСТРАТОРА>"Здесь:
<IP_АДРЕС>— актуальный внутренний IP-адрес ВМnexus-w.<ДОМЕН>— основной домен, в котором существует конечное доменное имя Nexus.<ПАРОЛЬ_АДМИНИСТРАТОРА>— пароли учетных записей администраторов.
Во время работы скрипт выводит диагностические сообщения и статистику копирования объектов.
- по HTTP к внутреннему IP-адресу ВМ
-
После завершения работы скрипта проанализируйте вывод и убедитесь в отсутствии критических ошибок.
-
Зайдите в веб-интерфейсы экземпляров Nexus по адресам
https://nexus-master.<ДОМЕН>иhttps://nx.<ДОМЕН>/. -
Убедитесь, что в новом экземпляре созданы такие же наборы объектов, как в старом.
Чтобы перенести файлы blob-хранилища с ВМ nexus-w на PV нового экземпляра Nexus:
-
Остановите старый экземпляр Nexus, выполнив в терминале ВМ
nexus-w:$ sudo systemctl stop nexus -
Остановите новый экземпляр Nexus:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> scale statefulset nexusce-nxrm-ha --replicas=0 -
Создайте манифест временного Deployment
deployment.yamlдля копирования данных на PV нового экземпляра Nexus.Шаблон манифеста временного Deployment
deployment.yaml:apiVersion: apps/v1kind: Deploymentmetadata:labels:app.kubernetes.io/instance: nexusce-migrate-dataapp.kubernetes.io/name: nexusce-migrate-dataname: nexusce-migrate-dataspec:replicas: 1selector:matchLabels:app.kubernetes.io/instance: nexusce-migrate-dataapp.kubernetes.io/name: nexusce-migrate-datatemplate:metadata:labels:app.kubernetes.io/instance: nexusce-migrate-dataapp.kubernetes.io/name: nexusce-migrate-dataspec:containers:- image: <ДОМЕН_DOCKER_REGISTRY>/<ПУТЬ_К_ОБРАЗУ>/curl:v1.6.0imagePullPolicy: IfNotPresentname: container-0command:- /bin/sh- -c- while true; do echo "ping..."; sleep 10; donevolumeMounts:- mountPath: /nexus-dataname: nexus-datasecurityContext:runAsUser: 0volumes:- name: nexus-datapersistentVolumeClaim:claimName: nexus-data-nexusce-nxrm-ha-0 -
Создайте временный Deployment:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> create -f deployment.yaml -
Заархивируйте файлы blob-хранилища на ВМ
nexus-w:$ cd /data/nexus$ sudo tar -zcvf nexus-blobs.tgz blobs/ -
Скопируйте архив blob-хранилища на PV нового экземпляра Nexus.
Рекомендуется скопировать на ВМ исполняемый файл
kubectlи административныйkubeconfig, а затем выполнить команду в терминале этой ВМ:$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> cp nexus-blobs.tgz nexusce-migrate-data-xxxxxxxxxx-yyyyy:/nexus-data/nexus-blobs.tgzВ этом случае копирование выполняется напрямую с ВМ в под.
Возможны и другие способы копирования. Например:
-
Загрузите архив в S3-бакет — на ВМ
nexus-wдолжен быть установлен клиент AWS CLI. Затем в подеnexusce-migrate-dataскачайте архив с помощьюcurlпо прямой ссылке. -
Загрузите архив в RAW-репозиторий инфраструктурного Nexus и скачайте его с помощью
curl.
-
-
Распакуйте архив:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> exec nexusce-migrate-data-xxxxxxxxxx-yyyyy -it -- sh/ # cd /nexus-data// # mv blobs blobs.bak/ # tar -zxvf nexus-blobs.tgz/ # chown -R 200:200 blobs/ # rm -f nexus-blobs.tgz/ # exit -
Удалите временный Deployment:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> delete deployment nexusce-migrate-data -
Запустите Nexus CE:
$ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> scale statefulset nexusce-nxrm-ha --replicas=1 -
Импортируйте компоненты из blob-хранилища:
- Откройте веб-интерфейс Nexus CE.
- Перейдите в раздел Settings → System → Tasks.
- Нажмите кнопку Create task.
- Выберите тип задачи
Repair - Reconcile component database from blob store. - В открывшейся форме заполните все обязательные поля.
- В поле Task frequency выберите
Manual. - Сохраните изменения.
- Запустите созданную задачу.
После выполнения задачи содержимое blob-хранилища будет загружено в БД и станет доступным для просмотра в разделе Browse и для скачивания.
-
Если в системе более одного blob-хранилища, повторите импорт для каждого из них.
-
После успешной миграции удалите старые Ingress и Deployment OIDC Proxy:
$ kubectl -n <nexus_namespace> delete deployment nexus-oidc-proxy$ kubectl -n <nexus_namespace> delete ing nexus-oidc-proxy