Перенос 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.
Следующие шаги
- Узнайте, как заблокировать возможность создания конвейеров экспорта из ограниченного сетью реестра контейнеров.