共用方式為


使用 Azure Kubernetes Service (AKS) 上的 KEDA 附加元件和工作負載身分識別,安全地調整您的應用程式

本文說明如何使用 Azure Kubernetes Service (AKS) 上的 Kubernetes 事件驅動自動調整 (KEDA) 和工作負載身分識別,安全地調整應用程式的規模。

重要

您的叢集 Kubernetes 版本會決定 AKS 叢集上將安裝的 KEDA 版本。 若要查看哪些 KEDA 版本對應至每個 AKS 版本,請參閱 Kubernetes 元件版本資料表的 [AKS 受控附加元件] 資料行。

針對 GA Kubernetes 版本,AKS 完整支援資料表中的對應 KEDA 次要版本。 客戶支援部門會盡最大地努力,局部涵蓋 Kubernetes 預覽版本和最新 KEDA 修補程式。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

開始之前

建立資源群組

  • 使用 az group create 命令建立資源群組。 請務必以您自己的值取代預留位置值。

    LOCATION=<azure-region>
    RG_NAME=<resource-group-name>
    
    az group create --name $RG_NAME --location $LOCATION
    

建立 AKS 叢集

  1. 使用具有 --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 
    
  2. 驗證部署是否成功,並確保已使用 --query 旗標設定為 "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"az aks show 命令,針對叢集啟用 KEDA、工作負載身分識別和 OIDC 簽發者。

    az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
    
  3. 使用 az aks get-credentials 命令連接到叢集。

    az aks get-credentials \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --overwrite-existing
    

建立 Azure 服務匯流排

  1. 使用 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
    
  2. 使用 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
    

建立受控識別

  1. 使用 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)
    
  2. 使用 --query 旗標設定為 oidcIssuerProfile.issuerUrlaz aks show 命令取得 OIDC 簽發者 URL。

    AKS_OIDC_ISSUER=$(az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query oidcIssuerProfile.issuerUrl \
        --output tsv)
    
  3. 使用 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
    
  4. 使用 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
    

建立角色指派

  1. 使用 --query 旗標設定為 "principalId"az identity show 命令,取得受控識別的物件識別碼。

    MI_OBJECT_ID=$(az identity show \
        --name $MI_NAME \
        --resource-group $RG_NAME \
        --query "principalId" \
        --output tsv)
    
  2. 使用 --query 旗標設定為 "id"az servicebus namespace show 命令,取得服務匯流排命名空間的資源識別碼。

    SB_ID=$(az servicebus namespace show \
        --name $SB_NAME \
        --resource-group $RG_NAME \
        --query "id" \
        --output tsv)
    
  3. 使用 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 運算子上啟用工作負載身分識別

  1. 建立 keda-operator ServiceAccount 的同盟認證之後,必須手動重新啟動 keda-operator Pod,以確保將工作負載識別環境變數插入 Pod。

    kubectl rollout restart deploy keda-operator -n kube-system
    
  2. 確認 KEDA 運算子 Pod 重新啟動

    kubectl get pod -n kube-system -lapp=keda-operator -w
    
  3. 確認 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
    
  4. 您應會在 [環境] 下看到類似下列的輸出。

    ---
    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/
    ---
    
  5. 部署包括使用者指派受控識別之用戶端識別碼的 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 工作負載身分識別進行調整。 我們將透過部署生產者與取用者工作負載來測試。

  1. 為工作負載建立新的 ServiceAccount。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $MI_CLIENT_ID
      name: $MI_NAME
    EOF
    
  2. 部署作業以發佈 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 則相應放大一次訊息。

  1. 部署 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 以取用訊息。

  2. 確認 KEDA 調整工具是否如預期運作。

    kubectl describe scaledjob myconsumer-scaledjob
    
  3. 您應會看見類似以下的活動。

    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 成本。

  1. 使用 [az group delete][az-group-delete] 命令刪除 Azure 資源群組及其所有資源。

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

下一步

本文將說明如何使用 AKS 上的 KEDA 附加元件與工作負載身分識別,來安全地調整應用程式。

如需 KEDA 疑難排解的相關資訊,請參閱 Kubernetes 事件驅動自動調整 (KEDA) 附加元件疑難排解

若要深入瞭解 KEDA,請參閱上游 KEDA 文件