Поделиться через


Перенос ACR с помощью шаблонов ARM

Предварительные требования

Перед выполнением действий, описанных в этой статье, выполните предварительные требования, описанные здесь. Это означает следующее.

  • У вас есть реестр номеров SKU цен. категории "Премиум" в обоих облаках.
  • У вас есть контейнер учетной записи хранения в обоих облаках.
  • У вас есть хранилище ключей с секретом, содержащим действительный маркер SAS с необходимыми разрешениями в обоих облаках.
  • У вас есть последняя версия Az CLI, установленная в обоих облаках.

Внимание

Передача ACR поддерживает артефакты с ограничениями размера слоя до 8 ГБ из-за технических ограничений.

Рассмотрите возможность использования расширения Azure CLI

Для большинства неавтомированных вариантов использования рекомендуется использовать расширение Az CLI, если это возможно. Документацию по расширению Azure CLI можно просмотреть здесь.

Создание ресурса ExportPipeline с помощью Resource Manager

Создайте ресурс ExportPipeline для исходного реестра контейнеров с помощью развертывания шаблона Azure Resource Manager.

Скопируйте файлы шаблона Resource Manager для ExportPipeline в локальную папку.

В файле azuredeploy.parameters.json введите значения для перечисленных ниже параметров.

Параметр Значение
registryName Имя исходного реестра контейнеров.
exportPipelineName Имя, выбранное для конвейера экспорта.
targetUri URI контейнера хранилища в исходной среде (целевой объект конвейера экспорта).
Пример: https://sourcestorage.blob.core.windows.net/transfer
keyVaultName Имя исходного хранилища ключей.
sasTokenSecretName Имя секрета маркера SAS в исходном хранилище ключей
Пример: acrexportsas.

Параметры экспорта

Свойство options для конвейеров экспорта поддерживает дополнительные логические значения. Мы рекомендуем использовать перечисленные ниже.

Параметр Значение
options OverwriteBlobs — перезапись существующих целевых BLOB-объектов.
ContinueOnErrors — продолжение экспорта оставшихся в исходном реестре артефактов в случае сбоя экспорта одного артефакта.

Создание ресурса

Выполните команду az deployment group create, чтобы создать ресурс с именем exportPipeline, как показано в примерах ниже. По умолчанию, как показано в первом варианте, пример шаблона позволяет использовать в ресурсе ExportPipeline удостоверение, назначаемое системой.

Второй же вариант позволяет предоставить ресурсу удостоверение, назначаемое пользователем. (Создание удостоверения, назначаемого пользователем, не показано.)

Какой бы из вариантов вы ни использовали, этот шаблон настраивает удостоверение для доступа к маркеру SAS в хранилище ключей для экспорта.

Вариант 1. Создание ресурса и использование удостоверения, назначаемого системой

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipeline \
  --parameters azuredeploy.parameters.json

Вариант 2. Создание ресурса и предоставление удостоверения, назначаемого пользователем

В этой команде в качестве дополнительного параметра укажите ИД ресурса для удостоверения, назначаемого пользователем.

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipeline \
  --parameters azuredeploy.parameters.json \
  --parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"

В выходных данных команды найдите и запишите ИД ресурса (id) для конвейера. Это значение можно сохранить в переменной среды для дальнейшего использования, выполнив команду az deployment group show. Например:

EXPORT_RES_ID=$(az deployment group show \
  --resource-group $SOURCE_RG \
  --name exportPipeline \
  --query 'properties.outputResources[1].id' \
  --output tsv)

Создание ресурса ImportPipeline с помощью Resource Manager

Создайте ресурс ImportPipeline в целевом реестре контейнеров с помощью развертывания шаблона Azure Resource Manager. По умолчанию конвейер автоматически запускается для импорта, когда в учетной записи хранения в целевой среде появляется BLOB-объект артефакта.

Скопируйте файлы шаблона Resource Manager для ImportPipeline в локальную папку.

В файле azuredeploy.parameters.json введите значения для перечисленных ниже параметров.

Параметр Значение
registryName Имя целевого реестра контейнеров.
importPipelineName Имя, выбранное для конвейера импорта.
sourceUri URI контейнера хранилища в целевой среде (источник для конвейера импорта).
Пример: https://targetstorage.blob.core.windows.net/transfer
keyVaultName Имя целевого хранилища ключей.
sasTokenSecretName Имя секрета маркера SAS в целевом хранилище ключей.
Пример: acrimportsas.

Параметры импорта

Свойство options для конвейера импорта поддерживает дополнительные логические значения. Мы рекомендуем использовать перечисленные ниже.

Параметр Значение
options OverwriteTags — перезапись существующих целевых тегов.
DeleteSourceBlobOnSuccess — удаление BLOB-объекта исходного хранилища после успешного импорта в целевой реестр.
ContinueOnErrors — продолжение импорта оставшихся в целевом реестре артефактов в случае сбоя импорта одного артефакта.

Создание ресурса

Выполните команду az deployment group create, чтобы создать ресурс с именем importPipeline, как показано в примерах ниже. По умолчанию, как показано в первом варианте, пример шаблона позволяет использовать в ресурсе ImportPipeline удостоверение, назначаемое системой.

Второй же вариант позволяет предоставить ресурсу удостоверение, назначаемое пользователем. (Создание удостоверения, назначаемого пользователем, не показано.)

Какой бы из вариантов вы ни использовали, этот шаблон настраивает удостоверение для доступа к маркеру SAS в хранилище ключей для импорта.

Вариант 1. Создание ресурса и использование удостоверения, назначаемого системой

az deployment group create \
  --resource-group $TARGET_RG \
  --template-file azuredeploy.json \
  --name importPipeline \
  --parameters azuredeploy.parameters.json

Вариант 2. Создание ресурса и предоставление удостоверения, назначаемого пользователем

В этой команде в качестве дополнительного параметра укажите ИД ресурса для удостоверения, назначаемого пользователем.

az deployment group create \
  --resource-group $TARGET_RG \
  --template-file azuredeploy.json \
  --name importPipeline \
  --parameters azuredeploy.parameters.json \
  --parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"

Если вы планируете выполнить импорт вручную, запишите ИД ресурса (id) для конвейера. Это значение можно сохранить в переменной среды для дальнейшего использования, выполнив команду az deployment group show. Например:

IMPORT_RES_ID=$(az deployment group show \
  --resource-group $TARGET_RG \
  --name importPipeline \
  --query 'properties.outputResources[1].id' \
  --output tsv)

Создание ресурса PipelineRun для экспорта с помощью Resource Manager

Создайте ресурс PipelineRun для исходного реестра контейнеров с помощью развертывания шаблона Azure Resource Manager. Он запускает ранее созданный ресурс ExportPipeline и экспортирует указанные артефакты в виде BLOB-объекта из реестра контейнеров в исходную учетную запись хранения.

Скопируйте файлы шаблона Resource Manager для PipelineRun в локальную папку.

В файле azuredeploy.parameters.json введите значения для перечисленных ниже параметров.

Параметр Значение
registryName Имя исходного реестра контейнеров.
pipelineRunName Имя, выбранное для запуска.
pipelineResourceId ИД ресурса для конвейера экспорта.
Пример: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline
targetName Имя, выбранное для BLOB-объекта артефактов, который экспортирован в исходную учетную запись хранения, например myblob.
artifacts Массив исходных артефактов для передачи в виде тегов или хэша манифеста.
Пример: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."]

Если вы повторно развертываете ресурс PipelineRun с идентичными свойствами, необходимо также использовать свойство forceUpdateTag.

Выполните команду az deployment group create, чтобы создать ресурс PipelineRun. В примере ниже развертывание называется exportPipelineRun.

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipelineRun \
  --parameters azuredeploy.parameters.json

Сохраните ИД ресурса для последующего запуска конвейера в переменной среды:

EXPORT_RUN_RES_ID=$(az deployment group show \
  --resource-group $SOURCE_RG \
  --name exportPipelineRun \
  --query 'properties.outputResources[0].id' \
  --output tsv)

Экспорт артефактов может занять несколько минут. После успешного развертывания проверьте, как прошел экспорт артефактов. Для этого выведите список экспортированных BLOB-объектов в контейнере transfer исходной учетной записи хранения. Например, выполните команду az storage blob list:

az storage blob list \
  --account-name $SOURCE_SA \
  --container transfer \
  --output table

Передача BLOB-объекта (дополнительно)

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

Например, команда azcopy copy копирует BLOB-объект myblob из контейнера transfer в исходной учетной записи в контейнер transfer в целевой учетной записи. Если BLOB-объект уже существует в целевой учетной записи, он будет перезаписан. Для проверки подлинности используются маркеры SAS с соответствующими разрешениями для исходного и целевого контейнеров. (Действия по созданию маркеров не отображаются.)

azcopy copy \
  'https://<source-storage-account-name>.blob.core.windows.net/transfer/myblob'$SOURCE_SAS \
  'https://<destination-storage-account-name>.blob.core.windows.net/transfer/myblob'$TARGET_SAS \
  --overwrite true

Триггер ресурса ImportPipeline

Если для ресурса ImportPipeline включен параметр sourceTriggerStatus (значение по умолчанию), то конвейер активируется после копирования BLOB-объекта в целевую учетную запись хранения. Импорт артефактов может занять несколько минут. После успешного завершения процесса проверьте, как прошел импорт артефактов. Для этого выведите список репозиториев в целевом реестре контейнеров. Например, выполните команду az acr repository list:

az acr repository list --name <target-registry-name>

Примечание.

Триггер источника будет импортировать только BLOB-объекты, измененные за последние 60 дней. Если вы планируете использовать триггер источника для импорта BLOB-объектов, созданные ранее этого срока, обновите время последнего изменения BLOB-объектов, добавив в них метаданные BLOB-объектов, или импортируйте их с помощью созданных вручную запусков конвейеров.

Если вы не включили для конвейера импорта параметр sourceTriggerStatus, запустите ресурс ImportPipeline вручную, как описано в следующем разделе.

Создание ресурса PipelineRun для импорта с помощью Resource Manager (дополнительно)

Вы также можете использовать ресурс PipelineRun, чтобы запустить ImportPipeline для импорта артефактов в целевой реестр контейнеров.

Скопируйте файлы шаблона Resource Manager для PipelineRun в локальную папку.

В файле azuredeploy.parameters.json введите значения для перечисленных ниже параметров.

Параметр Значение
registryName Имя целевого реестра контейнеров.
pipelineRunName Имя, выбранное для запуска.
pipelineResourceId ИД ресурса для конвейера импорта.
Пример: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/importPipelines/myImportPipeline
sourceName Имя существующего BLOB-объекта для экспортированных артефактов в учетной записи хранения, например myblob

Если вы повторно развертываете ресурс PipelineRun с идентичными свойствами, необходимо также использовать свойство forceUpdateTag.

Выполните команду az deployment group create, чтобы запустить ресурс.

az deployment group create \
  --resource-group $TARGET_RG \
  --name importPipelineRun \
  --template-file azuredeploy.json \
  --parameters azuredeploy.parameters.json

Сохраните ИД ресурса для последующего запуска конвейера в переменной среды:

IMPORT_RUN_RES_ID=$(az deployment group show \
  --resource-group $TARGET_RG \
  --name importPipelineRun \
  --query 'properties.outputResources[0].id' \
  --output tsv)

После успешного завершения развертывания проверьте, как прошел импорт артефактов. Для этого выведите список репозиториев в целевом реестре контейнеров. Например, выполните команду az acr repository list:

az acr repository list --name <target-registry-name>

Повторное развертывание ресурса PipelineRun

Если вы повторно развертываете ресурс PipelineRun с идентичными свойствами, необходимо использовать свойство forceUpdateTag. Оно указывает, что ресурс PipelineRun должен быть создан повторно, даже если конфигурация не изменилась. Убедитесь, что forceUpdateTag отличается при каждом повторном развертывании ресурса PipelineRun. В приведенном ниже примере повторно создается ресурс PipelineRun для экспорта. Для свойства forceUpdateTag используется текущая дата и время. Это гарантирует, что оно всегда будет уникальным.

CURRENT_DATETIME=`date +"%Y-%m-%d:%T"`
az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipelineRun \
  --parameters azuredeploy.parameters.json \
  --parameters forceUpdateTag=$CURRENT_DATETIME

Удаление ресурсов конвейера

В примерах ниже в командах используется az resource delete для удаления ресурсов конвейера, которые были созданы в рамках этой статьи. ИД ресурса ранее хранились в переменных сред.

# Delete export resources
az resource delete \
--resource-group $SOURCE_RG \
--ids $EXPORT_RES_ID $EXPORT_RUN_RES_ID \
--api-version 2019-12-01-preview

# Delete import resources
az resource delete \
--resource-group $TARGET_RG \
--ids $IMPORT_RES_ID $IMPORT_RUN_RES_ID \
--api-version 2019-12-01-preview

Устранение неполадок при переносе ACR

Ознакомьтесь с инструкциями по устранению неполадок при переносе ACR.

Следующие шаги