Usar uma identidade gerida atribuída pelo utilizador no Azure Kubernetes Service (AKS)

Este artigo explica como ativar uma identidade gerida atribuída pelo utilizador num cluster AKS novo ou existente, obter o principal ID da identidade gerida atribuída pelo utilizador e adicionar uma atribuição de função para a identidade gerida atribuída pelo utilizador.

Pré-requisitos

  • Um grupo de recursos Azure existente. Se não tiveres um, podes criar um usando o az group create comando.

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • CLI do Azure versão 2.23.0 ou posterior instalada. Executar az --version para localizar a versão. Se precisares de instalar ou atualizar, vê Install CLI do Azure.
  • Para atualizar um cluster existente para usar uma identidade gerida atribuída pelo utilizador, precisa CLI do Azure versão 2.49.0 ou posterior instalada.
  • Terraform instalado localmente. Para instruções de instalação, consulte Instalar Terraform.

Limitações

  • Depois de criar um cluster com uma identidade gerida, não é possível voltar a utilizar um principal de serviço.
  • Não há suporte para mover ou migrar um cluster gerenciado habilitado para identidade para um locatário diferente.
  • Se o cluster tiver a Identidade Gerida por Pods do Microsoft Entra (aad-pod-identity) ativada, os pods Node-Managed Identity (NMI) modificam as iptables dos nós para intercetar chamadas para o endpoint de Azure Instance Metadata (IMDS). Essa configuração significa que qualquer solicitação feita ao endpoint IMDS é intercetada pelo NMI, mesmo que um pod específico não use aad-pod-identity.
    • Pode configurar a definição de recurso personalizado AzurePodIdentityException (CRD) para especificar que os pedidos para o endpoint IMDS que originam de um pod que corresponde às etiquetas definidas no CRD devem ser proxyados sem qualquer processamento no NMI. Exclua os pods do sistema com o rótulo kubernetes.azure.com/managedby: aks no namespace kube-system ao configurar o CRD AzurePodIdentityException aad-pod-identity. Para mais informações, consulte Identidades geridas por pod do Microsoft Entra no Azure Kubernetes Service (AKS).
    • Para configurar uma exceção, instale o mic-exception YAML.
  • As regiões USDOD Central, USDOD East e USGov Iowa no Azure US Government cloud não suportam a criação de um cluster com uma identidade gerida atribuída pelo utilizador.

Considerações sobre a atualização do cluster

Ao atualizar um cluster, considere a seguinte informação:

  • Uma atualização só funciona se houver uma atualização VHD para consumir. Se você estiver executando o VHD mais recente, precisará esperar até que o próximo VHD esteja disponível para executar a atualização.
  • A CLI do Azure garante que a permissão do seu add-on está corretamente definida após a migração. Se não estiveres a usar a CLI do Azure para realizar a migração, tens de gerir a permissão da identidade do add-on por ti próprio. Para um exemplo usando um modelo Azure Resource Manager (ARM), veja Atribuir Azure funções usando templates ARM.
  • Se o teu cluster estava a usar --attach-acr para extrair imagens do Azure Container Registry (ACR), tens de executar o comando az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> após atualizar o cluster para que o kubelet recém-criado usado para identidade gerida obtenha a permissão para puxar do ACR. Caso contrário, você não poderá extrair do ACR após a atualização.

Criar uma identidade gerenciada atribuída pelo usuário

Se você ainda não tiver um recurso de identidade gerenciado atribuído pelo usuário, crie um usando o az identity create comando.

az identity create \
    --name <identity-name> \
    --resource-group <resource-group-name>

Sua saída deve ser semelhante à saída de exemplo a seguir:

{                                  
    "clientId": "<client-id>",
    "clientSecretUrl": "<clientSecretUrl>",
    "id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>",
    "location": "<location>",
    "name": "<identity-name>",
    "principalId": "<principal-id>",
    "resourceGroup": "<resource-group-name>",
    "tags": {},
    "tenantId": "<tenant-id>",
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

Obter o ID principal da identidade gerenciada atribuída pelo usuário

Obtenha a ID principal da identidade gerenciada atribuída pelo usuário usando o az identity show comando.

CLIENT_ID=$(az identity show \
    --name <identity-name> \
    --resource-group <resource-group-name> \
    --query principalId \
    --output tsv)

Obter o ID de recurso da identidade gerenciada atribuída pelo usuário

Obtenha o ID de recurso da identidade gerenciada atribuída pelo usuário usando o az identity show comando.

RESOURCE_ID=$(az identity show \
    --name <identity-name> \
    --resource-group <resource-group-name> \
    --query id \
    --output tsv)

Habilitar uma identidade gerenciada atribuída pelo usuário em um novo cluster AKS

Crie um cluster AKS com uma identidade gerida atribuída pelo utilizador usando o az aks create comando e o --assign-identity parâmetro definido para o ID de recurso da identidade gerida atribuída pelo utilizador.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --network-plugin azure \
    --vnet-subnet-id <vnet-subnet-id> \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 \
    --assign-identity $RESOURCE_ID \
    --generate-ssh-keys

Atualizar um cluster existente para usar uma identidade gerenciada atribuída pelo usuário

Atualize um cluster existente para usar uma identidade gerida atribuída pelo utilizador usando o az aks update comando e o --assign-identity parâmetro definidos para o ID de recurso da identidade gerida atribuída pelo utilizador.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-managed-identity \
    --assign-identity $RESOURCE_ID

A saída para uma atualização de cluster bem-sucedida para usar uma identidade gerenciada atribuída pelo usuário deve ser semelhante à saída de exemplo a seguir:

...
    "identity": {
    "principalId": null,
    "tenantId": null,
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
        "clientId": "<client-id>",
        "principalId": "<principal-id>"
        }
    }
    },
...

Depois de atualizar o cluster para usar uma identidade gerida atribuída pelo utilizador em vez de um principal de serviço, o plano de controlo e os pods usam a identidade gerida atribuída pelo utilizador para autorização ao aceder a outros serviços no Azure. O Kubelet continua a usar um principal de serviço até que também atualize o seu pool de nós. Uma atualização do pool de nós causa interrupção de serviço no cluster AKS, pois os nós nos pools de nós são desligados, evacuados e re-imagrados. Pode usar o comando nos seus nodos para atualizar para uma identidade gerida e atribuída pelo utilizador.

az aks nodepool upgrade \
  --resource-group <resource-group-name> \
  --cluster-name <aks-cluster-name> \
  --name <node-pool-name> \
  --node-image-only

Observação

A migração de uma identidade gerenciada para o plano de controle de atribuído pelo sistema para atribuído pelo usuário não resulta em nenhum tempo de inatividade para o plano de controle e os pools de agentes. Os componentes do plano de controlo mantêm a identidade antiga atribuída pelo sistema durante várias horas até à próxima atualização do token.

Atribuir um papel Azure RBAC à identidade gerida atribuída pelo utilizador

Adicione uma atribuição de função para a identidade gerenciada atribuída pelo usuário usando o az role assignment create comando. O exemplo seguinte atribui o papel Key Vault Secrets User à identidade gerida atribuída ao utilizador para lhe conceder permissões para aceder a segredos num cofre de chaves. A atribuição de funções está limitada ao recurso Key Vault.

az role assignment create \
    --assignee <client-id> \
    --role "Key Vault Secrets User" \
    --scope "<key-vault-resource-id>"

Observação

Pode levar até 60 minutos para que as permissões concedidas à identidade gerenciada do cluster se propaguem.

Criar o ficheiro de configuração do Terraform

Os ficheiros de configuração do Terraform definem a infraestrutura que o Terraform cria e gere.

  1. Crie um ficheiro chamado main.tf e adicione o seguinte código para definir a versão do Terraform e especificar o fornecedor Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Adicione o código seguinte a main.tf para criar um grupo de recursos Azure. Sinta-se à vontade para alterar o nome e a localização do grupo de recursos conforme necessário.

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

Crie um cluster AKS com uma identidade gerida atribuída pelo utilizador usando o Terraform

Adicione o seguinte código para main.tf criar uma identidade gerida atribuída pelo utilizador e um cluster AKS que utilize essa identidade:

resource "azurerm_user_assigned_identity" "uai" {
 name                = "aks-user-identity"
 resource_group_name = azurerm_resource_group.example.name
 location            = azurerm_resource_group.example.location
}
resource "azurerm_kubernetes_cluster" "user_assigned" {
 name                = "aks-user"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "aksuser"
 identity {
   type         = "UserAssigned"
   identity_ids = [azurerm_user_assigned_identity.uai.id]
 }
 default_node_pool {
   name       = "system"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
}

Adicionar uma atribuição de funções para uma identidade gerida atribuída pelo utilizador usando o Terraform

Adicione o seguinte código a main.tf para criar uma atribuição de função para a identidade gerida atribuída pelo utilizador. Este exemplo atribui o papel Usuário de Segredos do Cofre de Chaves à identidade gerida atribuída pelo utilizador, concedendo-lhe permissões para aceder a segredos num cofre de chaves. A atribuição de funções está limitada ao recurso Key Vault.

resource "azurerm_role_assignment" "user_assigned_key_vault_secrets_user" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "Key Vault Secrets User"
 principal_id         = azurerm_user_assigned_identity.uai.principal_id
}

Inicializar Terraform

Inicialize o Terraform no diretório que contém o seu main.tf ficheiro usando o terraform init comando. Este comando descarrega o fornecedor Azure necessário para gerir os recursos do Azure com o Terraform.

terraform init

Criar um plano de execução do Terraform

Crie um plano de execução Terraform usando o terraform plan comando. Este comando mostra-te os recursos que o Terraform irá criar ou modificar na tua subscrição do Azure.

terraform plan

Aplicar a configuração Terraform

Após rever e confirmar o plano de execução, aplique a configuração do Terraform usando o terraform apply comando. Este comando cria ou modifica os recursos definidos no seu ficheiro main.tf na sua subscrição Azure.

terraform apply

Verificar a implementação do Terraform

Depois de aplicar a configuração do Terraform, pode verificar a implementação usando o comando [az aks show][az-aks-show] com o parâmetro --query para filtrar a saída e mostrar as informações de identidade. Por exemplo:

az aks show \
 --name <cluster-name> \
 --resource-group <resource-group> \
 --query identity.type \
 --output tsv

Para saber mais sobre identidades geridas no AKS, consulte os seguintes artigos: