Distribuera till Azure Container Instances från Azure Container Registry med hjälp av en hanterad identitet
Azure Container Registry (ACR) är en Azure-baserad, hanterad containerregistertjänst som används för att lagra privata Docker-containeravbildningar. Den här artikeln beskriver hur du hämtar containeravbildningar som lagras i ett Azure-containerregister när du distribuerar till containergrupper med Azure Container Instances. Ett sätt att konfigurera registeråtkomst är att skapa en Microsoft Entra-hanterad identitet.
När åtkomsten till ett Azure Container Registry (ACR) begränsas med hjälp av en privat slutpunkt kan Azure Container Instances distribueras till ett virtuellt nätverk för åtkomst till containerregistret via den privata slutpunkten med hjälp av en hanterad identitet.
Förutsättningar
Azure-containerregister: Du behöver ett Premium SKU Azure-containerregister med minst en avbildning. Om du behöver skapa ett register kan du läsa Skapa ett containerregister med hjälp av Azure CLI. Var noga med att anteckna registrets id
och loginServer
Azure CLI: Kommandoradsexemplen i den här artikeln använder Azure CLI och är formaterade för Bash-gränssnittet. Du kan installera Azure CLI lokalt eller använda Azure Cloud Shell.
Begränsningar
- Windows-containrar stöder inte systemtilldelade hanterade identitetsautentiserade avbildningshämtningar med ACR, endast användartilldelade.
Konfigurera registerautentisering
Containerregistret måste ha betrodda tjänster aktiverade. Anvisningar om hur du aktiverar betrodda tjänster finns i Tillåt betrodda tjänster att på ett säkert sätt komma åt ett nätverksbegränsat containerregister.
Skapa en identitet
Skapa en identitet i din prenumeration med kommandot az identity create . Du kan använda samma resursgrupp som du använde tidigare för att skapa containerregistret eller en annan.
az identity create --resource-group myResourceGroup --name myACRId
Om du vill konfigurera identiteten i följande steg använder du kommandot az identity show för att lagra identitetens resurs-ID och tjänstens huvudnamns-ID i variabler.
För att konfigurera identiteten korrekt i framtida steg använder du az identity show för att hämta och lagra identitetens resurs-ID och tjänstens huvudnamns-ID i variabler.
# 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)
Du behöver identitetens resurs-ID för att logga in på CLI från den virtuella datorn. Så här visar du värdet:
echo $USERID
Resurs-ID:t är i formuläret:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId
Du behöver också tjänstens huvudnamns-ID för att ge den hanterade identiteten åtkomst till containerregistret. Så här visar du värdet:
echo $SPID
Tjänstens huvudnamns-ID är av formuläret:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
Bevilja identiteten en rolltilldelning
För att din identitet ska få åtkomst till containerregistret måste du ge den en rolltilldelning. Använd följande kommando för att bevilja acrpull
rollen till den identitet som du just har skapat, och se till att ange registrets ID och tjänstens huvudnamn som vi hämtade tidigare:
az role assignment create --assignee $SPID --scope <registry-id> --role acrpull
Distribuera med hjälp av en ARM-mall (Azure Resource Manager)
Börja med att kopiera följande JSON till en ny fil med namnet azuredeploy.json
. I Azure Cloud Shell kan du använda Visual Studio Code för att skapa filen i arbetskatalogen:
code azuredeploy.json
Du kan ange egenskaperna för ditt Azure-containerregister i en ARM-mall genom att inkludera imageRegistryCredentials
egenskapen i containergruppens definition. Du kan till exempel ange autentiseringsuppgifterna för registret direkt:
Kommentar
Det här är inte en omfattande ARM-mall, utan snarare ett exempel på hur avsnittet i resources
en fullständig mall skulle se ut.
{
"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"
}
}
Distribuera mallen
Distribuera Resource Manager-mallen med följande kommando:
az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json
Distribuera med Azure CLI
Om du vill distribuera en containergrupp med hanterad identitet för att autentisera avbildningshämtningar via Azure CLI använder du följande kommando och ser till att din <dns-label>
är globalt unik:
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>
Distribuera i ett virtuellt nätverk med hjälp av Azure CLI
Om du vill distribuera en containergrupp till ett virtuellt nätverk med hanterad identitet för att autentisera avbildningshämtningar från en ACR som körs bakom en privat slutpunkt via Azure CLI använder du följande kommando:
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
Mer information om hur du distribuerar till ett virtuellt nätverk finns i Distribuera containerinstanser till ett virtuellt Azure-nätverk.
Distribuera en grupp med flera containrar i ett virtuellt nätverk med YAML och Azure CLI
Om du vill distribuera en grupp med flera containrar till ett virtuellt nätverk med hanterad identitet för att autentisera avbildningshämtningar från en ACR som körs bakom en privat slutpunkt via Azure CLI, kan du ange konfigurationen av containergruppen i en YAML-fil. Skicka sedan YAML-filen som en parameter till kommandot .
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
Mer information om hur du distribuerar till en grupp med flera containrar finns i Distribuera en grupp med flera containrar.
Rensa resurser
Ta bort alla resurser från din Azure-prenumeration genom att ta bort resursgruppen:
az group delete --name myResourceGroup