How To Deploy PostgreSQL with Docker on Kubernetes

Reading Time: 4 Minutes

by  | March 10, 2017  How To Deploy PostgreSQL with Docker on Kubernetes

What is PostgreSQL?

PostgreSQL is a powerful, open source Relational Database Management System. PostgreSQL is not controlled by any organization or any individual. Its source code is available free of charge. It is pronounced as "post-gress-Q-L". 

Continuous delivery is a branch of continuous integration. It concentrates on automating the software delivery process so that teams can quickly and confidently deploy their code to production at any point.

Read More About Continuous delivery

PostgreSQL has earned a strong reputation for its reliability, data integrity, and correctness. 

  • It runs on all major operating systems, including Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, MacOS, Solaris, Tru64), and Windows. 
  • It is fully ACID compliant, has full support for foreign keys, joins, views, triggers, and stored procedures (in multiple languages). 
  • It includes most SQL:2008 data types, including INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL, and TIMESTAMP. 
  • It also supports storage of binary large objects, including pictures, sounds, or video. 
  • It has native programming interfaces for C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, among others, and exceptional documentation.

Prerequisites

To follow this guide you need -

Step 1 - Create a PostgreSQL Container Image

Create a file name “Dockerfile” for PostgreSQL. This image contains our custom config dockerfile which will look like -


FROM ubuntu: latest
MAINTAINER Don

RUN apt - key adv--keyserver hkp: //p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

 RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" > /etc/apt / sources.list.d / pgdg.list

RUN apt - get update && apt - get install - y python - software - properties software - properties - common postgresql - 9.6 postgresql - client - 9.6 postgresql - contrib - 9.6

RUN / etc / init.d / postgresql start && \
 psql--command "CREATE USER root WITH SUPERUSER PASSWORD 'xenonstack';" && \
 createdb - O root xenonstack

RUN echo "host all  all	0.0.0.0/0  md5" >> /etc/postgresql / 9.6 / main / pg_hba.conf

RUN echo "listen_addresses='*'" >> /etc/postgresql / 9.6 / main / postgresql.conf

# Expose the PostgreSQL port
EXPOSE 5432

# Add VOLUMEs to allow backup of databases
VOLUME["/var/lib/postgresql"]

# Set the
default command to run when starting the container
CMD["/usr/lib/postgresql/9.6/bin/postgres", "-D", "/var/lib/postgresql", "-c", "config_file=/etc/postgresql/9.6/main/postgresql.conf"]

This Postgres image has a base image of ubuntu xenial. After that, we create Super User and default databases. Exposing 5432 port will help external system to connect the PostgreSQL server.

Step 2 - Build PostgreSQL Docker Image


$ docker build - t dr.xenonstack.com: 5050 / postgres: v9 .6

Step 3 - Create a Storage Volume (Using GlusterFS)

Using below-mentioned command create a volume in GlusterFS for PostgreSQL and start it. As we don’t want to lose our PostgreSQL Database data just because a Gluster server dies in the cluster, so we put replica 2 or more for higher availability of data.


$ gluster volume create postgres - disk replica 2 transport tcp k8 - master: /mnt/brick
1 / postgres - disk k8 - 1: /mnt/brick
1 / postgres - disk
$ gluster volume start postgres - disk
$ gluster volume info postgres - disk

deploying-postgresql-on-kubernetes

Step 4 - Deploy PostgreSQL on Kubernetes

Deploying PostgreSQL on Kubernetes have following prerequisites -

  • Docker Image: We have created a Docker Image for Postgres in Step 2

  • Persistent Shared Storage Volume: We have created a Persistent Shared Storage Volume in Step 3

  • Deployment & Service Files: Next, we will create Deployment & Service Files

Create a file name “deployment.yml” for PostgreSQL. This deployment file will look like -


apiVersion: extensions / v1beta1
kind: Deployment
metadata:
 name: postgres
namespace: production
spec:
 replicas: 1
template:
 metadata:
 labels:
 k8s - app: postgres
spec:
 containers:
 -name: postgres
image: dr.xenonstack.com: 5050 / postgres: v9 .6
imagePullPolicy: "IfNotPresent"
ports:
 -containerPort: 5432
env:
 -name: POSTGRES_USER
value: postgres - name: POSTGRES_PASSWORD
value: superpostgres - name: PGDATA
value: /var/lib / postgresql / data / pgdata
volumeMounts:
 -mountPath: /var/lib / postgresql / data
name: postgredb
volumes:
 -name: postgredb
glusterfs:
 endpoints: glusterfs - cluster
path: postgres - disk
readOnly: false

We need to Define the Environment Variables for PostgreSQL

1. POSTGRES_USER (Super Username for PostgreSQL)

2. POSTGRES_PASSWORD (Super User password for PostgreSQL)

3. PGDATA (Data Directory for PostgreSQL Database)

Now we need to create a file named “service.yml” for PostgreSQL. This deployment file will look like -


apiVersion: v1
kind: Service
metadata:
 labels:
 k8s - app: postgres
name: postgres
namespace: production
spec:
 type: NodePort
ports:
 -port: 5432
selector:
 k8s - app: postgres
 
 

Now let's deploy PostgreSQL using following commands:


$ kubectl create - f deployment.yml
$ kubectl create - f service.yml

deploying-postgresql-on-kubernetes

Now you have successfully Deployed PostgreSQL on Kubernetes

Summary

PostgreSQL is a powerful, open source object-relational database system. PostgreSQL on kubernetes helped to utilize resources even much better than virtual machines and also provide isolation from other apps which are deployed on the same machine.

At Don we have specialized professionals that can help you in starting with Microservices Architecture, NoSQL and SQL Database like PostgreSQL On Docker & Kubernetes. Reach Us for Development, Deployment, and Consulting for MicroServices, Kubernetes, and Docker Technology Solutions.

Don Offerings

Don is a leading Software Company in Product Development and Solution Provider for DevOps, Big Data Integration, Real Time Analytics & Data Science.

Product NexaStack - Unified DevOps Platform Provides monitoring of Kubernetes, Docker, OpenStack infrastructure, Big Data Infrastructure and uses advanced machine learning techniques for Log Mining and Log Analytics.

Product ElixirData - Modern Data Integration Platform Enables enterprises and Different agencies for Log Analytics and Log Mining. 

Product Akira.AI is an Automated & Knowledge Drive Artificial Intelligence Platform that enables you to automate the Infrastructure to train and deploy Deep Learning Models on Public Cloud as well as On-Premises.