你当前正在访问 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。
先决条件
- Azure Kubernetes 服务 (AKS) 群集
- Prometheus 将指标发送到 Azure Monitor 工作区。 有关详细信息,请参阅适用于 Prometheus 的 Azure Monitor 托管服务。
设置工作负载标识
首先设置一些环境变量。 更改这些值以适应你的 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 进行身份验证的凭据的名称。
如果尚未在创建 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
将 OIDC 颁发者 URL 存储在环境变量中,供稍后使用。
export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
为 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" }
将
clientId
和tenantId
存储在环境变量中,以便稍后使用。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)"
将“监视数据读取者”角色分配给 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>
创建 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
通过运行此项来检查服务帐户:
kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
在服务帐户与用户分配的标识之间建立联合凭据。 联合凭据允许服务帐户使用用户分配的标识向 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
角色。