Deploying the PostgreSQL Operator on GKE

Patrick McLaughlin

6 min read

The Crunchy PostgreSQL Operator 4.0 provides an open source PostgreSQL-as-a-Service for Kubernetes platform.

This post provides some easy steps to help you get started, specifically deploying the Crunchy PostgreSQL Operator in Google Kubernetes Engine (GKE) making use of the Crunchy PostgreSQL Operator Ansible Installer.

PostgreSQL Operator Ansible Installer

The Crunchy PostgreSQL Operator 4.0 provides Ansible playbooks to automate the installation. These Ansible playbooks allow users to deploy the operator to a variety of Kubernetes platforms and automate a number of installation steps, including:

  • Generate TLS certificates required by the PostgreSQL Operator
  • Configure PostgreSQL Operator settings from a single inventory file

Preparation of GKE Environment

Given that this example leverages GKE, perhaps it goes without saying that you must be either an existing GKE user or begin by creating a GKE account.

If you are an existing GKE user, with the Google Cloud SDK installed and Kubernetes Engine Admin privileges, you can move on to "Installation of the PostgreSQL Operator Playbooks"

If you are not currently a GKE user, Google Cloud Platform provides a quickstart with the necessary steps. A few tips to consider:

  • Ensure that the Google Kubernetes Engine API is enabled for your project. If you do not see “API enabled”, then you may enable the API by clicking the “Enable this API” button.

  • It is necessary to install and configure the Google Cloud SDK and include the kubectl component.

  • Set your default compute service account to include: (1) Kubernetes Engine Admin and (2) Editor (on by default). To set this up, navigate to the IAM section of the Cloud Console.

Installation of the PostgreSQL Operator Playbooks

The Crunchy PostgreSQL Operator roles associated with the Crunchy PostgreSQL Operator Installer are available in the postgres-operator project repository. These roles are dependent on Ansible 2.4.6+.

In order to deploy those roles it is necessary to clone that repository in your local environment.

Configuration of Permissions

The installation of the Crunchy PostgreSQL Operator requires elevated privileges. In particular, it is required that the playbooks are run as a cluster-admin to ensure the playbooks can install:

Please confirm that you have the necessary cluster-admin privileges before proceeding.

Configuration of Operator Variables in the Inventory File

The inventory file included with the PostgreSQL Operator Playbooks allows the Ansible installer to configure how the operator will function when deployed into Kubernetes.

The table provided at the end of this post under the heading "More Information - Default Installation Configurations" provides a list of the installed operator variables implemented by the Ansible playbook.

It is of course worth noting that these values are provided for a simple single zone, "getting started" deployment to evaluate and test the operator, and are not intended for production environments.

This table is provided for your information only, no action is required to complete the install.

Install the PostgreSQL Operator

In order to install the PostgreSQL Operator, it is necessary to simply run the following command:

ansible-playbook -i /path/to/inventory --tags=install --ask-become-pass main.yml

This may take a few minutes to deploy.

Verifying the Installation

To check the status of the deployment run the following:

kubectl get deployments -n pgo
kubectl get pods -n pgo

After the Crunchy PostgreSQL Operator has successfully been installed we will need to configure local environment variables before using the pgo client.

To configure the environment variables used by pgo run the following command:

cat <<EOF >> ~/.bashrc
export PGO_NAMESPACE=pgo
export PGOUSER="${HOME?}/.pgo/pgo/pgouser"
export PGO_CA_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_KEY="${HOME?}/.pgo/pgo/client.pem"
export PGO_APISERVER_URL='https://127.0.0.1:8443'
EOF

Apply those changes to the current session by running:

source ~/.bashrc

Verify pgo Connection

In a separate terminal we need to setup a port forward to the Crunchy PostgreSQL Operator to ensure connection can be made outside of the cluster:

kubectl port-forward <OPERATOR_POD_NAME> -n pgo 8443:8443

On a separate terminal verify the pgo can communicate with the Crunchy PostgreSQL Operator:

pgo version

If the above command outputs versions of both the client and API server, the Crunchy PostgreSQL Operator has been installed successfully.

Ready to Deploy PostgreSQL Clusters

With the Crunchy PostgreSQL Operator Installed, you are ready to go.

Crunchy PostgreSQL Operator extends Kubernetes to support the creation, configuration and management of PostgreSQL clusters at scale. Built on top of the Crunchy PostgreSQL Container Suite, the Crunchy PostgreSQL Operator provides an open source software solution for PostgreSQL scaling, high-availability, disaster recovery, monitoring, and more.

You can find out more about the available PostgreSQL Operator commands available here. To view all of the commands available you can run pgo --help or review the PGO CLI command help here.

More Information - Default Installation Configurations

The Crunchy PostgreSQL Operator enables enterprise to deploy Kubernetes native PostgreSQL-as-a-Service. In order to support a broad range of enterprise requirements, the Operator provides a number of configuration variables that are intended to enable a broad range of use cases.

To learn more about the range of configuration options in the Crunchy PostgreSQL Operator, please see the Operator documentation.

The table provided below reflects the installed operator variables implemented by the Ansible playbook. It is worth repeating that these default values are provided for a simple single zone, "getting started" deployment to evaluate and test the operator, and are not intended for production environments.

Default Operator Configurations from Ansible Install

Configuration Variable Configuration Variable Notes Ansible Installer Default GKE Value
kubernetes_context Set to configure the context name of the kubeconfig used for authentication To retrieve the kubernetes_context value, run the following command: kubectl config current-context
pgo_admin_username Configures pgo administrator username admin
pgo_admin_password Configures pgo administrator password admin
pgo_operator_namespace Set to configure namespace where Operator will be deployed pgo
namespace Set to a comma delimited string of all namespaces Operator will manage. For this demonstration, only one namespace - namespace where the operator will be deployed - will be watched. pgo
ccp_image_prefix Configures image prefix used when creating containers from Crunchy Container Suite crunchydata
ccp_image_tag Configures image tag (version) used when creating containers from Crunchy Container Suite centos7-11.3-2.4.0
pgo_image_prefix Configures image prefix used when creating containers for Operator (apiserver, operator, scheduler..etc) crunchydata
pgo_image_tag Configures image tag used when creating containers for Operator (apiserver, operator, scheduler..etc) centos7-4.0.0
pgo_client_install Configures playbooks to install pgo client if set to true TRUE
pgo_client_version Configures which version of pgo playbooks should install. 4.0.0
pgo_tls_no_verify Set to configure Operator to verify TLS certificates FALSE
backrest_storage Set to configure storage definition to use when creating volumes used by pgBackRest on all newly created clusters storage1
backup_storage Set to configure storage definition to use when creating volumes used by pgBaseBackup on all newly created clusters storage1
primary_storage Set to configure storage definition to use when creating volumes used by PostgreSQL primaries on all newly created clusters storage1
replica_storage Set to configure storage definition to use when creating volumes used by PostgreSQL replicas on all newly created clusters storage1
storage<ID>_access_mode Set to configure storage definition to all primary pods created by Operator. storage1_access_mode='ReadWriteOnce'
storage<ID>_size Set to configure storage definition to all primary pods created by Operator. storage1_size='10G'
storage<ID>_type Set to configure storage definition to all primary pods created by the Operator. storage1_type='dynamic'
storage<ID>_class Set to configure storage definition to all primary pods created by the Operator. storage1_class='standard'
storage<ID>_supplemental_groups Set to configure storage definition to all primary pods created by the Operator. Since this demonstration is for GKE, this parameter should be commented out as it’s not applicable to GKE
storage<ID>_fs_group Set to configure storage definition to all primary pods created by the Operator. storage1_fs_group=26
Avatar for Patrick McLaughlin

Written by

Patrick McLaughlin

June 13, 2019 More by this author