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


Перенос 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 введите значения для перечисленных ниже параметров.

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

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

Свойство 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-объект артефакта.

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

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

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

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

Свойство 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-объекта в вашу исходную учетную запись хранения.

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

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

Параметр Значение
имя_реестра Имя исходного реестра контейнеров.
pipelineRunName Имя, выбранное для запуска.
идентификаторРесурсаКонвейера ИД ресурса для конвейера экспорта.
Пример: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline
targetName Имя, выбранное для BLOB-объекта артефактов, который экспортирован в вашу исходную учетную запись хранения, например myblob.
артефакты Массив исходных артефактов для передачи в виде тегов или дайджестов манифеста.
Пример: [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 или другие методы, чтобы передать данные блобов из исходной учетной записи хранения в целевую.

Например, команда azcopy copy копирует 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>

Примечание.

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

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

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

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

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

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

Параметр Значение
имя реестра Имя вашего целевого реестра контейнеров.
pipelineRunName Имя, выбранное для запуска.
идентификаторРесурсаКонвейера Идентификатор ресурса для потока импорта.
Пример: /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 для удаления ресурсов конвейера, которые были созданы в рамках этой статьи. IDs ресурсов ранее хранились в переменных среды.

# 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 Transfer.

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