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.
-
Pantau sumber peristiwa:
Scalerterhubung ke sumber peristiwa eksternal—seperti MongoDB—dan secara berkala mengkueri metrik tertentu, misalnya jumlah dokumen yang memenuhi kondisi tertentu. -
Kendalikan penskalaan aplikasi:
-
Ketika
Scalermendeteksi adanya backlog peristiwa—misalnya, data yang belum diproses—ack-keda dengan cepat menskala workload target yang terkait denganScaledJobatauScaledObjectdengan membuat Job baru atau menambah jumlah replika pod dalam suatu Deployment. -
Setelah peristiwa selesai diproses dan
Scalertidak 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
maxReplicaCountuntuk membatasi jumlah maksimum tugas konkuren dan melindungi sistem downstream dari lonjakan traffic. -
Pembersihan metadata otomatis: Setelah tugas selesai,
ScaledJobsecara 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
-
Pada halaman ACK Clusters , klik nama kluster Anda. Pada halaman detail kluster, di panel navigasi sebelah kiri, klik .
-
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.
-
Buat mongoDB.yaml.
PentingLayanan 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 -
Deploy MongoDB.
kubectl apply -f mongoDB.yaml
3. Inisialisasi database MongoDB
-
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" -
Di database
test, buat penggunatest_userdan koleksitest_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.
-
Buat auth.yaml dan deploy TriggerAuthentication.
Untuk sumber peristiwa MongoDB, bidang
secretTargetRefdalam 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== -
Deploy TriggerAuthentication.
kubectl apply -f auth.yaml -
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.-
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-triggerBidang
querymendefinisikan kondisi data. Ketika ack-keda menemukan dokumen di MongoDB yang sesuai dengan kondisi ini, ia akan membuat resource Job. -
Deploy ScaledJob.
kubectl apply -f scaledJob.yaml
-
Langkah 3: Simulasikan peristiwa dan picu penskalaan otomatis
-
Masukkan lima catatan tertunda ke instans MongoDB di namespace
mongodbuntuk 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"} ])' -
Verifikasi perilaku penskalaan otomatis.
Pantau terus resource Job di namespace mongodb-test.
watch kubectl get job -n mongodb-testOutput 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 -
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
statesemua catatan telah berubah dariwaitingmenjadifinished.