Deploying PostgreSQL on Kubernetes

Written by hackernoon-archives | Published 2017/03/22
Tech Story Tags: devops | dockerfiles | postgres | docker | kubernetes

TLDRvia the TL;DR App

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”.

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 XenonStack

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/brick1/postgres-disk  k8-1:/mnt/brick1/postgres-disk
$ gluster volume start postgres-disk
$ gluster volume info postgres-disk

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

Continue Reading The Full Article At — XenonStack.com/Blog


Published by HackerNoon on 2017/03/22