Dela via


Integrera KEDA med ditt Azure Kubernetes Service-kluster

KEDA är en Kubernetes-baserad händelsedriven autoskalning. MED KEDA kan du öka skalningen av alla containrar i Kubernetes baserat på den belastning som ska bearbetas genom att fråga efter mått från system som Prometheus. Integrera KEDA med ditt Azure Kubernetes Service-kluster (AKS) för att skala dina arbetsbelastningar baserat på Prometheus-mått från din Azure Monitor-arbetsyta.

För att integrera KEDA i Azure Kubernetes Service måste du distribuera och konfigurera en arbetsbelastningsidentitet eller poddidentitet i klustret. Med identiteten kan KEDA autentisera med Azure och hämta mått för skalning från din Monitor-arbetsyta.

Den här artikeln beskriver hur du integrerar KEDA i ditt AKS-kluster med hjälp av en arbetsbelastningsidentitet.

Kommentar

Vi rekommenderar att du använder Microsoft Entra-arbetsbelastnings-ID. Den här autentiseringsmetoden ersätter poddhanterad identitet (förhandsversion), som integreras med kubernetes interna funktioner för att federera med externa identitetsprovidrar för programmets räkning.

Den öppen källkod Microsoft Entra-poddhanterade identiteten (förhandsversion) i Azure Kubernetes Service har blivit inaktuell från och med den 24 september 2022 och projektet arkiveras i september 2023. Mer information finns i utfasningsmeddelandet. AKS Managed-tillägget börjar fasas ut i september 2023.

Stöd för Azure Managed Prometheus startar från KEDA v2.10. Om du har en äldre version av KEDA installerad måste du uppgradera för att kunna arbeta med Azure Managed Prometheus.

Förutsättningar

Konfigurera en arbetsbelastningsidentitet

  1. Börja med att konfigurera vissa miljövariabler. Ändra värdena så att de passar ditt AKS-kluster.

    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 måste använda tjänstkontot som användes för att skapa federerade autentiseringsuppgifter. Det kan vara valfritt användardefinierat namn.
    • AKS_CLUSTER_NAME– Namnet på AKS-klustret där du vill distribuera KEDA.
    • SERVICE_ACCOUNT_NAMESPACE Både KEDA och tjänstkontot måste finnas i samma namnområde.
    • USER_ASSIGNED_IDENTITY_NAME är namnet på den Microsoft Entra-identitet som har skapats för KEDA.
    • FEDERATED_IDENTITY_CREDENTIAL_NAME är namnet på de autentiseringsuppgifter som har skapats för KEDA att använda för att autentisera med Azure.
  2. Om ditt AKS-kluster inte har skapats med arbetsbelastningsidentitet eller oidc-issuer aktiverat måste du aktivera det. Om du inte är säker kan du köra följande kommando för att kontrollera om det är aktiverat.

    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
    

    Om du vill aktivera arbetsbelastningsidentitet och oidc-issuer kör du följande kommando.

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. Lagra url:en för OIDC-utfärdaren i en miljövariabel som ska användas senare.

    export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
    
  4. Skapa en användartilldelad identitet för KEDA. Den här identiteten används av KEDA för att autentisera med Azure Monitor.

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

    Resultatet blir något som liknar:

    {
      "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 Lagra miljövariablerna och tenantId som ska användas senare.

    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. Tilldela rollen Övervakningsdataläsare till identiteten för din Azure Monitor-arbetsyta. Med den här rollen kan identiteten läsa mått från din arbetsyta. Ersätt resursgruppen För Azure Monitor-arbetsytan och Namnet på Azure Monitor-arbetsytan med resursgruppen och namnet på Azure Monitor-arbetsytan som är konfigurerad för att samla in mått från AKS-klustret.

    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. Skapa KEDA-namnområdet och skapa sedan Kubernetes-tjänstkontot. Det här tjänstkontot används av KEDA för att autentisera med 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. Kontrollera ditt tjänstkonto genom att köra

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. Upprätta en federerad autentiseringsuppgift mellan tjänstkontot och den användartilldelade identiteten. Med federerade autentiseringsuppgifter kan tjänstkontot använda den användartilldelade identiteten för att autentisera med 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
    

    Kommentar

    När autentiseringsuppgifterna för federerade identiteter har lagts till tar det några sekunder innan de sprids. Om en tokenbegäran görs omedelbart efter att den federerade identitetsautentiseringsuppgiften har lagts till kan det leda till fel i ett par minuter eftersom cachen fylls i i katalogen med gamla data. För att undvika det här problemet kan du lägga till en liten fördröjning när du har lagt till den federerade identitetsautentiseringsuppgiften.

Distribuera KEDA

KEDA kan distribueras med YAML-manifest, Helm-diagram eller Operator Hub. Den här artikeln använder Helm-diagram. Mer information om hur du distribuerar KEDA finns i Distribuera KEDA

Lägg till helm-lagringsplats:

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

Distribuera KEDA med följande kommando:

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

Kontrollera distributionen genom att köra följande kommando.

kubectl get pods -n keda

Resultatet blir något som liknar:

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

Skalare

Skalare definierar hur och när KEDA ska skala en distribution. KEDA stöder en mängd olika skalare. Mer information om skalningsare finns i Scalers. Azure Managed Prometheus använder redan befintlig Prometheus-skalning för att hämta Prometheus-mått från Azure Monitor-arbetsytan. Följande yaml-fil är ett exempel på hur du använder 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 är frågeslutpunkten för din Azure Monitor-arbetsyta. Mer information finns i Fråga prometheus-mått med hjälp av API:et och PromQL
  • metricName är namnet på måttet som du vill skala på.
  • query är frågan som används för att hämta måttet.
  • threshold är värdet som distributionen skalar till.
  • podIdentity.provider Ange enligt vilken typ av identitet du använder.

Felsökning

Följande avsnitt innehåller felsökningstips för vanliga problem.

Federerade autentiseringsuppgifter

Federerade autentiseringsuppgifter kan ta upp till 10 minuter att sprida. Om du har problem med att KEDA autentiseras med Azure kan du prova följande steg.

Följande loggutdrag visar ett fel med de federerade autentiseringsuppgifterna.

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

Kontrollera de värden som används för att skapa ServiceAccount och de autentiseringsuppgifter som skapats med az identity federated-credential create och se till att subject värdet matchar system:serviceaccount värdet.

Behörigheter för Azure Monitor-arbetsytor

Om du har problem med att KEDA autentiserar med Azure kontrollerar du behörigheterna för Azure Monitor-arbetsytan. Följande loggutdrag visar att identiteten inte har läsbehörighet för Azure Monitor-arbetsytan.

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

Kontrollera att identiteten Monitoring Data Reader har rollen på Azure Monitor-arbetsytan.