Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 (
appIdpara la CLI de Azure oApplicationIdpara 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 createo el cmdletNew-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
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_NAMELa 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" }Copie los valores de
appIdypasswordde la salida que se van a usar al crear el clúster de AKS.
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 spLa 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.
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 createcon los parámetros--service-principaly--client-secretestablecidos para especificar los valoresappIdypassword.# 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
Convierta la entidad de servicio
ApplicationIdySecreten un objeto PSCredential mediante el siguiente comando.$Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)Cree un clúster de AKS con una entidad de servicio existente mediante el
New-AzAksClustercmdlet y especifique elServicePrincipalIdAndSecretpará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--assigneey 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-AzRoleAssignmentcmdlet . Especifique el valor del ID de aplicación de la entidad de servicio para el parámetro-ApplicationIdy 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:
- Cree un rol personalizado y defina los permisos de rol Microsoft.Compute/disks/read y Microsoft.Compute/disks/write .
- O bien, asigne el rol integrado Colaborador de la máquina virtual en el grupo de recursos.
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 comandoaz ad sp deletecon 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 cmdletRemove-AzADServicePrincipalcon 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-AzADAppCredentialpara comprobar la fecha de expiración de las credenciales de la entidad de servicio. La salida le mostrará laEndDatede 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.