Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для кластеров Azure Kubernetes Service (AKS) требуется либо сервисный принципал Microsoft Entra, либо управляемая идентичность для динамического создания и управления другими ресурсами Azure. В этой статье описывается, как создать учетную запись службы Microsoft Entra и использовать её с кластером AKS.
Примечание.
Для оптимальной безопасности и удобства использования рекомендуется использовать управляемые удостоверения вместо субъектов-служб для авторизации доступа из кластера AKS к другим ресурсам в Azure. Управляемое удостоверение — это особый тип учетной записи сервиса, который можно использовать для получения учетных данных Microsoft Entra без необходимости их управления и защиты. Для получения дополнительной информации см. статью об использовании управляемой идентичности в AKS.
Предварительные условия
- Вам потребуется Azure CLI версии 2.0.59 или более поздней. Найдите версию с помощью
az --versionкоманды. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
- Если вы используете Azure PowerShell, вам потребуется Azure PowerShell версии 5.0.0 или более поздней. Найдите вашу версию при помощи командлета
Get-InstalledModule -Name Az. Если вам необходимо выполнить установку или обновление, см. статью об установке модуля Azure Az PowerShell.
- Вам необходимо иметь разрешения для регистрации приложения в клиенте Microsoft Entra и назначения роли приложению в вашей подписке. Если у вас нет необходимых разрешений, вам нужно попросить администратора Microsoft Entra ID или подписки назначить необходимые разрешения или создать доверенный субъект для вас.
Рекомендации по использованию служебного принципала
При использовании учетной записи службы Microsoft Entra с AKS следует принять во внимание следующие соображения.
- Служебный принципал Kubernetes является частью конфигурации кластера, но не используйте эту учетную запись для развертывания кластера. Вместо этого сначала создайте субъект-службу , а затем используйте этот субъект-службу для создания кластера AKS.
- Каждая учетная запись службы связана с приложением Microsoft Entra. Служебный принципал для кластера Kubernetes можно связать с любым действительным именем приложения Microsoft Entra (например:
https://www.contoso.org/example). URL-адрес приложения не обязательно должен быть реальной конечной точкой. - При указании идентификатора клиента субъекта-службы используйте значение идентификатора приложения (
appIdдля Azure CLI илиApplicationIdAzure PowerShell). - На виртуальных машинах узла агента в кластере AKS учетные данные сервисного субъекта хранятся в файле
/etc/kubernetes/azure.json. - При удалении кластера AKS, который вы создали с помощью команды
az aks createили командлетаNew-AzAksCluster, созданный служебный принципал не удаляется автоматически. Ознакомьтесь с инструкциями по удалению субъекта-службы. - Если вы используете учетную запись службы из другого клиента Microsoft Entra, при развертывании кластера существуют другие аспекты, которые необходимо учитывать. Возможно, у вас нет соответствующих разрешений на чтение и запись сведений о каталоге. Дополнительные сведения см. в статье о том, какие разрешения пользователей по умолчанию доступны в идентификаторе Microsoft Entra ID?
Создание субъекта-службы
Создайте служебный принципал с помощью команды
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Выходные данные должны совпадать со следующим примером выходных данных:
{ "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "displayName": "myAKSClusterServicePrincipal", "name": "http://myAKSClusterServicePrincipal", "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }Скопируйте значения для
appIdиpasswordиз выходных данных, чтобы использовать их при создании кластера AKS.
Создайте служебный принципал с помощью команды
New-AzADServicePrincipal.# Set environment variable $SpName = <your-service-principal-name> # Create the service principal New-AzADServicePrincipal -DisplayName $SpName -OutVariable spВыходные данные должны совпадать со следующим примером выходных данных:
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 :Значения хранятся в переменной, используемой при создании кластера AKS.
Расшифровка значения, хранящегося в защищенной строке секрета, с помощью следующей команды.
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret) [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Создание кластера AKS с существующим субъектом-службой
Создайте кластер AKS с существующей учетной записью службы, используя команду
az aks createс параметрами--service-principalи--client-secret, чтобы задать значенияappIdи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
Преобразуйте субъект-службу
ApplicationIdиSecretв объект PSCredential с помощью следующей команды.$Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)Создайте кластер AKS с существующим субъектом-службой с помощью командлета
New-AzAksClusterи укажитеServicePrincipalIdAndSecretпараметр с объектом PSCredential в качестве значения.# 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
Примечание.
Если вы используете существующую учетную запись службы с настроенным секретом, убедитесь, что длина секрета не превышает 190 байтов.
Делегирование прав доступа другим ресурсам Azure
Чтобы получить доступ к другим ресурсам, можно использовать учетную запись службы для кластера AKS. Например, если вы хотите развернуть кластер AKS в существующей подсети виртуальной сети Azure, подключиться к реестру контейнеров Azure (ACR) или получить доступ к ключам или секретам в хранилище ключей из кластера, необходимо делегировать доступ к этим ресурсам субъекту-службе. Чтобы делегировать доступ, назначьте роль в системе управления доступом на основе ролей Azure (Azure RBAC) принципалу службы.
При назначении ролей укажите область назначения ролей, например группу ресурсов или ресурс виртуальной сети. Назначение роли определяет, какие разрешения доверенное лицо службы имеет на ресурсе и в каком объеме.
Внимание
Разрешения, предоставленные служебному принципалу, связанному с кластером, могут занять до 60 минут для распространения.
Создание назначения роли
Примечание.
Область ресурса должна быть полным идентификатором ресурса, например /subscriptions/\<guid\>/resourceGroups/myResourceGroup или /subscriptions/\<guid\>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet.
Создайте назначение роли с помощью
az role assignment createкоманды. Укажите значение идентификатора приложения принципала службы для--assigneeпараметра и область действия назначения роли для--scopeпараметра. В следующем примере назначаются разрешения принципала службы для доступа к секретам в хранилище ключей.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"
Создайте назначение роли с помощью командлета
New-AzRoleAssignment. Укажите значение идентификатора приложения сервисного принципала для параметра-ApplicationIdи область действия для назначения роли для параметра-Scope. В примере ниже назначаются разрешения служебного принципала для доступа к секретам в хранилище ключей.New-AzRoleAssignment -ApplicationId <app-id> ` -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" ` -RoleDefinitionName "Key Vault Secrets User"
Предоставление доступа к реестру контейнеров Azure
Если вы используете Реестр контейнеров Azure (ACR) в качестве хранилища образов контейнера, необходимо предоставить служебному принципалу вашего кластера AKS разрешения на чтение и извлечение (pull) образов. Мы рекомендуем выполнить действия, описанные в статье "Проверка подлинности с помощью реестра контейнеров Azure" из службы Azure Kubernetes , чтобы интегрироваться с реестром и назначить соответствующую роль субъекту-службе.
Предоставление доступа к сетевым ресурсам
Если вы используете расширенную сеть с виртуальной сетью и подсетью или общедоступными IP-адресами в другой группе ресурсов, можно назначить встроенную роль участника сети в подсети в виртуальной сети. Кроме того, можно создать настраиваемую роль с разрешениями на доступ к сетевым ресурсам в этой группе ресурсов. Дополнительные сведения см. в разделе Разрешения службы AKS.
Предоставление доступа к дискам хранилища
Если вам нужно получить доступ к существующим ресурсам диска в другой группе ресурсов, назначьте один из следующих наборов разрешений роли:
- Создайте пользовательскую роль и определите разрешения роли Microsoft.Compute/disks/read и Microsoft.Compute/disks/write .
- В группе ресурсов назначьте встроенную роль участника виртуальной машины.
Предоставление доступа к экземплярам контейнеров Azure
Если вы используете виртуальный kubelet для интеграции с AKS и запуска экземпляров контейнеров Azure (ACI) в группе ресурсов, отдельной от кластера AKS, необходимо назначить субъекту-службы кластера AKS права участника для группы ресурсов ACI.
Удаление субъекта-службы
Запросите идентификатор клиента субъекта-службы (
servicePrincipalProfile.clientId) и удалите субъект-службу с помощьюaz ad sp deleteкоманды с параметром--id. Команда [][az aks showaz-aks-show] извлекает идентификатор клиента для указанного кластера AKS.# 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)
Запросите идентификатор клиента сервисного принципала (
ServicePrincipalProfile.ClientId) и удалите сервисного принципала с помощью командлетаRemove-AzADServicePrincipalс параметром-ApplicationId. Командлет [][Get-AzAksClusterget-azakscluster] извлекает идентификатор клиента для указанного кластера AKS.# 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
Устранение проблем с учетными данными сервисного принципала
Azure CLI кэширует учетные данные служебного субъекта для кластеров AKS.
Azure PowerShell кэширует учетные данные служебного принципала для кластеров AKS.
Если срок действия этих учетных данных истекает, во время развертывания кластера AKS могут возникнуть ошибки. Если возникла проблема с кэшируемыми учетными данными, может появиться сообщение об ошибке, аналогичное следующему сообщению об ошибке:
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'.
Вы можете проверить дату окончания срока действия учетных данных сервисного принципала с помощью команды az ad app credential list с параметром "[].endDateTime". В выходных данных отображается endDateTime ваших учетных данных.
az ad app credential list \
--id <app-id> \
--query "[].endDateTime" \
--output tsv
- Проверьте дату истечения срока действия учетных данных служебного принципала с помощью командлета
Get-AzADAppCredential. В выходных данных отображаетсяEndDateваших учетных данных.
Get-AzADAppCredential -ApplicationId <app-id>
По умолчанию срок действия учетных данных сервисного принципала составляет один год. Если учетные данные старше одного года, можно сбросить существующие учетные данные или создать новый служебный принципал.