Pour les charges de travail pilotées par les événements, telles que les tâches hors ligne et le streaming de données, la mise à l'échelle horizontale des pods basée sur le CPU et la mémoire peut réagir trop lentement. ack-keda surveille les retards d'événements provenant de sources telles que les files d'attente de messages et les bases de données, crée des Jobs ou des réplicas de Deployment en quelques secondes, et réduit l'échelle à zéro une fois les tâches terminées pour une planification en temps réel efficace et une optimisation des coûts.
Fonctionnement
ack-keda est une version améliorée de KEDA (Kubernetes-based Event-driven Autoscaling) intégrée à ACK. Il introduit un composant Scaler qui fait le lien entre les sources d'événements et les applications.
Surveiller la source d'événements : Le
Scalerse connecte à une source d'événements externe, telle que MongoDB, et interroge périodiquement une métrique, par exemple le nombre de documents correspondant à certaines conditions.-
Piloter la mise à l'échelle de l'application :
Lorsque le
Scalerdétecte un retard d'événements (par exemple, des données non traitées), ack-keda met à l'échelle la charge de travail liée à unScaledJobou à unScaledObjecten créant un Job ou en ajoutant des réplicas de Deployment.Lorsque le
Scalerne détecte aucun retard, ack-keda réduit l'échelle de la charge de travail. Pour les Jobs, il supprime les ressources terminées afin d'éviter le gaspillage de capacité et l'accumulation de métadonnées.
Principales fonctionnalités :
Prise en charge étendue des sources d'événements : Prend en charge des sources de données telles qu'Apache Kafka, MySQL, PostgreSQL, RabbitMQ et MongoDB. Consultez RabbitMQ Queue.
Contrôle flexible de la concurrence : Utilisez
maxReplicaCountpour limiter le nombre de tâches concurrentes et protéger les systèmes en aval contre les pics de trafic.Nettoyage automatique des métadonnées : Une fois une tâche terminée,
ScaledJobsupprime les Jobs et les pods achevés, réduisant ainsi la pression exercée sur le serveur API due à l'accumulation de métadonnées.
ScaledJob vs. ScaledObject
Utilisez ScaledJob lorsque chaque événement correspond à une tâche discrète et de longue durée qui s'exécute jusqu'à son terme dans son propre pod. ack-keda planifie un Job par événement : celui-ci s'initialise, traite l'événement, puis se termine. Cette isolation empêche les tâches lentes de bloquer les autres et permet un contrôle précis de la concurrence grâce à maxReplicaCount.
Utilisez ScaledObject lorsque les événements alimentent un débit continu et que votre charge de travail est mieux gérée par un pool de réplicas de Deployment fonctionnant en continu.
Le tutoriel ci-dessous utilise ScaledJob pour le transcodage vidéo. Lorsqu'un enregistrement avec "state":"waiting" est inséré dans MongoDB, ack-keda crée un Job pour traiter la tâche et définit l'enregistrement sur "state":"finished" à la fin du traitement. Les Jobs terminés sont nettoyés automatiquement.

Prérequis
Assurez-vous de disposer des éléments suivants :
Un cluster ACK opérationnel
kubectlconfiguré pour se connecter au clusterDes permissions suffisantes pour créer des namespaces et déployer des charts Helm
Étape 1 : Déployer ack-keda
Sur la page Clusters ACK, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Applications > Helm.
Cliquez sur Create. Recherchez et sélectionnez ack-keda, choisissez la dernière version du chart et terminez l'installation.
-
Vérifiez que ack-keda est en cours d'exécution :
kubectl get pods -n kedaTous les pods doivent être dans l'état
Runningavant de poursuivre.
Étape 2 : Déployer l'exemple de mise à l'échelle automatique pilotée par les événements MongoDB
Créer les namespaces d'exemple
Cet exemple utilise le namespace mongodb pour la base de données et mongodb-test pour les configurations de mise à l'échelle automatique.
kubectl create ns mongodb
kubectl create ns mongodb-test
Déployer MongoDB
Si vous disposez déjà d'un service MongoDB, ignorez cette étape.
-
Créez le fichier
mongoDB.yaml.ImportantCe service MongoDB est destiné uniquement à la démonstration et n'offre pas de haute disponibilité. Ne l'utilisez pas en production.
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 -
Déployez MongoDB.
kubectl apply -f mongoDB.yaml
Initialiser la base de données MongoDB
-
Récupérez le nom du 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" -
Dans la base de données
test, créez l'utilisateurtest_useret la collectiontest_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")'
Configurer TriggerAuthentication et ScaledJob
ack-keda utilise TriggerAuthentication pour gérer de manière sécurisée les identifiants de la source d'événements. ScaledJob définit les règles de mise à l'échelle, les intervalles d'interrogation et le modèle de Job.
Le fichier suivant combine les trois ressources : Secret, TriggerAuthentication et ScaledJob.
-
Créez le fichier
keda-mongodb.yaml. Le champsecretTargetRefdansTriggerAuthenticationlit la chaîne de connexion depuis le Secret pour l'authentification MongoDB. La requêtequerydansScaledJobdéclenche la création d'un Job lorsque les documents detest_collectioncorrespondent à{"type":"mp4","state":"waiting"}.apiVersion: v1 kind: Secret metadata: name: mongodb-secret namespace: mongodb-test type: Opaque data: # Base64-encoded value of: # 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 # Check MongoDB every 15 seconds maxReplicaCount: 5 # Run at most 5 concurrent Jobs successfulJobsHistoryLimit: 0 # Delete completed Jobs immediately failedJobsHistoryLimit: 10 # Keep the last 10 failed Jobs for debugging triggers: - type: mongodb metadata: dbName: test collection: test_collection query: '{"type":"mp4","state":"waiting"}' # Launch a Job for each matching document queryValue: "1" authenticationRef: name: mongodb-trigger -
Déployez la configuration.
kubectl apply -f keda-mongodb.yaml
Étape 3 : Simuler des événements et vérifier la mise à l'échelle automatique
-
Insérez cinq enregistrements de transcodage en attente dans MongoDB.
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"} ])' -
Surveillez les ressources Job dans le namespace
mongodb-test.watch kubectl get job -n mongodb-testEn moins d'un intervalle d'interrogation (15 secondes), cinq Jobs sont créés puis nettoyés après leur achèvement :
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 -
Confirmez que tous les enregistrements sont marqués comme terminés.
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()'Tous les enregistrements passent de
waitingàfinished, confirmant que chaque Job a traité sa tâche.