All Products
Search
Document Center

Container Service for Kubernetes:Gunakan penskalaan berbasis event dengan sumber event MongoDB

Last Updated:Aug 21, 2026

Untuk workload berbasis event seperti job offline dan data streaming, penyesuaian otomatis pod horizontal (horizontal pod autoscaling) berdasarkan CPU dan memori mungkin merespons terlalu lambat. ack-keda memantau antrian event dari sumber seperti message queue dan database, membuat replika Job atau Deployment dalam hitungan detik, serta menskalakan ke nol setelah tugas selesai untuk penjadwalan real-time yang efisien dan optimalisasi biaya.

Cara kerja

ack-keda adalah versi yang ditingkatkan dari KEDA (Kubernetes-based Event-driven Autoscaling) yang terintegrasi dengan ACK. Komponen ini memperkenalkan Scaler yang menghubungkan sumber event dan aplikasi.

image
  1. Pantau sumber event: Scaler terhubung ke sumber event eksternal—seperti MongoDB—dan secara berkala melakukan kueri terhadap metrik, misalnya jumlah dokumen yang sesuai dengan kondisi tertentu.

  2. Kendalikan penskalaan aplikasi:

    • Ketika Scaler mendeteksi adanya backlog event—misalnya data yang belum diproses—ack-keda menskalakan workload yang terkait dengan ScaledJob atau ScaledObject dengan membuat Job atau menambah replika Deployment.

    • Ketika Scaler tidak mendeteksi backlog, ack-keda menskalakan turun workload tersebut. Untuk Job, sumber daya yang telah selesai dihapus untuk mencegah pemborosan kapasitas dan akumulasi metadata.

Kemampuan utama:

  • Dukungan luas terhadap sumber event: Mendukung sumber data seperti Apache Kafka, MySQL, PostgreSQL, RabbitMQ, dan MongoDB. Lihat RabbitMQ Queue.

  • Kontrol konkurensi fleksibel: Gunakan maxReplicaCount untuk membatasi jumlah maksimum tugas konkuren dan melindungi sistem downstream dari lonjakan traffic.

  • Pembersihan metadata otomatis: Setelah tugas selesai, ScaledJob menghapus Job dan Pod yang telah selesai, sehingga mengurangi beban pada API server akibat akumulasi metadata.

ScaledJob vs. ScaledObject

Gunakan ScaledJob ketika setiap event dipetakan ke tugas diskrit yang berjalan hingga selesai dalam Pod-nya sendiri. ack-keda menjadwalkan satu Job per event: menginisialisasi, memproses event, lalu menghentikan tugas. Isolasi ini mencegah tugas lambat menghambat tugas lain dan memungkinkan kontrol konkurensi yang tepat melalui maxReplicaCount.

Gunakan ScaledObject ketika event mendorong throughput berkelanjutan dan workload Anda paling baik ditangani oleh kumpulan replika Deployment yang berjalan lama.

Tutorial di bawah menggunakan ScaledJob untuk transkoding video. Ketika sebuah record dengan "state":"waiting" dimasukkan ke MongoDB, ack-keda membuat Job untuk memproses tugas tersebut dan mengubah status record menjadi "state":"finished" setelah selesai. Job yang telah selesai dibersihkan secara otomatis.

How it works

Prasyarat

Pastikan hal-hal berikut:

  • Kluster ACK aktif dan berjalan

  • kubectl telah dikonfigurasi untuk terhubung ke kluster

  • Izin yang cukup untuk membuat namespace dan men-deploy Helm chart

Langkah 1: Deploy ack-keda

  1. Pada halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, pilih Applications > Helm.

  2. Klik Create. Temukan dan pilih ack-keda, pilih versi chart terbaru, lalu selesaikan instalasi.

  3. Verifikasi bahwa ack-keda sedang berjalan:

    kubectl get pods -n keda

    Semua Pod harus berstatus Running sebelum Anda melanjutkan.

Langkah 2: Deploy contoh penskalaan otomatis berbasis event MongoDB

Buat namespace contoh

Contoh ini menggunakan namespace mongodb untuk database dan mongodb-test untuk konfigurasi penskalaan otomatis.

kubectl create ns mongodb
kubectl create ns mongodb-test

Deploy MongoDB

Jika Anda sudah memiliki layanan MongoDB, lewati langkah ini.

  1. Buat file mongoDB.yaml.

    Penting

    Layanan MongoDB ini hanya untuk demonstrasi tanpa ketersediaan tinggi. Jangan gunakan di lingkungan produksi.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mongodb
      namespace: mongodb
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: mongodb
      template:
        metadata:
          labels:
            name: mongodb
        spec:
          containers:
          - name: mongodb
            image: registry-cn-shanghai.ack.aliyuncs.com/acs/mongo:v5.0.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 27017
              name: mongodb
              protocol: TCP
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: mongodb-svc
      namespace: mongodb
    spec:
      type: ClusterIP
      ports:
      - name: mongodb
        port: 27017
        targetPort: 27017
        protocol: TCP
      selector:
        name: mongodb
  2. Deploy MongoDB.

    kubectl apply -f mongoDB.yaml

Inisialisasi database MongoDB

  1. Ambil nama Pod MongoDB.

    MONGO_POD_NAME=$(kubectl get pods -n mongodb -l name=mongodb -o jsonpath='{.items[0].metadata.name}')
    echo "MongoDB pod name: $MONGO_POD_NAME"
  2. Di database test, buat pengguna test_user dan koleksi test_collection.

    # Buat pengguna
    kubectl exec -n mongodb ${MONGO_POD_NAME} -- mongo --eval 'db.createUser({ user:"test_user",pwd:"test_password",roles:[{ role:"readWrite", db: "test"}]})'
    
    # Otentikasi pengguna
    kubectl exec -n mongodb ${MONGO_POD_NAME} -- mongo --eval 'db.auth("test_user","test_password")'
    
    # Buat koleksi
    kubectl exec -n mongodb ${MONGO_POD_NAME} -- mongo test --eval 'db.createCollection("test_collection")'

Konfigurasi TriggerAuthentication dan ScaledJob

ack-keda menggunakan TriggerAuthentication untuk mengelola kredensial sumber event secara aman. ScaledJob mendefinisikan aturan penskalaan, interval polling, dan templat Job.

File berikut menggabungkan ketiga sumber daya tersebut—Secret, TriggerAuthentication, dan ScaledJob.

  1. Buat file keda-mongodb.yaml. Properti secretTargetRef dalam TriggerAuthentication membaca string koneksi dari Secret untuk otentikasi MongoDB. Parameter query dalam ScaledJob memicu pembuatan Job ketika dokumen dalam test_collection sesuai dengan {"type":"mp4","state":"waiting"}.

    apiVersion: v1
    kind: Secret
    metadata:
      name: mongodb-secret
      namespace: mongodb-test
    type: Opaque
    data:
      # Nilai Base64 dari:
      # mongodb://test_user:test_password@mongodb-svc.mongodb.svc.cluster.local:27017/test
      connect: bW9uZ29kYjovL3Rlc3RfdXNlcjp0ZXN0X3Bhc3N3b3JkQG1vbmdvZGItc3ZjLm1vbmdvZGIuc3ZjLmNsdXN0ZXIubG9jYWw6MjcwMTcvdGVzdA==
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: mongodb-trigger
      namespace: mongodb-test
    spec:
      secretTargetRef:
        - parameter: connectionString
          name: mongodb-secret
          key: connect
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledJob
    metadata:
      name: mongodb-job
      namespace: mongodb-test
    spec:
      jobTargetRef:
        template:
          spec:
            containers:
              - name: mongo-update
                image: registry-cn-shanghai.ack.aliyuncs.com/acs/mongo-update:v6
                args:
                  - --dataBase=test
                  - --collection=test_collection
                  - --operation=updateMany
                  - --update={"$set":{"state":"finished"}}
                env:
                  - name: MONGODB_CONNECTION_STRING
                    value: mongodb://test_user:test_password@mongodb-svc.mongodb.svc.cluster.local:27017/test
                imagePullPolicy: IfNotPresent
            restartPolicy: Never
        backoffLimit: 1
      pollingInterval: 15         # Periksa MongoDB setiap 15 detik
      maxReplicaCount: 5          # Jalankan maksimal 5 Job konkuren
      successfulJobsHistoryLimit: 0  # Hapus Job yang selesai segera
      failedJobsHistoryLimit: 10     # Simpan 10 Job gagal terakhir untuk debugging
      triggers:
        - type: mongodb
          metadata:
            dbName: test
            collection: test_collection
            query: '{"type":"mp4","state":"waiting"}'  # Jalankan satu Job untuk setiap dokumen yang sesuai
            queryValue: "1"
          authenticationRef:
            name: mongodb-trigger
  2. Deploy konfigurasi tersebut.

    kubectl apply -f keda-mongodb.yaml

Langkah 3: Simulasikan event dan verifikasi penskalaan otomatis

  1. Masukkan lima record transkoding yang tertunda ke MongoDB.

    MONGO_POD_NAME=$(kubectl get pods -n mongodb -l name=mongodb -o jsonpath='{.items[0].metadata.name}')
    
    # Masukkan 5 record transkoding yang tertunda
    kubectl exec -n mongodb ${MONGO_POD_NAME} -- mongo test --eval 'db.test_collection.insert([
      {"type":"mp4","state":"waiting","createTimeStamp":"1610352740","fileName":"My Love"},
      {"type":"mp4","state":"waiting","createTimeStamp":"1610350740","fileName":"Harker"},
      {"type":"mp4","state":"waiting","createTimeStamp":"1610152940","fileName":"The World"},
      {"type":"mp4","state":"waiting","createTimeStamp":"1610390740","fileName":"Mother"},
      {"type":"mp4","state":"waiting","createTimeStamp":"1610344740","fileName":"Jagger"}
    ])'
  2. Amati sumber daya Job di namespace mongodb-test.

    watch kubectl get job -n mongodb-test

    Dalam satu interval polling (15 detik), lima Job dibuat dan dibersihkan setelah selesai:

    NAME                STATUS     COMPLETIONS   DURATION   AGE
    mongodb-job-4wxgx   Complete   1/1           3s         10s
    mongodb-job-9bs8r   Complete   1/1           3s         10s
    mongodb-job-p6pnb   Complete   1/1           3s         10s
    mongodb-job-pshkv   Complete   1/1           4s         10s
    mongodb-job-t6fs8   Complete   1/1           4s         10s
  3. Konfirmasi bahwa semua record telah ditandai sebagai selesai.

    MONGO_POD_NAME=$(kubectl get pods -n mongodb -l name=mongodb -o jsonpath='{.items[0].metadata.name}')
    kubectl exec -n mongodb ${MONGO_POD_NAME} -- mongo test --eval 'db.test_collection.find({"type":"mp4"}).pretty()'

    Semua record berubah dari waiting menjadi finished, yang mengonfirmasi bahwa setiap Job telah memproses tugasnya.

Referensi