Поделиться через


Использование служебного принципала с Azure Kubernetes Service (AKS)

Для кластеров 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 или ApplicationId Azure PowerShell).
  • На виртуальных машинах узла агента в кластере AKS учетные данные сервисного субъекта хранятся в файле /etc/kubernetes/azure.json.
  • При удалении кластера AKS, который вы создали с помощью команды az aks create или командлета New-AzAksCluster, созданный служебный принципал не удаляется автоматически. Ознакомьтесь с инструкциями по удалению субъекта-службы.
  • Если вы используете учетную запись службы из другого клиента Microsoft Entra, при развертывании кластера существуют другие аспекты, которые необходимо учитывать. Возможно, у вас нет соответствующих разрешений на чтение и запись сведений о каталоге. Дополнительные сведения см. в статье о том, какие разрешения пользователей по умолчанию доступны в идентификаторе Microsoft Entra ID?

Создание субъекта-службы

  1. Создайте служебный принципал с помощью команды 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"
    }
    
  2. Скопируйте значения для appId и password из выходных данных, чтобы использовать их при создании кластера AKS.

  1. Создайте служебный принципал с помощью команды 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.

  2. Расшифровка значения, хранящегося в защищенной строке секрета, с помощью следующей команды.

    $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
    
  1. Преобразуйте субъект-службу ApplicationId и Secret в объект PSCredential с помощью следующей команды.

    $Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)
    
  2. Создайте кластер 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.

Предоставление доступа к дискам хранилища

Если вам нужно получить доступ к существующим ресурсам диска в другой группе ресурсов, назначьте один из следующих наборов разрешений роли:

Предоставление доступа к экземплярам контейнеров 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> 

По умолчанию срок действия учетных данных сервисного принципала составляет один год. Если учетные данные старше одного года, можно сбросить существующие учетные данные или создать новый служебный принципал.