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 Kubernetes Service (AKS) atau Kubernetes dengan dukungan Azure Arc 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 memandu Anda melalui langkah-langkah untuk mengintegrasikan KEDA ke dalam kluster Kubernetes yang diaktifkan AKS atau Azure Arc menggunakan identitas beban kerja.

Catatan

Kami merekomendasikan untuk menggunakan ID Beban Kerja Microsoft Entra. Metode autentikasi ini menggantikan identitas yang dikelola oleh pod (pratinjau), yang berintegrasi dengan kemampuan asli Kubernetes untuk berintegasi dengan penyedia identitas eksternal untuk aplikasi.

Identitas yang dikelola pod Microsoft Entra sumber terbuka (pratinjau) di Azure Kubernetes Service telah dihentikan per 24/10/2022, dan proyek akan diarsipkan pada bulan September 2023. Untuk informasi selengkapnya, lihat pemberitahuan penghentian. Add-on Terkelola AKS mulai deprecation pada September 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

Menyiapkan identitas tugas

  1. Mulailah dengan menyiapkan beberapa variabel lingkungan. Ubah nilai agar sesuai dengan kluster 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.
  2. 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 workload identity dan oidc-issuer, jalankan perintah ini.

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. 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)"
    
  4. 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"
    }
    
  5. Simpan clientId dan tenantId 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)"
    
  6. 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>
    
  7. 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
    
  8. Periksa akun layanan Anda dengan menjalankan

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. 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 kredensial identitas federasi tersebar 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.

Menerapkan KEDA

KEDA dapat disebarkan menggunakan manifes YAML, bagan Helm, atau Operator Hub. Artikel ini menggunakan Helm charts. 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 deployment 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

Perangkat Pengukur

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 PromQL
  • metricName adalah nama metrik yang ingin Anda skalakan.
  • query adalah kueri yang digunakan untuk mengambil metrik.
  • threshold adalah nilai yang menentukan skala penyebaran.
  • 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 terfederasi.

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 az identity federated-credential create, lalu pastikan nilai subject cocok dengan nilai system:serviceaccount.

Hak Akses 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 tersebut memiliki peran Monitoring Data Reader di dalam ruang kerja Azure Monitor.