Condividi tramite


Usare un'identità gestita assegnata dall'utente in Servizio Azure Kubernetes (AKS)

Questo articolo spiega come abilitare un'identità gestita assegnata dall'utente in un cluster di Azure Kubernetes Service (AKS) nuovo o esistente, ottenere l'ID principale dell'identità gestita assegnata dall'utente, e aggiungere un'assegnazione di ruolo per la medesima identità.

Prerequisiti

  • Gruppo di risorse Azure esistente. Se non è disponibile, è possibile crearne uno usando il az group create comando .

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • interfaccia della riga di comando di Azure versione 2.23.0 o successiva installata. Eseguire az --version per trovare la versione. Se è necessario installare o aggiornare, vedere Installare interfaccia della riga di comando di Azure.
  • Per aggiornare un cluster esistente per l'uso di un'identità gestita assegnata dall'utente<>, è necessario interfaccia della riga di comando di Azure versione 2.49.0 o successiva installata.

Limitazioni

  • Dopo aver creato un cluster con un'identità gestita, non è possibile tornare all'uso di un'entità servizio.
  • Lo spostamento o la migrazione di un cluster abilitato per l'identità gestita a un tenant diverso non è supportato.
  • Se il cluster dispone di Microsoft Entra identità gestita da pod (aad-pod-identity) abilitata, i pod NMI (Node-Managed Identity) dei nodi modificano le tabelle iptables per intercettare le chiamate all'endpoint IMDS (Instance Metadata) di Azure. Questa configurazione implica che qualsiasi richiesta inviata all'endpoint IMDS venga intercettata da NMI, anche se un particolare pod non utilizza aad-pod-identity.
    • È possibile configurare la definizione di risorsa personalizzata (CRD) di AzurePodIdentityException per specificare che le richieste all'endpoint IMDS provenienti da un pod che corrispondono a etichette definite nel CRD devono essere inoltrate tramite proxy senza alcuna elaborazione in NMI. Escludere i pod di sistema con l'etichetta kubernetes.azure.com/managedby: aks nello spazio dei nomi kube-system in aad-pod-identity configurando il CRD AzurePodIdentityException. Per altre informazioni, vedere Usa le identità pod gestite di Microsoft Entra in Servizio Azure Kubernetes (AKS).
    • Per configurare un'eccezione, installare mic-exception YAML.
  • Le aree USDOD Central, USDOD East e USGov Iowa in Azure Governo Statunitense cloud non supportano la creazione di un cluster con un'identità gestita assegnata dall'utente.

Considerazioni sull'aggiornamento del cluster

Quando si aggiorna un cluster, prendere in considerazione le informazioni seguenti:

  • Un aggiornamento funziona solo se è disponibile un aggiornamento VHD da utilizzare. Se si esegue l'ultimo VHD, è necessario attendere che il prossimo VHD sia disponibile per effettuare l'aggiornamento.
  • Il interfaccia della riga di comando di Azure assicura che l'autorizzazione del componente aggiuntivo sia impostata correttamente dopo la migrazione. Se non si usa il interfaccia della riga di comando di Azure per eseguire l'operazione di migrazione, è necessario gestire manualmente l'autorizzazione dell'identità del componente aggiuntivo. Per un esempio relativo all'uso di un modello di Azure Resource Manager (ARM), vedere Assign Azure roles using ARM templates.
  • Se il cluster usava --attach-acr per eseguire il pull da immagini da Registro Azure Container (ACR), è necessario eseguire il comando az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> dopo aver aggiornato il cluster per consentire al kubelet appena creato usato per l'identità gestita di ottenere l'autorizzazione per eseguire il pull da Registro Azure Container. In caso contrario, non sarà possibile prelevare da Azure Container Registry dopo l'aggiornamento.

Creare un'identità gestita assegnata dall'utente

Se non si ha ancora una risorsa di identità gestita assegnata dall'utente, crearne una usando il comando az identity create.

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

L'output dovrebbe essere simile all'output di esempio seguente:

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

Ottenere l'ID principale dell'identità gestita assegnata dall'utente

Ottenere l'ID principale dell'identità gestita assegnata dall'utente usando il comando az identity show.

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

Ottenere l'ID risorsa dell'identità gestita assegnata dall'utente

Ottenere l'ID risorsa dell'identità gestita assegnata dall'utente usando il comando az identity show.

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

Abilitare un'Identità gestita assegnata dall'utente in un nuovo cluster AKS

Creare un cluster AKS con un'identità gestita assegnata dall'utente usando il comando az aks create e il parametro --assign-identity impostato sull'ID risorsa dell'identità gestita assegnata dall'utente.

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

Aggiornare un cluster esistente per usare un'identità gestita assegnata dall'utente

Aggiornare un cluster esistente per usare un'identità gestita assegnata dall'utente usando il az aks update comando e il --assign-identity parametro impostato sull'ID risorsa dell'identità gestita assegnata dall'utente.

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

L'output per un aggiornamento corretto del cluster per l'uso di un'identità gestita assegnata dall'utente dovrebbe essere simile all'output di esempio seguente:

...
    "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>"
        }
    }
    },
...

Dopo aver aggiornato il cluster per usare un'identità gestita assegnata dall'utente anziché un'entità servizio, il piano di controllo e i pod usano l'identità gestita assegnata dall'utente per l'autorizzazione quando accedono ad altri servizi in Azure. Kubelet continua a usare un'entità servizio fino a quando non si aggiorna anche il pool di nodi. Un aggiornamento del pool di nodi causa tempi di inattività per il cluster AKS poiché i nodi nei pool di nodi vengono bloccati, svuotati e reimmaginati. È possibile usare il comando nei nodi per eseguire l'aggiornamento a un'identità gestita assegnata dall'utente.

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

Annotazioni

La migrazione di un'identità gestita per il piano di controllo, da assegnata dal sistema a assegnata dall'utente, non comporta tempi di inattività per il piano di controllo e i pool di agenti. I componenti del piano di controllo continuano con l'identità assegnata dal sistema precedente fino a diverse ore fino al successivo aggiornamento del token.

Assegnare un ruolo di Azure RBAC all'identità gestita assegnata dall'utente

Aggiungere un'assegnazione di ruolo per l'identità gestita assegnata dall'utente usando il az role assignment create comando . Nell'esempio seguente viene assegnato il ruolo Key Vault Secrets User all'identità gestita assegnata dall'utente per concedere le autorizzazioni per accedere ai segreti in un key vault. L'assegnazione di ruolo è limitata alla risorsa dell'insieme di credenziali delle chiavi.

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

Annotazioni

La propagazione delle autorizzazioni concesse all'identità gestita del cluster può richiedere fino a 60 minuti.

Creare il file di configurazione terraform

I file di configurazione terraform definiscono l'infrastruttura creata e gestita da Terraform.

  1. Creare un file denominato main.tf e aggiungere il codice seguente per definire la versione di Terraform e specificare il provider Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Aggiungere il codice seguente a main.tf per creare un gruppo di risorse Azure. È possibile modificare il nome e la posizione del gruppo di risorse in base alle esigenze.

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

Creare un cluster AKS con identità gestita assegnata dall'utente usando Terraform

Aggiungere il codice seguente a main.tf per creare un'identità gestita assegnata dall'utente e un cluster AKS che usa l'identità:

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

Aggiungere un'assegnazione di ruolo per un'identità gestita assegnata dall'utente usando Terraform

Aggiungere il codice seguente a main.tf per creare un'assegnazione di ruolo per l'identità gestita assegnata dall'utente. In questo esempio viene assegnato il ruolo Key Vault Secrets User all'identità gestita assegnata dall'utente per concedergli le autorizzazioni per accedere ai segreti in un key vault. L'assegnazione di ruolo è limitata alla risorsa dell'insieme di credenziali delle chiavi.

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
}

Inizializzare Terraform

Inizializzare Terraform nella directory contenente il main.tf file usando il terraform init comando . Questo comando scarica il provider di Azure necessario per gestire le risorse Azure con Terraform.

terraform init

Crea un piano di esecuzione di Terraform

Creare un piano di esecuzione terraform usando il comando terraform plan. Questo comando mostra le risorse che Terraform creerà o modificherà nella sottoscrizione Azure.

terraform plan

Applicare la configurazione di Terraform

Dopo aver esaminato e confermato il piano di esecuzione, applicare la configurazione di Terraform usando il terraform apply comando . Questo comando crea o modifica le risorse definite nel file main.tf nella sottoscrizione Azure.

terraform apply

Verificare la distribuzione di Terraform

Dopo aver applicato la configurazione di Terraform, è possibile verificare la distribuzione usando il comando [az aks show][az-aks-show] con il --query parametro per filtrare l'output e visualizzare le informazioni sull'identità. Per esempio:

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

Per ulteriori informazioni sulle identità gestite nel servizio Azure Kubernetes Service (AKS), vedere gli articoli seguenti: