Extension Management

Extensions combine functions, data types, casts, etc. – everything you need to add some new feature to PostgreSQL in an easy to install package. How easy to install? For many extensions, like the fuzzystrmatch extension, it’s as easy as connecting to the database and running a command like this:

CREATE EXTENSION fuzzystrmatch;

However, in other cases, an extension might require additional configuration management. PGO lets you add those configurations to the PostgresCluster spec easily.

PGO also allows you to add a custom databse initialization script in case you would like to automate how and where the extension is installed.

This guide will walk through adding custom configuration for an extension and automating installation, using the example of Crunchy Data’s own pgnodemx extension.

pgnodemx

pgnodemx is a PostgreSQL extension that is able to pull container-specific metrics (e.g. CPU utilization, memory consumption) from the container itself via SQL queries.

In order to do this, pgnodemx requires information from the Kubernetes DownwardAPI to be mounted on the PostgreSQL pods. Please see the pgnodemx and the DownwardAPI section of the backup architecture page for more information on where and how the DownwardAPI is mounted.

pgnodemx Configuration

To enable the pgnodemx extension, we need to set certain configurations. Luckily, this can all be done directly through the spec:

spec:
  patroni:
    dynamicConfiguration:
      postgresql:
        parameters:
          shared_preload_libraries: pgnodemx
          pgnodemx.kdapi_enabled: on
          pgnodemx.kdapi_path: /etc/database-containerinfo

Those three settings will

  • load pgnodemx at start;
  • enable the kdapi functions (which are specific to the capture of Kubernetes DownwardAPI information);
  • tell pgnodemx where those DownwardAPI files are mounted (at the /etc/dabatase-containerinfo path).

If you create a PostgresCluster with those configurations, you will be able to connect, create the extension in a database, and run the functions installed by that extension:

CREATE EXTENSION pgnodemx;
SELECT * FROM proc_diskstats();

Automating pgnodemx Creation

Now that you know how to configure pgnodemx, let’s say you want to automate the creation of the extension in a particular database, or in all databases. We can do that through a custom database initialization.

First, we have to create a ConfigMap with the initialization SQL. Let’s start with the case where we want pgnodemx created for us in the hippo database. Our initialization SQL file might be named init.sql and look like this:

\c hippo\\
CREATE EXTENSION pgnodemx;

Now we create the ConfigMap from that file in the same namespace as our PostgresCluster will be created:

kubectl create configmap hippo-init-sql -n postgres-operator --from-file=init.sql=path/to/init.sql

You can check that the ConfigMap was created and has the right information:

kubectl get configmap -n postgres-operator hippo-init-sql -o yaml

apiVersion: v1
data:
  init.sql: |-
    \c hippo\\
    CREATE EXTENSION pgnodemx;
kind: ConfigMap
metadata:
  name: hippo-init-sql
  namespace: postgres-operator

Now, in addition to the spec changes we made above to allow pgnodemx to run, we add that ConfigMap’s information to the PostgresCluster spec: the name of the ConfigMap (hippo-init-sql) and the key for the data (init.sql):

spec:
  databaseInitSQL:
    key: init.sql
    name: hippo-init-sql

Apply that spec to a new or existing PostgresCluster, and the pods should spin up with pgnodemx already installed in the hippo database.