Использование удостоверений, управляемых pod Microsoft Entra, в Служба Azure Kubernetes (предварительная версия)
Управляемые microsoft Entra pod удостоверения используют примитивы Kubernetes для связывания управляемых удостоверений для ресурсов и удостоверений Azure в идентификаторе Microsoft Entra с модулями pod. Администраторы создают удостоверения и привязки в качестве примитивов Kubernetes, которые позволяют pod получать доступ к ресурсам Azure, которые используют идентификатор Microsoft Entra в качестве поставщика удостоверений.
Внимание
Рекомендуется просмотреть Идентификация рабочей нагрузки Microsoft Entra. Этот метод проверки подлинности заменяет управляемое pod удостоверение (предварительная версия), которое интегрируется с собственными возможностями Kubernetes для федерации с любыми внешними поставщиками удостоверений от имени приложения.
Управляемое открытый код управляемое модулем Microsoft Entra pod (предварительная версия) в Служба Azure Kubernetes было устарело 10.24.2022, а проект был архивирован в сентябре 2023 года. Дополнительные сведения см. в уведомлении об отмене. Надстройка AKS Pod Identity Managed будет исправлена и поддерживается до сентября 2025 г., чтобы разрешить клиентам переход на Идентификация рабочей нагрузки Microsoft Entra
Чтобы отключить управляемую надстройку AKS, используйте следующую команду: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
Подготовка к работе
Необходимо установить Azure CLI версии 2.20.0 или более поздней.
Ограничения
- Для кластера разрешено не более 200 удостоверений, управляемых pod.
- Для кластера разрешено не более 200 исключений управляемых pod удостоверений.
- Управляемые модулем pod идентификаторы доступны только в пулах узлов Linux.
- Эта функция поддерживается только для кластеров с поддержкой масштабируемых наборов виртуальных машин.
Установка расширения Azure CLI для aks-preview
Внимание
Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.
Чтобы установить расширение aks-preview, выполните следующую команду:
az extension add --name aks-preview
Выполните следующую команду, чтобы обновить до последней версии выпущенного расширения:
az extension update --name aks-preview
Регистрация флага функции EnablePodIdentityPreview
Зарегистрируйте флаг компонента EnablePodIdentityPreview
, используя команду az feature register, как показано в указанном ниже примере.
az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show :
az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"
Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью команды az provider register:
az provider register --namespace Microsoft.ContainerService
Параметры режима работы
Управляемое удостоверение Microsoft Entra pod поддерживает два режима работы:
- Стандартный режим: в этом режиме в кластере AKS развертываются следующие два компонента:
- Контроллер управляемых удостоверений (MIC): контроллер Kubernetes, который следит за изменениями в pod, AzureIdentity и AzureIdentityBinding, через сервер API в Kubernetes. Когда контроллер обнаруживает соответствующее изменение, MIC за необходимости добавляет или удаляет AzureAssignedIdentity. В частности, при планировании модуля pod MIC назначает управляемое удостоверение в Azure базовому масштабируемом набору виртуальных машин, используемому пулом узлов во время этапа создания. При удалении всех модулей pod, использующих удостоверение, он удаляет удостоверение из масштабируемого набора виртуальных машин пула узлов, если только одно и то же управляемое удостоверение не используется другими модулями pod. Контроллер управляемых удостоверений выполняет аналогичные действия при создании или удалении AzureIdentity или AzureIdentityBinding.
- Node Managed Identity (NMI): это pod, который работает как DaemonSet на каждом узле кластера AKS. NMI перехватывает запросы маркера безопасности службе метаданных экземпляра Azure на каждом узле, перенаправляет их на себя и проверяет, имеет ли модуль pod доступ к идентификатору, запрашивая маркер и извлекает маркер из клиента Microsoft Entra от имени приложения.
- Управляемый режим: в этом режиме есть только NMI. При установке с помощью надстройки кластера AKS Azure управляет созданием примитивов Kubernetes (AzureIdentity и AzureIdentityBinding) и назначением удостоверений в ответ на выполняемые пользователем команды CLI. В противном случае, если установка выполнена через диаграмму Helm, удостоверение должно назначаться и управляться пользователем вручную. Дополнительные сведения см. в статье Удостоверение pod в управляемом режиме.
При установке управляемого удостоверений Microsoft Entra pod с помощью диаграммы Helm или манифеста YAML, как показано в руководстве по установке, можно выбрать между режимом и managed
режимомstandard
. Если вы решили установить управляемое модулем Microsoft Entra pod с помощью надстройки кластера AKS, как показано в этой статье, программа установки будет использовать managed
режим.
Создание кластера Службы Azure Kubernetes с помощью Azure CNI
Примечание.
Это рекомендуемая конфигурация по умолчанию
Создание кластера AKS с включенными Azure CNI и управляемым модулем pod идентификатором. Ниже команда az group create используется для создания группы ресурсов с именем myResourceGroup и команда az aks create для создания кластера AKS с именем myAKSCluster в группе ресурсов myResourceGroup.
az group create --name myResourceGroup --location eastus
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-pod-identity \
--network-plugin azure \
--generate-ssh-keys
Для входа в кластер AKS используйте команду az-aks-get-credentials. Эта команда также загружает и настраивает сертификат клиента kubectl
на компьютере разработки.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Примечание.
При включении идентификатора, управляемого модулем pod, в кластере AKS в пространство имен kube-system добавляется AzurePodIdentityException с именем aks-added-exception. AzurePodIdentityException позволяет модулям pod с определенными метками получить доступ к конечной точке Службы метаданных экземпляров Azure (IMDS) без перехвата сервером NMI. Исключение aks-addon-exception позволяет сторонним надстройкам AKS, таким как управляемое удостоверением Microsoft Entra pod, работать без необходимости вручную настраивать AzurePodIdentityException. При необходимости можно добавлять, удалять и обновлять AzurePodIdentityException с помощью az aks pod-identity exception add
, az aks pod-identity exception delete
, az aks pod-identity exception update
или kubectl
.
Обновление имеющегося кластера AKS с помощью Azure CNI
Обновите существующий кластер AKS с помощью Azure CNI, чтобы добавить идентификатор, управляемый модулем pod.
az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity
Использование подключаемого модуля сети Kubenet с удостоверениями, управляемыми microsoft Entra pod
Внимание
Запуск управляемого модулем Pod Microsoft Entra в кластере с Kubenet не является рекомендуемой конфигурацией из-за проблем безопасности. Конфигурация Kubenet по умолчанию не позволяет предотвратить ARP-спуфинг, который модуль pod может использовать, чтобы выдать себя за другой pod и получить доступ к удостоверению, которое ему не предназначено. Следуйте инструкциям по устранению рисков и настройте политики, прежде чем включить управляемое модулем Microsoft Entra pod в кластере с Kubenet.
Исправление
Чтобы снизить уязвимость на уровне кластера, можно использовать встроенную политику Azure "Контейнеры в кластере Kubernetes должны использовать только разрешенные возможности" для ограничения возможностей атаки CAP_NET_RAW.
Добавление NET_RAW в требуемые возможности удаления
Если вы не используете Политику Azure, можно использовать контроллер допуска OpenPolicyAgent, а также веб-перехватчик с проверкой Gatekeeper. Если Gatekeeper в кластере у вас уже установлен, добавьте ConstraintTemplate типа K8sPSPCapabilities:
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml
Добавьте шаблон, чтобы ограничить порождение модулей pod с помощью функции NET_RAW:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
name: prevent-net-raw
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces:
- "kube-system"
parameters:
requiredDropCapabilities: ["NET_RAW"]
Создание кластера AKS с подключаемым модулем сети Kubenet
Создайте кластер AKS с включенными подключаемым модулем сети Kubenet и идентификатором, управляемым модулем pod.
az aks create \
--resource-group $MY_RESOURCE_GROUP \
--name $MY_CLUSTER \
--enable-pod-identity \
--enable-pod-identity-with-kubenet \
--generate-ssh-keys
Обновление имеющегося кластера AKS с подключаемым модулем сети Kubenet
Обновите имеющийся кластер AKS с сетевым подключаемым модулем Kubenet, чтобы включить удостоверение, управляемое объектом pod.
az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet
Создание удостоверения
Внимание
У вас должны быть соответствующие разрешения (например, владелец) в вашей подписке, чтобы создать удостоверение.
Создайте удостоверение, которое будет использоваться демонстрационным модулем pod, с помощью команды az identity create и задайте переменные IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_ID.
az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"
Назначьте разрешения для управляемого идентификатора
Управляемому удостоверению, которое будет назначено модулю pod, должны быть предоставлены разрешения, соответствующие действиям, которые он будет выполнять.
Чтобы запустить демонстрацию, у управляемого удостоверения IDENTITY_CLIENT_ID должны быть разрешения участника виртуальной машины в группе ресурсов, содержащей масштабируемый набор виртуальных машин кластера AKS.
# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
# Obtain the id of the node resource group
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")
# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID
Создание идентификатора Pod
Создайте управляемое pod удостоверение для кластера с помощью az aks pod-identity add
.
export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}
Примечание.
Значение POD_IDENTITY_NAME должно быть допустимым именем субдомена DNS по стандарту RFC 1123.
Примечание.
При назначении управляемого pod удостоверения с помощью pod-identity add
Azure CLI пытается предоставить роль оператора управляемых удостоверений через управляемое pod удостоверение (IDENTITY_RESOURCE_ID) удостоверению кластера.
Azure создаст в кластере ресурс AzureIdentity, представляющий удостоверение в Azure, и ресурс AzureIdentityBinding, связывающий AzureIdentity с селектором. Эти ресурсы можно просмотреть с помощью следующих команд:
kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE
Запуск примера приложения
Для использования управляемого модулем pod Microsoft Entra необходимо метка aadpodidbinding со значением, соответствующим селектору из AzureIdentityBinding. По умолчанию селектор будет соответствовать имени управляемого pod удостоверения, но его также можно задать с помощью --binding-selector
параметра при вызове az aks pod-identity add
.
Чтобы запустить пример приложения с помощью управляемого модулем pod Microsoft Entra, создайте demo.yaml
файл со следующим содержимым. Замените POD_IDENTITY_NAME, IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_GROUP значениями из предыдущих шагов. Замените SUBSCRIPTION-ID идентификатором своей подписки.
Примечание.
На предыдущих шагах вы создали переменные POD_IDENTITY_NAME, IDENTITY_CLIENT_ID и IDENTITY_RESOURCE_GROUP. Можно использовать, например, команду echo
, чтобы отобразить значение, например, заданное для переменных echo $POD_IDENTITY_NAME
.
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
aadpodidbinding: $POD_IDENTITY_NAME
spec:
containers:
- name: demo
image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
args:
- --subscriptionid=$SUBSCRIPTION_ID
- --clientid=$IDENTITY_CLIENT_ID
- --resourcegroup=$IDENTITY_RESOURCE_GROUP
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
nodeSelector:
kubernetes.io/os: linux
Обратите внимание, что определение pod имеет метку aadpodidbinding со значением, которое соответствует имени управляемого модуля pod удостоверения, запущенного az aks pod-identity add
на предыдущем шаге.
Развертывание demo.yaml
в том же пространстве имен, что и управляемое модулем pod с помощью kubectl apply
:
kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE
С помощью kubectl logs
убедитесь, что пример приложения успешно запущен.
kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE
Убедитесь, что в журналах показано, что маркер успешно получен, а операция GET выполнена.
...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...
Запуск приложения с несколькими удостоверениями
Чтобы приложение использовало несколько удостоверений, укажите для --binding-selector
тот же селектор, который использовался при создании удостоверений pod.
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE} --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector
Затем задайте в поле aadpodidbinding
манифеста YAML для модуля pod указанный селектор привязки.
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
aadpodidbinding: myMultiIdentitySelector
...
Отключение управляемого pod удостоверения в существующем кластере
Чтобы отключить управляемое pod удостоверение в существующем кластере, удалите удостоверения, управляемые pod, из кластера. Затем отключите функцию в кластере.
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity
Очистка
Чтобы удалить управляемое кластером удостоверение Microsoft Entra pod, удалите пример приложения и управляемое pod удостоверение из кластера. Затем удалите удостоверение и назначение ролей удостоверения кластера.
kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"
Следующие шаги
Дополнительные сведения об управляемых удостоверениях для ресурсов Azure см. в этой статье.
Azure Kubernetes Service