Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Use event-driven scaling with a MongoDB event source

Dernière mise à jour :Aug 11, 2026

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.

image

  1. Surveiller la source d'événements : Le Scaler se 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.

  2. Piloter la mise à l'échelle de l'application :

    • Lorsque le Scaler dé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 à un ScaledJob ou à un ScaledObject en créant un Job ou en ajoutant des réplicas de Deployment.

    • Lorsque le Scaler ne 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 maxReplicaCount pour 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, ScaledJob supprime 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.

How it works

Prérequis

Assurez-vous de disposer des éléments suivants :

  • Un cluster ACK opérationnel

  • kubectl configuré pour se connecter au cluster

  • Des permissions suffisantes pour créer des namespaces et déployer des charts Helm

Étape 1 : Déployer ack-keda

  1. Sur la page Clusters ACK, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, choisissez Applications > Helm.

  2. Cliquez sur Create. Recherchez et sélectionnez ack-keda, choisissez la dernière version du chart et terminez l'installation.

  3. Vérifiez que ack-keda est en cours d'exécution :

    kubectl get pods -n keda

    Tous les pods doivent être dans l'état Running avant 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.

  1. Créez le fichier mongoDB.yaml.

    Important

    Ce 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
  2. Déployez MongoDB.

    kubectl apply -f mongoDB.yaml

Initialiser la base de données MongoDB

  1. 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"
  2. Dans la base de données test, créez l'utilisateur test_user et la collection 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")'

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.

  1. Créez le fichier keda-mongodb.yaml. Le champ secretTargetRef dans TriggerAuthentication lit la chaîne de connexion depuis le Secret pour l'authentification MongoDB. La requête query dans ScaledJob déclenche la création d'un Job lorsque les documents de test_collection correspondent à {"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
  2. Déployez la configuration.

    kubectl apply -f keda-mongodb.yaml

Étape 3 : Simuler des événements et vérifier la mise à l'échelle automatique

  1. 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"}
    ])'
  2. Surveillez les ressources Job dans le namespace mongodb-test.

    watch kubectl get job -n mongodb-test

    En 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
  3. 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.

Références