New to KubeDB? Please start here.

Setting up Custom PostgresVersions

PostgresVersions are KubeDB crds that define the docker images KubeDB will use when deploying a postgres database. For more details about PostgresVersion crd, please visit here.

Creating a Custom Postgres Database Image for KubeDB

The best way to create a custom image is to build on top of the existing kubedb image.

FROM kubedb/postgres:10.2-v3

ENV TIMESCALEDB_VERSION 0.9.1

RUN set -ex \
    && apk add --no-cache --virtual .fetch-deps \
    ca-certificates \
    openssl \
    tar \
    && mkdir -p /build/timescaledb \
    && wget -O /timescaledb.tar.gz https://github.com/timescale/timescaledb/archive/$TIMESCALEDB_VERSION.tar.gz \
    && tar -C /build/timescaledb --strip-components 1 -zxf /timescaledb.tar.gz \
    && rm -f /timescaledb.tar.gz \
    \
    && apk add --no-cache --virtual .build-deps \
    coreutils \
    dpkg-dev dpkg \
    gcc \
    libc-dev \
    make \
    cmake \
    util-linux-dev \
    \
    && cd /build/timescaledb \
    && ./bootstrap \
    && cd build && make install \
    && cd ~ \
    \
    && apk del .fetch-deps .build-deps \
    && rm -rf /build

RUN sed -r -i "s/[#]*\s*(shared_preload_libraries)\s*=\s*'(.*)'/\1 = 'timescaledb,\2'/;s/,'/'/" /scripts/primary/postgresql.conf

From there, we would define a PostgresVersion that contains this new image. Let’s say we tagged it as myco/postgres:timescale-0.9.1

apiVersion: catalog.kubedb.com/v1alpha1
kind: PostgresVersion
metadata:
  name: timescaledb-2.14.2-pg14
spec:
  archiver:
    addon:
      name: postgres-addon
      tasks:
        manifestBackup:
          name: manifest-backup
        manifestRestore:
          name: manifest-restore
        volumeSnapshot:
          name: volume-snapshot
    walg:
      image: ghcr.io/kubedb/postgres-archiver:(v0.6.0)_14.10-alpine
  coordinator:
    image: ghcr.io/kubedb/pg-coordinator:v0.29.0
  db:
    baseOS: alpine
    image: timescale/timescaledb:2.14.2-pg14-oss
  distribution: TimescaleDB
  exporter:
    image: prometheuscommunity/postgres-exporter:v0.15.0
  initContainer:
    image: ghcr.io/kubedb/postgres-init:0.12.0
  podSecurityPolicies:
    databasePolicyName: postgres-db
  securityContext:
    runAsAnyNonRoot: false
    runAsUser: 70
  stash:
    addon:
      backupTask:
        name: postgres-backup-14.0
      restoreTask:
        name: postgres-restore-14.0
  version: "14.11"

Once we add this PostgresVersion we can use it in a new Postgres like:

apiVersion: kubedb.com/v1alpha2
kind: Postgres
metadata:
  name: timescale-postgres
  namespace: demo
spec:
  version: "timescaledb-2.14.2-pg14" # points to the name of our custom PostgresVersion
  storage:
    storageClassName: "standard"
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 1Gi