Container Service for Kubernetes (ACK) mendukung Penskalaan Otomatis Berbasis Acara untuk Kubernetes (KEDA). Anda dapat menginstal KEDA di konsol ACK untuk menerapkan penskalaan berbasis acara pada kluster. Topik ini menjelaskan apa itu KEDA, cara kerjanya, dan bagaimana menggunakannya.
Ikhtisar
Dalam Kubernetes, Horizontal Pod Autoscaler (HPA) adalah solusi yang paling umum digunakan untuk penskalaan pod secara otomatis. HPA menentukan strategi penskalaan berdasarkan perbedaan antara penggunaan sumber daya dan ambang batas yang telah ditentukan sebelumnya. Meskipun mudah digunakan dan mendukung berbagai metrik sumber daya, HPA tidak mendukung penskalaan secara real-time. Sebagai contoh, HPA tidak dapat menskalakan sumber daya ketika peristiwa tertentu terdeteksi. Untuk mengatasi masalah ini, Anda dapat menginstal KEDA di konsol ACK. ACK KEDA mendukung penskalaan berbasis acara yang dapat digunakan dalam berbagai skenario seperti transkoding video dan audio offline, pekerjaan berbasis acara, dan Pemrosesan aliran.
Cara kerja KEDA
ACK KEDA adalah versi yang ditingkatkan dari KEDA open source dan mendukung penskalaan berbasis acara. Gambar berikut menunjukkan cara kerja ACK KEDA.
ACK KEDA secara berkala mengonsumsi data dari sumber acara. Ketika pesan tertunda meningkat, ACK KEDA dipicu untuk menskalakan sekelompok pekerjaan dalam hitungan detik. Setelah periode berikutnya dimulai, kelompok pekerjaan berikutnya diskalakan secara asinkron. ACK KEDA mendukung fitur-fitur berikut:
Mendukung berbagai sumber acara
ACK KEDA mendukung berbagai sumber data seperti Kafka, MySQL, PostgreSQL, RabbitMQ, dan MongoDB. Untuk informasi lebih lanjut, lihat RabbitMQ Queue.
Mengontrol konkurensi pekerjaan
Ketika sejumlah besar pekerjaan dikirimkan, stabilitas sistem kontrol dasar terpengaruh karena sistem harus mengontrol sumber daya, kuota, dan permintaan API secara holistik. ACK KEDA dapat mengontrol konkurensi pekerjaan dalam satu atau beberapa batch untuk memastikan stabilitas sistem.
Membersihkan metadata setelah pekerjaan selesai
Sejumlah besar metadata tersimpan setelah sejumlah besar pekerjaan selesai. Peningkatan metadata menurunkan stabilitas server API. Performa dan stabilitas kluster juga menurun, serta layanan lainnya mungkin terpengaruh secara negatif. ACK KEDA dapat membersihkan metadata secara otomatis setelah pekerjaan selesai.
Studi kasus
Sebuah pekerjaan transkoding sederhana digunakan dalam kasus berikut. Ketika pekerjaan baru diterima, data serupa dengan contoh berikut dimasukkan ke MongoDB: {"type":"mp4","state":"waiting","createTimeStamp":"1610332940","fileName":"World and peace","endTimeStamp":"","uuid":"1fae72ff-3239-42f5-af97-04711d8007e8"}. ACK KEDA mencari database untuk entri data yang memenuhi kondisi "state":"waiting". Kemudian, ACK KEDA membuat pod untuk memproses entri data tersebut. Satu pod dibuat untuk setiap entri data. Setelah transkoding selesai, nilai dari bidang state berubah dari waiting menjadi finished. Setelah pekerjaan selesai, metadata secara otomatis dibersihkan untuk mengurangi beban pada server API, memungkinkan Anda mengelola pekerjaan dengan lebih nyaman.
Langkah 1: Menyebarkan ACK KEDA
Masuk ke Konsol ACK.
Di panel navigasi kiri Konsol ACK, pilih .
Di halaman Marketplace, temukan dan klik ack-keda.
Klik Deploy di pojok kanan atas halaman ack-keda. Di langkah Basic Information, pilih kluster, dan klik Next.
Di langkah Parameters, pilih versi bagan dan klik OK.
Di panel navigasi kiri, klik Clusters. Di halaman Clusters, pilih kluster tempat ACK KEDA disebarkan dan klik nama kluster atau klik Details di kolom Actions. Di panel navigasi kiri, pilih untuk melihat ACK KEDA.
Langkah 2: Menambahkan MongoDB sebagai sumber acara
Menyebarkan MongoDB.
Jika Anda sudah menyebarkan MongoDB, lewati langkah ini.
PentingDatabase hanya digunakan untuk tujuan pengujian. Jangan gunakan database ini di lingkungan produksi.
Buat file YAML bernama mongoDB.yaml dan tambahkan kode berikut ke file tersebut:
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb spec: replicas: 1 selector: matchLabels: name: mongodb template: metadata: labels: name: mongodb spec: containers: - name: mongodb image: mongo:4.2.1 imagePullPolicy: IfNotPresent ports: - containerPort: 27017 name: mongodb protocol: TCP --- kind: Service apiVersion: v1 metadata: name: mongodb-svc spec: type: ClusterIP ports: - name: mongodb port: 27017 targetPort: 27017 protocol: TCP selector: name: mongodbMenyebarkan MongoDB ke namespace mongodb dari kluster.
kubectl apply -f mongoDB.yaml -n mongodb
Masuk ke MongoDB dan buat akun pengguna.
Buat pengguna.
# Buat pengguna kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createUser({ user:"test_user",pwd:"test_password",roles:[{ role:"readWrite", db: "test"}]})'Masuk ke MongoDB.
# Lengkapi autentikasi kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.auth("test_user","test_password")'Buat koleksi.
# Buat koleksi kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createCollection("test_collection")'
Menyebarkan TriggerAuthentication dan ScaledJob.
ACK KEDA menggunakan TriggerAuthentication untuk mengautentikasi permintaan masuk ke sumber acara. Dalam kasus ini, MongoDB ditambahkan sebagai sumber acara. ACK KEDA menggunakan bidang
secretTargetRefdi TriggerAuthentication untuk mengambil informasi koneksi dari Secret yang ditentukan dan kemudian menggunakan informasi koneksi tersebut untuk mengautentikasi permintaan ke MongDB.Buat file YAML bernama auth.yaml dan tambahkan kode berikut ke file tersebut:
apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: mongodb-trigger spec: secretTargetRef: - parameter: connectionString name: mongodb-secret key: connect --- apiVersion: v1 kind: Secret metadata: name: mongodb-secret type: Opaque data: connect: bW9uZ29kYjovL3Rlc3RfdXNlcjp0ZXN0X3Bhc3N3b3JkQG1vbmdvZGItc3ZjLm1vbmdvZGIuc3ZjLmNsdXN0ZXIubG9jYWw6MjcwMTcvdGVzdA==Menyebarkan TriggerAuthentication ke namespace mongodb-test dari kluster.
kubectl apply -f auth.yaml -n mongodb-test
Menyebarkan ScaledJob.
ScaledJob digunakan untuk mendefinisikan template pekerjaan dan menentukan database yang akan diquery serta ekspresi query. Dalam contoh berikut, sebuah pekerjaan dibuat untuk menanyakan koleksi test_collection di database test dan mentranskode entri data yang memenuhi kondisi
{"type":"mp4","state":"waiting"}.Buat file YAML bernama scaledJob.yaml dan tambahkan kode berikut ke file tersebut:
apiVersion: keda.sh/v1alpha1 kind: ScaledJob metadata: name: mongodb-job spec: jobTargetRef: # Template pekerjaan template: spec: containers: - name: mongo-update image: registry.cn-hangzhou.aliyuncs.com/carsnow/mongo-update:v6 args: - --connectStr=mongodb://test_user:test_password@mongodb-svc.mongodb.svc.cluster.local:27017/test - --dataBase=test - --collection=test_collection imagePullPolicy: IfNotPresent restartPolicy: Never backoffLimit: 1 pollingInterval: 15 maxReplicaCount: 5 successfulJobsHistoryLimit: 0 failedJobsHistoryLimit: 10 triggers: - type: mongodb metadata: dbName: test # Database yang akan diquery. collection: test_collection # Koleksi yang akan diquery. query: '{"type":"mp4","state":"waiting"}' # Buat pekerjaan untuk memproses setiap entri data yang bertipe mp4 dan statusnya waiting. queryValue: "1" authenticationRef: name: mongodb-triggerquery: Tetapkan kondisi. Ketika ACK KEDA mendeteksi entri data yang memenuhi kondisi yang ditentukan, pekerjaan dimulai.Menyebarkan ScaledJob ke namespace mongodb-test dari kluster.
kubectl apply -f scaledJob.yaml -n mongodb-test
Sisipkan lima entri data ke MongoDB.
# Sisipkan lima entri data ke MongoDB kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.test_collection.insert([ {"type":"mp4","state":"waiting","createTimeStamp":"1610352740","fileName":"My Love","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610350740","fileName":"Harker","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610152940","fileName":"The World","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d87767e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610390740","fileName":"Mother","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04799d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610344740","fileName":"Jagger","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d80099e8"}, ])'
Langkah 3: Periksa apakah ACK KEDA bekerja sesuai harapan
Jalankan perintah berikut untuk menanyakan pekerjaan:
# pantau pekerjaan
watch -n 1 kubectl get job -n mongodb-test
Verifikasi bahwa lima pekerjaan telah dibuat. Masuk ke MongoDB dan periksa data yang dimasukkan. Verifikasi bahwa status setiap entri data yang Anda sisipkan berubah dari waiting menjadi finished.