Eseguire la distribuzione in Istanze di Azure Container da Registro Azure Container usando 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 del registro e idloginServer

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

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 futuri, usare az identity show per ottenere e archiviare l'ID risorsa dell'identità e l'ID entità servizio nelle variabili.

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

È necessario l'ID risorsa dell'identità per accedere all'interfaccia della riga di comando dalla macchina virtuale. 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

È necessario anche l'ID entità servizio per concedere all'identità gestita l'accesso al registro contenitori. Per visualizzare il valore:

echo $SPID

L'ID dell'entità servizio è nel formato seguente:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Concedere all'identità un'assegnazione di ruolo

Per consentire all'identità di accedere al registro contenitori, è necessario concedergli un'assegnazione di ruolo. Usare il comando seguente per concedere il ruolo all'identità appena creata, assicurandosi di specificare l'ID acrpull del Registro di sistema e l'entità servizio ottenuta 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 Azure Container in un modello di Resource Manager includendo la imageRegistryCredentials proprietà 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, ma piuttosto di un esempio dell'aspetto resources della sezione 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"
    }
  }

Distribuire il modello

Distribuire il modello di Resource Manager con il comando seguente:

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

Distribuire tramite l'interfaccia della riga di comando di Azure

Per distribuire un gruppo di contenitori usando l'identità gestita per autenticare le immagini tramite l'interfaccia della riga di comando di Azure, usare il comando seguente, assicurandosi che sia <dns-label> 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

Per distribuire un gruppo di contenitori in una rete virtuale usando l'identità gestita per autenticare le immagini pull da un Registro Azure Container eseguito dietro un endpoint privato tramite l'interfaccia della riga di comando di Azure, usare 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/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --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

Per distribuire un gruppo multi-contenitore in una rete virtuale usando l'identità gestita per autenticare le immagini estrae da un record di controllo di accesso eseguito dietro un endpoint privato tramite l'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