Installation Guide

This guide sets up NooBaa with PostgreSQL (via KubeDB) and backup support (via KubeStash). You must complete this installation before exploring any NooBaa features.


Install Operators

We need three operators:

Install NooBaa Operator

NooBaa operator can only install using the NooBaa CLI. Download your desired file, extract the binary and place it in your PATH. https://github.com/noobaa/noobaa-operator/releases/tag/v5.18.1

$ noobaa operator install --operator-image=ghcr.io/kubeobj/noobaa-operator:<release-version>
$ noobaa crd create

Here,

  • This will automatically install all NooBaa CRDS and NooBaa components e,g(endpoints, operator, etc)

Install KubeDB Operator

Get a Free License

Download a FREE license from AppsCode License Server.

KubeDB licensing process has been designed to work with CI/CD workflow. You can automatically obtain a license from your CI/CD pipeline by following the guide from here.

$ helm install kubedb oci://ghcr.io/appscode-charts/kubedb \
  --version <VERSION> \
  --namespace kubedb --create-namespace \
  --set-file global.license=/path/to/the/license.txt \
  --wait --burst-limit=10000 --debug

Or, Simply follow the guide to install KubeDB.

Install KubeStash Operator

$ helm install kubestash oci://ghcr.io/appscode-charts/kubestash \
  --version <VERSION> \
  --namespace stash --create-namespace \
  --set-file global.license=/path/to/the/license.txt \
  --wait --burst-limit=10000 --debug

Or, Simply follow the guide to install KubeStash.


Deploy a HA PostgreSQL with KubeDB

We need a HA PostgreSQL with KubeDB to store the NooBaa data. This PostgreSQL need to be HA enabled. We will use the following YAML to deploy a HA PostgreSQL.

apiVersion: kubedb.com/v1
kind: Postgres
metadata:
  name: nbcore-postgres
  namespace: noobaa
spec:
  replicas: 3
  storage:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 10Gi
  storageType: Durable
  version: "15.12"
  podTemplate:
    spec:
      containers:
        - name: postgres
          env:
            - name: POSTGRES_DB
              value: pgdb
          resources:
            requests:
              memory: "6Gi"
              cpu: "800m"

Here,

  • The replicas is set to 3, so we have a HA PostgreSQL.
  • The storage is set to 10Gi, so we have a 10Gi storage.
  • The storageType is set to Durable, so we have a durable storage.

Note: The version is set to 15.12, NooBaa has some limitation about supporting PostgreSQL versions so, before applying check the supported version.

Create Database and Auth Secret for NooBaa

NooBaa requires a dedicated database in PostgreSQL. We will create the database, prepare a connection URL, and store it as a Kubernetes Secret.

Create a database named nbcore

$ kubectl exec -it -n noobaa nbcore-postgres-0 -- \
  psql -U postgres -d postgres \
  -c "CREATE DATABASE nbcore WITH LC_COLLATE = 'C' TEMPLATE template0;"

Prepare Database URL Retrieve the PostgreSQL credentials generated by KubeDB:

$ kubectl view-secret -n noobaa nbcore-postgres-auth

password='<your-password>'
username='postgres'

Build the DB connection URL:

postgres://postgres:<your-password>@nbcore-postgres.noobaa.svc.cluster.local:5432/nbcore

Create Auth Secret for NooBaa Save the DB connection URL in a Kubernetes Secret:

$ kubectl create secret generic noobaa-external-pg-db \
    --namespace=noobaa \
    --from-literal=db_url='postgres://postgres:<your-password>@nbcore-postgres.noobaa.svc.cluster.local:5432/nbcore'

Install NooBaa

Once the NooBaa CRDs and Operator are installed, you can deploy NooBaa in two ways: using the NooBaa CLI or by applying a NooBaa Custom Resource (CR). Choose the method that best suits your workflow.


Option 1: Deploy NooBaa Using the NooBaa CLI

The NooBaa CLI provides a quick and straightforward way to deploy NooBaa.

$ noobaa install \
  --disable-load-balancer=true \
  --postgres-url='<db-url>' \
  --manual-default-backingstore=true \
  --noobaa-image=ghcr.io/kubeobj/noobaa-core:<release-version>

Here,

  • This will automatically install all NooBaa CRDS, and create a default NooBaa CR.
  • The --postgres-url is the URL of the postgres database.
  • The --manual-default-backingstore=true disable the default BackingStore, that means you need to create your own BackingStore manually.
  • The --disable-load-balancer=true disable the load balancer. If you use external Ingress, you need to disable the load balancer.

Option 2: Deploy NooBaa Using a Custom Resource (CR)

You can also deploy NooBaa by applying a YAML manifest for the NooBaa Custom Resource.

apiVersion: noobaa.io/v1alpha1
kind: NooBaa
metadata:
  name: noobaa
  namespace: noobaa
spec:
  bucketNotifications:
    enabled: false
  dbType: postgres
  externalPgSSLUnauthorized: true
  externalPgSecret:
    name: noobaa-external-pg-db
    namespace: noobaa
  image: noobaa/noobaa-core:master-20240520
  manualDefaultBackingStore: true

Here,

  • The manualDefaultBackingStore is set to true, so you need to create your own BackingStore manually.
  • The dbType is set to postgres, so you need to provide the postgres URL.
  • The externalPgSSLUnauthorized is set to true, so you need to provide the postgres URL.
  • The externalPgSecret is set to the secret that contains the postgres URL.

Create DefaultBackingStore for NooBaa

As, we have disabled the default BackingStore, we need to create our own BackingStore manually for basic operations.

apiVersion: noobaa.io/v1alpha1
kind: BackingStore
metadata:
  name: noobaa-default-backing-store
  namespace: noobaa
spec:
  pvPool:
    numVolumes: 1
    resources:
      requests:
        storage: 16Gi
        memory: 2Gi
        cpu: 1000m
      limits:
        memory: 2Gi
        cpu: 1000m
    secret: {}
  type: pv-pool

Note: I’m using Rook-Ceph for Volume Provisioning, you can any what you’ve in your cluster.

Here,

  • The numVolumes is set to 1, so we have a single volume.
  • The resources is set to 16Gi, so we have a 16Gi storage.
  • The type is set to pv-pool, so we have a local backing store, it can be any cloud storage as well.

Now, We’ve successfully done our NooBaa installation.


Verify the Default Bucket Creation and Access the Bucket

Now, let’s connect with the NooBaa S3 endpoint and verify the bucket creation.

export EXTERNAL_IP=$(kubectl get svc s3 -n noobaa -o json | jq -r '.status.loadBalancer.ingress[0].ip')
export NOOBAA_ACCESS_KEY=$(kubectl get secret noobaa-admin -n noobaa -o json | jq -r '.data.AWS_ACCESS_KEY_ID|@base64d')
export NOOBAA_SECRET_KEY=$(kubectl get secret noobaa-admin -n noobaa -o json | jq -r '.data.AWS_SECRET_ACCESS_KEY|@base64d')
alias s3='AWS_ACCESS_KEY_ID=$NOOBAA_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$NOOBAA_SECRET_KEY aws --endpoint https://$EXTERNAL_IP:443 --no-verify-ssl s3'
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
export AWS_RESPONSE_CHECKSUM_CALCULATION=when_required

Let’s verify the bucket creation.

s3 ls 
2025-08-26 18:57:55 first.bucket