在 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
使用
az login
命令,登入您的「租用戶 A」訂用帳戶。# Set environment variable TENANT_A_ID=<tenant-id> az login --tenant $TENANT_A_ID
使用
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 中建立資源
使用
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
使用
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
使用
az logout
命令,登出您的「租用戶 A」訂用帳戶。az logout
使用
az login
命令,登入您的「租用戶 B」訂用帳戶。# Set environment variable TENANT_B_ID=<tenant-id> az login --tenant $TENANT_B_ID
使用
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 中建立資源
使用
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
使用
az servicebus namespace create
和az 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
使用
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 中取得資源識別碼並指派權限
使用
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)
使用
az identity show
命令,取得「租用戶 B」中受控識別的用戶端識別碼。CLIENT_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query clientId \ --output tsv)
使用
az servicebus namespace show
命令,在「租用戶 B」中取得服務匯流排命名空間的資源識別碼。SERVICEBUS_ID=$(az servicebus namespace show \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
使用
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 認證
使用
az logout
命令,登出您的「租用戶 B」訂用帳戶。az logout
使用
az login
命令,登入您的「租用戶 A」訂用帳戶。az login --tenant $TENANT_A_ID
使用
az account set
命令,確保您有在「租用戶 A」中使用正確的訂用帳戶。az account set --subscription $TENANT_A_SUBSCRIPTION_ID
使用
az aks get-credentials
命令,取得「租用戶 A」中 AKS 叢集的認證。az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
建立 Kubernetes 資源以將訊息傳送至 Azure 服務匯流排佇列
在
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
在
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
檢查部署
使用
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
使用
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 中的資源
使用
az login
命令,登入您的「租用戶 A」訂用帳戶。az login --tenant $TENANT_A_ID
使用
az account set
命令,確保您有在「租用戶 A」中使用正確的訂用帳戶。az account set --subscription $TENANT_A_SUBSCRIPTION_ID
使用
az group delete
命令,刪除 Azure 資源群組及其中的所有資源。az group delete --name $RESOURCE_GROUP --yes --no-wait
刪除租用戶 B 中的資源
使用
az login
命令,登入您的「租用戶 B」訂用帳戶。az login --tenant $TENANT_B_ID
使用
az account set
命令,確保您有在「租用戶 B」中使用正確的訂用帳戶。az account set --subscription $TENANT_B_SUBSCRIPTION_ID
使用
az group delete
命令,刪除 Azure 資源群組及其中的所有資源。az group delete --name $RESOURCE_GROUP --yes --no-wait
下一步
在本文中,您已了解如何在 Azure Kubernetes Service (AKS) 上設定跨租用戶工作負載身分識別。 若要深入了解工作負載身分識別,請參閱下列文章:
- 工作負載身分識別概觀 (部分機器翻譯)
- 在 Azure Kubernetes Service (AKS) 上設定工作負載身分識別 (部分機器翻譯)