Condividi tramite


Integrare KEDA con il cluster del servizio Azure Kubernetes

KEDA è un'utilità di scalabilità automatica guidata dagli eventi basata su Kubernetes. KEDA consente di gestire il ridimensionamento di qualsiasi contenitore in Kubernetes in base al carico da elaborare, eseguendo query sulle metriche da sistemi come Prometheus. È possibile integrare KEDA con il cluster del servizio Azure Kubernetes per ridimensionare i carichi di lavoro in base alle metriche Prometheus dell'area di lavoro di Monitoraggio di Azure.

Per integrare KEDA nel servizio Azure Kubernetes, è necessario distribuire e configurare un'identità del carico di lavoro o un'identità pod all'interno del cluster. L'identità consente a KEDA di eseguire l'autenticazione con Azure e di recuperare le metriche per il ridimensionamento dall'area di lavoro Monitoraggio.

Il presente articolo illustra i passaggi per integrare KEDA nel cluster del servizio Azure Kubernetes mediante un'identità del carico di lavoro.

Nota

È consigliabile usare ID dei carichi di lavoro di Microsoft Entra. Questo metodo di autenticazione sostituisce l'identità gestita da pod (anteprima), che si integra con le funzionalità native di Kubernetes per operare con qualsiasi provider di identità esterno.

L'identità gestita da pod di Microsoft Entra open source (anteprima) nel servizio Azure Kubernetes è stata deprecata il 24/10/2022 e il progetto sarà archiviato a settembre 2023. Per altre informazioni, vedere Informativa sulle funzionalità deprecate. Il componente aggiuntivo gestito del servizio Azure Kubernetes inizia la deprecazione a settembre 2023.

Il supporto di Prometheus gestito di Azure inizia da KEDA v2.10. Se è installata una versione precedente di KEDA, è necessario eseguire l'aggiornamento per poter utilizzare Prometheus gestito da Azure.

Prerequisiti

Configurare un'identità del carico di lavoro

  1. Per iniziare, configurare alcune variabili di ambiente. Modificare i valori in base al cluster del servizio Azure Kubernetes.

    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 deve utilizzare l'account del servizio impiegato per la creazione di credenziali federate. Può trattarsi di qualsiasi nome definito dall'utente.
    • AKS_CLUSTER_NAME- Il nome del cluster del servizio Azure Kubernetes in cui si vuole distribuire KEDA.
    • SERVICE_ACCOUNT_NAMESPACE Sia KEDA che l'account del servizio devono trovarsi nel medesimo spazio dei nomi.
    • USER_ASSIGNED_IDENTITY_NAME è il nome dell'identità Microsoft Entra creata per KEDA.
    • FEDERATED_IDENTITY_CREDENTIAL_NAME è il nome delle credenziali create per KEDA da utilizzare per l'autenticazione con Azure.
  2. Se il cluster del servizio Azure Kubernetes non è stato creato con l'identità del carico di lavoro o con oidc-issuer abilitato, sarà necessario abilitarlo. Se non si è certi, è possibile eseguire il comando seguente per verificare se è abilitato.

    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
    

    Per abilitare l'identità del carico di lavoro e oidc-issuer, eseguire il comando seguente.

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. Archiviare l'URL dell'emittente OIDC in una variabile di ambiente da utilizzare in un secondo momento.

    export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
    
  4. Creare un'identità assegnata dall'utente per KEDA. Questa identità viene usata da KEDA per l'autenticazione con Monitoraggio di Azure.

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

    L'output sarà simile al seguente:

    {
      "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. Archiviare clientId e tenantId nelle variabili di ambiente da usare in un secondo momento.

    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. Assegnare il ruolo Lettore dati di monitoraggio all'identità per l'area di lavoro di Monitoraggio di Azure. Questo ruolo consente all'identità di leggere le metriche dall'area di lavoro. Sostituire il gruppo di risorse area di lavoro di Monitoraggio di Azure e il nome dell'area di lavoro di Monitoraggio di Azure con il gruppo di risorse e il nome dell'area di lavoro di Monitoraggio di Azure configurato per raccogliere le metriche dal cluster del servizio Azure Kubernetes.

    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. Creare lo spazio dei nomi KEDA, quindi creare l'account del servizio Kubernetes. Questo account del servizio viene utilizzato da KEDA per l'autenticazione con 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. Controllare l'account del servizio eseguendo

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. Stabilire una credenziale federata tra l'account del servizio e l'identità assegnata dall'utente. Le credenziali federate consentono all'account del servizio di utilizzare l'identità assegnata dall'utente per l'autenticazione con 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
    

    Nota

    La propagazione delle credenziali di identità federata dopo l'aggiunta iniziale richiede alcuni secondi. Se una richiesta di token viene creata immediatamente dopo l'aggiunta delle credenziali dell'identità federata, è possibile che si verifichi un errore per un paio di minuti, perché la cache viene popolata nella directory con dati obsoleti. Per evitare questo problema, è possibile aggiungere un lieve ritardo dopo l'aggiunta delle credenziali di identità federate.

Distribuire KEDA

KEDA può essere distribuito usando manifesti YAML, grafici Helm o Hub operatore. Questo articolo utilizza grafici Helm. Per altre informazioni sulla distribuzione di KEDA, vedere Distribuzione di KEDA

Aggiungere il repository Helm:

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

Distribuire KEDA usando il comando seguente:

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

Controllare la distribuzione eseguendo il comando seguente.

kubectl get pods -n keda

L'output sarà simile al seguente:

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

Utilità di scalabilità

Le utilità di scalabilità come e quando KEDA deve ridimensionare una distribuzione. KEDA supporta un'ampia gamma di utilità di scalabilità. Per altre informazioni sulle utilità di scalabilità, vedere Utilità di scalabilità. Prometheus gestito di Azure utilizza un'utilità di scalabilità Prometheus già esistente per recuperare le metriche di Prometheus dall'area di lavoro di Monitoraggio di Azure. Il seguente file yaml è un esempio di utilizzo di Prometheus gestito di Azure.

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 è l'endpoint query dell'area di lavoro di Monitoraggio di Azure. Per altre informazioni, vedere Eseguire query sulle metriche di Prometheus usando l'API e PromQL
  • metricName è il nome della metrica su cui si vuole eseguire la scalabilità.
  • query è la query usata per recuperare la metrica.
  • threshold è il valore in base al quale la distribuzione viene ridimensionata.
  • Impostare podIdentity.provider in base al tipo di identità in uso.

Risoluzione dei problemi

Nella sezione seguente vengono forniti suggerimenti per la risoluzione dei problemi comuni.

Credenziali federate

La propagazione delle credenziali federate può richiedere fino a 10 minuti. Se si verificano problemi con l'autenticazione KEDA con Azure, provare la procedura seguente.

L'estratto del log riportato di seguito mostra un errore con le credenziali federate.

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"}

Controllare i valori utilizzati per creare ServiceAccount e le credenziali generate con az identity federated-credential create e assicurarsi che il valore subject corrisponda al valore system:serviceaccount.

Autorizzazioni dell'area di lavoro di Monitoraggio di Azure

Se si verificano problemi con l'autenticazione KEDA con Azure, controllare le autorizzazioni per l'area di lavoro di Monitoraggio di Azure. L'estratto del log seguente mostra che l'identità non dispone delle autorizzazioni di lettura per l'area di lavoro di Monitoraggio di 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/rg-azmon-ws-01/providers/microsoft.monitor/accounts/azmon-ws-01\\u0027. RequestId: 123456c427f348258f3e5aeeefef834a\"}"}

Verificare che l'identità abbia il ruolo Monitoring Data Reader nell'area di lavoro di Monitoraggio di Azure.