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 VariableConfiguration Variable NotesAnsible Installer Default GKE Value
kubernetes_contextSet to configure the context name of the kubeconfig used for authenticationTo retrieve the kubernetes_context value, run the following command: kubectl config current-context
pgo_admin_usernameConfigures pgo administrator usernameadmin
pgo_admin_passwordConfigures pgo administrator passwordadmin
pgo_operator_namespaceSet to configure namespace where Operator will be deployedpgo
namespaceSet 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_prefixConfigures image prefix used when creating containers from Crunchy Container Suitecrunchydata
ccp_image_tagConfigures image tag (version) used when creating containers from Crunchy Container Suitecentos7-11.3-2.4.0
pgo_image_prefixConfigures image prefix used when creating containers for Operator (apiserver, operator, scheduler..etc)crunchydata
pgo_image_tagConfigures image tag used when creating containers for Operator (apiserver, operator, scheduler..etc)centos7-4.0.0
pgo_client_installConfigures playbooks to install pgo client if set to trueTRUE
pgo_client_versionConfigures which version of pgo playbooks should install.4.0.0
pgo_tls_no_verifySet to configure Operator to verify TLS certificatesFALSE
backrest_storageSet to configure storage definition to use when creating volumes used by pgBackRest on all newly created clustersstorage1
backup_storageSet to configure storage definition to use when creating volumes used by pgBaseBackup on all newly created clustersstorage1
primary_storageSet to configure storage definition to use when creating volumes used by PostgreSQL primaries on all newly created clustersstorage1
replica_storageSet to configure storage definition to use when creating volumes used by PostgreSQL replicas on all newly created clustersstorage1
storage<ID>_access_modeSet to configure storage definition to all primary pods created by Operator.storage1_access_mode='ReadWriteOnce'
storage<ID>_sizeSet to configure storage definition to all primary pods created by Operator.storage1_size='10G'
storage<ID>_typeSet to configure storage definition to all primary pods created by the Operator.storage1_type='dynamic'
storage<ID>_classSet to configure storage definition to all primary pods created by the Operator.storage1_class='standard'
storage<ID>_supplemental_groupsSet 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_groupSet 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