使用 Azure Kubernetes Service (AKS) 上的 KEDA 附加元件和工作負載身分識別,安全地調整您的應用程式
本文說明如何使用 Azure Kubernetes Service (AKS) 上的 Kubernetes 事件驅動自動調整 (KEDA) 和工作負載身分識別,安全地調整應用程式的規模。
重要
您的叢集 Kubernetes 版本會決定 AKS 叢集上將安裝的 KEDA 版本。 若要查看哪些 KEDA 版本對應至每個 AKS 版本,請參閱 Kubernetes 元件版本資料表的 [AKS 受控附加元件] 資料行。
針對 GA Kubernetes 版本,AKS 完整支援資料表中的對應 KEDA 次要版本。 客戶支援部門會盡最大地努力,局部涵蓋 Kubernetes 預覽版本和最新 KEDA 修補程式。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
開始之前
- 您需要訂閱 Azure。 如果您沒有 Azure 訂閱,則可以建立免費帳戶。
- 您需要安裝 Azure CLI。
- 請確定您已將防火牆規則設定為允許存取 Kubernetes API 伺服器。 如需詳細資訊,請參閱 Azure Kubernetes Services (AKS) 叢集的輸出網路和 FQDN 規則。
建立資源群組
使用
az group create
命令建立資源群組。 請務必以您自己的值取代預留位置值。LOCATION=<azure-region> RG_NAME=<resource-group-name> az group create --name $RG_NAME --location $LOCATION
建立 AKS 叢集
使用具有
--enable-workload-identity
、--enable-keda
與--enable-oidc-issuer
旗標的az aks create
命令,建立具有 KEDA 附加元件、已啟用工作負載身分識別和 OIDC 簽發者的 AKS 叢集。 請務必以您自己的值取代預留位置值。AKS_NAME=<cluster-name> az aks create \ --name $AKS_NAME \ --resource-group $RG_NAME \ --enable-workload-identity \ --enable-oidc-issuer \ --enable-keda \ --generate-ssh-keys
驗證部署是否成功,並確保已使用
--query
旗標設定為"[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
的az aks show
命令,針對叢集啟用 KEDA、工作負載身分識別和 OIDC 簽發者。az aks show \ --name $AKS_NAME \ --resource-group $RG_NAME \ --query "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
使用
az aks get-credentials
命令連接到叢集。az aks get-credentials \ --name $AKS_NAME \ --resource-group $RG_NAME \ --overwrite-existing
建立 Azure 服務匯流排
使用
az servicebus namespace create
命令建立 Azure 服務匯流排命名空間。 請務必以您自己的值取代預留位置值。SB_NAME=<service-bus-name> SB_HOSTNAME="${SB_NAME}.servicebus.windows.net" az servicebus namespace create \ --name $SB_NAME \ --resource-group $RG_NAME \ --disable-local-auth
使用
az servicebus queue create
命令建立 Azure 服務匯流排佇列。 請務必以您自己的值取代預留位置值。SB_QUEUE_NAME=<service-bus-queue-name> az servicebus queue create \ --name $SB_QUEUE_NAME \ --namespace $SB_NAME \ --resource-group $RG_NAME
建立受控識別
使用
az identity create
命令來建立受控識別。 請務必以您自己的值取代預留位置值。MI_NAME=<managed-identity-name> MI_CLIENT_ID=$(az identity create \ --name $MI_NAME \ --resource-group $RG_NAME \ --query "clientId" \ --output tsv)
使用
--query
旗標設定為oidcIssuerProfile.issuerUrl
的az aks show
命令取得 OIDC 簽發者 URL。AKS_OIDC_ISSUER=$(az aks show \ --name $AKS_NAME \ --resource-group $RG_NAME \ --query oidcIssuerProfile.issuerUrl \ --output tsv)
使用
az identity federated-credential create
命令,在受控識別與工作負載所使用的命名空間與服務帳戶之間建立同盟認證。 請務必以您自己的值取代預留位置值。FED_WORKLOAD=<federated-credential-workload-name> az identity federated-credential create \ --name $FED_WORKLOAD \ --identity-name $MI_NAME \ --resource-group $RG_NAME \ --issuer $AKS_OIDC_ISSUER \ --subject system:serviceaccount:default:$MI_NAME \ --audience api://AzureADTokenExchange
使用
az identity federated-credential create
命令,在受控識別與 KEDA 運算子所使用的命名空間與服務帳戶之間建立第二個同盟認證。 請務必以您自己的值取代預留位置值。FED_KEDA=<federated-credential-keda-name> az identity federated-credential create \ --name $FED_KEDA \ --identity-name $MI_NAME \ --resource-group $RG_NAME \ --issuer $AKS_OIDC_ISSUER \ --subject system:serviceaccount:kube-system:keda-operator \ --audience api://AzureADTokenExchange
建立角色指派
使用
--query
旗標設定為"principalId"
的az identity show
命令,取得受控識別的物件識別碼。MI_OBJECT_ID=$(az identity show \ --name $MI_NAME \ --resource-group $RG_NAME \ --query "principalId" \ --output tsv)
使用
--query
旗標設定為"id"
的az servicebus namespace show
命令,取得服務匯流排命名空間的資源識別碼。SB_ID=$(az servicebus namespace show \ --name $SB_NAME \ --resource-group $RG_NAME \ --query "id" \ --output tsv)
使用
az role assignment create
命令,將 Azure 服務匯流排資料擁有者角色指派給受控識別。az role assignment create \ --role "Azure Service Bus Data Owner" \ --assignee-object-id $MI_OBJECT_ID \ --assignee-principal-type ServicePrincipal \ --scope $SB_ID
在 KEDA 運算子上啟用工作負載身分識別
建立
keda-operator
ServiceAccount 的同盟認證之後,必須手動重新啟動keda-operator
Pod,以確保將工作負載識別環境變數插入 Pod。kubectl rollout restart deploy keda-operator -n kube-system
確認 KEDA 運算子 Pod 重新啟動
kubectl get pod -n kube-system -lapp=keda-operator -w
確認 KEDA 運算子 Pod 已完成滾動後,點擊
Ctrl+c
中斷先前的監看命令,並確認是否已插入工作負載識別環境變數。KEDA_POD_ID=$(kubectl get po -n kube-system -l app.kubernetes.io/name=keda-operator -ojsonpath='{.items[0].metadata.name}') kubectl describe po $KEDA_POD_ID -n kube-system
您應會在 [環境] 下看到類似下列的輸出。
--- AZURE_CLIENT_ID: AZURE_TENANT_ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx AZURE_FEDERATED_TOKEN_FILE: /var/run/secrets/azure/tokens/azure-identity-token AZURE_AUTHORITY_HOST: https://login.microsoftonline.com/ ---
部署包括使用者指派受控識別之用戶端識別碼的 KEDA TriggerAuthentication 資源。
kubectl apply -f - <<EOF apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: azure-servicebus-auth namespace: default # this must be same namespace as the ScaledObject/ScaledJob that will use it spec: podIdentity: provider: azure-workload identityId: $MI_CLIENT_ID EOF
注意
有了 TriggerAuthentication,KEDA 便能利用工作負載身分識別進行驗證。 評估調整觸發程序時,
keda-operator
Pod 會使用identityId
來驗證 Azure 資源。
將訊息發佈至 Azure 服務匯流排
此時,所有設定均已經完成,可使用 KEDA 與 Microsoft Entra 工作負載身分識別進行調整。 我們將透過部署生產者與取用者工作負載來測試。
為工作負載建立新的 ServiceAccount。
kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MI_CLIENT_ID name: $MI_NAME EOF
部署作業以發佈 100 條訊息。
kubectl apply -f - <<EOF apiVersion: batch/v1 kind: Job metadata: name: myproducer spec: template: metadata: labels: azure.workload.identity/use: "true" spec: serviceAccountName: $MI_NAME 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: $SB_QUEUE_NAME - name: AZURE_SERVICEBUS_HOSTNAME value: $SB_HOSTNAME restartPolicy: Never EOF
從 Azure 服務匯流排取用訊息
既然我們已將訊息發佈至 Azure 服務匯流排佇列,我們將部署 ScaledJob 來取用訊息。 此 ScaledJob 會使用 KEDA TriggerAuthentication 資源,使用工作負載身分識別來向 Azure 服務匯流排佇列進行驗證,並每隔 10 則相應放大一次訊息。
部署 ScaledJob 資源以取用訊息。 調整觸發程序會設定為每 10 則訊息進行一次擴增。 KEDA 調整工具會建立 10 個作業來取用 100 條訊息。
kubectl apply -f - <<EOF apiVersion: keda.sh/v1alpha1 kind: ScaledJob metadata: name: myconsumer-scaledjob spec: jobTargetRef: template: metadata: labels: azure.workload.identity/use: "true" spec: serviceAccountName: $MI_NAME containers: - image: ghcr.io/azure-samples/aks-app-samples/servicebusdemo:latest name: myconsumer env: - name: OPERATION_MODE value: "consumer" - name: MESSAGE_COUNT value: "10" - name: AZURE_SERVICEBUS_QUEUE_NAME value: $SB_QUEUE_NAME - name: AZURE_SERVICEBUS_HOSTNAME value: $SB_HOSTNAME restartPolicy: Never triggers: - type: azure-servicebus metadata: queueName: $SB_QUEUE_NAME namespace: $SB_NAME messageCount: "10" authenticationRef: name: azure-servicebus-auth EOF
注意
ScaledJob 會在發生調整事件時建立 Kubernetes 作業資源,因此建立資源時必須傳入作業範本。 建立新作業時,會使用工作負載身分識別位來部署 Pod 以取用訊息。
確認 KEDA 調整工具是否如預期運作。
kubectl describe scaledjob myconsumer-scaledjob
您應會看見類似以下的活動。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal KEDAScalersStarted 10m scale-handler Started scalers watch Normal ScaledJobReady 10m keda-operator ScaledJob is ready for scaling Warning KEDAScalerFailed 10m scale-handler context canceled Normal KEDAJobsCreated 10m scale-handler Created 10 jobs
清除資源
驗證部署成功之後,您可以清除資源,以免產生 Azure 成本。
使用 [
az group delete
][az-group-delete] 命令刪除 Azure 資源群組及其所有資源。az group delete --name $RG_NAME --yes --no-wait
下一步
本文將說明如何使用 AKS 上的 KEDA 附加元件與工作負載身分識別,來安全地調整應用程式。
如需 KEDA 疑難排解的相關資訊,請參閱 Kubernetes 事件驅動自動調整 (KEDA) 附加元件疑難排解。
若要深入瞭解 KEDA,請參閱上游 KEDA 文件。