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
NooBaaCRDS 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
replicasis set to3, so we have a HA PostgreSQL. - The
storageis set to10Gi, so we have a 10Gi storage. - The
storageTypeis set toDurable, so we have a durable storage.
Note: The
versionis set to15.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
NooBaaCRDS, and create a defaultNooBaaCR. - The
--postgres-urlis the URL of the postgres database. - The
--manual-default-backingstore=truedisable the defaultBackingStore, that means you need to create your ownBackingStoremanually. - The
--disable-load-balancer=truedisable the load balancer. If you use externalIngress, 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
manualDefaultBackingStoreis set totrue, so you need to create your ownBackingStoremanually. - The
dbTypeis set topostgres, so you need to provide the postgres URL. - The
externalPgSSLUnauthorizedis set totrue, so you need to provide the postgres URL. - The
externalPgSecretis 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-Cephfor Volume Provisioning, you can any what you’ve in your cluster.
Here,
- The
numVolumesis set to1, so we have a single volume. - The
resourcesis set to16Gi, so we have a 16Gi storage. - The
typeis set topv-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







