Implementación en Azure Container Instances desde Azure Container Registry mediante una identidad administrada

Azure Container Registry (ACR) es un servicio de registro de contenedores administrado basado en Azure que se usa para almacenar imágenes de contenedor de Docker privadas. En este artículo se describe cómo extraer imágenes de contenedor almacenadas en una instancia de Azure Container Registry al implementarlas en grupos de contenedores con Azure Container Instances. Una manera de configurar el acceso al registro consiste en crear una identidad administrada de Microsoft Entra.

Cuando el acceso a un Azure Container Registry (ACR) está restringido mediante un punto de conexión privado, el uso de una identidad administrada permite Azure Container Instances implementar en una red virtual para acceder al registro de contenedor a través del punto de conexión privado.

Requisitos previos

Azure Container Registry: necesita una SKU Premium de Azure Container Registry con al menos una imagen. Si necesita crear un registro, consulte Creación de un registro de contenedor con la CLI de Azure. Asegúrese de tomar nota de los valores de id y loginServer del registro

CLI de Azure: los ejemplos de línea de comandos de este artículo usan la CLI de Azure y tienen un formato adecuado para el shell de Bash. Puede instalar la CLI de Azure localmente o usar Azure Cloud Shell.

Limitaciones

Configurar la autenticación del registro

El registro de contenedor debe tener servicios de confianza habilitados. Para obtener instrucciones sobre cómo habilitar servicios de confianza, consulte Permitir que los servicios de confianza accedan de forma segura a un registro de contenedor con restricciones de red.

Creación de una identidad

Cree una identidad en la suscripción con el comando az identity create. Puede usar el mismo grupo de recursos que usó anteriormente para crear el registro de contenedor o uno diferente.

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

Para configurar la identidad en los pasos siguientes, use el comando az identity show para almacenar en variables los identificadores de la entidad de servicio y del recurso de la identidad.

Para configurar correctamente la identidad en pasos futuros, use az identity show para obtener y almacenar el identificador de recurso y el identificador de la entidad de servicio de la identidad en las variables.

# 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)

Necesitará el identificador de recurso de la identidad para iniciar sesión en la CLI desde la máquina virtual. Para mostrar el valor:

echo $USERID

El identificador de recurso tiene el formato siguiente:

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

También necesitará el identificador de la entidad de servicio para conceder a la identidad administrada acceso al registro de contenedor. Para mostrar el valor:

echo $SPID

El identificador de la entidad de servicio tiene el formato siguiente:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Conceder una asignación de roles a la identidad

Para que la identidad acceda al registro de contenedor, debe concederle una asignación de roles. Use el comando siguiente para conceder el rol acrpull a la identidad que acaba de crear y asegúrese de proporcionar el identificador y la entidad de servicio del registro que se obtuvo anteriormente:

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

Implementación de una plantilla de Azure Resource Manager (ARM)

Para empezar, copie el siguiente código JSON en un nuevo archivo denominado azuredeploy.json. En Azure Cloud Shell, puede usar Visual Studio Code para crear el archivo en el directorio de trabajo:

code azuredeploy.json

Puede especificar las propiedades de Azure Container Registry en una plantilla de ARM; para ello, debe incluir la propiedad imageRegistryCredentials en la definición del grupo de contenedores. Por ejemplo, puede especificar las credenciales del registro directamente:

Nota

No se trata de una plantilla de ARM completa, sino de un ejemplo del aspecto que tendría la sección resources de una plantilla completa.

{
    "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"
    }
  }

Implementación de la plantilla

Implemente la plantilla de Resource Manager con el siguiente comando:

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

Implementación mediante la CLI de Azure

Para implementar un grupo de contenedores mediante una identidad administrada para autenticar las extracciones de imágenes a través de la CLI de Azure, use el siguiente comando y asegúrese de que su <dns-label> es único globalmente:

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>

Implemente en una red virtual mediante la CLI de Azure

Para implementar un grupo de contenedores en una red virtual mediante una identidad administrada para autenticar las extracciones de imágenes de un ACR que se ejecuta detrás de un punto de conexión privado mediante la CLI de Azure, use el siguiente comando:

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

Para más información sobre cómo implementar en una red virtual, consulte Implementación de instancias de contenedor en una red virtual de Azure.

Implementación de un grupo de varios contenedores en una red virtual mediante YAML y la CLI de Azure

Para implementar un grupo de varios contenedores en una red virtual mediante la identidad administrada para autenticar las extracciones de imágenes de un ACR que se ejecuta detrás de un punto de conexión privado a través de la CLI de Azure, puede especificar la configuración del grupo de contenedores en un archivo YAML. A continuación, pase el archivo YAML como parámetro al comando.

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

Para obtener más información sobre cómo implementar en un grupo de varios contenedores, consulte Implementación de un grupo de varios contenedores.

Limpieza de recursos

Para quitar todos los recursos de la suscripción de Azure, quite el grupo de recursos:

az group delete --name myResourceGroup

Pasos siguientes