Настройка удостоверения рабочей нагрузки между клиентами в Служба Azure Kubernetes (AKS)
В этой статье описано, как настроить удостоверение рабочей нагрузки между клиентами в Служба Azure Kubernetes (AKS). Удостоверение рабочей нагрузки между клиентами позволяет получить доступ к ресурсам в другом клиенте из кластера AKS. В этом примере вы создадите Служебная шина Azure в одном клиенте и отправляете в него сообщения из рабочей нагрузки, работающей в кластере AKS в другом клиенте.
Дополнительные сведения об удостоверениях рабочей нагрузки см. в обзоре удостоверений рабочей нагрузки.
Необходимые компоненты
Две подписки Azure, каждая из которых содержит отдельный клиент. В этой статье мы называем их клиентом A и клиентом B.
Azure CLI, установленная на локальном компьютере. Если у вас нет установленного Интерфейса командной строки Azure, см . статью "Установка Azure CLI".
Среда оболочки Bash. В этой статье используется синтаксис оболочки Bash.
У вас должны быть следующие сведения о подписке:
- Идентификатор клиента A
- Идентификатор подписки клиента
- Идентификатор клиента B
- Идентификатор подписки B клиента B
Внимание
Убедитесь, что вы остаетесь в одном окне терминала в течение этой статьи, чтобы сохранить заданные переменные среды. Если закрыть окно терминала, необходимо снова задать переменные среды.
Настройка ресурсов в клиенте A
В клиенте A создается кластер AKS с включенным удостоверением рабочей нагрузки и издателем OIDC. Этот кластер используется для развертывания приложения, пытающегося получить доступ к ресурсам в клиенте B.
Вход в клиент A
Войдите в подписку Tenant A с помощью
az login
команды.# Set environment variable TENANT_A_ID=<tenant-id> az login --tenant $TENANT_A_ID
Убедитесь, что вы работаете с правильной подпиской в клиенте A с помощью
az account set
команды.# Set environment variable TENANT_A_SUBSCRIPTION_ID=<subscription-id> # Log in to your Tenant A subscription az account set --subscription $TENANT_A_SUBSCRIPTION_ID
Создание ресурсов в клиенте A
Создайте группу ресурсов в клиенте A , чтобы разместить кластер AKS с помощью
az group create
команды.# Set environment variables RESOURCE_GROUP=<resource-group-name> LOCATION=<location> # Create a resource group az group create --name $RESOURCE_GROUP --location $LOCATION
Создайте кластер AKS в клиенте A с удостоверением рабочей нагрузки и издателем OIDC, включенным
az aks create
с помощью команды.# Set environment variable CLUSTER_NAME=<cluster-name> # Create an AKS cluster az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --enable-oidc-issuer \ --enable-workload-identity \ --generate-ssh-keys
Получение URL-адреса издателя OIDC из кластера AKS
Получите URL-адрес издателя OIDC из кластера в клиенте
az aks show
A с помощью команды.OIDC_ISSUER_URL=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" --output tsv)
Настройка ресурсов в клиенте B
В клиенте B вы создаете Служебная шина Azure, управляемое удостоверение и назначаете ему разрешения на чтение и запись сообщений в служебную шину и устанавливаете доверие между управляемым удостоверением и кластером AKS в клиенте A.
Вход в клиент B
Выйдите из подписки Tenant A с помощью
az logout
команды.az logout
Войдите в подписку Tenant B с помощью
az login
команды.# Set environment variable TENANT_B_ID=<tenant-id> az login --tenant $TENANT_B_ID
Убедитесь, что вы работаете с правильной подпиской в клиенте B с помощью
az account set
команды.# Set environment variable TENANT_B_SUBSCRIPTION_ID=<subscription-id> # Log in to your Tenant B subscription az account set --subscription $TENANT_B_SUBSCRIPTION_ID
Создание ресурсов в клиенте B
Создайте группу ресурсов в клиенте B для размещения управляемого удостоверения с помощью
az group create
команды.# Set environment variables RESOURCE_GROUP=<resource-group-name> LOCATION=<location> # Create a resource group az group create --name $RESOURCE_GROUP --location $LOCATION
Создайте служебную шину и очередь в клиенте B с помощью
az servicebus namespace create
команд иaz servicebus queue create
команд.# Set environment variable SERVICEBUS_NAME=sb-crosstenantdemo-$RANDOM # Create a new service bus namespace and and return the service bus hostname SERVICEBUS_HOSTNAME=$(az servicebus namespace create \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --disable-local-auth \ --query serviceBusEndpoint \ --output tsv | sed -e 's/https:\/\///' -e 's/:443\///') # Create a new queue in the service bus namespace az servicebus queue create \ --name myqueue \ --namespace $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP
Создайте управляемое удостоверение, назначаемое пользователем, в клиенте B с помощью
az identity create
команды.# Set environment variable IDENTITY_NAME=${SERVICEBUS_NAME}-identity # Create a user-assigned managed identity az identity create --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME
Получение идентификаторов ресурсов и назначение разрешений в клиенте B
Получите идентификатор субъекта управляемого удостоверения в клиенте B с помощью
az identity show
команды.# Get the user-assigned managed identity principalId PRINCIPAL_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query principalId \ --output tsv)
Получите идентификатор клиента управляемого удостоверения в клиенте B с помощью
az identity show
команды.CLIENT_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query clientId \ --output tsv)
Получите идентификатор ресурса пространства имен служебной шины в клиенте B с помощью
az servicebus namespace show
команды.SERVICEBUS_ID=$(az servicebus namespace show \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
Назначьте управляемое удостоверение в клиенте B разрешения на чтение и запись сообщений служебной
az role assignment create
шины с помощью команды.az role assignment create \ --role "Azure Service Bus Data Owner" \ --assignee-object-id $PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal \ --scope $SERVICEBUS_ID
Установка доверия между кластером AKS и управляемым удостоверением
В этом разделе описано, как создать учетные данные федеративного удостоверения, необходимые для установления доверия между кластером AKS в клиенте A и управляемым удостоверением в клиенте B. Вы используете URL-адрес издателя OIDC из кластера AKS в клиенте A и имя управляемого удостоверения в клиенте B.
Создайте учетные данные федеративного
az identity federated-credential create
удостоверения с помощью команды.az identity federated-credential create \ --name $IDENTITY_NAME-$RANDOM \ --identity-name $IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --issuer $OIDC_ISSUER_URL \ --subject system:serviceaccount:default:myserviceaccount
--subject system:serviceaccount:default:myserviceaccount
— это имя учетной записи службы Kubernetes, создаваемой в клиенте A далее в этой статье. Когда модуль pod приложения выполняет запросы на проверку подлинности, это значение отправляется в идентификатор Microsoft Entra в качестве subject
запроса авторизации. Идентификатор Microsoft Entra определяет, соответствует ли это значение заданному при создании учетных данных федеративного удостоверения, поэтому важно убедиться, что значение совпадает.
Развертывание приложения для отправки сообщений в очередь Служебная шина Azure
В этом разделе описано, как развернуть приложение в кластере AKS в клиенте A, который отправляет сообщения в очередь Служебная шина Azure в клиенте B.
Вход в клиент A и получение учетных данных AKS
Выйдите из подписки Клиента B с помощью
az logout
команды.az logout
Войдите в подписку Tenant A с помощью
az login
команды.az login --tenant $TENANT_A_ID
Убедитесь, что вы работаете с правильной подпиской в клиенте A с помощью
az account set
команды.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
Получите учетные данные для кластера AKS в клиенте
az aks get-credentials
A с помощью команды.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
Создание ресурсов Kubernetes для отправки сообщений в очередь Служебная шина Azure
Создайте новую службу Kubernetes ServiceAccount в
default
пространстве имен и передайте идентификатор клиента управляемого удостоверения в клиентЕ Bkubectl apply
в команду. Идентификатор клиента используется для проверки подлинности приложения в клиенте A в Служебная шина Azure в клиенте B.kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $CLIENT_ID name: myserviceaccount EOF
Создайте новое задание Kubernetes в пространстве имен, чтобы отправить 100 сообщений в
default
очередь Служебная шина Azure. Шаблон Pod настроен для использования удостоверения рабочей нагрузки и учетной записи службы, созданной на предыдущем шаге. Кроме того, обратите внимание, чтоAZURE_TENANT_ID
переменная среды имеет идентификатор клиента B. Это необходимо в качестве идентификатора рабочей нагрузки по умолчанию для клиента кластера AKS, поэтому необходимо явно задать идентификатор клиента B.kubectl apply -f - <<EOF apiVersion: batch/v1 kind: Job metadata: name: myproducer spec: template: metadata: labels: azure.workload.identity/use: "true" spec: serviceAccountName: myserviceaccount containers: - image: ghcr.io/azure-samples/aks-app-samples/servicebusdemo:latest name: myproducer resources: {} env: - name: OPERATION_MODE value: "producer" - name: MESSAGE_COUNT value: "100" - name: AZURE_SERVICEBUS_QUEUE_NAME value: myqueue - name: AZURE_SERVICEBUS_HOSTNAME value: $SERVICEBUS_HOSTNAME - name: AZURE_TENANT_ID value: $TENANT_B_ID restartPolicy: Never EOF
Проверка развертывания
Убедитесь, что модуль pod правильно настроен для взаимодействия с очередью Служебная шина Azure в клиенте B, проверив состояние модуля pod с помощью
kubectl describe pod
команды.# Get the dynamically generated pod name POD_NAME=$(kubectl get po --selector job-name=myproducer -o jsonpath='{.items[0].metadata.name}') # Verify the tenant ID environment variable is set for Tenant B kubectl describe pod $POD_NAME | grep AZURE_TENANT_ID
Проверьте журналы pod, чтобы узнать, удалось ли приложению отправлять сообщения между клиентами с помощью
kubectl logs
команды.kubectl logs $POD_NAME
Выходные данные должны выглядеть примерно так:
... Adding message to batch: Hello World! Adding message to batch: Hello World! Adding message to batch: Hello World! Sent 100 messages
Примечание.
В качестве дополнительного шага проверки можно перейти к портал Azure и перейти к очереди Служебная шина Azure в клиенте B, чтобы просмотреть сообщения, отправленные в обозревателе служебная шина.
Очистка ресурсов
Убедившись, что развертывание выполнено успешно, можно очистить ресурсы, чтобы избежать затрат Azure.
Удаление ресурсов в клиенте A
Войдите в подписку Tenant A с помощью
az login
команды.az login --tenant $TENANT_A_ID
Убедитесь, что вы работаете с правильной подпиской в клиенте A с помощью
az account set
команды.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
Удалите группу ресурсов Azure и все ресурсы в ней
az group delete
с помощью команды.az group delete --name $RESOURCE_GROUP --yes --no-wait
Удаление ресурсов в клиенте B
Войдите в подписку Tenant B с помощью
az login
команды.az login --tenant $TENANT_B_ID
Убедитесь, что вы работаете с правильной подпиской в клиенте B с помощью
az account set
команды.az account set --subscription $TENANT_B_SUBSCRIPTION_ID
Удалите группу ресурсов Azure и все ресурсы в ней
az group delete
с помощью команды.az group delete --name $RESOURCE_GROUP --yes --no-wait
Следующие шаги
Из этой статьи вы узнали, как настроить удостоверение рабочей нагрузки между клиентами на Служба Azure Kubernetes (AKS). Дополнительные сведения об удостоверениях рабочей нагрузки см. в следующих статьях:
Azure Kubernetes Service