Dela via


Konfigurera arbetsbelastningsidentitet mellan klientorganisationer i Azure Kubernetes Service (AKS)

I den här artikeln får du lära dig hur du konfigurerar arbetsbelastningsidentitet mellan klientorganisationer i Azure Kubernetes Service (AKS). Med arbetsbelastningsidentitet mellan klientorganisationer kan du komma åt resurser i en annan klientorganisation från ditt AKS-kluster. I det här exemplet skapar du en Azure Service Bus i en klientorganisation och skickar meddelanden till den från en arbetsbelastning som körs i ett AKS-kluster i en annan klientorganisation.

Mer information om arbetsbelastningsidentitet finns i översikten över arbetsbelastningsidentitet.

Förutsättningar

  • Två Azure-prenumerationer, var och en i en separat klientorganisation. I den här artikeln refererar vi till dessa som Klient A och Klient B.

  • Azure CLI installerat på din lokala dator. Om du inte har Installerat Azure CLI läser du Installera Azure CLI.

  • Bash Shell-miljö. Den här artikeln använder Bash Shell-syntax.

  • Du måste ha följande prenumerationsinformation:

    • Klientorganisation Ett klient-ID
    • Klientorganisation Ett prenumerations-ID
    • Klient-B-klientorganisations-ID
    • Klient-B-prenumerations-ID

Viktigt!

Se till att du håller dig inom samma terminalfönster under hela den här artikeln för att behålla de miljövariabler som du anger. Om du stänger terminalfönstret måste du ange miljövariablerna igen.

Konfigurera resurser i klient A

I Klient A skapar du ett AKS-kluster med arbetsbelastningsidentitet och OIDC-utfärdare aktiverat. Du använder det här klustret för att distribuera ett program som försöker komma åt resurser i klient B.

Logga in på klientorganisation A

  1. Logga in på din klientorganisation En prenumeration med hjälp av az login kommandot .

    # Set environment variable
    TENANT_A_ID=<tenant-id>
    
    az login --tenant $TENANT_A_ID
    
  2. Se till att du arbetar med rätt prenumeration i Klient A med hjälp av az account set kommandot .

    # Set environment variable
    TENANT_A_SUBSCRIPTION_ID=<subscription-id>
    
    # Log in to your Tenant A subscription
    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    

Skapa resurser i klient A

  1. Skapa en resursgrupp i Klient A som värd för AKS-klustret med hjälp av az group create kommandot .

    # Set environment variables
    RESOURCE_GROUP=<resource-group-name>
    LOCATION=<location>
    
    # Create a resource group
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Skapa ett AKS-kluster i klient A med arbetsbelastningsidentitet och OIDC-utfärdare aktiverat med kommandot 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
    

Hämta URL för OIDC-utfärdare från AKS-kluster

  • Hämta url:en för OIDC-utfärdaren från klustret i klient A med hjälp av az aks show kommandot .

    OIDC_ISSUER_URL=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" --output tsv)
    

Konfigurera resurser i klient B

I Klient B skapar du en Azure Service Bus, en hanterad identitet och tilldelar den behörighet att läsa och skriva meddelanden till Service Bus och upprätta förtroendet mellan den hanterade identiteten och AKS-klustret i klient A.

Logga in på klient B

  1. Logga ut från din klientorganisation En prenumeration med hjälp av az logout kommandot .

    az logout
    
  2. Logga in på din klient-B-prenumeration med hjälp av az login kommandot .

    # Set environment variable
    TENANT_B_ID=<tenant-id>
    
    az login --tenant $TENANT_B_ID
    
  3. Se till att du arbetar med rätt prenumeration i klient B med hjälp av az account set kommandot .

    # Set environment variable
    TENANT_B_SUBSCRIPTION_ID=<subscription-id>
    
    # Log in to your Tenant B subscription
    az account set --subscription $TENANT_B_SUBSCRIPTION_ID
    

Skapa resurser i klient B

  1. Skapa en resursgrupp i klient B som värd för den hanterade identiteten az group create med hjälp av kommandot .

    # Set environment variables
    RESOURCE_GROUP=<resource-group-name>
    LOCATION=<location>
    
    # Create a resource group
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Skapa en servicebuss och kö i klient B med hjälp av kommandona az servicebus namespace create och 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
    
  3. Skapa en användartilldelad hanterad identitet i klient B med hjälp av az identity create kommandot .

    # Set environment variable
    IDENTITY_NAME=${SERVICEBUS_NAME}-identity
    
    # Create a user-assigned managed identity
    az identity create --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME
    

Hämta resurs-ID:n och tilldela behörigheter i klient B

  1. Hämta huvud-ID:t för den hanterade identiteten i klient B med hjälp av az identity show kommandot .

    # Get the user-assigned managed identity principalId
    PRINCIPAL_ID=$(az identity show \
      --resource-group $RESOURCE_GROUP \
      --name $IDENTITY_NAME \
      --query principalId \
      --output tsv)
    
  2. Hämta klient-ID:t för den hanterade identiteten i klient B med hjälp av az identity show kommandot .

    CLIENT_ID=$(az identity show \
      --resource-group $RESOURCE_GROUP \
      --name $IDENTITY_NAME \
      --query clientId \
      --output tsv)
    
  3. Hämta resurs-ID:t för Service Bus-namnområdet i klient B med hjälp av az servicebus namespace show kommandot .

    SERVICEBUS_ID=$(az servicebus namespace show \
      --name $SERVICEBUS_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id \
      --output tsv)
    
  4. Tilldela den hanterade identiteten i klient B-behörigheter för att läsa och skriva Service Bus-meddelanden med hjälp av az role assignment create kommandot .

    az role assignment create \
      --role "Azure Service Bus Data Owner" \
      --assignee-object-id $PRINCIPAL_ID \
      --assignee-principal-type ServicePrincipal \
      --scope $SERVICEBUS_ID
    

Upprätta förtroende mellan AKS-kluster och hanterad identitet

I det här avsnittet skapar du de federerade identitetsautentiseringsuppgifter som behövs för att upprätta förtroende mellan AKS-klustret i klient A och den hanterade identiteten i klient B. Du använder OIDC-utfärdarens URL från AKS-klustret i klient A och namnet på den hanterade identiteten i klient B.

  • Skapa en federerad identitetsautentiseringsuppgift med kommandot 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 är namnet på kubernetes-tjänstkontot som du skapar i klientorganisation A senare i artikeln. När programpodden gör autentiseringsbegäranden skickas det här värdet till Microsoft Entra-ID som subject i auktoriseringsbegäran. Microsoft Entra-ID avgör berättigande baserat på om det här värdet matchar det du angav när du skapade den federerade identitetens autentiseringsuppgifter, så det är viktigt att se till att värdet matchar.

Distribuera program för att skicka meddelanden till Azure Service Bus-kön

I det här avsnittet distribuerar du ett program till ditt AKS-kluster i Klient A som skickar meddelanden till Azure Service Bus-kön i klient B.

Logga in på klientorganisation A och hämta AKS-autentiseringsuppgifter

  1. Logga ut från din klient-B-prenumeration med kommandot az logout .

    az logout
    
  2. Logga in på din klientorganisation En prenumeration med hjälp av az login kommandot .

    az login --tenant $TENANT_A_ID
    
  3. Se till att du arbetar med rätt prenumeration i Klient A med hjälp av az account set kommandot .

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  4. Hämta autentiseringsuppgifterna för AKS-klustret i Klient A med hjälp av az aks get-credentials kommandot .

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Skapa Kubernetes-resurser för att skicka meddelanden till Azure Service Bus-kön

  1. Skapa ett nytt Kubernetes ServiceAccount i default namnområdet och skicka klient-ID:t för din hanterade identitet i klient B till kubectl apply kommandot. Klient-ID:t används för att autentisera appen i Klient A till Azure Service Bus i klient B.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $CLIENT_ID
      name: myserviceaccount
    EOF
    
  2. Skapa ett nytt Kubernetes-jobb i default namnområdet för att skicka 100 meddelanden till Azure Service Bus-kön. Poddmallen är konfigurerad för att använda arbetsbelastningsidentitet och det tjänstkonto som du skapade i föregående steg. Observera också att AZURE_TENANT_ID miljövariabeln är inställd på klientorganisations-ID för klient B. Detta krävs eftersom arbetsbelastningsidentiteten som standard är klientorganisationen för AKS-klustret, så du måste uttryckligen ange klientorganisations-ID för klient 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
    

Verifiera distributionen

  1. Kontrollera att podden är korrekt konfigurerad för att interagera med Azure Service Bus-kön i klient B genom att kontrollera statusen för podden med hjälp kubectl describe pod av kommandot .

    # 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
    
  2. Kontrollera loggarna för podden för att se om programmet kunde skicka meddelanden mellan klienter med hjälp av kubectl logs kommandot .

    kubectl logs $POD_NAME
    

    Dina utdata bör se ut ungefär som följande exempelutdata:

    ...
    Adding message to batch: Hello World!
    Adding message to batch: Hello World!
    Adding message to batch: Hello World!
    Sent 100 messages
    

Kommentar

Som ett extra verifieringssteg kan du gå till Azure Portal och navigera till Azure Service Bus-kön i klient B för att visa de meddelanden som skickades i Service Bus Explorer.

Rensa resurser

När du har kontrollerat att distributionen har slutförts kan du rensa resurserna för att undvika kostnader för Azure.

Ta bort resurser i klient A

  1. Logga in på din klientorganisation En prenumeration med hjälp av az login kommandot .

    az login --tenant $TENANT_A_ID
    
  2. Se till att du arbetar med rätt prenumeration i Klient A med hjälp av az account set kommandot .

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  3. Ta bort Azure-resursgruppen och alla resurser i den az group delete med kommandot .

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

Ta bort resurser i klient B

  1. Logga in på din klient-B-prenumeration med hjälp av az login kommandot .

    az login --tenant $TENANT_B_ID
    
  2. Se till att du arbetar med rätt prenumeration i klient B med hjälp av az account set kommandot .

    az account set --subscription $TENANT_B_SUBSCRIPTION_ID
    
  3. Ta bort Azure-resursgruppen och alla resurser i den az group delete med kommandot .

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

Nästa steg

I den här artikeln har du lärt dig hur du konfigurerar arbetsbelastningsidentitet mellan klientorganisationer i Azure Kubernetes Service (AKS). Mer information om arbetsbelastningsidentitet finns i följande artiklar: