Share via


整合 KEDA 與您的 Azure Kubernetes Service 叢集

KEDA 是Kubernetes 型事件驅動自動調整程式。 KEDA 可讓您藉由查詢 Prometheus 等系統的計量,根據要處理的負載,推動 Kubernetes 中任何容器的調整。 整合 KEDA 與您的 Azure Kubernetes Service (AKS) 叢集,以根據來自 Azure 監視器工作區的 Prometheus 計量調整工作負載。

若要將 KEDA 整合到 Azure Kubernetes Service 中,您必須在叢集上部署和設定工作負載身分識別或 Pod 身分識別。 身分識別可讓 KEDA 向 Azure 進行驗證,並從您的監視器工作區擷取調整計量。

本文將逐步引導您完成使用工作負載身分識別將 KEDA 整合到 AKS 叢集的步驟。

注意

我們建議使用 Microsoft Entra 工作負載識別碼。 此驗證方法會取代 Pod 受控識別 (預覽),其會與 Kubernetes 原生功能整合,代表應用程式來與任何外部識別提供者建立同盟。

Azure Kubernetes Service 的開放原始碼 Microsoft Entra Pod 受控身分識別 (預覽版) 已於 2022 年 10 月 24 日起停用,且專案將於 2023 年 9 月封存。 如需詳細資訊,請參閱淘汰通知。 AKS Managed 附加元件將於 2023 年 9 月開始淘汰。

Azure Managed Prometheus 支援從 KEDA v2.10 開始。 如果您已安裝舊版的 KEDA,您必須升級才能使用 Azure 受控 Prometheus。

必要條件

設定工作負載身分識別

  1. 首先設定一些環境變數。 變更值以符合您的 AKS 叢集。

    export RESOURCE_GROUP="rg-keda-integration"
    export LOCATION="eastus"
    export SUBSCRIPTION="$(az account show --query id --output tsv)"
    export USER_ASSIGNED_IDENTITY_NAME="keda-int-identity"
    export FEDERATED_IDENTITY_CREDENTIAL_NAME="kedaFedIdentity" 
    export SERVICE_ACCOUNT_NAMESPACE="keda"
    export SERVICE_ACCOUNT_NAME="keda-operator"
    export AKS_CLUSTER_NAME="aks-cluster-name"
    
    • SERVICE_ACCOUNT_NAME - KEDA 必須使用用來建立同盟認證的服務帳戶。 這可以是任何使用者定義的名稱。
    • AKS_CLUSTER_NAME- 您要在其中部署 KEDA 的 AKS 叢集名稱。
    • SERVICE_ACCOUNT_NAMESPACE KEDA 和服務帳戶都必須位於相同的命名空間中。
    • USER_ASSIGNED_IDENTITY_NAME 是針對 KEDA 建立的 Microsoft Entra 身分識別名稱。
    • FEDERATED_IDENTITY_CREDENTIAL_NAME 是針對 KEDA 用來向 Azure 進行驗證所建立的認證名稱。
  2. 如果您的 AKS 叢集尚未建立且已啟用工作負載身分識別或 oidc 簽發者,您必須加以啟用。 如果您不確定,您可以執行下列命令來檢查它是否已啟用。

    az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query oidcIssuerProfile
    az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query securityProfile.workloadIdentity
    

    若要啟用工作負載身分識別和 oidc 簽發者,請執行下列命令。

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. 以環境變數儲存 OIDC 簽發者 url,以供稍後使用。

    export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
    
  4. 建立 KEDA 的使用者指派的身分識別。 KEDA 會使用此身分識別向 Azure 監視器進行驗證。

     az identity create --name $USER_ASSIGNED_IDENTITY_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --subscription $SUBSCRIPTION
    

    輸出將類似於:

    {
      "clientId": "abcd1234-abcd-abcd-abcd-9876543210ab",
      "id": "/subscriptions/abcdef01-2345-6789-0abc-def012345678/resourcegroups/rg-keda-integration/providers/Microsoft.    ManagedIdentity/userAssignedIdentities/keda-int-identity",
      "location": "eastus",
      "name": "keda-int-identity",
      "principalId": "12345678-abcd-abcd-abcd-1234567890ab",
      "resourceGroup": "rg-keda-integration",
      "systemData": null,
      "tags": {},
      "tenantId": "1234abcd-9876-9876-9876-abcdef012345",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  5. clientIdtenantId 儲存在環境變數中,以供稍後使用。

    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $USER_ASSIGNED_IDENTITY_NAME --query 'clientId' -otsv)"
    export TENANT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $USER_ASSIGNED_IDENTITY_NAME --query 'tenantId' -otsv)"
    
  6. 監視資料讀取器角色指派給 Azure 監視器工作區的身分識別。 此角色可讓身分識別從您的工作區讀取計量。 將 Azure 監視器工作區資源群組Azure 監視器工作區名稱取代為資源群組和 Azure 監視器工作區的名稱,並設定為從 AKS 叢集收集計量。

    az role assignment create \
    --assignee $USER_ASSIGNED_CLIENT_ID \
    --role "Monitoring Data Reader" \
    --scope /subscriptions/$SUBSCRIPTION/resourceGroups/<Azure Monitor Workspace resource group>/providers/microsoft.monitor/accounts/<Azure monitor workspace name>
    
  7. 建立 KEDA 命名空間,然後建立 Kubernetes 服務帳戶。 KEDA 會使用此服務帳戶向 Azure 進行驗證。

    
    az aks get-credentials -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP
    
    kubectl create namespace keda
    
    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $USER_ASSIGNED_CLIENT_ID
      name: $SERVICE_ACCOUNT_NAME
      namespace: $SERVICE_ACCOUNT_NAMESPACE
    EOF
    
  8. 執行以檢查您的服務帳戶

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. 在服務帳戶與使用者指派的身分識別之間建立同盟認證。 同盟認證可讓服務帳戶使用使用者指派的身分識別向 Azure 進行驗證。

    az identity federated-credential create --name $FEDERATED_IDENTITY_CREDENTIAL_NAME --identity-name $USER_ASSIGNED_IDENTITY_NAME --resource-group $RESOURCE_GROUP --issuer $AKS_OIDC_ISSUER --subject     system:serviceaccount:$SERVICE_ACCOUNT_NAMESPACE:$SERVICE_ACCOUNT_NAME --audience api://AzureADTokenExchange
    

    注意

    一開始新增之後,同盟身分識別認證需要幾秒鐘的時間才能散佈。 若在新增同盟身分識別認證之後立即提出權杖要求,可能會導致幾分鐘的失敗,因為快取會在目錄中填入舊的資料。 若要避免此問題,您可以在新增同盟身分識別認證之後稍待片刻,再提出權杖要求。

部署 KEDA

KEDA 可以使用 YAML 指令清單、Helm 圖表或操作員中樞來部署。 本文使用 Helm 圖表。 如需部署 KEDA 的詳細資訊,請參閱部署 KEDA

新增 Helm 存放庫:

helm repo add kedacore https://kedacore.github.io/charts
helm repo update

使用下列命令部署 KEDA:

helm install keda kedacore/keda --namespace keda \
--set serviceAccount.create=false \
--set serviceAccount.name=keda-operator \
--set podIdentity.azureWorkload.enabled=true \
--set podIdentity.azureWorkload.clientId=$USER_ASSIGNED_CLIENT_ID \
--set podIdentity.azureWorkload.tenantId=$TENANT_ID

執行下列命令,以檢查您的部署。

kubectl get pods -n keda

輸出將類似於:

NAME                                               READY   STATUS    RESTARTS       AGE
keda-admission-webhooks-ffcb8f688-kqlxp            1/1     Running   0              4m
keda-operator-5d9f7d975-mgv7r                      1/1     Running   1 (4m ago)     4m
keda-operator-metrics-apiserver-7dc6f59678-745nz   1/1     Running   0              4m

縮放器

縮放器會定義 KEDA 應如何及何時縮放部署。 KEDA 支援各種縮放器。 如需縮放器的詳細資訊,請參閱縮放器。 Azure 受控 Prometheus 利用現有的 Prometheus 縮放程式,從 Azure 監視器工作區擷取 Prometheus 計量。 下列 yaml 檔案是使用 Azure Managed Prometheus 的範例。

apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: azure-managed-prometheus-trigger-auth
spec:
  podIdentity:
      provider: azure-workload | azure # use "azure" for pod identity and "azure-workload" for workload identity
      identityId: <identity-id> # Optional. Default: Identity linked with the label set when installing KEDA.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: azure-managed-prometheus-scaler
spec:
  scaleTargetRef:
    name: deployment-name-to-be-scaled
  minReplicaCount: 1
  maxReplicaCount: 20
  triggers:
  - type: prometheus
    metadata:
      serverAddress: https://test-azure-monitor-workspace-name-1234.eastus.prometheus.monitor.azure.com
      metricName: http_requests_total
      query: sum(rate(http_requests_total{deployment="my-deployment"}[2m])) # Note: query must return a vector/scalar single element response
      threshold: '100.50'
      activationThreshold: '5.5'
    authenticationRef:
      name: azure-managed-prometheus-trigger-auth
  • serverAddress 是 Azure 監視器工作區的查詢端點。 如需詳細資訊,請參閱使用 API 和 PromQL 查詢 Prometheus 計量
  • metricName 是您想要縮放的計量名稱。
  • query 是用來擷取計量的查詢。
  • threshold 是部署縮放的值。
  • 根據您使用的身分識別類型來設定 podIdentity.provider

疑難排解

下列區段提供常見問題的疑難排解秘訣。

同盟認證

同盟認證最多可能需要 10 分鐘才能填入。 如果您在使用 Azure 進行 KEDA 驗證時遇到問題,請嘗試下列步驟。

下列記錄摘錄顯示同盟認證的錯誤。

kubectl logs -n keda keda-operator-5d9f7d975-mgv7r

{
 \"error\": \"unauthorized_client\",\n  \"error_description\": \"AADSTS70021: No matching federated identity record found for presented assertion. 
Assertion Issuer: 'https://eastus.oic.prod-aks.azure.com/abcdef01-2345-6789-0abc-def012345678/12345678-abcd-abcd-abcd-1234567890ab/'.
Assertion Subject: 'system:serviceaccount:keda:keda-operator'. 
Assertion Audience: 'api://AzureADTokenExchange'. https://docs.microsoft.com/azure/active-directory/develop/workload-identity-federation
Trace ID: 12dd9ea0-3a65-408f-a41f-5d0403a25100\\r\\nCorrelation ID: 8a2dce68-17f1-4f11-bed2-4bcf9577f2af\\r\\nTimestamp: 2023-05-30 11:11:53Z\",
\"error_codes\": [\n    70021\n  ],\n  \"timestamp\": \"2023-05-30 11:11:53Z\",
\"trace_id\": \"12345678-3a65-408f-a41f-5d0403a25100\",
\"correlation_id\": \"12345678-17f1-4f11-bed2-4bcf9577f2af\",
\"error_uri\": \"https://login.microsoftonline.com/error?code=70021\"\n}
\n--------------------------------------------------------------------------------\n"}

檢查用來建立 ServiceAccount 的值,以及使用 az identity federated-credential create 建立的認證,並確定 subject 值符合 system:serviceaccount 值。

Azure 監視器工作區權限

如果您在向 Azure 進行 KEDA 驗證時遇到問題,請檢查 Azure 監視器工作區的權限。 下列記錄摘錄顯示身分識別沒有 Azure 監視器工作區的讀取權限。

kubectl logs -n keda keda-operator-5d9f7d975-mgv7r

2023-05-30T11:15:45Z    ERROR   scale_handler   error getting metric for scaler 
{"scaledObject.Namespace": "default", "scaledObject.Name": "azure-managed-prometheus-scaler", "scaler": "prometheusScaler", 
"error": "prometheus query api returned error. status: 403 response: {\"status\":\"error\",
\"errorType\":\"Forbidden\",\"error\":\"User \\u0027abc123ab-1234-1234-abcd-abcdef123456
\\u0027 does not have access to perform any of the following actions 
\\u0027microsoft.monitor/accounts/data/metrics/read, microsoft.monitor/accounts/data/metrics/read
\\u0027 on resource \\u0027/subscriptions/abcdef01-2345-6789-0abc-def012345678/resourcegroups/rg-azmon-ws-01/providers/microsoft.monitor/accounts/azmon-ws-01\\u0027. RequestId: 123456c427f348258f3e5aeeefef834a\"}"}

請確定身分識別在 Azure 監視器工作區上具有 Monitoring Data Reader 角色。