Uso de una identidad administrada asignada por el usuario en Azure Kubernetes Service (AKS)

En este artículo se explica cómo habilitar una identidad administrada asignada por el usuario en un clúster nuevo o existente de AKS, obtener su ID principal y agregarle una asignación de roles.

Prerrequisitos

  • Un grupo de recursos de Azure existente. Si no tiene una, puede crearla mediante el az group create comando .

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • CLI de Azure versión 2.23.0 o posterior instalada. Ejecute az --version para encontrar la versión. Si necesita instalar o actualizar, consulte Install CLI de Azure.
  • Para actualizar un clúster existente para usar una identidad administrada asignada por el usuario , necesita CLI de Azure versión 2.49.0 o posterior instalada.

Limitaciones

  • Una vez que crea un clúster con una identidad administrada, no puede volver a usar un principal de servicio.
  • No se admite el traslado o migración de un clúster habilitado para identidad administrada a otro inquilino.
  • Si el clúster tiene habilitada la identidad administrada por pods de Microsoft Entra (aad-pod-identity), los pods de Identidad administrada del nodo (NMI) modifican las tablas de IP de los nodos para interceptar las llamadas que se realizan en el punto de conexión de Azure Instance Metadata (IMDS). Esta configuración significa que NMI intercepta cualquier solicitud realizada al punto de conexión IMDS, incluso si un pod determinado no usa aad-pod-identity.
    • Puede configurar la definición de recursos personalizados (CRD) de AzurePodIdentityException para especificar que las solicitudes al punto de conexión IMDS que se originan en pods con etiquetas que coincidan con las definidas en el CRD deben redirigirse sin ningún procesamiento en NMI. Excluye los pods del sistema con la etiqueta kubernetes.azure.com/managedby: aks en el espacio de nombres kube-system en aad-pod-identity configurando la CRD de AzurePodIdentityException. Para obtener más información, consulte Uso de identidades administradas por pods de Microsoft Entra en Azure Kubernetes Service (AKS).
    • Para configurar una excepción, instale el mic-exception YAML.
  • Las regiones Centro de USDOD, Este de USDOD y USGov Iowa en Azure US Government nube no admiten la creación de un clúster con una identidad administrada asignada por el usuario.

Consideraciones sobre la actualización del clúster

Al actualizar un clúster, tenga en cuenta la siguiente información:

  • Una actualización solo funciona si hay una actualización de VHD para consumir. Si ya ejecuta el VHD más reciente, deberá esperar hasta que la siguiente actualización del VHD esté disponible.
  • El CLI de Azure garantiza que el permiso del complemento esté configurado correctamente después de la migración. Si no usa el CLI de Azure para realizar la operación de migración, debe controlar el permiso de la identidad del complemento por su cuenta. Para obtener un ejemplo con una plantilla de Azure Resource Manager (ARM), consulte Assign Azure roles mediante plantillas de ARM.
  • Si el clúster usaba --attach-acr para extraer de imágenes de Azure Container Registry (ACR), debe ejecutar el comando az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> después de actualizar el clúster para permitir que el kubelet recién creado usado para la identidad administrada obtenga el permiso para extraer de ACR. De lo contrario, no podrá extraer datos desde ACR después de la actualización.

Creación de una identidad administrada asignada por el usuario

Si aún no tienes un recurso de identidad administrada asignada por el usuario, crea uno mediante el comando az identity create.

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

La salida debería ser similar a la salida de ejemplo siguiente:

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

Obtención del id. de cliente de la identidad administrada asignada por el usuario

Obtenga el ID principal de la identidad administrada asignada por el usuario mediante el comando az identity show.

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

Obtención del id. de recurso de la identidad administrada asignada por el usuario

Obtenga el identificador de recurso de la identidad administrada asignada por el usuario mediante el az identity show comando .

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

Habilitación de una identidad administrada asignada por el usuario en un nuevo clúster de AKS

Cree un clúster de AKS con una identidad gestionada asignada por el usuario mediante el az aks create comando y el --assign-identity parámetro configurado con el ID del recurso de la identidad gestionada asignada por el usuario.

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

Actualización de un clúster existente para usar una identidad administrada asignada por el usuario

Actualice un clúster existente para usar una identidad administrada asignada por el usuario mediante el az aks update comando y el --assign-identity parámetro establecido en el identificador de recurso de la identidad administrada asignada por el usuario.

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

La salida de una actualización correcta del clúster para usar una identidad administrada asignada por el usuario debe ser similar a la del ejemplo siguiente:

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

Después de actualizar el clúster para usar una identidad administrada asignada por el usuario en lugar de una entidad de servicio, el plano de control y los pods usan la identidad administrada asignada por el usuario para la autorización al acceder a otros servicios en Azure. Kubelet continuará usando una entidad de servicio hasta que también actualice el grupo de nodos. Una actualización del grupo de nodos provoca un tiempo de inactividad para el clúster de AKS, ya que los nodos de los grupos de nodos se acordonan o purgan y se restablece la imagen inicial. Puede usar el comando en los nodos para actualizar a una identidad administrada asignada por el usuario.

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

Nota:

Migrar la identidad administrada para el plano de control de "asignada por el sistema" a "asignada por el usuario" no provoca ningún tiempo de inactividad para el plano de control ni los grupos de agentes. Los componentes del plano de control continúan utilizando la identidad anterior asignada por el sistema durante un máximo de varias horas, hasta la siguiente actualización del token.

Asignación de un rol de RBAC de Azure a la identidad administrada asignada por el usuario

Agregue una asignación de roles para la identidad administrada asignada por el usuario mediante el az role assignment create comando . En el ejemplo siguiente, se asigna el rol Key Vault Secrets User a la identidad administrada asignada por el usuario para otorgarle permisos para acceder a los secretos en una bóveda de claves. La asignación de roles se limita al recurso del almacén de claves.

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

Nota:

Los permisos concedidos a la identidad administrada del clúster pueden tardar hasta 60 minutos en propagarse.

Creación del archivo de configuración de Terraform

Los archivos de configuración de Terraform definen la infraestructura que Terraform crea y administra.

  1. Cree un archivo denominado main.tf y agregue el código siguiente para definir la versión de Terraform y especifique el proveedor de Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Agregue el código siguiente a main.tf para crear un grupo de recursos de Azure. No dude en cambiar el nombre y la ubicación del grupo de recursos según sea necesario.

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

Creación de un clúster de AKS con una identidad administrada asignada por el usuario mediante Terraform

Agregue el siguiente código en main.tf para crear una identidad administrada asignada por el usuario y un clúster de AKS que use la identidad.

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

Adición de una asignación de roles para una identidad administrada asignada por el usuario mediante Terraform

Agregue el código siguiente a main.tf para crear una asignación de rol para la identidad administrada asignada al usuario. En este ejemplo, se asigna el rol Key Vault Secrets User a la identidad administrada asignada por el usuario para concederle permisos para acceder a secretos en el almacén de claves. La asignación de roles se limita al recurso del almacén de claves.

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
}

Inicialización de Terraform

Inicialice Terraform en el directorio que contiene el archivo main.tf usando el comando terraform init. Este comando descarga el proveedor de Azure necesario para administrar Azure recursos con Terraform.

terraform init

Creación de un plan de ejecución de Terraform

Cree un plan de ejecución de Terraform mediante el comando terraform plan. Este comando muestra los recursos que Terraform creará o modificará en la suscripción de Azure.

terraform plan

Aplica la configuración de Terraform

Después de revisar y confirmar el plan de ejecución, aplique la configuración de Terraform mediante el terraform apply comando . Este comando crea o modifica los recursos definidos en tu archivo main.tf en tu suscripción de Azure.

terraform apply

Comprobación de la implementación de Terraform

Después de aplicar la configuración de Terraform, puede comprobar la implementación mediante el comando [az aks show][az-aks-show] con el --query parámetro para filtrar la salida y mostrar la información de identidad. Por ejemplo:

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

Para más información sobre las identidades administradas en AKS, consulte los artículos siguientes: