Använda en användartilldelad hanterad identitet i Azure Kubernetes Service (AKS)

Den här artikeln beskriver hur du aktiverar en användartilldelad hanterad identitet i ett nytt eller befintligt AKS-kluster, hämtar huvud-ID:t för den användartilldelade hanterade identiteten och lägger till en rolltilldelning för den användartilldelade hanterade identiteten.

Förutsättningar

  • En befintlig Azure resursgrupp. Om du inte har en kan du skapa en med kommandot az group create .

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI version 2.23.0 eller senare installerad. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.
  • Om du vill uppdatera ett befintligt kluster för att använda en användaretilldelad hanterad identitet behöver du Azure CLI version 2.49.0 eller senare installerad.

Begränsningar

  • När du har skapat ett kluster med en hanterad identitet kan du inte växla tillbaka till att använda tjänstens huvudnamn.
  • Det går inte att flytta eller migrera ett hanterat identitetsaktiverat kluster till en annan klientorganisation.
  • Om klustret har Microsoft Entra poddhanterad identitet (aad-pod-identity) aktiverad, modifierar Node-Managed Identity (NMI)-poddar noderna iptables för att intercepta anrop till IMDS-slutpunkten (Azure Instance Metadata). Den här konfigurationen innebär att alla begäranden som görs till IMDS-slutpunkten fångas upp av NMI, även om en viss podd inte använder aad-pod-identity.
    • Du kan konfigurera den anpassade resursdefinitionen för AzurePodIdentityException (CRD) för att ange att begäranden till IMDS-slutpunkten som kommer från en podd med etiketter som definierats i CRD ska hanteras som proxy utan någon bearbetning i NMI. Undanta systempoddar i kubernetes.azure.com/managedby: aks-namnområdet med -etiketten i aad-pod-identity genom att konfigurera CRD:n AzurePodIdentityException. Mer information finns i Använd Microsoft Entra poddhanterade identiteter i Azure Kubernetes Service (AKS).
    • Om du vill konfigurera ett undantag installerar du mic-exception YAML.
  • Regionerna USDOD Central, USDOD East och USGov Iowa i Azure US Government molnet har inte stöd för att skapa ett kluster med en användartilldelad hanterad identitet.

Uppdatera klusteröverväganden

När du uppdaterar ett kluster bör du tänka på följande information:

  • En uppdatering fungerar bara om det finns en VHD-uppdatering att använda. Om du kör den senaste virtuella hårddisken måste du vänta tills nästa virtuella hårddisk är tillgänglig för att kunna utföra uppdateringen.
  • Azure CLI ser till att tilläggets behörighet har angetts korrekt efter migreringen. Om du inte använder Azure CLI för att utföra migreringsåtgärden måste du hantera tilläggsidentitetens behörighet själv. Ett exempel med hjälp av en Azure Resource Manager-mall (ARM) finns i Tilldela Azure roller med arm-mallar.
  • Om klustret använde --attach-acr för att hämta från avbildningar från Azure Container Registry (ACR) måste du köra kommandot az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> när du har uppdaterat klustret så att den nyligen skapade kubelet som används för hanterad identitet får behörighet att hämta från ACR. Annars kan du inte hämta från ACR efter uppdateringen.

Skapa en användartilldelad hanterad identitet

Om du ännu inte har en användartilldelad hanterad identitetsresurs skapar du en med kommandot az identity create .

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

Dina utdata bör likna följande exempelutdata:

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

Hämta huvud-ID:t för den användartilldelade hanterade identiteten

Använd kommandot az identity show för att hämta huvud-ID:t för den användartilldelade hanterade identiteten.

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

Hämta resurs-ID för den användartilldelade hanterade identiteten

Använd kommandot az identity show för att hämta resurs-ID:t för den användartilldelade hanterade identiteten.

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

Aktivera en användartilldelad hanterad identitet i ett nytt AKS-kluster

Skapa ett AKS-kluster med en användartilldelad hanterad identitet med kommandot az aks create och parametern --assign-identity inställd på resurs-ID för den användartilldelade hanterade identiteten.

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

Uppdatera ett befintligt kluster för att använda en användartilldelad hanterad identitet

Uppdatera ett befintligt kluster för att använda en användartilldelad hanterad identitet med kommandot az aks update och parametern --assign-identity inställd på resurs-ID för den användartilldelade hanterade identiteten.

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

Utdata för en lyckad klusteruppdatering för att använda en användartilldelad hanterad identitet bör likna följande exempelutdata:

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

När du har uppdaterat klustret för att använda en användartilldelad hanterad identitet i stället för ett huvudnamn för tjänsten använder kontrollplanet och poddarna den användartilldelade hanterade identiteten för auktorisering vid åtkomst till andra tjänster i Azure. Kubelet fortsätter att använda tjänstens huvudnamn tills du även uppgraderar nodpoolen. En uppgradering av nodpoolen orsakar stilleståndstid för DITT AKS-kluster eftersom noderna i nodpoolerna är avspärrade, tömda och omskapade. Du kan använda kommandot på noderna för att uppdatera till en användartilldelad hanterad identitet.

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

Anmärkning

Migrering av en hanterad identitet för kontrollplanet från systemtilldelad till användartilldelad leder inte till någon stilleståndstid för kontrollplans- och agentpooler. Kontrollplanskomponenterna fortsätter att använda den gamla systemtilldelade identiteten i upp till flera timmar tills nästa token uppdateras.

Tilldela en Azure RBAC-roll till den användartilldelade hanterade identiteten

Lägg till en rolltilldelning för den användartilldelade hanterade identiteten med kommandot az role assignment create. I följande exempel tilldelas den hanterade användaridentiteten rollen Key Vault Secrets User för att ge den behörighet att komma åt hemligheter i ett nyckelvalv. Rolltilldelningen är begränsad till nyckelvalvsresursen.

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

Anmärkning

Det kan ta upp till 60 minuter innan de behörigheter som beviljas till klustrets hanterade identitet sprids.

Skapa Terraform-konfigurationsfilen

Terraform-konfigurationsfiler definierar infrastrukturen som Terraform skapar och hanterar.

  1. Skapa en fil med namnet main.tf och lägg till följande kod för att definiera Terraform-versionen och ange Azure provider:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Lägg till följande kod i main.tf för att skapa en Azure resursgrupp. Ändra gärna namn och plats för resursgruppen efter behov.

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

Skapa ett AKS-kluster med en användartilldelad hanterad identitet med Terraform

Lägg till följande kod för att main.tf skapa en användartilldelad hanterad identitet och ett AKS-kluster som använder identiteten:

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

Lägga till en rolltilldelning för en användartilldelad hanterad identitet med Terraform

Lägg till följande kod i main.tf för att skapa en rolltilldelning för den hanterade identitet som är användartilldelad. I det här exemplet tilldelas rollen Key Vault Secrets User till den hanterade identiteten som tilldelats användaren för att ge den behörighet att komma åt hemligheter i ett nyckelvalv. Rolltilldelningen är begränsad till nyckelvalvsresursen.

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
}

Initiera Terraform

Initiera Terraform i katalogen som innehåller main.tf filen med hjälp av terraform init kommandot . Det här kommandot laddar ned den Azure provider som krävs för att hantera Azure resurser med Terraform.

terraform init

Skapa en Terraform-utförandeplan

Skapa en Terraform-körningsplan med kommandot terraform plan . Det här kommandot visar de resurser som Terraform skapar eller ändrar i din Azure-prenumeration.

terraform plan

Applicera Terraform-konfigurationen

När du har granskat och bekräftat körningsplanen, verkställer du Terraform-konfigurationen med kommandot terraform apply. Det här kommandot skapar eller ändrar de resurser som definierats i filen main.tf i din Azure-prenumeration.

terraform apply

Verifiera Terraform-driftsättningen

När du har tillämpat Terraform-konfigurationen kan du verifiera distributionen med kommandot [az aks show][az-aks-show] med parametern --query för att filtrera utdata och visa identitetsinformationen. Som exempel:

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

Mer information om hanterade identiteter i AKS finns i följande artiklar: