Развертывание в службе "Экземпляры контейнеров Azure" из Реестра контейнеров Azure с использованием управляемого удостоверения

Реестр контейнеров Azure (ACR) — это управляемая служба реестра контейнеров на базе Azure, используемая для хранения образов частных контейнеров Docker. В этой статье описывается, как извлекать образы контейнеров, хранящиеся в реестре контейнеров Azure, при развертывании в группах контейнеров с помощью службы "Экземпляры контейнеров Azure". Одним из способов настройки доступа к реестру является создание управляемого удостоверения Microsoft Entra.

Если доступ к Реестр контейнеров Azure (ACR) ограничен с помощью частной конечной точки, использование управляемого удостоверения позволяет Экземпляры контейнеров Azure развертываться в виртуальной сети для доступа к реестру контейнеров через частную конечную точку.

Необходимые компоненты

Реестр контейнеров Azure. Вам нужен реестр контейнеров Azure уровня "Премиум" по крайней мере с одним образом. Если вам нужно создать реестр, см. статью Создание реестра контейнеров с помощью Azure CLI. Обязательно запишите параметры реестра id и loginServer.

Azure CLI. Примеры командной строки в этой статье используют Azure CLI и отформатированы для оболочки Bash. Вы можете установить Azure CLI локально или использовать Azure Cloud Shell.

Ограничения

Настройка проверки подлинности в реестре

В реестр контейнеров должны быть включены Доверенные службы. Инструкции по включению доверенных служб см. в статье Обеспечение безопасного доступа доверенных служб к реестру контейнеров с сетевыми ограничениями.

Создание удостоверения

Создайте в подписке удостоверение, используя команду az identity create. Вы можете использовать ту же группу ресурсов, которую указали ранее для создания реестра контейнеров, либо другую.

az identity create --resource-group myResourceGroup --name myACRId

Чтобы настроить удостоверение на следующих шагах, выполните команду az identity show для сохранения идентификатора ресурса и идентификатора субъекта-службы удостоверения в переменных.

Чтобы правильно настроить удостоверение в последующих шагах, используйте команду az identity show для получения и сохранения ИД ресурса удостоверения и ИД субъекта-службы в переменных.

# Get resource ID of the user-assigned identity
USERID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)
# Get service principal ID of the user-assigned identity
SPID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

Вам понадобится ИД ресурса удостоверения, чтобы войти в интерфейс командной строки с виртуальной машины. Чтобы показать значение:

echo $USERID

ИД ресурса имеет вид:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

Вам также понадобится идентификатор субъекта-службы, чтобы предоставить управляемому удостоверению доступ к вашему реестру контейнеров. Чтобы показать значение:

echo $SPID

Идентификатор субъекта-службы имеет вид:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Предоставление назначения роли удостоверению

Чтобы удостоверение могло получить доступ к реестру контейнеров, необходимо предоставить ему назначение ролей. Используйте следующую команду, чтобы предоставить роль acrpull только что созданному удостоверению, предоставив идентификатор реестра и субъект-службу, полученные ранее:

az role assignment create --assignee $SPID --scope <registry-id> --role acrpull

Развертывание с использованием шаблона Azure Resource Manager (ARM)

Для начала скопируйте следующий код JSON в новый файл с именем azuredeploy.json. В Azure Cloud Shell для создания файла в рабочей папке можно применить Visual Studio Code.

code azuredeploy.json

Вы можете указать свойства реестра контейнеров Azure в шаблоне ARM, включив свойство imageRegistryCredentials в определение группы контейнеров. Например, вы можете напрямую указать учетные данные реестра:

Примечание.

Это не всеобъемлющий шаблон ARM, а скорее пример того, как будет выглядеть раздел resources полного шаблона.

{
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2021-09-01",
    "name": "myContainerGroup",
    "location": "norwayeast",
    "identity": {
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId": {}
        }
    },
    "properties": {
      "containers": [
        {
          "name": "mycontainer",
          "properties": {
            "image": "myacr.azurecr.io/hello-world:latest",
            "ports": [
              {
                "port": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {
              "requests": {
                "cpu": 1,
                "memoryInGB": 1
              }
            }
        }
        }
      ],
      "imageRegistryCredentials": [
        {
            "server":"myacr.azurecr.io",
            "identity":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId"
        }
      ],
      "ipAddress": {
        "ports": [
          {
            "port": 80,
            "protocol": "TCP"
          }
        ],
        "type": "public"
      },
      "osType": "Linux"
    }
  }

Развертывание шаблона

Разверните шаблон ARM с помощью следующей команды:

az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json

Развертывание с использованием интерфейса командной строки Azure

Чтобы развернуть группу контейнеров с помощью управляемого удостоверения для проверки подлинности извлечения образов через Azure CLI, используйте следующую команду, убедившись в глобальной уникальности <dns-label>:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --ports 80 --dns-name-label <dns-label>

Развертывание в виртуальной сети с помощью Azure CLI

Чтобы развернуть группу контейнеров в виртуальной сети с помощью управляемого удостоверения для проверки подлинности образа, извлекаемого из ACR, которая выполняется за частной конечной точкой через Azure CLI, используйте следующую команду:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --vnet "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --subnet mySubnetName

Дополнительные сведения о развертывании в виртуальной сети см. в статье "Развертывание экземпляров контейнеров в виртуальной сети Azure".

Развертывание группы с несколькими контейнерами в виртуальной сети с помощью YAML и Azure CLI

Чтобы развернуть группу с несколькими контейнерами в виртуальной сети с помощью управляемого удостоверения для проверки подлинности образа, извлекаемого из ACR, работающего за частной конечной точкой через Azure CLI, можно указать конфигурацию группы контейнеров в файле YAML. Затем передайте YAML-файл в качестве параметра в команду.

apiVersion: '2021-10-01'
location: eastus
type: Microsoft.ContainerInstance/containerGroups
identity: 
  type: UserAssigned
  userAssignedIdentities: {
    '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId': {}
    }
properties:
  osType: Linux
  imageRegistryCredentials:
  - server: myacr.azurecr.io
    identity: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId'
  subnetIds:
  - id: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNetName/subnets/mySubnetName'
    name: mySubnetName
  containers:
  - name: myContainer-1
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 1
      image: 'myacr.azurecr.io/myimage:latest'
  - name: myContainer-2
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 2
      image: 'myacr.azurecr.io/myimage:latest'
az container create --name my-containergroup --resource-group myResourceGroup --file my-YAML-file.yaml

Дополнительные сведения о развертывании в группе с несколькими контейнерами см. в статье "Развертывание группы с несколькими контейнерами".

Очистка ресурсов

Чтобы удалить все ресурсы из подписки Azure, удалите группу ресурсов:

az group delete --name myResourceGroup

Дальнейшие действия