Compartir a través de


Use una entidad de servicio con Azure Kubernetes Service (AKS)

Los clústeres de Azure Kubernetes Service (AKS) requieren un principal de servicio de Microsoft Entra o una identidad administrada para crear y gestionar de manera dinámica otros recursos de Azure. En este artículo se describe cómo crear un principal de servicio de Microsoft Entra y utilizarlo con el clúster de AKS.

Nota:

Para una seguridad óptima y facilidad de uso, se recomienda usar identidades administradas en lugar de entidades de servicio para autorizar el acceso desde un clúster de AKS a otros recursos de Azure. Una identidad administrada es un tipo especial de entidad de servicio que puede usar para obtener las credenciales de Microsoft Entra sin necesidad de administrar y proteger las credenciales. Para más información, consulte Uso de una identidad administrada en AKS.

Requisitos previos

  • Necesita la VERSIÓN 2.0.59 o posterior de la CLI de Azure. Busque su versión usando el comando az --version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.
  • Si usa Azure PowerShell, necesita la versión 5.0.0 o posterior de Azure PowerShell. Busque su versión mediante el cmdlet Get-InstalledModule -Name Az. Si tiene que instalarla o actualizarla, consulte Instalación del módulo Azure Az PowerShell.
  • Necesita permisos para registrar una aplicación con el inquilino de Microsoft Entra y asignar la aplicación a un rol en la suscripción. Si no tiene los permisos necesarios, tiene que pedir al administrador de Microsoft Entra ID o de la suscripción que asigne los permisos necesarios o que cree la entidad de servicio.

Consideraciones al usar una entidad de servicio

Tenga en cuenta las siguientes consideraciones al usar un principal de servicio de Microsoft Entra con AKS.

  • La entidad de servicio de Kubernetes forma parte de la configuración del clúster, pero no usa esta identidad para implementar el clúster. En su lugar, cree primero una entidad de servicio y después use esa entidad de servicio para crear el clúster de AKS.
  • Cada entidad de servicio está asociada a una aplicación de Microsoft Entra. La entidad de servicio de un clúster de Kubernetes puede asociarse con cualquier nombre de aplicación de Microsoft Entra válido (por ejemplo, https://www.contoso.org/example). La dirección URL de la aplicación no tiene por qué ser un punto de conexión real.
  • Al especificar el identificador de cliente de la entidad de servicio, use el valor del identificador de aplicación (appId para la CLI de Azure o ApplicationId para Azure PowerShell).
  • En las máquinas virtuales del nodo de agente del clúster de AKS, las credenciales de la entidad de servicio se almacenan en el archivo /etc/kubernetes/azure.json.
  • Al eliminar un clúster de AKS que creó utilizando el comando az aks create o el cmdlet New-AzAksCluster, la entidad de servicio creada no se elimina automáticamente. Vea los pasos para eliminar un principal del servicio.
  • Si usa una entidad de servicio de otro inquilino de Microsoft Entra, hay otras consideraciones en torno a los permisos disponibles al implementar el clúster. Es posible que no tenga los permisos adecuados para leer y escribir información de directorio. Para más información, consulte ¿Cuáles son los permisos de usuario predeterminados en Microsoft Entra ID?

Creación de una entidad de servicio

  1. Cree una entidad de servicio mediante el comando az ad sp create-for-rbac.

    # Set environment variable
    SERVICE_PRINCIPAL_NAME=<your-service-principal-name>
    
    # Create the service principal
    az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME
    

    La salida debe ser similar a la siguiente salida de ejemplo:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Copie los valores de appId y password de la salida que se van a usar al crear el clúster de AKS.

  1. Cree una entidad de servicio mediante el comando New-AzADServicePrincipal.

    # Set environment variable
    $SpName = <your-service-principal-name>
    
    # Create the service principal
    New-AzADServicePrincipal -DisplayName $SpName -OutVariable sp
    

    La salida debe ser similar a la siguiente salida de ejemplo:

    Secret                : System.Security.SecureString
    ServicePrincipalNames : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, http://myAKSClusterServicePrincipal}
    ApplicationId         : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ObjectType            : ServicePrincipal
    DisplayName           : myAKSClusterServicePrincipal
    Id                    : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Type                  :
    

    Los valores se almacenan en una variable que se usa al crear el clúster de AKS.

  2. Para descifrar el valor almacenado en la cadena segura Secret, ejecute el comando siguiente.

    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
    [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    

Creación de un clúster de AKS con una entidad de servicio existente

  • Cree un clúster de AKS con una entidad de servicio existente utilizando el comando az aks create con los parámetros --service-principal y --client-secret establecidos para especificar los valores appId y password.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    APP_ID=<app-id>
    CLIENT_SECRET=<password-value>
    
    # Create the AKS cluster
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --service-principal $APP_ID \
        --client-secret $CLIENT_SECRET \
        --generate-ssh-keys
    
  1. Convierta la entidad de servicio ApplicationId y Secret en un objeto PSCredential mediante el siguiente comando.

    $Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)
    
  2. Cree un clúster de AKS con una entidad de servicio existente mediante el New-AzAksCluster cmdlet y especifique el ServicePrincipalIdAndSecret parámetro con el objeto PSCredential como su valor.

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    
    # Create the AKS cluster
    New-AzAksCluster -ResourceGroupName $ResourceGroupName -Name $ClusterName -ServicePrincipalIdAndSecret $Cred
    

Nota:

Si utiliza una entidad de servicio existente con un secreto personalizado, asegúrese de que este no supere los 190 bytes.

Delegación del acceso a otros recursos de Azure

La entidad de servicio del clúster de AKS se puede utilizar para acceder a otros recursos. Por ejemplo, si desea implementar el clúster de AKS en una subred de Azure Virtual Network (VNet) existente, conectarse a ACR o a claves o secretos en un almacén de claves desde el clúster, debe delegar el acceso a esos recursos a la entidad de servicio. Para delegar el acceso, asigne un rol de control de acceso basado en rol de Azure (RBAC de Azure) a la entidad de servicio.

Al asignar roles, especifique el ámbito de la asignación de roles, como un grupo de recursos o un recurso de red virtual. La asignación de roles determina qué permisos tiene la entidad de servicio en el recurso y en qué ámbito.

Importante

Los permisos concedidos a una entidad de servicio asociada a un clúster pueden tardar hasta 60 minutos en propagarse.

Crear una asignación de roles

Nota:

El ámbito de un recurso debe ser un identificador de recurso completo, como /subscriptions/\<guid\>/resourceGroups/myResourceGroup o /subscriptions/\<guid\>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet.

  • Cree una asignación de roles con el comando az role assignment create. Especifique el valor del ID de aplicación de la entidad de servicio para el parámetro --assignee y el ámbito de la asignación de roles para el parámetro --scope. En el siguiente ejemplo se asignan permisos a la entidad de servicio para acceder a los secretos de un almacén de claves.

    az role assignment create \
        --assignee <app-id> \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" \
        --role "Key Vault Secrets User"
    
  • Cree una asignación de roles mediante el New-AzRoleAssignment cmdlet . Especifique el valor del ID de aplicación de la entidad de servicio para el parámetro -ApplicationId y el ámbito de la asignación de roles para el parámetro -Scope. En el ejemplo siguiente se asignan permisos al principal de servicio para acceder a los secretos de una bóveda de claves.

    New-AzRoleAssignment -ApplicationId <app-id> `
        -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" `
        -RoleDefinitionName "Key Vault Secrets User"
    

Concesión de acceso a Azure Container Registry

Si usa Azure Container Registry (ACR) como el almacén de imágenes de contenedor, deberá conceder permisos a la entidad de servicio que el clúster de AKS pueda leer y extraer imágenes. Se recomienda seguir los pasos descritos en Autenticación con Azure Container Registry desde Azure Kubernetes Service para integrarse con un registro y asignar el rol adecuado para la entidad de servicio.

Concesión de acceso a recursos de red

Si usa redes avanzadas con una VNet y una subred, o direcciones IP públicas en un grupo de recursos distinto, puede asignar el rol integrado Network Contributor en la subred dentro de la VNet. Como alternativa, puede crear un rol personalizado con permisos para tener acceso a los recursos de red de ese grupo de recursos. Para obtener más información, consulte los permisos de servicio de AKS.

Concesión de acceso a discos de almacenamiento

Si necesita acceder a los recursos de disco existentes en otro grupo de recursos, asigne uno de los siguientes conjuntos de permisos de rol:

Concesión de acceso a Azure Container Instances

Si utiliza virtual kubelet para integrarse con AKS y ejecutar Azure Container Instances (ACI) en un grupo de recursos separado del clúster de AKS, debe asignar permisos de Contributor a la entidad de servicio del clúster de AKS para el grupo de recursos de ACI.

Eliminación de una entidad de servicio

  • Consulte el identificador de cliente de la entidad de servicio (servicePrincipalProfile.clientId) y elimine la entidad de servicio mediante el comando az ad sp delete con el parámetro --id. El comando [az aks show][az-aks-show] recupera el identificador de cliente del clúster de AKS especificado.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    
    # Delete the service principal
    az ad sp delete --id $(az aks show \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --query servicePrincipalProfile.clientId \
        --output tsv)
    
  • Consulte el identificador de cliente de la entidad de servicio (ServicePrincipalProfile.ClientId) y elimine la entidad de servicio mediante el cmdlet Remove-AzADServicePrincipal con el parámetro -ApplicationId. El cmdlet [Get-AzAksCluster][get-azakscluster] recupera el identificador de cliente del clúster de AKS especificado.

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    $ClientId = (Get-AzAksCluster -ResourceGroupName myResourceGroup -Name myAKSCluster ).ServicePrincipalProfile.ClientId
    
    # Delete the service principal
    Remove-AzADServicePrincipal -ApplicationId $ClientId
    

Resolución de problemas de credenciales de entidad de servicio

La CLI de Azure almacena en caché las credenciales de la entidad de servicio para los clústeres de AKS.

Azure PowerShell almacena en caché las credenciales de la entidad de servicio para los clústeres de AKS.

Si estas credenciales expiran, es posible que encuentre errores durante la implementación del clúster de AKS. Si hay un problema con las credenciales almacenadas en caché, es posible que reciba un mensaje de error similar al siguiente:

Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
Details: adal: Refresh request failed. Status Code = '401'.

Compruebe la fecha de expiración de las credenciales de la entidad de servicio mediante el comando az ad app credential list con la consulta "[].endDateTime". La salida le mostrará la endDateTime de las credenciales.

az ad app credential list \
    --id <app-id> \
    --query "[].endDateTime" \
    --output tsv
  • Utilice el cmdlet Get-AzADAppCredential para comprobar la fecha de expiración de las credenciales de la entidad de servicio. La salida le mostrará la EndDate de las credenciales.
Get-AzADAppCredential -ApplicationId <app-id> 

El tiempo de expiración predeterminado para las credenciales del principal de servicio es de un año. Si las credenciales son anteriores a un año, puede restablecer las credenciales existentes o crear una nueva entidad de servicio.