All Products
Search
Document Center

Container Service for Kubernetes:Penyesuaian Otomatis Berbasis Peristiwa (KEDA) berdasarkan metrik RocketMQ

Last Updated:Mar 26, 2026

Ketika backlog pesan menumpuk di ApsaraMQ for RocketMQ, pod konsumen dapat tertinggal, sehingga meningkatkan beban sistem dan berisiko mengganggu layanan. Gunakan Kubernetes Event-Driven Autoscaling (KEDA) untuk secara otomatis menskala pod konsumen berdasarkan metrik backlog pesan real-time, sehingga kapasitas menyesuaikan permintaan tanpa intervensi manual.

Cara kerja

KEDA menskala pod konsumen dalam dua fase berbeda:

  • Fase aktivasi (0 hingga 1 replika): KEDA memantau metrik backlog pesan secara langsung. Ketika backlog melebihi ambang batas aktivasi, KEDA menskala Penyebaran dari nol menjadi satu replika.

  • Fase penskalaan (1 hingga N replika): Setelah setidaknya satu replika berjalan, Kubernetes Horizontal Pod Autoscaler (HPA) mengambil alih dan menyesuaikan jumlah replika berdasarkan metrik yang diekspos oleh KEDA. Oleh karena itu, kubectl get hpa menampilkan resource HPA yang dikelola KEDA setelah Anda menerapkan ScaledObject.

Untuk ApsaraMQ for RocketMQ, KEDA menggunakan Managed Service for Prometheus sebagai sumber metrik. Parameter threshold dalam ScaledObject merepresentasikan target backlog pesan per replika. Sebagai contoh, jika setiap pod konsumen dapat memproses 30 pesan, atur threshold: '30'. Dengan 90 pesan terakumulasi, KEDA akan menskala menjadi 3 replika.

Jika Anda menggunakan Apache RocketMQ open-source, Anda dapat mengaktifkan penyesuaian otomatis pod horizontal berdasarkan metrik yang dikumpulkan oleh Java Management Extensions (JMX) Prometheus exporter. Untuk informasi lebih lanjut, lihat Apache RocketMQ.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Langkah 1: Deploy aplikasi

Langkah ini membuat Penyebaran NGINX bernama sample-app sebagai target penskalaan.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster yang ingin Anda kelola. Di panel kiri, pilih Workloads > Deployments.

  3. Di halaman Deployments, klik Create from YAML. Di halaman Create, atur Sample Template ke Custom, lalu terapkan YAML berikut:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - name: sample-app
            # Ganti dengan gambar kontainer konsumen RocketMQ aktual Anda.
            image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
            resources:
              limits:
                cpu: "500m"

Langkah 2: Konfigurasikan kebijakan penskalaan melalui ScaledObject

ScaledObject mendefinisikan target penskalaan, batas replika, dan kueri Prometheus yang mendorong keputusan penskalaan. Sebelum membuat ScaledObject, kumpulkan endpoint Prometheus dan detail instans dari konsol ApsaraMQ for RocketMQ serta konsol ARMS.

Kumpulkan informasi instans dari konsol ApsaraMQ for RocketMQ

  1. Masuk ke Konsol ApsaraMQ for RocketMQ. Di panel navigasi kiri, klik Instances.

  2. Di bilah navigasi atas, pilih wilayah, misalnya China (Hangzhou). Di halaman Instances, klik nama instans yang ingin Anda kelola.

  3. Di panel navigasi kiri, klik Topics. Catat Name topik dan Instance ID yang ditampilkan di pojok kanan atas—misalnya, keda dan mq-cn-uax33****.

Dapatkan endpoint Prometheus untuk instans ApsaraMQ for RocketMQ

  1. Masuk ke Konsol ARMS.

  2. Di panel navigasi kiri, pilih Managed Service for Prometheus > Instances.

  3. Temukan instans bernama Cloud Services-{{RegionId}}, lalu klik namanya. Di panel kiri, klik Settings, lalu salin endpoint dari bagian HTTP API URL (Grafana Read URL).

    image

Buat ScaledObject

  1. Buat file bernama ScaledObject.yaml dengan konten berikut:

    ParameterDeskripsi
    scaleTargetRef.namePenyebaran yang akan diskala. Pada contoh ini, sample-app (dibuat pada Langkah 1).
    maxReplicaCountJumlah maksimum replika yang diizinkan saat scale out.
    minReplicaCountJumlah minimum replika yang dipertahankan saat scale in.
    serverAddressEndpoint Prometheus yang menyimpan metrik ApsaraMQ for RocketMQ. Gunakan endpoint yang disalin dari HTTP API URL (Grafana Read URL) pada langkah sebelumnya.
    metricNameNama metrik PromQL yang digunakan sebagai sinyal penskalaan.
    queryKueri PromQL yang mengagregasi backlog pesan di seluruh instans dan topik yang ditentukan, dikelompokkan berdasarkan kelompok konsumen.
    thresholdTarget backlog pesan per replika (AverageValue). KEDA menskala Penyebaran sehingga setiap replika menangani tidak lebih dari jumlah pesan tersebut rata-rata. Untuk menentukan nilai ini, perkirakan jumlah pesan yang dapat diproses oleh satu pod konsumen, lalu gunakan angka tersebut sebagai ambang batas.
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: prometheus-scaledobject
      namespace: default
    spec:
      scaleTargetRef:
        name: sample-app          # Wajib. Penyebaran yang akan diskala.
      maxReplicaCount: 10         # Wajib. Replika maksimum saat scale out.
      minReplicaCount: 2          # Wajib. Replika minimum saat scale in.
      triggers:
      - type: prometheus
        metadata:
          # Field wajib:
          serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
          # Ganti serverAddress dengan endpoint yang disalin dari konsol ARMS.
          metricName: rocketmq_consumer_inflight_messages
          query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
          # Ganti instance_id dan topic dengan ID instans dan nama topik aktual Anda.
          threshold: '30'         # Target backlog pesan per replika (AverageValue).
                                  # Contoh: jika satu pod menangani 30 pesan,
                                  # 90 pesan terakumulasi menskala menjadi 3 replika.

    Tabel berikut menjelaskan parameter utama:

  2. Terapkan ScaledObject dan verifikasi resource yang dibuat:

    # Terapkan konfigurasi penskalaan.
    kubectl apply -f ScaledObject.yaml
    
    # Verifikasi ScaledObject siap digunakan.
    kubectl get ScaledObject

    Output yang diharapkan:

    NAME                      SCALETARGETKIND      SCALETARGETNAME   MIN   MAX   TRIGGERS     AUTHENTICATION   READY   ACTIVE   FALLBACK   AGE
    prometheus-scaledobject   apps/v1.Deployment   sample-app        2     10    prometheus                    True    False    False      105s

    KEDA secara otomatis membuat HPA untuk Penyebaran tersebut. Konfirmasi keberadaannya:

    kubectl get hpa

    Output yang diharapkan:

    NAME                               REFERENCE               TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)   2         10        2          28m
  3. (Opsional) Untuk mengamankan akses baca ke Prometheus, konfigurasikan autentikasi berbasis token. Klik untuk melihat langkah-langkah detail

    1. Hasilkan token Prometheus seperti yang diminta di halaman tersebut. image

    2. Buat Secret dengan nilai Base64-encoded untuk field customAuthHeader dan customAuthValue:

      apiVersion: v1
      kind: Secret
      metadata:
        name: keda-prom-secret
        namespace: default
      data:
        customAuthHeader: "QXV0Xxxxxxxlvbg=="
        customAuthValue: "kR2tpT2lJeFpXSmxaVFV6WlMTxxxxxxxxRMVFE0TUdRdE9USXpaQzFqWkRZd09EZ3dOVFV5WWpZaWZRLjlDaFBYU0Q2dEhWc1dQaFlyMGh3ZU5FQjZQZWVETXFjTlYydVNqOU82TTQ="
    3. Buat resource TriggerAuthentication yang mereferensikan Secret tersebut:

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-prom-creds
        namespace: default
      spec:
        secretTargetRef:
          - parameter: customAuthHeader
            name: keda-prom-secret
            key: customAuthHeader
          - parameter: customAuthValue
            name: keda-prom-secret
            key: customAuthValue
    4. Perbarui ScaledObject untuk mereferensikan TriggerAuthentication:

      apiVersion: keda.sh/v1alpha1
      kind: ScaledObject
      metadata:
        name: prometheus-scaledobject
        namespace: default
      spec:
        scaleTargetRef:
          name: sample-app
        maxReplicaCount: 10
        minReplicaCount: 2
        triggers:
        - type: prometheus
          metadata:
            serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
            metricName: rocketmq_consumer_inflight_messages
            query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
            threshold: '30'
            authModes: "custom"
          authenticationRef:
            name: keda-prom-creds   # Mereferensikan TriggerAuthentication yang dibuat di atas.
      Catatan: Contoh ini menggunakan autentikasi kustom. Untuk metode autentikasi lain yang didukung oleh scaler Prometheus, lihat dokumentasi komunitas KEDA.

Langkah 3: Produksi dan konsumsi data

Gunakan proyek rocketmq-keda-sample untuk memproduksi dan mengonsumsi pesan. Dalam kode proyek, tentukan endpoint, username, dan password instans ApsaraMQ for RocketMQ yang diperoleh pada Langkah 2.

Langkah 4: Verifikasi perilaku autoscaling

  1. Masuk ke Konsol ApsaraMQ for RocketMQ. Di panel navigasi kiri, klik Instances.

  2. Di bilah navigasi atas, pilih wilayah, misalnya China (Hangzhou). Di halaman Instances, klik nama instans yang ingin Anda kelola. Catat Endpoint and Network Information.

  3. Di panel navigasi kiri, klik Access Control, lalu klik tab Intelligent Authentication. Catat username dan password.

  4. Jalankan program produsen untuk menerbitkan pesan, lalu periksa status HPA:

    kubectl get hpa

    Output yang diharapkan:

    NAME                               REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   32700m/30 (avg)   2         10        10         47m

    REPLICAS menunjukkan bahwa sample-app telah diskala ke jumlah replika maksimum yang dikonfigurasi dalam ScaledObject.

  5. Hentikan program produsen dan jalankan program konsumen. Amati HPA melakukan scale in saat backlog terhapus:

    kubectl get hpa -w

    Output yang diharapkan:

    NAME                               REFERENCE               TARGETS            MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   222500m/30 (avg)   2         10        10         50m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   232400m/30 (avg)   2         10        10         51m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        10         52m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        2          57m

    Setelah semua pesan dikonsumsi, REPLICAS kembali ke jumlah replika minimum (minReplicaCount: 2).

Langkah berikutnya

Skala pod berdasarkan panjang antrian dan laju pesan menggunakan metrik ApsaraMQ for RabbitMQ. Untuk informasi lebih lanjut, lihat Penyesuaian otomatis pod horizontal berdasarkan metrik ApsaraMQ for RabbitMQ.