共用方式為


在 Azure Kubernetes Service (AKS) 上設定跨租用戶工作負載身分識別

在本文中,您會了解如何在 Azure Kubernetes Service (AKS) 上設定跨租用戶工作負載身分識別。 跨租用戶工作負載身分識別可讓您從 AKS 叢集存取另一個租用戶中的資源。 在此範例中,您會在某個租用戶中建立 Azure 服務匯流排,並從在另一個租用戶中的 AKS 叢集內執行的工作負載傳送訊息給這個服務匯流排。

如需工作負載身分識別的詳細資訊,請參閱工作負載身分識別概觀 (部分機器翻譯)。

必要條件

  • 兩個 Azure 訂用帳戶,各位於不同租用戶中。 在本文中,我們將這兩個租用戶稱為「租用戶 A」和「租用戶 B」

  • 本機電腦上已安裝 Azure CLI。 如果您未安裝 Azure CLI,請參閱安裝 Azure CLI (部分機器翻譯)。

  • Bash 殼層環境。 本文使用 Bash 殼層語法。

  • 您需要有下列訂用帳戶詳細資料:

    • 「租用戶 A」的租用戶識別碼
    • 「租用戶 A」的訂用帳戶識別碼
    • 「租用戶 B」的租用戶識別碼
    • 「租用戶 B」的訂用帳戶識別碼

重要

在本文進行期間,請務必留在相同的終端機視窗內,以保持您設定的環境變數。 如果您關閉終端機視窗,就必須重新設定環境變數。

在租用戶 A 中設定資源

在「租用戶 A」中,您會建立已啟用工作負載身分識別和 OIDC 簽發者的 AKS 叢集。 您會使用這個叢集來部署應用程式,以嘗試存取「租用戶 B」中的資源。

登入租用戶 A

  1. 使用 az login 命令,登入您的「租用戶 A」訂用帳戶。

    # Set environment variable
    TENANT_A_ID=<tenant-id>
    
    az login --tenant $TENANT_A_ID
    
  2. 使用 az account set 命令,確保您有在「租用戶 A」中使用正確的訂用帳戶。

    # 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 中建立資源

  1. 使用 az group create 命令,在「租用戶 A」中建立資源群組以裝載 AKS 叢集。

    # Set environment variables
    RESOURCE_GROUP=<resource-group-name>
    LOCATION=<location>
    
    # Create a resource group
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. 使用 az aks create 命令,在「租用戶 A」中建立已啟用工作負載身分識別和 OIDC 簽發者的 AKS 叢集。

    # 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
    

從 AKS 叢集取得 OIDC 簽發者 URL

  • 使用 az aks show 命令,從「租用戶 A」中的叢集取得 OIDC 簽發者 URL。

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

在租用戶 B 中設定資源

在「租用戶 B」中,您會建立 Azure 服務匯流排,建立受控識別並向其指派在服務匯流排中讀取和寫入訊息的權限,並在此受控識別與「租用戶 A」中的 AKS 叢集之間建立信任。

登入租用戶 B

  1. 使用 az logout 命令,登出您的「租用戶 A」訂用帳戶。

    az logout
    
  2. 使用 az login 命令,登入您的「租用戶 B」訂用帳戶。

    # Set environment variable
    TENANT_B_ID=<tenant-id>
    
    az login --tenant $TENANT_B_ID
    
  3. 使用 az account set 命令,確保您有在「租用戶 B」中使用正確的訂用帳戶。

    # 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 中建立資源

  1. 使用 az group create 命令,在「租用戶 B」中建立資源群組以裝載受控識別。

    # Set environment variables
    RESOURCE_GROUP=<resource-group-name>
    LOCATION=<location>
    
    # Create a resource group
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. 使用 az servicebus namespace createaz servicebus queue create 命令,在「租用戶 B」中建立服務匯流排和佇列。

    # 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. 使用 az identity create 命令,在「租用戶 B」中建立使用者指派的受控識別。

    # 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 中取得資源識別碼並指派權限

  1. 使用 az identity show 命令,取得「租用戶 B」中受控識別的主體識別碼。

    # Get the user-assigned managed identity principalId
    PRINCIPAL_ID=$(az identity show \
      --resource-group $RESOURCE_GROUP \
      --name $IDENTITY_NAME \
      --query principalId \
      --output tsv)
    
  2. 使用 az identity show 命令,取得「租用戶 B」中受控識別的用戶端識別碼。

    CLIENT_ID=$(az identity show \
      --resource-group $RESOURCE_GROUP \
      --name $IDENTITY_NAME \
      --query clientId \
      --output tsv)
    
  3. 使用 az servicebus namespace show 命令,在「租用戶 B」中取得服務匯流排命名空間的資源識別碼。

    SERVICEBUS_ID=$(az servicebus namespace show \
      --name $SERVICEBUS_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id \
      --output tsv)
    
  4. 使用 az role assignment create 命令,向「租用戶 B」中的受控識別指派讀取和寫入服務匯流排訊息的權限。

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

在 AKS 叢集與受控識別之間建立信任

本節中,您會建立要在「租用戶 A」中的 AKS 叢集與「租用戶 B」中的受控識別之間建立信任所需的同盟身分識別認證。您會使用「租用戶 A」中 AKS 叢集的 OIDC 簽發者 URL,以及「租用戶 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 是您會在本文稍後於「租用戶 A」中建立之 Kubernetes 服務帳戶的名稱。 當應用程式 Pod 提出驗證要求時,系統便會將此值傳送至 Microsoft Entra ID 以作為授權要求中的 subject。 Microsoft Entra ID 會根據此值是否符合您在建立同盟身分識別認證時所設定的值來判斷資格,因此請務必確保此值相符。

部署應用程式以將訊息傳送至 Azure 服務匯流排佇列

在本節中,您會將應用程式部署至「租用戶 A」中的 AKS 叢集,以將訊息傳送至「租用戶 B」中的 Azure 服務匯流排佇列。

登入租用戶 A 並取得 AKS 認證

  1. 使用 az logout 命令,登出您的「租用戶 B」訂用帳戶。

    az logout
    
  2. 使用 az login 命令,登入您的「租用戶 A」訂用帳戶。

    az login --tenant $TENANT_A_ID
    
  3. 使用 az account set 命令,確保您有在「租用戶 A」中使用正確的訂用帳戶。

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  4. 使用 az aks get-credentials 命令,取得「租用戶 A」中 AKS 叢集的認證。

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

建立 Kubernetes 資源以將訊息傳送至 Azure 服務匯流排佇列

  1. default 命名空間中建立新的 Kubernetes ServiceAccount,並將「租用戶 B」中受控識別的用戶端識別碼傳遞至 kubectl apply 命令。 用戶端識別碼可用來向「租用戶 B」中的 Azure 服務匯流排驗證「租用戶 A」中的應用程式。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $CLIENT_ID
      name: myserviceaccount
    EOF
    
  2. default 命名空間中建立新的 Kubernetes 作業,以將 100 則訊息傳送至您的 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
    

檢查部署

  1. 使用 kubectl describe pod 命令檢查 Pod 的狀態,驗證 Pod 已正確設定為與「租用戶 B」中的 Azure 服務匯流排佇列互動。

    # 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. 使用 kubectl logs 命令檢查 Pod 的記錄,以查看應用程式是否能夠在租用戶之間傳送訊息。

    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 入口網站,並瀏覽至「租用戶 B」中的 Azure 服務匯流排佇列,以檢視在 Service Bus Explorer 中傳送的訊息。

清除資源

驗證部署成功之後,您可以清除資源,以免產生 Azure 成本。

刪除租用戶 A 中的資源

  1. 使用 az login 命令,登入您的「租用戶 A」訂用帳戶。

    az login --tenant $TENANT_A_ID
    
  2. 使用 az account set 命令,確保您有在「租用戶 A」中使用正確的訂用帳戶。

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  3. 使用 az group delete 命令,刪除 Azure 資源群組及其中的所有資源。

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

刪除租用戶 B 中的資源

  1. 使用 az login 命令,登入您的「租用戶 B」訂用帳戶。

    az login --tenant $TENANT_B_ID
    
  2. 使用 az account set 命令,確保您有在「租用戶 B」中使用正確的訂用帳戶。

    az account set --subscription $TENANT_B_SUBSCRIPTION_ID
    
  3. 使用 az group delete 命令,刪除 Azure 資源群組及其中的所有資源。

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

下一步

在本文中,您已了解如何在 Azure Kubernetes Service (AKS) 上設定跨租用戶工作負載身分識別。 若要深入了解工作負載身分識別,請參閱下列文章: