PostgreSQL Latest

Scale applications based on a PostgreSQL query.

Availability: v1.2+ Maintainer: Community

Trigger Specification

This specification describes the postgresql trigger that scales based on a PostgreSQL query

The PostgreSQL scaler allows for two connection options:

A user can offer a full connection string (often in the form of an environment variable secret)

  • connectionFromEnv - PostgreSQL connection string that should point to environment variable with valid value.

Alternatively, a user can specify individual arguments (host, userName, password, etc.), and the scaler will form a connection string internally.

  • host: - Service URL to postgresql. Note that you should use a full svc URL as KEDA will need to contact postgresql from a different namespace.
  • userName: - Username for postgresql user.
  • passwordFromEnv Password for postgresql user.
  • port - Postgresql port.
  • dbName - Postgresql Database name.
  • sslmode - SSL policy for communicating with database.

Finally, a user inserts a query that returns the desired value.

  • query - What query to poll postgresql with. Query must return an integer.
  • targetQueryValue - A threshold that is used as targetValue or targetAverageValue (depending on the trigger metric type) in HPA. (This value can be a float)
  • activationTargetQueryValue - Target value for activating the scaler. Learn more about activation here.(Default: 0, Optional, This value can be a float)

Note that the query must return a single integer value. If the query has a possibility of returning null, a default value can be set using the COALESCE function. For example, SELECT COALESCE(column_name, 0) FROM table_name;. See PostgreSQL documentation for more information on the COALESCE function.

This is an example of using a full connection string with AIRFLOW_CONN_AIRFLOW_DB set as postgresql://test@localhost:

triggers:
- type: postgresql
  metadata:
    connectionFromEnv: AIRFLOW_CONN_AIRFLOW_DB
    query: "SELECT ceil(COUNT(*)::decimal / 16) FROM task_instance WHERE state='running' OR state='queued';"
    targetQueryValue: "1.1"
    activationTargetQueryValue: "5"

While this is an example of specifying each parameter:

triggers:
- type: postgresql
  metadata:
    userName: "kedaUser"
    passwordFromEnv: PG_PASSWORD
    host: postgres-svc.namespace.cluster.local #use the cluster-wide namespace as KEDA
                                                #lives in a different namespace from your postgres
    port: "5432"
    dbName: test_db_name
    sslmode: disable
    query: "SELECT ceil(COUNT(*)::decimal / 16) FROM task_instance WHERE state='running' OR state='queued';"
    targetQueryValue: "2.2"

Authentication Parameters

You can authenticate by using a password or store the password within the connectionString.

Connection String Authentication:

  • connection - Connection string for PostgreSQL database.

Password Authentication:

  • host - Service URL to PostgreSQL. Note that you should use a fully qualified URL (including the namespace) as KEDA will need to contact PostgreSQL from a different namespace.
  • userName - Username for PostgreSQL user.
  • password Password for configured user to login to PostgreSQL database variables.
  • port - PostgreSQL port.
  • dbName - PostgreSQL Database name.
  • sslmode - SSL policy for communicating with database.

Example

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: airflow-worker
spec:
  scaleTargetRef:
    name: airflow-worker
  pollingInterval: 10   # Optional. Default: 30 seconds
  cooldownPeriod: 30    # Optional. Default: 300 seconds
  maxReplicaCount: 10   # Optional. Default: 100
  triggers:
    - type: postgresql
      metadata:
        connectionFromEnv: AIRFLOW_CONN_AIRFLOW_DB
        query: "SELECT ceil(COUNT(*)::decimal / 16) FROM task_instance WHERE state='running' OR state='queued';"
        targetQueryValue: 1