Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / DevOps / deployment

Deploy and Manage PostgreSQL on Kubernetes

0.00/5 (No votes)
31 Mar 2021CPOL7 min read 10.7K  
Easily deploy PostgreSQL pod in Kubernetes
This post discusses how to easily deploy a PostgreSQL pod in Kubernetes, which will allow users to leverage the strengths of both platforms.

PostgreSQL database is an enterprise-grade, open-source object-relational database system focused on providing a highly scalable and robust platform while conforming to SQL standards. Kubernetes is an open-source container orchestration platform designed to be easily deployable in any environment. It enables users to easily deploy and manage containerized applications.

Utilizing Kubernetes to deploy a PostgreSQL instance allows users to leverage the strengths of both platforms. Furthermore, it enables users to create a highly portable and scalable PostgreSQL instance in a Kubernetes cluster. In this article, we will discuss how to easily deploy a PostgreSQL pod in Kubernetes.

What Options are Available to Deploy PostgreSQL?

When it comes to deploying PostgreSQL on Kubernetes, there are two options. One is to create a Kubernetes deployment from scratch, and the other is to use a helm chart to carry out the deployment.

Option 01 - Creating Deployment Configuration From Scratch

This option requires the user to set up the ConfigMaps, create and set up persistent storage volumes and then create the PostgreSQL deployment and service. This process involves a higher degree of planning and technical knowledge to get the service up and running. Therefore, only use this option if you have specific requirements that require custom configurations from the ground up such as complex persistent storage configurations, network and security policies, multi cluster connectivity, etc.

Option 02 - Use a Helm Chart

Helm charts can be considered a type of package that can be used to easily deploy applications to Kubernetes clusters. These charts can be used in any kind of deployment, from a single pod application to complex applications consisting of multiple pods with different software and services.

In this article, we will focus on using a helm chart to deploy a PostgreSQL instance. Before that, we should know what Helm is and how to configure Helm in a development environment.

What is Helm?

Helm is the package manager for Kubernetes. It is an open-source project started with the goal of providing a more efficient way to manage Kubernetes YAML files are created when deploying an application.

Currently, Helm has evolved into a fully-fledged package manager that streamlines the installation, upgrading, dependency management, and configuration of applications on a Kubernetes cluster using simple CLI commands (Helm Client).

Helm Architecture

Helm creates packages by creating helm charts that bundle one or more Kubernetes manifests (YAML files). These charts contain all the dependencies of the project and allow users to deploy an application with a single command. Additionally, charts can be versioned so that users can create different configurations for the same helm chart under different versions.

Helm is Composed of Three Main Concepts

  • Chart - Contains information required to create an application instance in Kubernetes
  • Config - Contains the configuration information that can be merged with a chart to create a releasable object
  • Release - A running instance of a chart, combined with a specific config

The Helm executable can be broken down into two components as follows:

  • The Helm Client: A command-line tool used by end-users to create and manage helm charts and interfaces with the Helm library.
  • The Helm Library: Interfaces with the Kubernetes API and executes all the helm operations.

Both of these are written in the Go programming language. To connect with Kubernetes, Helm utilizes the Kubernetes client library using REST API.

How to Install Helm

Before installing Helm, we need to have a Kubernetes cluster configured and running. It is recommended to use the latest stable release of Kubernetes.

Installing Helm is a simple process. You can use a package manager like Homebrew for Mac, Chocolatey/Scoop for Windows, or apt/Snap for Debian/Ubuntu. Another way to install Helm is by downloading the binary for the related operating system.

The following example demonstrates how to install Helm using the chocolatey package manager in a windows environment.

choco install kubernetes-helm

RESULT

Image 1

That’s it, and you have completed installing Helm. Next, let’s verify the installation by checking the helm version using the command below:

helm version

RESULT

Image 2

Finding Helm Charts

You have the option to create helm charts from scratch. However, there are also prebuilt charts that can be deployed instantly for popular software like PostgreSQL. There, Helm charts are stored and shared using a chart repository.

Artifact Hub is the official distributed community Helm chart repository. For third-party repositories, we need to add the repository to our local environment before we can use it.

Available PostgreSQL Charts

First, we have to find a suitable PostgreSQL helm chart for deployment. For that, we can search the Artifact Hub using the following command in the CLI interface.

helm search hub postgresql

RESULT

Image 3

The above command will search for all the available charts in the Artifact Hub for a PostgreSQL chart. The hub parameter points to the Artifact Hub.

To search in a third-party repository, first, we need to add the repository to our helm installation. It can be done through the repo add command. The following example shows how to add the bitnami repository to our helm installation and search for the repository.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo bitnami

RESULT

Image 4

In the above search command, we use the parameter repo to carry out the search in the newly added repository apart from the artifact hub. Now let’s search for PostgreSQL instances in this repo using the following command:

helm search repo postgresql

RESULT

Image 5

Installing Helm Charts

By now, we have located a helm chart, and the next step would be to install the chart using the helm install command, as shown below:

Syntax

helm install <Pod Name> <Chart Name>

Code

helm install postgresql-dev bitnami/postgresql

RESULT

Image 6

Wait till the installation is completed. Then, check the Kubernetes environment, and you will see that a PostgreSQL instance has been deployed successfully.

kubectl get all

RESULT

Image 7

Now we have deployed a PostgreSQL container. The next step would be to connect to the database, and it can be done using the following commands.

We need to extract the password of the instance and save it as an environmental variable. That password will be used to create the connection.

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql-test -o jsonpath="{.data.postgresql-password}" | base64 --decode)

kubectl run postgresql-test-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:11.11.0-debian-10-r31 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgresql-test -U postgres -d postgres -p 5432

RESULT

Image 8

After connecting to the database successfully, we can verify our installation by checking the server version.

Configuration Options

Depending on the selected helm chart, the available configuration options may differ. The bitnami PostgreSQL chart offers a whole host of options from simple user creation to complex security configurations like setting up certificates and policies. All the available options are listed on the helm chart GitHub page.

Let's look at some common options, such as changing the username, password, database name, and port. This can be done by providing the following parameters while installing the helm chart.

helm install postgresql-test01 bitnami/postgresql --set global.postgresql.postgresqlUsername=testadmin --set global.postgresql.postgresqlPassword=testadmin123 --set global.postgresql.postgresqlDatabase=testdb --set global.postgresql.servicePort=5555

RESULT

Image 9

The above output indicates that the new port is configured, and a new user is created. If we export the password for the “testadmin” user, it will return the user-defined password.

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql-test01 -o jsonpath="{.data.postgresql-password}" | base64 --decode)

RESULT

Image 10

Another common scenario is to configure persistent storage for PostgreSQL deployment. We need to create persistent storage volume before installing the helm chart. The below code block shows how to create a simple storage volume and a volume claim and then attach it to the PostgreSQL deployment.

test-pv.yaml

YAML
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgresql-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

test-pvc.yaml

YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgresql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Create the volume and claim:

kubectl apply -f test-pv.yaml
kubectl apply -f test-pvc.yaml
kubectl get pvc

RESULT

Image 11

Then, we can attach the persistent volume claim to the helm chart using the following command. We will set the volumePermissions.enabled to true for mitigating any permission issues that can occur when writing to the storage volume.

helm install postgresql-test02 bitnami/postgresql --set persistence.existingClaim=postgresql-pv-claim --set volumePermissions.enabled=true

RESULT

Image 12

Upgrading Helm Chart

When upgrading the PostgreSQL helm, it is essential to provide the existing postgresqlPassword and replication.password parameters. It will ensure these values are not updated with random details, which will lead to an inaccessible database.

Syntax

helm upgrade <Pod Name> <Chart Name> --set postgresqlPassword=<POSTGRESQL_PASSWORD> --set replication.password=<REPLICATION_PASSWORD>

Code

helm upgrade postgresql-test bitnami/postgresql --set postgresqlPassword=testadmin123 --set replication.password=12345

RESULT

Image 13

Deleting a Helm Chart

We can simply delete a helm chart by providing the chart name with the delete command, as shown below:

Syntax

helm delete <Chart Name>

Code

helm delete postgresql-test

RESULT

Image 14

However, this would not delete any PVC associated with the chart. So we need to delete the unused PVCs manually.

kubectl get pvc
kubectl delete pvc data-postgresql-test-postgresql-0

RESULT

Image 15

Conclusion

In this article, we learned how to deploy a PostgreSQL database in a Kubernetes cluster using a helm chart, change the configurations, and upgrade and delete the PostgreSQL chart. Using helm charts is a relatively straightforward method to deploy commonly used applications in a Kubernetes cluster. This frees up the users to concentrate on the development of the database without having to create complex Kubernetes configurations.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)