Implantar em Instâncias de Contêiner do Azure a partir do Registro de Contêiner do Azure usando uma identidade gerenciada
O Azure Container Registry (ACR) é um serviço de registro de contêiner gerenciado baseado no Azure usado para armazenar imagens de contêiner privadas do Docker. Este artigo descreve como extrair imagens de contêiner armazenadas em um registro de contêiner do Azure ao implantar em grupos de contêineres com Instâncias de Contêiner do Azure. Uma maneira de configurar o acesso ao Registro é criar uma identidade gerenciada do Microsoft Entra.
Quando o acesso a um Registro de Contêiner do Azure (ACR) é restrito usando um ponto de extremidade privado, o uso de uma identidade gerenciada permite que as Instâncias de Contêiner do Azure implantadas em uma rede virtual acessem o Registro de contêiner por meio do ponto de extremidade privado.
Pré-requisitos
Registro de contêiner do Azure: você precisa de um registro de contêiner do Azure SKU premium com pelo menos uma imagem. Se você precisar criar um registro, consulte Criar um registro de contêiner usando a CLI do Azure. Certifique-se de que toma nota do registo id
e loginServer
CLI do Azure: Os exemplos de linha de comando neste artigo usam a CLI do Azure e são formatados para o shell Bash. Você pode instalar a CLI do Azure localmente ou usar o Azure Cloud Shell.
Limitações
- Os contêineres do Windows não oferecem suporte a pull de imagem autenticada por identidade gerenciada atribuída pelo sistema com ACR, apenas atribuídos pelo usuário.
Configurar a autenticação do registo
Seu registro de contêiner deve ter os Serviços Confiáveis habilitados. Para encontrar instruções sobre como habilitar serviços confiáveis, consulte Permitir que serviços confiáveis acessem com segurança um registro de contêiner restrito à rede.
Criar uma identidade
Crie uma identidade em sua assinatura usando o comando az identity create . Você pode usar o mesmo grupo de recursos usado anteriormente para criar o registro de contêiner ou um diferente.
az identity create --resource-group myResourceGroup --name myACRId
Para configurar a identidade nas etapas a seguir, use o comando az identity show para armazenar o ID de recurso da identidade e o ID da entidade de serviço em variáveis.
Para configurar corretamente a identidade em etapas futuras, use az identity show para obter e armazenar o ID de recurso da identidade e o ID da entidade de serviço em variáveis.
# 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)
Você precisará do ID de recurso da identidade para entrar na CLI a partir de sua máquina virtual. Para mostrar o valor:
echo $USERID
O ID do recurso é do formato:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId
Você também precisará da ID da entidade de serviço para conceder acesso à identidade gerenciada ao seu registro de contêiner. Para mostrar o valor:
echo $SPID
O ID da entidade de serviço tem o seguinte formato:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
Conceder à identidade uma atribuição de função
Para que sua identidade acesse seu registro de contêiner, você deve conceder-lhe uma atribuição de função. Use o comando a seguir para conceder a acrpull
função à identidade que você acabou de criar, certificando-se de fornecer a ID do seu registro e a entidade de serviço que obtivemos anteriormente:
az role assignment create --assignee $SPID --scope <registry-id> --role acrpull
Implantar usando um modelo do Azure Resource Manager (ARM)
Comece copiando o JSON a seguir em um novo arquivo chamado azuredeploy.json
. No Azure Cloud Shell, você pode usar o Visual Studio Code para criar o arquivo em seu diretório de trabalho:
code azuredeploy.json
Você pode especificar as propriedades do seu registro de contêiner do Azure em um modelo ARM incluindo a imageRegistryCredentials
propriedade na definição de grupo de contêineres. Por exemplo, você pode especificar as credenciais do Registro diretamente:
Nota
Este não é um modelo ARM abrangente, mas sim um exemplo de como seria a resources
seção de um modelo 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"
}
}
Implementar o modelo
Implante seu modelo do Resource Manager com o seguinte comando:
az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json
Implementar com a CLI do Azure
Para implantar um grupo de contêineres usando a identidade gerenciada para autenticar as capturas de imagem por meio da CLI do Azure, use o seguinte comando, certificando-se de que você <dns-label>
seja globalmente exclusivo:
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>
Implantar em uma rede virtual usando a CLI do Azure
Para implantar um grupo de contêineres em uma rede virtual usando a identidade gerenciada para autenticar imagens extraídas de uma ACR que é executada atrás de um ponto de extremidade privado por meio da CLI do Azure, use o seguinte comando:
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
Para saber mais sobre como implantar em uma rede virtual, veja Implantar instâncias de contêiner em uma rede virtual do Azure.
Implantar um grupo de vários contêineres em uma rede virtual usando o YAML e a CLI do Azure
Para implantar um grupo de vários contêineres em uma rede virtual usando a identidade gerenciada para autenticar imagens extraídas de um ACR que é executado atrás de um ponto de extremidade privado por meio da CLI do Azure, você pode especificar a configuração do grupo de contêineres em um arquivo YAML. Em seguida, passe o arquivo YAML como um parâmetro para o 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
Para saber mais sobre como implantar em um grupo de vários contêineres, veja Implantar um grupo de vários contêineres.
Clean up resources (Limpar recursos)
Para remover todos os recursos da sua assinatura do Azure, exclua o grupo de recursos:
az group delete --name myResourceGroup