Mengintegrasikan KEDA dengan kluster Azure Kubernetes Service Anda
KEDA adalah Event Driven Autoscaler berbasis Kubernetes. KEDA memungkinkan Anda mendorong penskalaan kontainer apa pun di Kubernetes berdasarkan beban yang akan diproses, dengan mengkueri metrik dari sistem seperti Prometheus. Integrasikan KEDA dengan kluster Azure Kubernetes Service (AKS) untuk menskalakan beban kerja berdasarkan metrik Prometheus dari ruang kerja Azure Monitor Anda.
Untuk mengintegrasikan KEDA ke dalam Azure Kubernetes Service, Anda harus menyebarkan dan mengonfigurasi identitas beban kerja atau identitas pod pada kluster Anda. Identitas memungkinkan KEDA mengautentikasi dengan Azure dan mengambil metrik untuk penskalaan dari ruang kerja Monitor Anda.
Artikel ini memancang Anda melalui langkah-langkah untuk mengintegrasikan KEDA ke dalam kluster AKS Anda menggunakan identitas beban kerja.
Catatan
Sebaiknya gunakan ID Beban Kerja Microsoft Entra. Metode autentikasi ini menggantikan identitas yang dikelola pod (pratinjau), yang terintegrasi dengan kemampuan asli Kubernetes untuk bergabung dengan penyedia identitas eksternal atas nama aplikasi.
Identitas yang dikelola pod Sumber terbuka Microsoft Entra (pratinjau) di Azure Kubernetes Service telah ditolak per 24/10/2022, dan proyek akan diarsipkan pada Bulan September 2023. Untuk informasi selengkapnya, lihat pemberitahuan penghentian. Add-on Terkelola AKS mulai dihentikan pada 2023.
Dukungan Azure Managed Prometheus dimulai dari KEDA v2.10. Jika Anda memiliki versi KEDA yang lebih lama yang terinstal, Anda harus meningkatkan agar dapat bekerja dengan Azure Managed Prometheus.
Prasyarat
- Kluster Azure Kube Service (AKS)
- Prometheus mengirim metrik ke ruang kerja Azure Monitor. Untuk informasi selengkapnya, lihat Layanan terkelola Azure Monitor untuk Prometheus.
Menyiapkan identitas beban kerja
Mulailah dengan menyiapkan beberapa variabel lingkungan. Ubah nilai agar sesuai dengan kluster AKS Anda.
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 harus menggunakan akun layanan yang digunakan untuk membuat kredensial federasi. Ini bisa menjadi nama yang ditentukan pengguna.AKS_CLUSTER_NAME
- Nama kluster AKS tempat Anda ingin menyebarkan KEDA.SERVICE_ACCOUNT_NAMESPACE
Keda dan akun layanan harus berada di namespace yang sama.USER_ASSIGNED_IDENTITY_NAME
adalah nama identitas Microsoft Entra yang dibuat untuk KEDA.FEDERATED_IDENTITY_CREDENTIAL_NAME
adalah nama kredensial yang dibuat untuk digunakan KEDA untuk mengautentikasi dengan Azure.
Jika kluster AKS Anda belum dibuat dengan identitas beban kerja atau pengeluar sertifikat oidc diaktifkan, Anda harus mengaktifkannya. Jika tidak yakin, Anda dapat menjalankan perintah berikut untuk memeriksa apakah perintah diaktifkan.
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
Untuk mengaktifkan identitas beban kerja dan pengeluar sertifikat oidc, jalankan perintah berikut.
az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
Simpan url pengeluar sertifikat OIDC dalam variabel lingkungan yang akan digunakan nanti.
export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
Buat identitas yang ditetapkan pengguna untuk KEDA. Identitas ini digunakan oleh KEDA untuk mengautentikasi dengan Azure Monitor.
az identity create --name $USER_ASSIGNED_IDENTITY_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --subscription $SUBSCRIPTION
Outputnya akan mirip dengan contoh berikut:
{ "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
Simpan dantenantId
dalam variabel lingkungan untuk digunakan nanti.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)"
Tetapkan peran Pembaca Data Pemantauan ke identitas untuk ruang kerja Azure Monitor Anda. Peran ini memungkinkan identitas membaca metrik dari ruang kerja Anda. Ganti grup sumber daya Ruang Kerja Azure Monitor dan nama Ruang Kerja Azure Monitor dengan grup sumber daya dan nama ruang kerja Azure Monitor yang dikonfigurasi untuk mengumpulkan metrik dari kluster 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>
Buat namespace LAYANAN KEDA, lalu buat akun layanan Kubernetes. Akun layanan ini digunakan oleh KEDA untuk mengautentikasi dengan 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
Periksa akun layanan Anda dengan menjalankan
kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
Buat kredensial federasi antara akun layanan dan identitas yang ditetapkan pengguna. Kredensial federasi memungkinkan akun layanan menggunakan identitas yang ditetapkan pengguna untuk mengautentikasi dengan 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
Catatan
Dibutuhkan waktu beberapa detik agar info masuk identitas federasi dapat disebarluaskan setelah ditambahkan. Jika permintaan token dibuat segera setelah menambahkan kredensial identitas federasi, itu mungkin menyebabkan kegagalan selama beberapa menit karena cache diisi di direktori dengan data lama. Untuk menghindari masalah ini, Anda dapat menambahkan sedikit penundaan setelah menambahkan kredensial identitas federasi.
Menyebarkan KEDA
KEDA dapat disebarkan menggunakan manifes YAML, bagan Helm, atau Operator Hub. Artikel ini menggunakan bagan Helm. Untuk informasi selengkapnya tentang penyebaran KEDA, lihat Menyebarkan KEDA
Tambahkan repositori helm:
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
Sebarkan KEDA menggunakan perintah berikut:
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
Periksa penyebaran Anda dengan menjalankan perintah berikut.
kubectl get pods -n keda
Outputnya akan mirip dengan contoh berikut:
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
Penskala
Scaler menentukan bagaimana dan kapan KEDA harus menskalakan penyebaran. KEDA mendukung berbagai scaler. Untuk informasi selengkapnya tentang scaler, lihat Scaler. Azure Managed Prometheus menggunakan penskala Prometheus yang sudah ada untuk mengambil metrik Prometheus dari Ruang Kerja Azure Monitor. File yaml berikut adalah contoh untuk menggunakan 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
adalah titik akhir Kueri ruang kerja Azure Monitor Anda. Untuk informasi selengkapnya, lihat Metrik Query Prometheus menggunakan API dan PromQLmetricName
adalah nama metrik yang ingin Anda skalakan.query
adalah kueri yang digunakan untuk mengambil metrik.threshold
adalah nilai di mana penyebaran diskalakan.- Atur
podIdentity.provider
sesuai dengan jenis identitas yang Anda gunakan.
Pemecahan Masalah
Bagian berikut ini menyediakan tips pemecahan masalah untuk masalah umum.
Info masuk terfederasi
Kredensial federasi dapat memakan waktu hingga 10 menit untuk disebarluaskan. Jika Anda mengalami masalah dengan autentikasi KEDA dengan Azure, coba langkah-langkah berikut.
Kutipan log berikut menunjukkan kesalahan dengan kredensial federasi.
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"}
Periksa nilai yang digunakan untuk membuat ServiceAccount dan kredensial yang dibuat dengan dan memastikan subject
nilainya cocok system:serviceaccount
dengan az identity federated-credential create
nilai.
Izin ruang kerja Azure Monitor
Jika Anda mengalami masalah dengan Autentikasi KEDA dengan Azure, periksa izin untuk ruang kerja Azure Monitor. Kutipan log berikut menunjukkan bahwa identitas tidak memiliki izin baca untuk ruang kerja 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\"}"}
Pastikan identitas memiliki Monitoring Data Reader
peran di ruang kerja Azure Monitor.