Menyebarkan ke Azure Container Instances dari Azure Container Registry menggunakan identitas terkelola

Azure Container Registry (ACR) adalah layanan registri kontainer terkelola berbasis Azure yang digunakan untuk menyimpan gambar kontainer Docker privat. Artikel ini menjelaskan cara menarik gambar kontainer yang disimpan di registri kontainer Azure saat menyebarkan ke grup kontainer dengan Azure Container Instances. Salah satu cara untuk mengonfigurasi akses registri adalah dengan membuat identitas terkelola Microsoft Entra.

Saat akses ke Azure Container Registry (ACR) dibatasi menggunakan titik akhir privat, menggunakan identitas terkelola memungkinkan Azure Container Instances disebarkan ke jaringan virtual untuk mengakses registri kontainer melalui titik akhir privat.

Prasyarat

Registri kontainer Azure: Anda memerlukan registri kontainer Azure SKU premium dengan setidaknya satu gambar. Jika Anda perlu membuat registri, lihat Membuat registri kontainer menggunakan Azure CLI. Pastikan untuk mencatat id dan loginServer registri

Microsoft Azure CLI: Contoh baris perintah dalam artikel ini menggunakan Microsoft Azure CLI dan diformat untuk shell Bash. Anda dapat memasang Microsoft Azure CLI secara lokal, atau menggunakan Microsoft Azure Cloud Shell.

Batasan

Konfigurasikan autentikasi registri

Registri kontainer Anda harus mengaktifkan Layanan Tepercaya. Untuk menemukan instruksi tentang cara mengaktifkan layanan tepercaya, lihat Mengizinkan layanan tepercaya mengakses registri kontainer yang dibatasi jaringan dengan aman.

Buat Identitas

Buat identitas di langganan Anda menggunakan perintah buat identitas az. Anda dapat menggunakan grup sumber daya yang sama yang Anda gunakan sebelumnya untuk membuat registri kontainer, atau yang berbeda.

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

Untuk mengonfigurasi identitas dalam langkah-langkah berikut, gunakan perintah az identity show untuk menyimpan ID sumber daya identitas dan ID perwakilan layanan dalam variabel.

Untuk mengonfigurasi identitas dengan benar di langkah mendatang, gunakan az identity show untuk mendapatkan dan menyimpan ID sumber daya identitas dan ID perwakilan layanan dalam variabel.

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

Anda memerlukan ID sumber daya identitas untuk masuk ke CLI dari mesin virtual Anda. Untuk menunjukkan nilai:

echo $USERID

ID sumber daya dalam bentuk:

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

Anda juga memerlukan ID perwakilan layanan untuk memberikan akses identitas terkelola ke registri kontainer Anda. Untuk menunjukkan nilai:

echo $SPID

ID perwakilan layanan dalam bentuk:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Memberikan identitas dengan penetapan peran

Agar identitas Anda dapat mengakses registri kontainer, Anda harus memberi identitas dengan penetapan peran. Gunakan perintah berikut untuk memberikan peran acrpull ke identitas yang baru saja Anda buat, pastikan untuk memberikan ID registri Anda dan perwakilan layanan yang kita dapatkan sebelumnya:

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

Menyebarkan dengan menggunakan template Azure Resource Manager (ARM)

Mulailah dengan menyalin JSON berikut ke dalam file baru bernama azuredeploy.json. Di Azure Cloud Shell, Anda bisa menggunakan Visual Studio Code untuk membuat file di direktori kerja:

code azuredeploy.json

Anda dapat menentukan properti registri kontainer Azure di template ARM dengan menyertakan properti imageRegistryCredentials dalam definisi grup kontainer. Contohnya, Anda dapat menentukan informasi masuk registri secara langsung:

Catatan

Ini bukan template ARM yang komprehensif, melainkan contoh bagaimana bagian resources dari template yang lengkap akan terlihat.

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

Menyebarkan templat

Sebarkan template Resource Manager Anda dengan perintah berikut:

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

Menyebarkan dengan menggunakan Azure CLI

Untuk menyebarkan grup kontainer menggunakan identitas terkelola untuk mengautentikasi penarikan gambar melalui Azure CLI, gunakan perintah berikut, memastikan bahwa <dns-label> Anda unik secara global:

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>

Menyebarkan di jaringan virtual menggunakan Azure CLI

Untuk menyebarkan grup kontainer ke jaringan virtual menggunakan identitas terkelola untuk mengautentikasi penarikan gambar dari ACR yang berjalan di belakang titik akhir privat melalui Azure CLI, gunakan perintah berikut:

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

Untuk informasi selengkapnya tentang cara menyebarkan ke jaringan virtual, lihat Menyebarkan instans kontainer ke jaringan virtual Azure.

Menyebarkan grup multi-kontainer di jaringan virtual menggunakan YAML dan Azure CLI

Untuk menyebarkan grup multi-kontainer ke jaringan virtual menggunakan identitas terkelola untuk mengautentikasi penarikan gambar dari ACR yang berjalan di belakang titik akhir privat melalui Azure CLI, Anda dapat menentukan konfigurasi grup kontainer dalam file YAML. Kemudian loloskan file YAML sebagai parameter ke perintah.

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

Untuk informasi selengkapnya tentang cara menyebarkan ke grup multi-kontainer, lihat Menyebarkan grup multi-kontainer.

Membersihkan sumber daya

Untuk menghapus semua sumber daya dari langganan Azure Anda, hapus grup sumber daya:

az group delete --name myResourceGroup

Langkah berikutnya