Используйте управляемое удостоверение, назначенное пользователем, в службе Azure Kubernetes (AKS)

В этой статье объясняется, как включить управляемое удостоверение, назначаемое пользователем, в новом или существующем кластере AKS, получить идентификатор субъекта управляемого удостоверения, назначаемого пользователем, и добавить назначение роли для управляемого удостоверения, назначаемого пользователем.

Необходимые условия

  • Ознакомьтесь с Обзором управляемых удостоверений в Azure Kubernetes Service (AKS), чтобы понять различные типы управляемых удостоверений, доступных в AKS, и как их можно использовать для безопасного доступа к ресурсам Azure.

  • Задайте подписку в качестве текущей активной подписки с помощью az account set команды.

    az account set --subscription <subscription-id>
    
  • Существующая группа ресурсов Azure. Если у вас его нет, его можно создать с помощью az group create команды.

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI версии 2.23.0 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если необходимо установить или обновить, см. раздел Install Azure CLI.
  • Чтобы обновить существующий кластер для использования управляемого удостоверения, назначаемого пользователем, необходимо установить Azure CLI версии 2.49.0 или более поздней.
  • Terraform установлен локально. Инструкции по установке см. в разделе "Установка Terraform".

Ограничения

  • После создания кластера с управляемым удостоверением невозможно вернуться к использованию учетной записи службы.
  • Перемещение или перенос кластера с поддержкой управляемого удостоверения в другой клиент не поддерживается.
  • Если в кластере включено управляемое удостоверение pod Microsoft Entra (aad-pod-identity), поды с управляемой идентичностью узла (NMI) изменяют iptables узлов, чтобы перехватывать вызовы к Azure Instance Metadata Service (IMDS). Эта конфигурация означает, что любой запрос, сделанный в конечную точку IMDS, перехватывается NMI, даже если конкретный pod не использует aad-pod-identity.
    • Вы можете настроить определение ресурса AzurePodIdentityException (CRD), чтобы указать, что запросы к конечной точке IMDS, исходящие из подов, соответствующих меткам, определённым в CRD, должны проксироваться без обработки в NMI. Исключите системные модули pod с kubernetes.azure.com/managedby: aks меткой в пространстве имен kube-system , aad-pod-identity настроив CRD AzurePodIdentityException. Дополнительные сведения см. в разделе Удостоверения Microsoft Entra, управляемые подами в службе Azure Kubernetes (AKS).
    • Чтобы настроить исключение, установите mic-exception YAML.
  • Регионы USDOD Central, USDOD East и USGov Iowa в Azure US Government облаке не поддерживают создание кластера с управляемым удостоверением, назначаемым пользователем.

Рекомендации по обновлению кластера

При обновлении кластера рассмотрите следующие сведения:

  • Обновление работает только в том случае, если требуется использовать обновление виртуального жесткого диска. Если вы используете последнюю версию виртуального жесткого диска, необходимо ждать, пока следующий виртуальный жесткий диск не будет доступен для выполнения обновления.
  • Azure CLI обеспечивает корректную настройку разрешений надстройки после миграции. Если вы не используете Azure CLI для выполнения операции миграции, необходимо самостоятельно управлять разрешениями удостоверения дополнительного компонента. Пример использования шаблона Azure Resource Manager (ARM) можно найти в разделе Назначение ролей Azure с помощью шаблонов ARM.
  • Если кластер использовал --attach-acr для извлечения изображений из Реестр контейнеров Azure (ACR), необходимо выполнить команду az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> после обновления кластера, чтобы позволить созданному kubelet, используемому для управляемого удостоверения, получить разрешение на извлечение из ACR. В противном случае вы не сможете загрузить из ACR после обновления.

Создайте управляемую идентичность, назначаемую пользователем

Если у вас еще нет ресурса управляемого удостоверения, назначаемого пользователем, создайте его с помощью az identity create команды.

az identity create \
    --name <identity-name> \
    --resource-group <resource-group-name>

Выходные данные должны выглядеть примерно так:

{                                  
    "clientId": "<client-id>",
    "clientSecretUrl": "<clientSecretUrl>",
    "id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>",
    "location": "<location>",
    "name": "<identity-name>",
    "principalId": "<principal-id>",
    "resourceGroup": "<resource-group-name>",
    "tags": {},
    "tenantId": "<tenant-id>",
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

Получение идентификатора субъекта управляемого удостоверения, назначаемого пользователем

Получите идентификатор субъекта управляемого удостоверения, назначаемого пользователем, с помощью az identity show команды.

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

Узнайте идентификатор ресурса управляемого удостоверения пользователя

Получите идентификатор ресурса управляемой удостоверенности, назначенной пользователем, используя команду az identity show.

RESOURCE_ID=$(az identity show \
    --name <identity-name> \
    --resource-group <resource-group-name> \
    --query id \
    --output tsv)

Включение назначаемого пользователем управляемого удостоверения на новом кластере AKS

Чтобы создать кластер AKS с пользовательским управляемым удостоверением, используйте команду az aks create и параметр --assign-identity, установленный в идентификатор ресурса пользовательского управляемого удостоверения.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --network-plugin azure \
    --vnet-subnet-id <vnet-subnet-id> \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 \
    --assign-identity $RESOURCE_ID \
    --generate-ssh-keys

Обновление существующего кластера для использования управляемого удостоверения, назначаемого пользователем

Обновите существующий кластер, чтобы использовать управляемое удостоверение, назначаемое пользователем, с помощью az aks update команды и --assign-identity параметра, заданного идентификатором ресурса управляемого удостоверения, назначаемого пользователем.

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

Выходные данные для успешного обновления кластера для использования управляемого удостоверения, назначаемого пользователем, должны выглядеть примерно так:

...
    "identity": {
    "principalId": null,
    "tenantId": null,
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
        "clientId": "<client-id>",
        "principalId": "<principal-id>"
        }
    }
    },
...

После обновления кластера для использования управляемого удостоверения, назначаемого пользователем, а не субъекта-службы, плоскость управления и модули pod используют управляемое удостоверение, назначаемое пользователем, для авторизации при доступе к другим службам в Azure. Kubelet продолжает использовать сервисную учетную запись, пока вы не обновите пул узлов. Обновление пула узлов приводит к простою для кластера AKS, так как узлы в пулах узлов оцеплены, осушены и переимычены. Можно использовать команду на узлах для обновления управляемой идентичности, назначенной пользователем.

az aks nodepool upgrade \
  --resource-group <resource-group-name> \
  --cluster-name <aks-cluster-name> \
  --name <node-pool-name> \
  --node-image-only

Замечание

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

Назначьте роль Azure RBAC управляемому удостоверению, назначенному пользователем.

Добавьте назначение роли для управляемого удостоверения пользователя с помощью команды az role assignment create. В следующем примере роль Key Vault Secrets User назначается пользовательским управляемым удостоверением, предоставляя ему разрешения на доступ к секретам в хранилище ключей. Назначение роли распространяется на ресурс хранилища ключей.

az role assignment create \
    --assignee <client-id> \
    --role "Key Vault Secrets User" \
    --scope "<key-vault-resource-id>"

Замечание

Для распространения разрешений, предоставленных управляемому удостоверению кластера, может потребоваться до 60 минут.

Создание файла конфигурации Terraform

Файлы конфигурации Terraform определяют инфраструктуру, которую Terraform создает и управляет ею.

  1. Создайте файл с именем main.tf и добавьте следующий код, чтобы определить версию Terraform и указать поставщика Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. Добавьте следующий код в main.tf для создания группы ресурсов Azure. При необходимости вы можете изменить имя и расположение группы ресурсов.

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

Создание кластера AKS с управляемым удостоверением, назначаемое пользователем, с помощью Terraform

Добавьте следующий код в main.tf, чтобы создать управляемое удостоверение, назначенное пользователем, и кластер AKS, использующий это удостоверение.

resource "azurerm_user_assigned_identity" "uai" {
 name                = "aks-user-identity"
 resource_group_name = azurerm_resource_group.example.name
 location            = azurerm_resource_group.example.location
}
resource "azurerm_kubernetes_cluster" "user_assigned" {
 name                = "aks-user"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "aksuser"
 identity {
   type         = "UserAssigned"
   identity_ids = [azurerm_user_assigned_identity.uai.id]
 }
 default_node_pool {
   name       = "system"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
}

Добавьте назначение роли для управляемой идентичности, назначенной пользователем, с помощью Terraform

Добавьте следующий код в main.tf, чтобы создать назначение ролей для управляемого удостоверения, назначенного пользователем. В этом примере роль Key Vault Secrets User назначается управляемому удостоверению, созданному пользователем, чтобы предоставить ему разрешения на доступ к секретам в хранилище ключей. Назначение роли распространяется на ресурс хранилища ключей.

resource "azurerm_role_assignment" "user_assigned_key_vault_secrets_user" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "Key Vault Secrets User"
 principal_id         = azurerm_user_assigned_identity.uai.principal_id
}

Инициализируйте Terraform

Инициализируйте Terraform в каталоге, содержащем ваш файл main.tf, с помощью команды terraform init. Эта команда загружает поставщика (провайдера) Azure, необходимого для управления ресурсами Azure с помощью Terraform.

terraform init

Создайте план запуска Terraform

Создайте план выполнения Terraform с помощью terraform plan команды. Эта команда показывает ресурсы, которые Terraform создаст или изменит в подписке Azure.

terraform plan

Применение конфигурации Terraform

После проверки и подтверждения плана выполнения примените конфигурацию Terraform с помощью terraform apply команды. Эта команда создает или изменяет ресурсы, определенные в файле main.tf в подписке Azure.

terraform apply

Проверьте развертывание Terraform

После применения конфигурации Terraform можно проверить развертывание с помощью команды [az aks show][az-aks-show] и параметром --query для фильтрации выходных данных и отображения сведений об идентификации. Рассмотрим пример.

az aks show \
 --name <cluster-name> \
 --resource-group <resource-group> \
 --query identity.type \
 --output tsv

Дополнительные сведения об управляемых идентичностях в AKS смотрите в следующих статьях: