You are looking at the documentation of a prior release. To read the documentation of the latest release, please
visit here.
New to KubeDB? Please start here.
Running PostgreSQL
This tutorial will show you how to use KubeDB to run a PostgreSQL database.
āā
Before You Begin
At first, you need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using minikube.
Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps here.
To keep things isolated, this tutorial uses a separate namespace called demo throughout this tutorial.
$ kubectl create ns demo
namespace "demo" created
$ kubectl get ns demo
NAME    STATUS  AGE
demo    Active  5s
This tutorial will also use a pgAdmin to connect and test PostgreSQL database, once it is running.
Run the following command to prepare your cluster for this tutorial
$ kubectl create -f https://raw.githubusercontent.com/kubedb/cli/0.8.0-rc.0/docs/examples/postgres/quickstart/pgadmin.yaml
deployment "pgadmin" created
service "pgadmin" created
$ kubectl get pods -n demo --watch
NAME                       READY     STATUS              RESTARTS   AGE
pgadmin-54688976f7-5rxfs   0/1       ContainerCreating   0          9s
pgadmin-54688976f7-5rxfs   1/1       Running   0         11s
^Cā
Now, open pgAdmin in your browser by running minikube service pgadmin -n demo.
Or you can get the URL of Service pgadmin by running following command
$ minikube service pgadmin -n demo --url
http://192.168.99.100:32231
To log into the pgAdmin, use username admin and password admin.
Note: Yaml files used in this tutorial are stored in docs/examples/postgres folder in github repository kubedb/cli.
Create a PostgreSQL database
KubeDB implements a Postgres CRD to define the specification of a PostgreSQL database.
Below is the Postgres object created in this tutorial.
apiVersion: kubedb.com/v1alpha1
kind: Postgres
metadata:
  name: quick-postgres
  namespace: demo
spec:
  version: "9.6"
  doNotPause: true
  storage:
    storageClassName: "standard"
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 50Mi
Here,
spec.versionis the version of PostgreSQL database. In this tutorial, a PostgreSQL 9.6 database is created.spec.doNotPauseprevents user from deleting this object if admission webhook is enabled.spec.storagespecifies the StorageClass of PVC dynamically allocated to store data for this database. This storage spec will be passed to the StatefulSet created by KubeDB operator to run database pods. You can specify any StorageClass available in your cluster with appropriate resource requests. Since release 0.8.0-rc.0, a storage spec is required for MySQL.
$ kubedb create -f https://raw.githubusercontent.com/kubedb/cli/0.8.0-rc.0/docs/examples/postgres/quickstart/quick-postgres.yaml
postgres "quick-postgres" created
KubeDB operator watches for Postgres objects using Kubernetes api. When a Postgres object is created, KubeDB operator will create a new StatefulSet and two ClusterIP Service with the matching name.
KubeDB operator will also create a governing service for StatefulSet with the name kubedb, if one is not already present.
If RBAC is enabled in clusters, PostgreSQL specific RBAC permission is required. Check here for details.
KubeDB operator sets the status.phase to Running once the database is successfully created.
$ kubedb get pg -n demo quick-postgres -o wide
NAME             VERSION   STATUS    AGE
quick-postgres   9.6       Running   17m
Lets describe Postgres object quick-postgres
$ kubedb describe pg -n demo quick-postgres
Name:           quick-postgres
Namespace:      demo
StartTimestamp: Thu, 08 Feb 2018 14:44:24 +0600
Status:         Running
Volume:
  StorageClass: standard
  Capacity:     50Mi
  Access Modes: RWO
StatefulSet:
  Name:                 quick-postgres
  Replicas:             1 current / 1 desired
  CreationTimestamp:    Thu, 08 Feb 2018 14:44:29 +0600
  Pods Status:          1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Service:
  Name: quick-postgres
  Type: ClusterIP
  IP:   10.104.43.68
  Port: api	5432/TCP
Service:
  Name: quick-postgres-replicas
  Type: ClusterIP
  IP:   10.96.98.122
  Port: api	5432/TCP
Database Secret:
  Name:	quick-postgres-auth
  Type:	Opaque
  Data
  ====
  POSTGRES_PASSWORD:    16 bytes
Topology:
  Type      Pod                StartTime                       Phase
  ----      ---                ---------                       -----
  primary   quick-postgres-0   2018-02-08 14:44:29 +0600 +06   Running
No Snapshots.
Events:
  FirstSeen   LastSeen   Count     From                Type       Reason       Message
  ---------   --------   -----     ----                --------   ------       -------
  2m          2m         1         Postgres operator   Normal     Successful   Successfully patched StatefulSet
  2m          2m         1         Postgres operator   Normal     Successful   Successfully patched Postgres
  2m          2m         1         Postgres operator   Normal     Successful   Successfully created StatefulSet
  2m          2m         1         Postgres operator   Normal     Successful   Successfully created Postgres
  4m          4m         1         Postgres operator   Normal     Successful   Successfully created Service
  4m          4m         1         Postgres operator   Normal     Successful   Successfully created Service
$ kubectl get service -n demo --selector=kubedb.com/kind=Postgres,kubedb.com/name=quick-postgres
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
quick-postgres              ClusterIP   10.104.43.68   <none>        5432/TCP   5m
quick-postgres-replicas     ClusterIP   10.96.98.122   <none>        5432/TCP   5m
Two services for each Postgres object.
- Service 
quick-postgrestargets only one Pod which is acting as primary server - Service 
quick-postgres-replicastargets all Pods created by StatefulSet 
KubeDB supports PostgreSQL clustering where Pod can be either primary or standby. To learn how to configure highly available PostgreSQL cluster, click here.
Here, we create a PostgreSQL database with single node, primary only.
Please note that KubeDB operator has created a new Secret called quick-postgres-auth for storing the password for postgres superuser.
apiVersion: v1
data:
  POSTGRES_PASSWORD: OXFyUktkNWFBT1JnSC1hVg==
kind: Secret
metadata:
  creationTimestamp: 2018-02-08T08:44:29Z
  labels:
    kubedb.com/kind: Postgres
    kubedb.com/name: quick-postgres
  name: quick-postgres-auth
  namespace: demo
  resourceVersion: "19311"
  selfLink: /api/v1/namespaces/demo/secrets/quick-postgres-auth
  uid: 46ac9a71-0cac-11e8-b21d-0800273fbab1
type: Opaque
This Secret contains postgres superuser password as POSTGRES_PASSWORD key.
Note: Auth Secret name format:
{postgres-name}-auth
Now, you can connect to this database from the pgAdmin dashboard using Service quick-postgres.demo and postgres superuser password .
Connection information:
- address: you can use any of these
- Service 
quick-postgres.demo - Pod IP (
$ kubectl get pods quick-postgres-0 -n demo -o yaml | grep podIP) 
 - Service 
 - port: 
5432 - database: 
postgres - username: 
postgres 
Run following command to get postgres superuser password
$ kubectl get secrets -n demo quick-postgres-auth -o jsonpath='{.data.\POSTGRES_PASSWORD}' | base64 -d

Pause Database
KubeDB takes advantage of ValidationWebhook feature in Kubernetes 1.9.0 or later clusters to implement doNotPause feature.
If admission webhook is enabled, It prevents user from deleting the database as long as the spec.doNotPause is set true.
In this tutorial, Postgres quick-postgres is created with spec.doNotPause: true. So, if you delete this Postgres object, admission webhook will nullify the delete operation.
$ kubedb delete pg -n demo quick-postgres
error: Postgres "quick-postgres " can't be paused. To continue delete, unset spec.doNotPause and retry.
To continue with this tutorial, unset spec.doNotPause by updating Postgres object
$ kubedb edit pg -n demo quick-postgres
spec:
  doNotPause: false
Now, if you delete the Postgres object, KubeDB operator will create a matching DormantDatabase object. KubeDB operator watches for DormantDatabase objects and it will take necessary steps when a DormantDatabase object is created.
KubeDB operator will delete the StatefulSet and its Pods, but leaves the Secret, PVCs unchanged.
$ kubedb delete pg -n demo quick-postgres
postgres "quick-postgres" deleted
Check DormantDatabase entry
$ kubedb get drmn -n demo quick-postgres
NAME             STATUS    AGE
quick-postgres   Paused    19s
In KubeDB parlance, we say that Postgres quick-postgres has entered into dormant state.
Lets see, what we have in this DormantDatabase object
$ kubedb get drmn -n demo quick-postgres -o yaml
apiVersion: kubedb.com/v1alpha1
kind: DormantDatabase
metadata:
  clusterName: ""
  creationTimestamp: 2018-02-08T09:33:22Z
  finalizers:
  - kubedb.com
  generation: 0
  labels:
    kubedb.com/kind: Postgres
  name: quick-postgres
  namespace: demo
  resourceVersion: "24091"
  selfLink: /apis/kubedb.com/v1alpha1/namespaces/demo/dormantdatabases/quick-postgres
  uid: 1ab5628d-0cb3-11e8-b21d-0800273fbab1
spec:
  origin:
    metadata:
      creationTimestamp: null
      name: quick-postgres
      namespace: demo
    spec:
      postgres:
        databaseSecret:
          secretName: quick-postgres-auth
        resources: {}
        storage:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 50Mi
          storageClassName: standard
        version: "9.6"
status:
  creationTime: 2018-02-08T09:33:22Z
  pausingTime: 2018-02-08T09:33:24Z
  phase: Paused
Here,
spec.origincontains original Postgres object.status.phasepoints to the current database statePaused.
Resume DormantDatabase
To resume the database from the dormant state, create same Postgres object with same Spec.
In this tutorial, the DormantDatabase quick-postgres can be resumed by creating original Postgres object.
The below command will resume the DormantDatabase quick-postgres
$ kubedb create -f https://raw.githubusercontent.com/kubedb/cli/0.8.0-rc.0/docs/examples/postgres/quickstart/quick-postgres.yaml
postgres "quick-postgres" created
WipeOut DormantDatabase
You can wipe out a DormantDatabase while deleting the objet by setting spec.wipeOut to true. KubeDB operator will delete any relevant resources of this Elasticsearch database (i.e, PVCs, Secrets, Snapshots). It will also delete snapshot data stored in the Cloud Storage buckets.
$ kubedb edit drmn -n demo quick-postgres
spec:
  wipeOut: true
If spec.wipeOut is not set to true while deleting the dormantdatabase object, then only this object will be deleted and kubedb-operator won’t delete related Secrets, PVCs and Snapshots. So, user still can access the stored data in the cloud storage buckets as well as PVCs.
Delete DormantDatabase
As it is already discussed above, DormantDatabase can be deleted with or without wiping out the resources. To delete the dormantdatabase,
$ kubedb delete drmn -n demo quick-postgres
dormantdatabase "quick-postgres" deleted
Cleaning up
To cleanup the Kubernetes resources created by this tutorial, run:
$ kubectl patch -n demo pg/quick-postgres -p '{"spec":{"doNotPause":false}}' --type="merge"
$ kubectl delete -n demo pg/quick-postgres
$ kubectl patch -n demo drmn/quick-postgres -p '{"spec":{"wipeOut":true}}' --type="merge"
$ kubectl delete -n demo drmn/quick-postgres
$ kubectl delete ns demo
Next Steps
- Learn about taking instant backup of PostgreSQL database using KubeDB Snapshot.
 - Learn how to schedule backup of PostgreSQL database.
 - Learn about initializing PostgreSQL with Script.
 - Learn about initializing PostgreSQL from KubeDB Snapshot.
 - Want to setup PostgreSQL cluster? Check how to configure Highly Available PostgreSQL Cluster
 - Monitor your PostgreSQL database with KubeDB using built-in Prometheus.
 - Monitor your PostgreSQL database with KubeDB using CoreOS Prometheus Operator.
 - Detail concepts of Postgres object.
 - Detail concepts of Snapshot object.
 - Use private Docker registry to deploy PostgreSQL with KubeDB.
 - Wondering what features are coming next? Please visit here.
 - Want to hack on KubeDB? Check our contribution guidelines.
 






























