你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 KEDA 与 Azure Kubernetes 服务群集集成

KEDA 是基于 Kubernetes 的事件驱动的自动缩放程序。 KEDA 允许你根据要处理的负载,通过查询 Prometheus 等系统的指标来驱动 Kubernetes 中任何容器的缩放。 将 KEDA 与 Azure Kubernetes 服务 (AKS) 群集集成,以根据 Azure Monitor 工作区中的 Prometheus 指标缩放工作负载。

若要将 KEDA 集成到 Azure Kubernetes 服务,必须在群集上部署和配置工作负载标识或 Pod 标识。 该标识允许 KEDA 向 Azure 进行身份验证,并从 Monitor 工作区检索用于缩放的指标。

本文将指导你完成使用工作负载标识将 KEDA 集成到 AKS 群集的步骤。

注意

建议使用 Microsoft Entra 工作负载 ID。 此身份验证方法将替代 Pod 托管标识(预览版),后者与 Kubernetes 本机功能集成,以便代表应用程序与任何外部标识提供者联合。

Azure Kubernetes 服务中的开源 Microsoft Entra Pod 托管标识(预览版)已于 2022 年 10 月 24 日弃用,该项目将于 2023 年 9 月存档。 有关详细信息,请查看弃用通知。 AKS 托管加载项将于 2023 年 9 月开始弃用。

Azure 托管 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 Monitor 进行身份验证。

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

    输出将如下所示:

    {
      "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/rg-keda-integration/providers/Microsoft.    ManagedIdentity/userAssignedIdentities/keda-int-identity",
      "location": "eastus",
      "name": "keda-int-identity",
      "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
      "resourceGroup": "rg-keda-integration",
      "systemData": null,
      "tags": {},
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "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 Monitor 工作区的标识。 此角色允许标识从工作区读取指标。 将 Azure Monitor 工作区资源组Azure Monitor 工作区名称替换为配置为从 AKS 群集收集指标的 Azure Monitor 工作区的资源组和名称。

    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

可以使用 YAML 清单、Helm 图表或操作员中心部署 KEDA。 本文使用 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 Monitor 工作区检索 Prometheus 指标。 以下 yaml 文件是使用 Azure 托管 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 Monitor 工作区的查询终结点。 有关详细信息,请参阅使用 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: 0000aaaa-11bb-cccc-dd22-eeeeee333333\\r\\nCorrelation ID: 1111bbbb-22cc-dddd-ee33-ffffff444444\\r\\nTimestamp: 2023-05-30 11:11:53Z\",
\"error_codes\": [\n    70021\n  ],\n  \"timestamp\": \"2023-05-30 11:11:53Z\",
\"trace_id\": \"2222cccc-33dd-eeee-ff44-aaaaaa555555\",
\"correlation_id\": \"aaaa0000-bb11-2222-33cc-444444dddddd\",
\"error_uri\": \"https://login.microsoftonline.com/error?code=70021\"\n}
\n--------------------------------------------------------------------------------\n"}

检查用于创建 ServiceAccount 的值以及使用 az identity federated-credential create 创建的凭据,并确保 subject 值与 system:serviceaccount 值匹配。

Azure Monitor 工作区权限

如果在使用 Azure 进行 KEDA 身份验证时遇到问题,请检查 Azure Monitor 工作区的权限。 以下日志摘录显示标识没有 Azure Monitor 工作区的读取权限。

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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/rg-azmon-ws-01/providers/microsoft.monitor/accounts/azmon-ws-01\\u0027. RequestId: 123456c427f348258f3e5aeeefef834a\"}"}

确保标识在 Azure Monitor 工作区中具有 Monitoring Data Reader 角色。