Todos los productos
Search
Centro de documentos

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

Última actualización: Sep 04, 2026

En cargas de trabajo basadas en eventos, como tareas por lotes y datos en streaming, el autoescalado horizontal de pods basado en CPU y memoria puede tener una respuesta demasiado lenta. ack-keda supervisa la acumulación de eventos en orígenes como colas de mensajes y bases de datos, crea réplicas de Jobs o Deployments en segundos y reduce la escala a cero cuando finalizan las tareas. Esto permite una programación eficiente en tiempo real y optimiza los costos.

Funcionamiento

ack-keda es una versión mejorada de KEDA (Kubernetes-based Event-driven Autoscaling) integrada con ACK. Introduce un Scaler que conecta los orígenes de eventos con las aplicaciones.

image

  1. Supervisión del origen de eventos: El Scaler se conecta a un origen de eventos externo, como MongoDB, y consulta periódicamente una métrica; por ejemplo, el recuento de documentos que cumplen ciertas condiciones.

  2. Control del escalado de la aplicación:

    • Cuando el Scaler detecta una acumulación de eventos (por ejemplo, datos sin procesar), ack-keda escala la carga de trabajo asociada a un ScaledJob o ScaledObject. Para ello, crea un Job o añade réplicas al Deployment.

    • Si el Scaler no detecta acumulaciones, ack-keda reduce la escala de la carga de trabajo. En el caso de los Jobs, elimina los recursos completados para evitar el desperdicio de capacidad y la acumulación de metadatos.

Capacidades principales:

  • Amplia compatibilidad con orígenes de eventos: Admite orígenes de datos como Apache Kafka, MySQL, PostgreSQL, RabbitMQ y MongoDB. Consulte RabbitMQ Queue.

  • Control flexible de la concurrencia: Utilice maxReplicaCount para limitar las tareas simultáneas y proteger los sistemas posteriores ante picos de tráfico.

  • Limpieza automática de metadatos: Una vez finalizada una tarea, ScaledJob elimina los Jobs y pods completados. Esto reduce la presión sobre el servidor de API al evitar la acumulación de metadatos.

Diferencias entre ScaledJob y ScaledObject

Utilice ScaledJob cuando cada evento corresponda a una tarea discreta y de larga duración que se ejecuta hasta completarse en su propio pod. ack-keda programa un Job por evento: lo inicializa, procesa el evento y lo finaliza. Este aislamiento evita que las tareas lentas bloqueen a otras y permite un control preciso de la concurrencia mediante maxReplicaCount.

Utilice ScaledObject cuando los eventos impulsen un rendimiento continuo y su carga de trabajo se gestione mejor mediante un pool de réplicas de Deployment de larga duración.

El siguiente tutorial utiliza ScaledJob para la transcodificación de video. Cuando se inserta un registro con "state":"waiting" en MongoDB, ack-keda crea un Job para procesar la tarea y establece el registro en "state":"finished" al finalizar. Los Jobs terminados se limpian automáticamente.

How it works

Requisitos previos

Asegúrese de cumplir con lo siguiente:

  • Un clúster de ACK en funcionamiento

  • kubectl configurado para conectarse al clúster

  • Permisos suficientes para crear namespaces y desplegar charts de Helm

Paso 1: Desplegar ack-keda

  1. En la página ACK Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, seleccione Applications > Helm.

  2. Haga clic en Create. Busque y seleccione ack-keda, elija la última versión del chart y complete la instalación.

  3. Compruebe que ack-keda se esté ejecutando:

    kubectl get pods -n keda

    Todos los pods deben estar en estado Running antes de continuar.

Paso 2: Desplegar el ejemplo de autoescalado basado en eventos con MongoDB

Crear los namespaces del ejemplo

Este ejemplo utiliza el namespace mongodb para la base de datos y mongodb-test para las configuraciones de autoescalado.

kubectl create ns mongodb
kubectl create ns mongodb-test

Desplegar MongoDB

Si ya cuenta con un servicio de MongoDB, omita este paso.

  1. Cree el archivo mongoDB.yaml.

    Importante

    Este servicio de MongoDB es solo para fines de demostración y no cuenta con alta disponibilidad. No lo utilice en entornos de producción.

    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. Despliegue MongoDB.

    kubectl apply -f mongoDB.yaml

Inicializar la base de datos MongoDB

  1. Obtenga el nombre del pod de 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. En la base de datos test, cree el usuario test_user y la colección 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")'

Configurar TriggerAuthentication y ScaledJob

ack-keda utiliza TriggerAuthentication para gestionar de forma segura las credenciales del origen de eventos. ScaledJob define las reglas de escalado, los intervalos de sondeo y la plantilla del Job.

El siguiente archivo combina los tres recursos: Secret, TriggerAuthentication y ScaledJob.

  1. Cree el archivo keda-mongodb.yaml. La referencia secretTargetRef en TriggerAuthentication lee la cadena de conexión del Secret para la autenticación en MongoDB. La query en ScaledJob activa la creación de Jobs cuando los documentos en test_collection coinciden con {"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. Despliegue la configuración.

    kubectl apply -f keda-mongodb.yaml

Paso 3: Simular eventos y comprobar el autoescalado

  1. Inserte cinco registros de transcodificación pendientes en 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. Supervise los recursos Job en el namespace mongodb-test.

    watch kubectl get job -n mongodb-test

    En un intervalo de sondeo (15 segundos), se crean cinco Jobs que se limpian tras completarse:

    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. Confirme que todos los registros estén marcados como finalizados.

    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()'

    Todos los registros cambian de waiting a finished, lo que confirma que cada Job procesó su tarea correctamente.

Referencias