Configurare l'identità del carico di lavoro tra tenant nel servizio Azure Kubernetes
Questo articolo illustra come configurare l'identità del carico di lavoro tra tenant nel servizio Azure Kubernetes. L'identità del carico di lavoro tra tenant consente di accedere alle risorse in un altro tenant dal cluster del servizio Azure Kubernetes. In questo esempio, si crea un bus di servizio di Azure in un tenant e gli si inviano messaggi da un carico di lavoro in esecuzione in un cluster del servizio Azure Kubernetes in un altro tenant.
Per altre informazioni sull'identità del carico di lavoro, vedere Informazioni generali sul carico di lavoro.
Prerequisiti
Due sottoscrizioni di Azure, ognuna in un tenant separato. In questo articolo, si fa riferimento a questi elementi come Tenant A e Tenant B.
Interfaccia della riga di comando di Azure installata nel computer locale. Se non si è installato l'interfaccia della riga di comando di Azure, vedere Installare l'interfaccia della riga di comando di Azure.
Ambiente shell Bash. Questo articolo usa la sintassi della shell Bash.
È necessario disporre dei dettagli della sottoscrizione seguenti:
- Tenant A ID tenant
- Tenant A ID sottoscrizione
- Tenant B ID tenant
- Tenant B ID sottoscrizione
Importante
Assicurarsi di rimanere all'interno della stessa finestra del terminale per tutta la durata di questo articolo per mantenere le variabili di ambiente impostate. Se si chiude la finestra del terminale, è necessario impostare di nuovo le variabili di ambiente.
Configurare le risorse nel Tenant A
Nel Tenant A, si crea un cluster del servizio Azure Kubernetes con l'identità del carico di lavoro e l'autorità di certificazione OIDC abilitate. Questo cluster viene usato per distribuire un'applicazione che tenta di accedere alle risorse nel Tenant B.
Accedere al Tenant A
Accedere alla sottoscrizione del Tenant A usando il comando
az login
.# Set environment variable TENANT_A_ID=<tenant-id> az login --tenant $TENANT_A_ID
Assicurarsi di usare la sottoscrizione corretta nel Tenant A tramite il comando
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
Creare risorse nel Tenant A
Creare un gruppo di risorse nel Tenant A per ospitare il cluster del servizio Azure Kubernetes tramite il comando
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
Creare un cluster del servizio Azure Kubernetes nel Tenant A con l'identità del carico di lavoro e l'autorità di certificazione OIDC abilitate tramite il comando
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
Ottenere l'URL dell'autorità di certificazione OIDC dal cluster del servizio Azure Kubernetes
Ottenere l'URL dell'autorità di certificazione OIDC dal cluster nel Tenant A tramite il comando
az aks show
.OIDC_ISSUER_URL=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" --output tsv)
Configurare le risorse nel Tenant B
Nel Tenant B, si crea un bus di servizio di Azure, un'identità gestita a cui si assegnano le autorizzazioni di lettura e scrittura dei messaggi nel bus di servizio e si stabilisce l'attendibilità tra l'identità gestita e il cluster del servizio Azure Kubernetes nel Tenant A.
Accedere al Tenant B
Disconnettersi dalla sottoscrizione del Tenant A tramite il comando
az logout
.az logout
Accedere alla sottoscrizione del Tenant B tramite il comando
az login
.# Set environment variable TENANT_B_ID=<tenant-id> az login --tenant $TENANT_B_ID
Assicurarsi di usare la sottoscrizione corretta nel Tenant B tramite il comando
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
Creare risorse nel Tenant B
Creare un gruppo di risorse nel Tenant B per ospitare l'identità gestita tramite il comando
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
Creare un bus di servizio e una coda nel Tenant B tramite i comandi
az servicebus namespace create
eaz 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
Creare un'identità gestita assegnata dall'utente nel Tenant B tramite il comando
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
Ottenere gli ID risorsa e assegnare le autorizzazioni nel Tenant B
Ottenere l'ID entità di sicurezza dell'identità gestita nel Tenant B tramite il comando
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)
Ottenere l'ID client dell'identità gestita nel Tenant B tramite il comando
az identity show
.CLIENT_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query clientId \ --output tsv)
Ottenere l'ID risorsa dello spazio dei nomi del bus di servizio nel Tenant B tramite il comando
az servicebus namespace show
.SERVICEBUS_ID=$(az servicebus namespace show \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
Assegnare all'identità gestita del Tenant B le autorizzazioni di lettura e scrittura dei messaggi del bus di servizio tramite il comando
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
Costituire un trust tra il cluster del servizio Azure Kubernetes e l'identità gestita
In questa sezione, si creano le credenziali di identità federata necessarie per costituire il trust tra il cluster del servizio Azure Kubernetes nel Tenant A e l'identità gestita nel Tenant B. Si usa l'URL dell'autorità di certificazione OIDC dal cluster del servizio Azure Kubernetes nel Tenant A e il nome dell'identità gestita nel Tenant B.
Creare una credenziale di identità federata tramite il comando
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
è il nome dell'account del servizio Kubernetes creato nel Tenant A più avanti nell'articolo. Quando il pod dell'applicazione effettua richieste di autenticazione, questo valore viene inviato a Microsoft Entra ID come subject
nella richiesta di autorizzazione. Microsoft Entra ID determina l'idoneità in base alla corrispondenza di questo valore con quello impostato al momento della creazione della credenziale di identità federata, pertanto è importante assicurarsi che il valore coincida.
Distribuire l'applicazione per inviare messaggi alla coda del bus di servizio di Azure
In questa sezione, si distribuisce un'applicazione al cluster del servizio Azure Kubernetes nel Tenant A che invia messaggi alla coda del bus di servizio di Azure nel Tenant B.
Accedere al Tenant A e ottenere le credenziali del servizio Azure Kubernetes
Disconnettersi dalla sottoscrizione del Tenant B tramite il comando
az logout
.az logout
Accedere alla sottoscrizione del Tenant A usando il comando
az login
.az login --tenant $TENANT_A_ID
Assicurarsi di usare la sottoscrizione corretta nel Tenant A tramite il comando
az account set
.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
Ottenere le credenziali per il cluster del servizio Azure Kubernetes nel Tenant A tramite il comando
az aks get-credentials
.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
Creare risorse di Kubernetes per inviare messaggi alla coda del bus di servizio di Azure
Creare un nuovo ServiceAccount Kubernetes nello spazio dei nomi
default
e passare l'ID client dell'identità gestita nel Tenant B al comandokubectl apply
. L'ID client viene usato per autenticare l'app nel Tenant A presso il bus di servizio di Azure nel Tenant B.kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $CLIENT_ID name: myserviceaccount EOF
Creare un nuovo processo Kubernetes nello spazio dei nomi
default
per inviare 100 messaggi alla coda del bus di servizio di Azure. Il modello Pod è configurato per l'uso dell'identità del carico di lavoro e dell'account del servizio creato nel passaggio precedente. Si noti anche che la variabile di ambienteAZURE_TENANT_ID
è impostata sull'ID tenant del Tenant B. Questa operazione è necessaria perché per impostazione predefinita l'identità del carico di lavoro è quella del cluster del servizio Azure Kubernetes, quindi è necessario impostare in modo esplicito l'ID tenant del Tenant 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
Verificare la distribuzione
Verificare che il pod sia configurato correttamente per interagire con la coda del bus di servizio di Azure nel Tenant B controllando lo stato del pod tramite il comando
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
Controllare i log del pod per verificare se l'applicazione è stata in grado di inviare messaggi tra tenant tramite il comando
kubectl logs
.kubectl logs $POD_NAME
L'output dovrebbe essere simile all'esempio di output seguente:
... Adding message to batch: Hello World! Adding message to batch: Hello World! Adding message to batch: Hello World! Sent 100 messages
Nota
Come ulteriore fase di verifica, è possibile accedere al portale di Azure e spostarsi nella coda del bus di servizio di Azure nel Tenant B per visualizzare i messaggi inviati in Service Bus Explorer.
Pulire le risorse
Dopo aver verificato che la distribuzione sia avvenuta correttamente, è possibile pulire le risorse per evitare di incorrere nei costi di Azure.
Eliminare le risorse nel Tenant A
Accedere alla sottoscrizione del Tenant A usando il comando
az login
.az login --tenant $TENANT_A_ID
Assicurarsi di usare la sottoscrizione corretta nel Tenant A tramite il comando
az account set
.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
Eliminare il gruppo di risorse di Azure e tutte le risorse in esso contenute tramite il comando
az group delete
.az group delete --name $RESOURCE_GROUP --yes --no-wait
Eliminare le risorse nel Tenant B
Accedere alla sottoscrizione del Tenant B tramite il comando
az login
.az login --tenant $TENANT_B_ID
Assicurarsi di usare la sottoscrizione corretta nel Tenant B tramite il comando
az account set
.az account set --subscription $TENANT_B_SUBSCRIPTION_ID
Eliminare il gruppo di risorse di Azure e tutte le risorse in esso contenute tramite il comando
az group delete
.az group delete --name $RESOURCE_GROUP --yes --no-wait
Passaggi successivi
In questo articolo si è appreso come configurare l'identità del carico di lavoro tra tenant nel servizio Azure Kubernetes. Per altre informazioni sull'identità del carico di lavoro, vedere gli articoli seguenti:
Azure Kubernetes Service