Używanie tożsamości zarządzanej przypisanej przez użytkownika w Azure Kubernetes Service (AKS)

W tym artykule wyjaśniono, jak włączyć przypisaną przez użytkownika tożsamość zarządzaną w nowym lub istniejącym klastrze AKS, uzyskać jej identyfikator główny oraz dodać przypisanie roli dla tej tożsamości.

Wymagania wstępne

  • Istniejąca grupa zasobów Azure. Jeśli go nie masz, możesz go utworzyć przy użyciu az group create polecenia .

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI w wersji 2.23.0 lub nowszej zainstalowana. Uruchom az --version, aby znaleźć wersję. Jeśli musisz zainstalować lub uaktualnić, zobacz Install Azure CLI.
  • Aby zaktualizować istniejący klaster do używania tożsamości zarządzanej przypisanej przez użytkownika , musisz zainstalować Azure CLI w wersji 2.49.0 lub nowszej.

Ograniczenia

  • Po utworzeniu klastra z tożsamością zarządzaną nie można wrócić do używania zasady usługi.
  • Przenoszenie lub migrowanie klastra z włączoną obsługą tożsamości zarządzanej do innej dzierżawy nie jest obsługiwane.
  • Jeśli klaster ma włączoną tożsamość zarządzaną przez zasobnik Microsoft Entra (aad-pod-identity), zasobniki Node-Managed Identity (NMI) modyfikują tabele IP węzłów, aby przechwytywać wywołania do punktu końcowego metadanych wystąpienia Azure (IMDS). Ta konfiguracja oznacza, że każde żądanie skierowane do punktu końcowego IMDS jest przechwytywane przez NMI, nawet jeśli określony pod nie używa elementu aad-pod-identity.
    • Można skonfigurować niestandardową definicję zasobu AzurePodIdentityException (CRD), aby określić, że żądania do punktu końcowego IMDS pochodzące z zasobników pasujących do etykiet zdefiniowanych w CRD powinny być przekierowane bez żadnego przetwarzania w NMI. Wyklucz zasobniki systemowe z etykietą kubernetes.azure.com/managedby: aks w przestrzeni nazw kube-system, konfigurując CRD AzurePodIdentityException w aad-pod-identity. Aby uzyskać więcej informacji, zobacz Użyj tożsamości zarządzane przez zasobniki Microsoft Entra w Azure Kubernetes Service (AKS).
    • Aby skonfigurować wyjątek, zainstaluj mic-exception YAML.
  • Regiony USDOD Central, USDOD East i USGov Iowa w chmurze Azure US Government nie obsługują tworzenia klastra z tożsamością zarządzaną przypisaną przez użytkownika.

Zagadnienia dotyczące aktualizacji klastra

Podczas aktualizowania klastra należy wziąć pod uwagę następujące informacje:

  • Aktualizacja działa tylko wtedy, gdy istnieje aktualizacja dysku VHD do korzystania. Jeśli używasz najnowszego wirtualnego dysku twardego, musisz poczekać, aż następny wirtualny dysk twardy będzie dostępny w celu przeprowadzenia aktualizacji.
  • Azure CLI gwarantuje, że uprawnienie dodatku jest poprawnie ustawione po przeprowadzeniu migracji. Jeśli nie używasz Azure CLI do przeprowadzenia operacji migracyjnej, musisz samodzielnie zarządzać uprawnieniami identyfikatora dodatku. Aby zapoznać się z przykładem użycia szablonu Azure Resource Manager (ARM), zobacz Jak przypisać role Azure za pomocą szablonów ARM.
  • Jeśli klaster używał --attach-acr do ściągania obrazów z Azure Container Registry (ACR), należy uruchomić polecenie az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> po zaktualizowaniu klastra, aby umożliwić nowo utworzonemu kubeletowi używanemu na potrzeby tożsamości zarządzanej uzyskanie uprawnień do ściągania z usługi ACR. W przeciwnym razie nie będzie można pobrać z ACR po aktualizacji.

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika

Jeśli nie masz jeszcze zasobu tożsamości zarządzanej przypisanej przez użytkownika, utwórz go przy użyciu az identity create polecenia .

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

Dane wyjściowe powinny przypominać następujące przykładowe dane wyjściowe:

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

Uzyskaj główny identyfikator tożsamości zarządzanej przypisanej przez użytkownika

Pobierz główny identyfikator tożsamości zarządzanej przypisanej przez użytkownika za pomocą polecenia az identity show.

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

Pobierz identyfikator zasobu dla tożsamości zarządzanej przypisanej przez użytkownika

Pobierz identyfikator zasobu tożsamości zarządzanej przypisanej przez użytkownika za pomocą polecenia az identity show.

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

Włącz tożsamość zarządzaną przez użytkownika w nowym klastrze AKS.

Utwórz klaster AKS z tożsamością zarządzaną przypisaną przez użytkownika, używając polecenia az aks create oraz ustawiając parametr --assign-identity na identyfikator zasobu tej tożsamości.

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

Aktualizowanie istniejącego klastra w celu używania tożsamości zarządzanej przypisanej przez użytkownika

Zaktualizuj istniejący klaster, aby korzystał z zarządzanej tożsamości przypisanej użytkownikowi, używając polecenia az aks update i parametru --assign-identity, który należy ustawić na identyfikator zasobu tej tożsamości.

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

Dane wyjściowe pomyślnej aktualizacji klastra do korzystania z tożsamości zarządzanej przypisanej przez użytkownika powinny przypominać następujące przykładowe dane wyjściowe:

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

Po zaktualizowaniu klastra do używania tożsamości zarządzanej przypisanej przez użytkownika zamiast jednostki usługi, płaszczyzna sterowania i zasobniki używają tożsamości zarządzanej przypisanej przez użytkownika do autoryzacji podczas uzyskiwania dostępu do innych usług w Azure. Rozwiązanie Kubelet kontynuuje korzystanie z jednostki usługi, dopóki nie uaktualnisz również puli węzłów. Uaktualnienie puli węzłów powoduje przestój klastra usługi AKS, ponieważ węzły w pulach węzłów są zablokowane, czyszczone i ponownie obrazowane. Aby zaktualizować zarządzaną tożsamość przypisaną użytkownikowi, możesz użyć polecenia w swoich węzłach.

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

Uwaga / Notatka

Migracja tożsamości zarządzanej dla płaszczyzny sterowania z przypisanej przez system na przypisaną przez użytkownika nie powoduje żadnych przestojów ani dla płaszczyzny sterowania, ani dla pul agentów. Składniki płaszczyzny sterowania nadal mają starą tożsamość przypisaną przez system przez maksymalnie kilka godzin do następnego odświeżenia tokenu.

Przypisz rolę RBAC Azure do tożsamości zarządzanej, którą przypisano użytkownikowi

Dodaj przypisanie roli dla tożsamości zarządzanej przypisanej przez użytkownika za pomocą polecenia az role assignment create. W poniższym przykładzie przypisano rolę Key Vault Secrets User do przypisanej tożsamości zarządzanej przez użytkownika, aby przyznać jej uprawnienia do dostępu do tajemnic w key vault. Przypisanie roli jest ograniczone do zasobu magazynu kluczy.

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

Uwaga / Notatka

Propagacja uprawnień udzielonych tożsamości zarządzanej klastra może potrwać do 60 minut.

Tworzenie pliku konfiguracji narzędzia Terraform

Pliki konfiguracji narzędzia Terraform definiują infrastrukturę, którą program Terraform tworzy i zarządza.

  1. Utwórz plik o nazwie main.tf i dodaj następujący kod, aby zdefiniować wersję programu Terraform i określić dostawcę Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Dodaj następujący kod do main.tf, aby utworzyć grupę zasobów Azure. W razie potrzeby możesz zmienić nazwę i lokalizację grupy zasobów.

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

Tworzenie klastra usługi AKS z tożsamością zarządzaną przypisaną przez użytkownika przy użyciu narzędzia Terraform

Dodaj następujący kod do main.tf, aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika i klaster AKS, który używa tej tożsamości.

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

Dodawanie przypisania roli dla tożsamości zarządzanej przypisanej przez użytkownika przy użyciu narzędzia Terraform

Dodaj następujący kod do main.tf, aby utworzyć przypisanie roli dla tożsamości zarządzanej przypisanej przez użytkownika. W tym przykładzie przypisano rolę Key Vault Secrets User do przypisanej przez użytkownika tożsamości zarządzanej w celu udzielenia mu uprawnień dostępu do wpisów tajnych w key vault. Przypisanie roli jest ograniczone do zasobu magazynu kluczy.

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
}

Inicjowanie narzędzia Terraform

Zainicjuj Terraform w katalogu zawierającym plik main.tf przy użyciu polecenia terraform init. To polecenie pobiera dostawcę Azure wymaganego do zarządzania zasobami Azure za pomocą narzędzia Terraform.

terraform init

Tworzenie planu wykonania programu Terraform

Utwórz plan wykonywania narzędzia Terraform przy użyciu terraform plan polecenia . To polecenie pokazuje zasoby, które narzędzie Terraform utworzy lub zmodyfikuje w ramach subskrypcji Azure.

terraform plan

Stosowanie konfiguracji narzędzia Terraform

Po przejrzeniu i potwierdzeniu planu wykonania zastosuj konfigurację narzędzia Terraform przy użyciu terraform apply polecenia . To polecenie tworzy lub modyfikuje zasoby zdefiniowane w pliku main.tf w subskrypcji Azure.

terraform apply

Weryfikowanie wdrożenia narzędzia Terraform

Po zastosowaniu konfiguracji narzędzia Terraform możesz zweryfikować wdrożenie przy użyciu polecenia [az aks show][az-aks-show] z parametrem --query w celu filtrowania danych wyjściowych i wyświetlania informacji o tożsamości. Przykład:

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

Aby dowiedzieć się więcej o tożsamościach zarządzanych w usłudze AKS, zobacz następujące artykuły: