All Products
Search
Document Center

Container Service for Kubernetes:Gunakan penskalaan berbasis peristiwa berdasarkan sumber peristiwa MongoDB

Last Updated:Mar 08, 2026

Saat menangani workload berbasis peristiwa seperti job offline atau data streaming, Penyesuaian Otomatis Pod Horizontal (HPA) tradisional yang berbasis pemanfaatan CPU atau memori mungkin tidak cukup cepat merespons. ack-keda memantau backlog dari berbagai sumber peristiwa—seperti antrian pesan atau database—dan secara otomatis membuat Job atau Deployment dalam hitungan detik. Setelah tugas selesai, ia menskala sumber daya kembali ke nol, sehingga memungkinkan penjadwalan sumber daya secara 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. Mekanisme intinya memperkenalkan Scaler sebagai jembatan antara sumber peristiwa dan aplikasi.

image
  1. Pantau sumber peristiwa: Scaler terhubung ke sumber peristiwa eksternal—seperti MongoDB—dan secara berkala mengkueri metrik tertentu, misalnya jumlah dokumen yang memenuhi kondisi tertentu.

  2. Kendalikan penskalaan aplikasi:

    • Ketika Scaler mendeteksi adanya backlog peristiwa—misalnya, data yang belum diproses—ack-keda dengan cepat menskala workload target yang terkait dengan ScaledJob atau ScaledObject dengan membuat Job baru atau menambah jumlah replika pod dalam suatu Deployment.

    • Setelah peristiwa selesai diproses dan Scaler tidak lagi mendeteksi backlog, ack-keda secara otomatis menskala turun workload tersebut. Untuk Job, ia membersihkan sumber daya yang telah selesai guna mencegah pemborosan kapasitas dan akumulasi metadata.

Keunggulan utama:

  • Dukungan luas terhadap sumber peristiwa: Mendukung sumber data seperti Kafka, MySQL, PostgreSQL, RabbitMQ, dan MongoDB. Untuk detailnya, lihat RabbitMQ Queue.

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

  • Pembersihan metadata otomatis: Setelah tugas selesai, ScaledJob secara otomatis menghapus Job dan pod-nya yang telah selesai, sehingga mengurangi beban pada API Server akibat akumulasi metadata.

原理

Topik ini menggunakan skenario simulasi transkoding video sebagai contoh. Ketika pekerjaan transkoding baru—berupa catatan dengan "state":"waiting"—dimasukkan ke dalam database MongoDB, ack-keda secara otomatis membuat pod Job untuk menjalankan tugas transkoding tersebut dan memperbarui status catatan menjadi "state":"finished" setelah selesai. Setelah Job selesai, metadata-nya secara otomatis dibersihkan untuk mengurangi beban pada API Server.

Langkah 1: Deploy ack-keda

  1. Pada halaman ACK Clusters , klik nama kluster Anda. Pada halaman detail kluster, di panel navigasi sebelah kiri, klik Applications > Helm.

  2. Klik Create. Ikuti petunjuk di layar untuk menemukan dan memilih ack-keda, pilih versi chart terbaru, lalu selesaikan instalasi.

Langkah 2: Deploy contoh penskalaan otomatis berbasis peristiwa MongoDB

1. Buat namespace contoh

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

kubectl create ns mongodb
kubectl create ns mongodb-test

2. Deploy MongoDB

Jika Anda sudah memiliki layanan MongoDB, lewati langkah ini.

  1. Buat mongoDB.yaml.

    Penting

    Layanan MongoDB ini hanya untuk demonstrasi dan tidak menyediakan 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

3. 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 is: $MONGO_POD_NAME"
  2. Di database test, buat pengguna test_user dan koleksi test_collection.

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

4. Konfigurasi TriggerAuthentication dan ScaledJob

ack-keda menggunakan resource TriggerAuthentication untuk mengelola kredensial secara aman saat terhubung ke sumber peristiwa. ScaledJob adalah resource inti ack-keda yang mendefinisikan aturan penskalaan, interval polling, dan templat Job yang akan dijalankan.

  1. Buat auth.yaml dan deploy TriggerAuthentication.

    Untuk sumber peristiwa MongoDB, bidang secretTargetRef dalam TriggerAuthentication membaca string koneksi dari Secret yang ditentukan ke ack-keda untuk melakukan otentikasi dengan MongoDB.

    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: mongodb-trigger
      namespace: mongodb-test
    spec:
      secretTargetRef:
        - parameter: connectionString
          name: mongodb-secret
          key: connect
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mongodb-secret
      namespace: mongodb-test
    type: Opaque
    data:
      connect: bW9uZ29kYjovL3Rlc3RfdXNlcjp0ZXN0X3Bhc3N3b3JkQG1vbmdvZGItc3ZjLm1vbmdvZGIuc3ZjLmNsdXN0ZXIubG9jYWw6MjcwMTcvdGVzdA==
  2. Deploy TriggerAuthentication.

    kubectl apply -f auth.yaml
  3. Deploy ScaledJob.

    ScaledJob mengonfigurasi templat Job dan menentukan database serta ekspresi kueri yang digunakan. Contoh berikut mengkueri test_collection di database test untuk dokumen yang sesuai dengan {"type":"mp4","state":"waiting"}—ini merepresentasikan tugas transkoding yang tertunda.

    1. Buat scaledJob.yaml.

      apiVersion: keda.sh/v1alpha1
      kind: ScaledJob
      metadata:
        name: mongodb-job
        namespace: mongodb-test
      spec:
        jobTargetRef:
          # Job template configuration
          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
        maxReplicaCount: 5
        successfulJobsHistoryLimit: 0
        failedJobsHistoryLimit: 10
        triggers:
          - type: mongodb
            metadata:
              dbName: test                               # Database to query
              collection: test_collection                # Collection to query
              query: '{"type":"mp4","state":"waiting"}'  # Launch jobs for mp4 files with "waiting" status
              queryValue: "1"
            authenticationRef:
              name: mongodb-trigger

      Bidang query mendefinisikan kondisi data. Ketika ack-keda menemukan dokumen di MongoDB yang sesuai dengan kondisi ini, ia akan membuat resource Job.

    2. Deploy ScaledJob.

      kubectl apply -f scaledJob.yaml

Langkah 3: Simulasikan peristiwa dan picu penskalaan otomatis

  1. Masukkan lima catatan tertunda ke instans MongoDB di namespace mongodb untuk mensimulasikan tugas masuk.

    MONGO_POD_NAME=$(kubectl get pods -n mongodb -l name=mongodb -o jsonpath='{.items[0].metadata.name}')
    
    # Insert 5 pending transcoding records
    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. Verifikasi perilaku penskalaan otomatis.

    Pantau terus resource Job di namespace mongodb-test.

    watch kubectl get job -n mongodb-test

    Output yang diharapkan menunjukkan lima Job dibuat dan secara otomatis 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. Kueri status data di database.

    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()'

    Pada output yang diharapkan, bidang state semua catatan telah berubah dari waiting menjadi finished.

Referensi