Usare un'identità gestita kubelet creata in precedenza in Azure Kubernetes Service (AKS)

Questo articolo illustra come abilitare un'identità gestita kubelet creata in un cluster del servizio Azure Kubelet nuovo o esistente, ottenere le proprietà dell'identità gestita kubelet e aggiungere un'assegnazione di ruolo per l'identità gestita kubelet.

Prerequisiti

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

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI versione 2.26.0 o successiva installata. Eseguire az --version per trovare la versione. Se è necessario installare o aggiornare, vedere Installare Azure CLI.

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 nel cluster è abilitata l'identità gestita dal pod di Microsoft Entra (aad-pod-identity), i pod di identità gestita dal nodo modificano le tabelle iptable dei nodi per intercettare le chiamate all'endpoint IMDS (Azure Instance Metadata). 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 ulteriori informazioni, vedere Usare le identità gestite dai pod di Microsoft Entra nel servizio Azure Kubernetes (AKS).
    • Per configurare un'eccezione, installare mic-exception YAML.
  • Un'identità kubelet pre-creata deve essere un'identità gestita assegnata dall'utente.
  • Le aree Cina orientale e Cina settentrionale in Microsoft Azure gestite da 21Vianet non sono supportate.

Importante

Tutte le funzionalità di Microsoft Defender for Cloud verranno ritirate ufficialmente nell'Azure nella regione della Cina il 18 agosto 2026. A causa di questo prossimo ritiro, i clienti di Azure in Cina non sono più in grado di eseguire l'onboarding di nuove sottoscrizioni al servizio. Una nuova sottoscrizione è una sottoscrizione che non è già stata inserita nel servizio Microsoft Defender for Cloud prima del 18 agosto 2025, la data dell'annuncio di ritiro. Per altre informazioni sul ritiro, vedere Annuncio relativo alla deprecazione di Microsoft Defender for Cloud in Microsoft Azure gestito da 21Vianet.

I clienti devono collaborare con i rappresentanti dell'account per Microsoft Azure gestito da 21Vianet per valutare l'impatto di questo ritiro sulle proprie operazioni.

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.
  • L'interfaccia della riga di comando di Azure garantisce che l'autorizzazione del componente aggiuntivo sia impostata correttamente dopo la migrazione. Se non si usa l'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 Azure Container Registry (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 da kubelet

Se non si ha un'identità gestita kubelet, crearne una usando il comando az identity create.

az identity create \
    --name <kubelet-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/<kubelet-identity-name>",
    "location": "<location>",
    "name": "<kubelet-identity-name>",
    "principalId": "<principal-id>",
    "resourceGroup": "<resource-group-name>",
    "tags": {},
    "tenantId": "<tenant-id>",
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

Assegnare un ruolo controllo degli accessi in base al ruolo all'identità gestita kubelet

Assegnare il ruolo acrpull nell'identità gestita da kubelet usando il comando az role assignment create.

az role assignment create \
    --assignee <kubelet-client-id> \
    --role "acrpull" \
    --scope "<acr-registry-id>"

Abilitare un'identità gestita del kubelet in un nuovo cluster AKS

Creare un cluster AKS utilizzando le identità esistenti usando il comando az aks create.

az aks create \
    --resource-group <resource-group-name> \
    --name <aks-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 <identity-resource-id> \
    --assign-kubelet-identity <kubelet-identity-resource-id> \
    --generate-ssh-keys

Una creazione riuscita di un cluster AKS utilizzando un'identità gestita da kubelet dovrebbe produrre un output simile al 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>"
        }
    }
    },
    "identityProfile": {
    "kubeletidentity": {
        "clientId": "<client-id>",
        "objectId": "<object-id>",
        "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<kubelet-identity-name>"
    }
    },
...

Aggiornare un cluster esistente per usare un'identità gestita da kubelet

Per aggiornare un cluster esistente per usare l'identità gestita kubelet, ottenere prima di tutto l'identità gestita del piano di controllo corrente per il cluster del servizio Azure Kubernetes.

Avviso

Aggiornando l'identità gestita da kubelet aggiorna i pool di nodi del cluster del servizio Azure Kubernetes AKS, assicurarsi di avere le corrette configurazioni di disponibilità, ad esempio Pod Disruption Budgets, configurate prima di eseguire questa operazione per evitare interruzioni del carico di lavoro o eseguire l'aggiornamento durante una finestra di manutenzione.

  1. Verificare che il cluster AKS stia usando l'identità gestita assegnata dall'utente usando il comando az aks show.

    az aks show \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --query "servicePrincipalProfile"
    

    Se il cluster usa un'identità gestita, l'output viene visualizzato clientId con un valore msi. Un cluster che usa un'entità servizio mostra un ID oggetto. Per esempio:

    {
      "clientId": "msi"
    }
    
  2. Dopo aver confermato che il cluster usa un'identità gestita, trovare l'ID risorsa dell'identità gestita usando il comando az aks show.

    az aks show --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --query "identity"
    

    Per un'identità gestita assegnata dall'utente, l'output dovrebbe essere simile all'output di esempio seguente:

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": <identity-resource-id>
          "clientId": "<client-id>",
          "principalId": "<principal-id>"
    },
    
  3. Aggiornare il cluster con le identità esistenti usando il comando az aks update. Specificare l'ID risorsa dell'identità gestita assegnata dall'utente per il piano di controllo per il parametro assign-identity. Specificare l'ID risorsa dell'identità gestita kubelet per il parametro assign-kubelet-identity.

    az aks update \
        --resource-group <resource-group-name> \
        --name <aks-cluster-name> \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    L'output per un aggiornamento riuscito del cluster usando la propria identità gestita di kubelet dovrebbe assomigliare al seguente output di esempio:

    ...
      "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>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<kubelet-identity-name>"
        }
      },
    ...
    

Ottenere le proprietà dell'identità gestita da kubelet

Ottenere le proprietà dell'identità gestita da kubelet usando il comando az aks show ed eseguire la query sulla proprietà identityProfile.kubeletidentity.

az aks show \
    --name <aks-cluster-name> \
    --resource-group <resource-group-name> \
    --query "identityProfile.kubeletidentity"

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 terraform e specificare il provider di Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Aggiungi il seguente codice a main.tf per creare un gruppo di risorse di 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 un'identità gestita di kubelet precreata usando Terraform.

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

resource "azurerm_user_assigned_identity" "kubelet" {
 name                = "aks-kubelet-identity"
 resource_group_name = azurerm_resource_group.example.name
 location            = azurerm_resource_group.example.location
}
resource "azurerm_kubernetes_cluster" "kubelet_identity" {
 name                = "aks-kubelet"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "akskubelet"
 identity {
   type         = "UserAssigned"
   identity_ids = [azurerm_user_assigned_identity.kubelet.id]
 }
 kubelet_identity {
   client_id                 = azurerm_user_assigned_identity.kubelet.client_id
   object_id                 = azurerm_user_assigned_identity.kubelet.principal_id
   user_assigned_identity_id = azurerm_user_assigned_identity.kubelet.id
 }
 default_node_pool {
   name       = "system"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
}

Aggiungere un'assegnazione di ruolo per l'identità gestita kubelet usando Terraform

Aggiungere il codice seguente a main.tf per creare un'assegnazione di ruolo per l'identità gestita kubelet. Questo esempio assegna il ruolo AcrPull all'identità gestita kubelet per concedergli le autorizzazioni per eseguire il pull delle immagini dal Registro Azure Container. L'assegnazione di ruolo ha come ambito il gruppo di risorse.

Annotazioni

Negli scenari di produzione assegnare il ruolo AcrPull nell'ambito di Registro Azure Container anziché al gruppo di risorse.

resource "azurerm_role_assignment" "kubelet_acr_pull" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "AcrPull"
 principal_id         = azurerm_user_assigned_identity.kubelet.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 di 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 di 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 main.tf file nella sottoscrizione di Azure.

terraform apply

Verificare la distribuzione di Terraform

Dopo aver applicato la configurazione di Terraform, è possibile verificare la distribuzione usando il az aks show comando 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: