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

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

重要

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

針對正式發行 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. 使用 az aks create 命令搭配 --enable-workload-identity、--enable-keda 和 --enable-oidc-issuer 旗標,建立已啟用 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. 使用 az aks show 命令並將 --query 旗標設定為 "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]",驗證部署是否成功,另確認叢集已啟用 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. 使用 az aks show 命令並將 --query 旗標設定為 oidcIssuerProfile.issuerUrl,以取得 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. 使用 az identity show 命令並將 --query 旗標設置為 "principalId",取得受控識別的物件識別碼。

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

    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 的同盟認證之後,請使用受控識別的用戶端識別碼標註 ServiceAccount。 這會告訴工作負載身分識別 Webhook 要將哪個身分識別繫結至 keda-operator Pod。

    kubectl annotate serviceaccount keda-operator \
        azure.workload.identity/client-id=$MI_CLIENT_ID \
        -n kube-system
    
  2. 重新啟動 keda-operator pod 以確保 Workload Identity 環境變數被注入 Pod 中。

    kubectl rollout restart deploy keda-operator -n kube-system
    
  3. 確認 keda-operator Pod 重新啟動

    kubectl get pod -n kube-system -lapp=keda-operator -w
    
  4. 確認 keda-operator Pod 已完成輪替之後,按 Ctrl+c 中斷先前的監看命令,然後確認已插入 Workload Identity 環境變數。

    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
    
  5. 您應會在 [環境] 下看到類似下列的輸出。

    ---
    AZURE_CLIENT_ID:               xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
    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/
    ---
    
  6. 部署包含使用者指派受控識別用戶端識別碼的 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 文件。