Distribuire in Istanze di contenitori di Azure da Registro contenitori di Azure tramite un'identità gestita

Registro Azure Container (ACR) è un servizio di registro contenitori gestito basato su Azure usato per archiviare immagini di contenitori Docker private. Questo articolo descrive come eseguire il pull delle immagini del contenitore archiviate in un Registro Azure Container durante la distribuzione in gruppi di contenitori con Istanze di Azure Container. Un modo per configurare l'accesso al Registro di sistema consiste nel creare un'identità gestita di Microsoft Entra.

Quando l'accesso a un Registro Azure Container (ACR) è limitato tramite un endpoint privato, l'uso di un'identità gestita consente Istanze di Azure Container distribuita in una rete virtuale per accedere al registro contenitori tramite l'endpoint privato.

Prerequisiti

registro Azure Container: è necessario un registro Azure Container con SKU Premium con almeno un'immagine. Se è necessario creare un registro, vedere Creare un registro contenitori usando l'interfaccia della riga di comando di Azure. Assicurarsi di prendere nota dei id e loginServer del registro

Interfaccia della riga di comando di Azure: gli esempi della riga di comando in questo articolo usano l'interfaccia della riga di comando di Azure e sono formattati per la shell Bash. È possibile installare l'interfaccia della riga di comando di Azure localmente o usare Azure Cloud Shell.

Limiti

  • Istanze di Azure Container non supporta il prelievo di immagini da ACR autenticato tramite identità gestita assegnata dal sistema. È necessario usare un'identità gestita assegnata dall'utente per autenticare i pull delle immagini dal Registro Azure Container, indipendentemente dal sistema operativo del gruppo di contenitori.
  • Quando si usa un endpoint privato per Registro Azure Container all'interno di una rete virtuale, l'endpoint privato del Registro Azure Container deve trovarsi in una subnet diversa da quella delegata a Istanze di Azure Container. Le subnet delegate ACI possono contenere solo gruppi di contenitori. Il posizionamento dell'endpoint privato di ACR nella stessa subnet delegata causa un conflitto e la distribuzione ha esito negativo.

Nota

L'accesso con identità gestita a un Registro Azure Container privato può essere configurato solo tramite un modello ARM/Bicep o la CLI di Azure più recente.

Configurare l'autenticazione del registro

Il registro contenitori deve avere Servizi attendibili abilitati. Per istruzioni su come abilitare i servizi attendibili, vedere Consentire ai servizi attendibili di accedere in modo sicuro a un registro contenitori con restrizioni di rete.

Creare un'identità

Creare un'identità nella sottoscrizione usando il comando az identity create. È possibile usare lo stesso gruppo di risorse usato in precedenza per creare il registro contenitori o uno diverso.

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

Per configurare l'identità nei passaggi seguenti, usare il comando az identity show per archiviare l'ID risorsa dell'identità e l'ID dell'entità servizio nelle variabili.

Per configurare correttamente l'identità nei passaggi successivi, usare az identity show per ottenere e salvare in variabili l'ID della risorsa dell'identità e l'ID dell'entità servizio.

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

Per accedere all'interfaccia della riga di comando dalla tua macchina virtuale, è necessario l'ID della risorsa dell'identità. Per visualizzare il valore:

echo $USERID

L'ID risorsa è nel formato seguente:

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

Avrai inoltre bisogno dell'ID dell'entità servizio per concedere all'identità gestita l'accesso al registro contenitori. Per visualizzare il valore:

echo $SPID

L'ID dell'entità servizio ha il formato seguente:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Concedere all'identità un'assegnazione di ruolo

Affinché la tua identità possa accedere al registro di contenitori, devi concederle un'assegnazione di ruolo. Usare il comando seguente per concedere il ruolo acrpull all'identità creata, assicurandosi di specificare l'ID del registro e il service principal ottenuto in precedenza:

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

Distribuire usando un modello di Azure Resource Manager (ARM)

Per iniziare, copiare il codice JSON seguente in un nuovo file denominato azuredeploy.json. In Azure Cloud Shell è possibile usare Visual Studio Code per creare il file nella directory di lavoro:

code azuredeploy.json

È possibile specificare le proprietà del registro contenitori di Azure in un modello ARM includendo la proprietà imageRegistryCredentials nella definizione del gruppo di contenitori. Ad esempio, è possibile specificare direttamente le credenziali del Registro di sistema:

Nota

Non si tratta di un modello ARM completo, bensì di un esempio di come apparirebbe la sezione resources di un modello completo.

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

Distribuisci il modello

Distribuire il modello di Resource Manager con il comando seguente:

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

Distribuire usando l'interfaccia della riga di comando di Azure

Per distribuire un gruppo di contenitori che usa un'identità gestita per autenticare il pull delle immagini tramite l'interfaccia della riga di comando di Azure, usare il comando seguente, assicurandosi che <dns-label> sia univoco a livello globale:

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>

Distribuire in una rete virtuale usando l'interfaccia della riga di comando di Azure

Importante

Se il tuo ACR usa un endpoint privato, l'endpoint privato deve trovarsi in una subnet diversa da quella delegata ad Istanze di Azure Container. Le subnet delegate ad ACI possono contenere solo gruppi di contenitori, quindi il posizionamento dell'endpoint privato di ACR nella stessa subnet causa il fallimento della distribuzione.

Per distribuire un gruppo di contenitori in una rete virtuale usando un'identità gestita per autenticare il pull delle immagini da un ACR in esecuzione dietro un endpoint privato tramite l'interfaccia della riga di comando di Azure, usa il comando seguente:

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

Per altre informazioni su come eseguire la distribuzione in una rete virtuale, vedere Distribuire istanze di contenitori in una rete virtuale di Azure.

Distribuire un gruppo multi-contenitore in una rete virtuale usando YAML e l'interfaccia della riga di comando di Azure

Importante

Se il tuo ACR utilizza un endpoint privato, l'endpoint privato deve trovarsi in una subnet diversa da quella delegata a Istanze di Azure Container. Le subnet delegate ad ACI possono contenere solo gruppi di contenitori, quindi collocare l'endpoint privato di ACR nella stessa subnet causa il fallimento della distribuzione.

Per distribuire un gruppo multicontenitore in una rete virtuale usando l'identità gestita per autenticare il pull delle immagini da un'istanza di Azure Container Registry (ACR) che si trova dietro un endpoint privato tramite interfaccia della riga di comando di Azure, è possibile specificare la configurazione del gruppo di contenitori in un file YAML. Quindi passare il file YAML come parametro per il 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

Per altre informazioni su come eseguire la distribuzione in un gruppo multi-contenitore, vedere Distribuire un gruppo multi-contenitore.

Pulire le risorse

Per rimuovere tutte le risorse dalla sottoscrizione di Azure, eliminare il gruppo di risorse:

az group delete --name myResourceGroup

Passaggi successivi