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

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

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>
    
  • La CLI de Azure versión 2.23.0 o posterior está instalada. Ejecute az --version para encontrar la versión. Si necesita instalar o actualizar, consulte Install Azure CLI.
  • Para actualizar un clúster existente para usar una identidad administrada asignada por el sistema, necesita la versión 2.49.0 o posterior de la CLI de Azure 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 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.
  • AKS no admite el uso de una identidad administrada asignada por el sistema cuando se usa una zona DNS privada personalizada.

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.
  • La CLI de Azure garantiza que el permiso del complemento esté configurado correctamente después de la migración. Si no usa la 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.

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

Una identidad administrada asignada por el sistema está habilitada de forma predeterminada al crear un nuevo clúster de AKS.

Cree un clúster de AKS con el comando az aks create.

az aks create \
    --resource-group <resource-group-name> \
    --name <aks-cluster-name> \
    --generate-ssh-keys

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

Actualice un clúster de AKS existente de una entidad de servicio a una identidad administrada asignada por el sistema utilizando el comando az aks update con el parámetro --enable-managed-identity.

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

Después de actualizar el clúster para usar una identidad administrada asignada por el sistema en lugar de una entidad de servicio, el plano de control y los pods usan la identidad administrada asignada por el sistema para la autorización al acceder a otros servicios en Azure. Kubelet continúa usando una entidad de servicio hasta que actualices también el grupo de agentes. Puede usar el comando az aks nodepool upgrade --resource-group <resource-group-name> --cluster-name <aks-cluster-name> --name <node-pool-name> --node-image-only en los nodos para actualizar a una identidad administrada. 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.

Obtén la ID principal de una identidad administrada asignada por el sistema

Obtenga el ID principal de la identidad administrada asignada por el sistema del clúster usando el comando az aks show.

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

Incorporación de una asignación de roles para una identidad administrada asignada por el sistema

Nota:

Para una red virtual (VNet), un disco de Azure adjunto, una dirección IP estática, o una tabla de rutas fuera del grupo de recursos del nodo de trabajo predeterminado, debe asignar el rol Network Contributor en el grupo de recursos personalizado.

Asigne un rol de RBAC de Azure a la identidad administrada asignada por el sistema mediante el comando az role assignment create. En el ejemplo siguiente se asigna el rol Colaborador de red a la identidad administrada asignada por el sistema. La asignación de roles se limita al grupo de recursos que contiene la red virtual.

az role assignment create \
    --assignee <client-id> \
    --role "Network Contributor" \
    --scope <custom-resource-group-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 especificar 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 sistema mediante Terraform

Agregue el siguiente código en main.tf para crear un clúster AKS con una identidad administrada asignada por el sistema:

resource "azurerm_kubernetes_cluster" "system_assigned" {
 name                = "aks-system"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "akssystem"
 identity {
   type = "SystemAssigned"
 }
 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 sistema mediante Terraform

Agregue el código siguiente a main.tf para crear una asignación de roles para la identidad administrada asignada por el sistema. En este ejemplo se asigna el rol Colaborador de red a la identidad administrada asignada por el sistema. La asignación de roles se limita al grupo de recursos que contiene la red virtual.

resource "azurerm_role_assignment" "system_assigned_network_contributor" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "Network Contributor"
 principal_id         = azurerm_kubernetes_cluster.system_assigned.identity[0].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 recursos de Azure 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 su 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 el archivo main.tf de 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 verificar la implementación utilizando el comando az aks show con el parámetro --query 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: