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
- AKS-kluster (Azure Kubernetes Service)
- Prometheus skickar mått till en Azure Monitor-arbetsyta. Mer information finns i Hanterad Azure Monitor-tjänst för Prometheus.
Konfigurera en arbetsbelastningsidentitet
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.
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
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)"
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": "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
Lagra miljövariablerna ochtenantId
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)"
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>
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
Kontrollera ditt tjänstkonto genom att köra
kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
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 PromQLmetricName
ä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: 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"}
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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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.