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
- Los contenedores de Windows no admiten la extracción de imágenes autenticadas por identidades administradas asignadas por el sistema con ACR, solo las asignadas por el usuario.
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