Wdrażanie w usłudze Azure Container Instances z usługi Azure Container Registry przy użyciu tożsamości zarządzanej

Azure Container Registry (ACR) to oparta na platformie Azure usługa rejestru kontenerów zarządzanych używana do przechowywania prywatnych obrazów kontenerów platformy Docker. W tym artykule opisano sposób ściągania obrazów kontenerów przechowywanych w rejestrze kontenerów platformy Azure podczas wdrażania w grupach kontenerów za pomocą usługi Azure Container Instances. Jednym ze sposobów konfigurowania dostępu do rejestru jest utworzenie tożsamości zarządzanej firmy Microsoft Entra.

Gdy dostęp do usługi Azure Container Registry (ACR) jest ograniczony przy użyciu prywatnego punktu końcowego, użycie tożsamości zarządzanej umożliwia usłudze Azure Container Instances wdrożone w sieci wirtualnej dostęp do rejestru kontenerów za pośrednictwem prywatnego punktu końcowego.

Wymagania wstępne

Rejestr kontenerów platformy Azure: potrzebujesz rejestru kontenerów platformy Azure w warstwie Premium z co najmniej jednym obrazem. Jeśli musisz utworzyć rejestr, zobacz Tworzenie rejestru kontenerów przy użyciu interfejsu wiersza polecenia platformy Azure. Pamiętaj, aby zanotować rejestry id i loginServer

Interfejs wiersza polecenia platformy Azure: przykłady wiersza polecenia w tym artykule używają interfejsu wiersza polecenia platformy Azure i są formatowane dla powłoki Bash. Interfejs wiersza polecenia platformy Azure można zainstalować lokalnie lub użyć usługi Azure Cloud Shell.

Ograniczenia

Konfigurowanie uwierzytelniania rejestru

Rejestr kontenerów musi mieć włączone zaufane usługi. Aby znaleźć instrukcje dotyczące włączania zaufanych usług, zobacz Zezwalanie zaufanym usługom na bezpieczny dostęp do rejestru kontenerów z ograniczeniami sieci.

Tworzenie tożsamości

Utwórz tożsamość w subskrypcji przy użyciu polecenia az identity create . Możesz użyć tej samej grupy zasobów, która była wcześniej używana do utworzenia rejestru kontenerów lub innej.

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

Aby skonfigurować tożsamość w poniższych krokach, użyj polecenia az identity show , aby zapisać identyfikator zasobu tożsamości i identyfikator jednostki usługi w zmiennych.

Aby prawidłowo skonfigurować tożsamość w przyszłych krokach, użyj polecenia az identity show , aby uzyskać i zapisać identyfikator zasobu tożsamości i identyfikator jednostki usługi w zmiennych.

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

Aby zalogować się do interfejsu wiersza polecenia z maszyny wirtualnej, potrzebny będzie identyfikator zasobu tożsamości. Aby wyświetlić wartość:

echo $USERID

Identyfikator zasobu ma postać:

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

Potrzebny będzie również identyfikator jednostki usługi, aby udzielić tożsamości zarządzanej dostępu do rejestru kontenerów. Aby wyświetlić wartość:

echo $SPID

Identyfikator jednostki usługi ma postać:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Udzielanie tożsamości przypisania roli

Aby tożsamość uzyskiwała dostęp do rejestru kontenerów, należy przyznać jej przypisanie roli. Użyj polecenia , aby przyznać acrpull rolę utworzonej tożsamości, upewniając się, że podaj identyfikator rejestru i jednostkę usługi uzyskaną wcześniej:

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

Wdrażanie przy użyciu szablonu usługi Azure Resource Manager (ARM)

Zacznij od skopiowania następującego pliku JSON do nowego pliku o nazwie azuredeploy.json. W usłudze Azure Cloud Shell możesz użyć programu Visual Studio Code do utworzenia pliku w katalogu roboczym:

code azuredeploy.json

Właściwości rejestru kontenerów platformy Azure można określić w szablonie usługi ARM, uwzględniając imageRegistryCredentials właściwość w definicji grupy kontenerów. Można na przykład bezpośrednio określić poświadczenia rejestru:

Uwaga

Nie jest to kompleksowy szablon usługi ARM, ale raczej przykładowa resources sekcja kompletnego szablonu.

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

Wdrażanie szablonu

Wdróż szablon usługi Resource Manager za pomocą następującego polecenia:

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

Wdrażanie przy użyciu interfejsu wiersza polecenia platformy Azure

Aby wdrożyć grupę kontenerów przy użyciu tożsamości zarządzanej w celu uwierzytelniania ściągnięcia obrazu za pośrednictwem interfejsu wiersza polecenia platformy Azure, użyj następującego polecenia, upewniając się, że element <dns-label> jest globalnie unikatowy:

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>

Wdrażanie w sieci wirtualnej przy użyciu interfejsu wiersza polecenia platformy Azure

Aby wdrożyć grupę kontenerów w sieci wirtualnej przy użyciu tożsamości zarządzanej w celu uwierzytelniania ściągania obrazu z usługi ACR działającej za prywatnym punktem końcowym za pośrednictwem interfejsu wiersza polecenia platformy Azure, użyj następującego polecenia:

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

Aby uzyskać więcej informacji na temat wdrażania w sieci wirtualnej, zobacz Wdrażanie wystąpień kontenera w sieci wirtualnej platformy Azure.

Wdrażanie grupy z wieloma kontenerami w sieci wirtualnej przy użyciu języka YAML i interfejsu wiersza polecenia platformy Azure

Aby wdrożyć grupę z wieloma kontenerami w sieci wirtualnej przy użyciu tożsamości zarządzanej w celu uwierzytelnienia ściągania obrazu z usługi ACR działającej za prywatnym punktem końcowym za pośrednictwem interfejsu wiersza polecenia platformy Azure, możesz określić konfigurację grupy kontenerów w pliku YAML. Następnie przekaż plik YAML jako parametr do polecenia .

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

Aby uzyskać więcej informacji na temat wdrażania w grupie z wieloma kontenerami, zobacz Deploy a multi-container group (Wdrażanie grupy z wieloma kontenerami).

Czyszczenie zasobów

Aby usunąć wszystkie zasoby z subskrypcji platformy Azure, usuń grupę zasobów:

az group delete --name myResourceGroup

Następne kroki