Integrace KEDA s clusterem Azure Kubernetes Service

KEDA je automatické škálování řízené událostmi založené na Kubernetes. KEDA umožňuje řídit škálování libovolného kontejneru v Kubernetes na základě zatížení, které se má zpracovat, dotazováním metrik ze systémů, jako je Například Prometheus. Integrujte KEDA s clusterem Azure Kubernetes Service (AKS) a škálujte úlohy na základě metrik Prometheus z pracovního prostoru služby Azure Monitor.

Pokud chcete integrovat KEDA do služby Azure Kubernetes Service, musíte v clusteru nasadit a nakonfigurovat identitu úlohy nebo identitu podu. Identita umožňuje, aby se KEDA ověřila v Azure a načítala metriky pro škálování z pracovního prostoru Monitoru.

Tento článek vás provede postupem integrace KEDA do clusteru AKS pomocí identity úloh.

Poznámka:

Doporučujeme používat ID úloh Microsoft Entra. Tato metoda ověřování nahrazuje identitu spravovanou podem (Preview), která se integruje s nativními možnostmi Kubernetes pro federaci s externími zprostředkovateli identity jménem aplikace.

Opensourcová identita spravovaná podem Microsoft Entra (Preview) ve službě Azure Kubernetes Service je od 24. 10. 2022 zastaralá a projekt bude archivován v září 2023. Další informace najdete v oznámení o vyřazení. Spravovaný doplněk AKS začíná v září 2023 zastarání.

Podpora azure Managed Prometheus začíná od KEDA verze 2.10. Pokud máte nainstalovanou starší verzi KEDA, musíte upgradovat, abyste mohli pracovat se službou Azure Managed Prometheus.

Požadavky

Nastavení identity úlohy

  1. Začněte nastavením některých proměnných prostředí. Změňte hodnoty tak, aby vyhovovaly vašemu clusteru 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 musí používat účet služby, který byl použit k vytvoření federovaných přihlašovacích údajů. Může se jednat o jakékoli uživatelem definované jméno.
    • AKS_CLUSTER_NAME– Název clusteru AKS, do kterého chcete nasadit KEDA.
    • SERVICE_ACCOUNT_NAMESPACE KeDA i účet služby musí být ve stejném oboru názvů.
    • USER_ASSIGNED_IDENTITY_NAME je název identity Microsoft Entra, která je vytvořená pro KEDA.
    • FEDERATED_IDENTITY_CREDENTIAL_NAME je název přihlašovacích údajů vytvořených pro KEDA, které se mají použít k ověřování v Azure.
  2. Pokud se váš cluster AKS nevytvořil s povolenou identitou úloh nebo vystavitelem oidc, budete ho muset povolit. Pokud si nejste jistí, můžete spuštěním následujícího příkazu zkontrolovat, jestli je povolený.

    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
    

    Pokud chcete povolit identitu úlohy a vystavitele oidc,spusťte následující příkaz.

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. Uložte adresu URL vystavitele OIDC do proměnné prostředí, která se použije později.

    export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
    
  4. Vytvořte identitu přiřazenou uživatelem pro KEDA. Tuto identitu používá KEDA k ověření ve službě Azure Monitor.

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

    Výstup se bude podobat tomuto:

    {
      "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. clientId Uložte proměnné prostředí a tenantId použijte je později.

    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. Přiřaďte roli Čtenář dat monitorování k identitě pracovního prostoru služby Azure Monitor. Tato role umožňuje identitě číst metriky z vašeho pracovního prostoru. Nahraďte skupinu prostředků azure Monitoru a název pracovního prostoru služby Azure Monitor skupinou prostředků a názvem pracovního prostoru služby Azure Monitor, který je nakonfigurovaný tak, aby shromažďoval metriky z clusteru 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. Vytvořte obor názvů KEDA a pak vytvořte účet služby Kubernetes. Tento účet služby používá KEDA k ověřování v 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. Spuštěním příkazu zkontrolujte svůj účet služby.

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. Vytvořte federované přihlašovací údaje mezi účtem služby a identitou přiřazenou uživatelem. Federované přihlašovací údaje umožňují účtu služby používat identitu přiřazenou uživatelem k ověření v 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
    

    Poznámka:

    Rozšíření přihlašovacích údajů federované identity po počátečním přidání trvá několik sekund. Pokud se žádost o token provede okamžitě po přidání přihlašovacích údajů federované identity, může dojít k selhání po dobu několika minut, protože mezipaměť je naplněná starými daty v adresáři. Abyste se tomuto problému vyhnuli, můžete po přidání přihlašovacích údajů federované identity přidat mírné zpoždění.

Nasazení KEDA

KEDA je možné nasadit pomocí manifestů YAML, chartů Helm nebo centra operátorů. Tento článek používá charty Helm. Další informace o nasazení KEDA najdete v tématu Nasazení KEDA.

Přidejte úložiště Helm:

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

KeDA nasaďte pomocí následujícího příkazu:

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

Spuštěním následujícího příkazu zkontrolujte nasazení.

kubectl get pods -n keda

Výstup se bude podobat tomuto:

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

Škálovací škálovače

Škálovací nástroje definují, jak a kdy má KEDA škálovat nasazení. KEDA podporuje různé škálovače. Další informace o škálovačích najdete v tématu Škálování. Azure Managed Prometheus využívá už existující škálovací nástroj Prometheus k načtení metrik Prometheus z pracovního prostoru služby Azure Monitor. Následující soubor yaml je příkladem použití spravovaného nástroje 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 je koncový bod dotazu vašeho pracovního prostoru služby Azure Monitor. Další informace najdete v tématu Dotazování metrik Prometheus pomocí rozhraní API a PromQL.
  • metricName je název metriky, se kterou chcete škálovat.
  • query je dotaz použitý k načtení metriky.
  • threshold je hodnota, ve které se škáluje nasazení.
  • podIdentity.provider Nastavte typ identity, kterou používáte.

Řešení problému

Následující část obsahuje tipy pro řešení běžných problémů.

Federované přihlašovací údaje

Rozšíření federovaných přihlašovacích údajů může trvat až 10 minut. Pokud máte problémy s ověřováním KEDA v Azure, vyzkoušejte následující kroky.

Následující výňatek protokolu ukazuje chybu s federovanými přihlašovacími údaji.

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

Zkontrolujte hodnoty použité k vytvoření účtu ServiceAccount a přihlašovacích údajů vytvořených pomocí az identity federated-credential create a ujistěte se, subject že hodnota odpovídá hodnotě system:serviceaccount .

Oprávnění pracovního prostoru služby Azure Monitor

Pokud máte problémy s ověřováním KEDA v Azure, zkontrolujte oprávnění pro pracovní prostor Služby Azure Monitor. Následující výňatek protokolu ukazuje, že identita nemá oprávnění ke čtení pro pracovní prostor služby 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/abcdef01-2345-6789-0abc-def012345678/resourcegroups/rg-azmon-ws-01/providers/microsoft.monitor/accounts/azmon-ws-01\\u0027. RequestId: 123456c427f348258f3e5aeeefef834a\"}"}

Ujistěte se, že identita má Monitoring Data Reader roli v pracovním prostoru služby Azure Monitor.