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.
-
Pantau sumber event:
Scalerterhubung ke sumber event eksternal—seperti MongoDB—dan secara berkala melakukan kueri terhadap metrik, misalnya jumlah dokumen yang sesuai dengan kondisi tertentu. -
Kendalikan penskalaan aplikasi:
-
Ketika
Scalermendeteksi adanya backlog event—misalnya data yang belum diproses—ack-keda menskalakan workload yang terkait denganScaledJobatauScaledObjectdengan membuat Job atau menambah replika Deployment. -
Ketika
Scalertidak 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
maxReplicaCountuntuk membatasi jumlah maksimum tugas konkuren dan melindungi sistem downstream dari lonjakan traffic. -
Pembersihan metadata otomatis: Setelah tugas selesai,
ScaledJobmenghapus 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.
Prasyarat
Pastikan hal-hal berikut:
-
Kluster ACK aktif dan berjalan
-
kubectltelah dikonfigurasi untuk terhubung ke kluster -
Izin yang cukup untuk membuat namespace dan men-deploy Helm chart
Langkah 1: Deploy ack-keda
-
Pada halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, pilih Applications > Helm.
-
Klik Create. Temukan dan pilih ack-keda, pilih versi chart terbaru, lalu selesaikan instalasi.
-
Verifikasi bahwa ack-keda sedang berjalan:
kubectl get pods -n kedaSemua Pod harus berstatus
Runningsebelum 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.
-
Buat file
mongoDB.yaml.PentingLayanan 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 -
Deploy MongoDB.
kubectl apply -f mongoDB.yaml
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: $MONGO_POD_NAME" -
Di database
test, buat penggunatest_userdan koleksitest_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.
-
Buat file
keda-mongodb.yaml. PropertisecretTargetRefdalamTriggerAuthenticationmembaca string koneksi dari Secret untuk otentikasi MongoDB. ParameterquerydalamScaledJobmemicu pembuatan Job ketika dokumen dalamtest_collectionsesuai 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 -
Deploy konfigurasi tersebut.
kubectl apply -f keda-mongodb.yaml
Langkah 3: Simulasikan event dan verifikasi penskalaan otomatis
-
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"} ])' -
Amati sumber daya Job di namespace
mongodb-test.watch kubectl get job -n mongodb-testDalam 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 -
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
waitingmenjadifinished, yang mengonfirmasi bahwa setiap Job telah memproses tugasnya.