Bagikan melalui


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

Menyiapkan identitas beban kerja

  1. 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.
  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 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
    
  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. clientId Simpan 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 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 PromQL
  • metricName 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.