Code Monkey home page Code Monkey logo

patroni-helm's Introduction

Patroni Helm Chart

This directory contains a Kubernetes chart to deploy a five node Patroni cluster using a Spilo and a StatefulSet.

Prerequisites Details

  • Kubernetes 1.5+
  • PV support on the underlying infrastructure

StatefulSet Details

StatefulSet Caveats

Todo

  • Make namespace configurable
  • K8S native DCS

Chart Details

This chart will do the following:

  • Implement a HA scalable PostgreSQL 10 cluster using a Kubernetes StatefulSet.

Installing the Chart

To install the chart with the release name my-release:

$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
$ helm dependency update
$ helm install --name my-release incubator/patroni

To install the chart with randomly generated passwords:

$ helm install --name my-release incubator/patroni \
  --set credentials.superuser="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32)",credentials.admin="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32)",credentials.standby="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32)"

Connecting to PostgreSQL

Your access point is a cluster IP. In order to access it spin up another pod:

$ kubectl run -i --tty --rm psql --image=postgres --restart=Never -- bash -il

Then, from inside the pod, connect to PostgreSQL:

$ psql -U admin -h my-release-patroni.default.svc.cluster.local postgres
<admin password from values.yaml>
postgres=>

Configuration

The following table lists the configurable parameters of the patroni chart and their default values.

Parameter Description Default
nameOverride Override the name of the chart nil
fullnameOverride Override the fullname of the chart nil
replicaCount Amount of pods to spawn 5
image.repository The image to pull registry.opensource.zalan.do/acid/spilo-10
image.tag The version of the image to pull 1.4-p6
image.pullPolicy The pull policy IfNotPresent
credentials.superuser Password of the superuser tea
credentials.admin Password of the admin cola
credentials.standby Password of the replication user pinacolada
etcd.enable Using etcd as DCS true
etcd.deployChart Deploy etcd chart true
etcd.host Host name of etcd cluster nil
etcd.discovery Domain name of etcd cluster nil
zookeeper.enable Using ZooKeeper as DCS false
zookeeper.deployChart Deploy ZooKeeper chart false
zookeeper.hosts List of ZooKeeper cluster members host1:port1,host2:port,etc...
walE.enable Use of Wal-E tool for base backup/restore false
walE.scheduleCronJob Schedule of Wal-E backups 00 01 * * *
walE.retainBackups Number of base backups to retain 2
walE.s3Bucket: Amazon S3 bucket used for wal-e backups nil
walE.gcsBucket GCS storage used for Wal-E backups nil
walE.kubernetesSecret K8s secret name for provider bucket nil
walE.backupThresholdMegabytes Maximum size of the WAL segments accumulated after the base backup to consider WAL-E restore instead of pg_basebackup 1024
walE.backupThresholdPercentage Maximum ratio (in percents) of the accumulated WAL files to the base backup to consider WAL-E restore instead of pg_basebackup 30
resources Any resources you wish to assign to the pod {}
nodeSelector Node label to use for scheduling {}
tolerations List of node taints to tolerate []
affinity Affinity settings Preferred on hostname
persistentVolume.accessModes Persistent Volume access modes [ReadWriteOnce]
persistentVolume.annotations Annotations for Persistent Volume Claim` {}
persistentVolume.mountPath Persistent Volume mount root path /home/postgres/pgdata
persistentVolume.size Persistent Volume size 2Gi
persistentVolume.storageClass Persistent Volume Storage Class volume.alpha.kubernetes.io/storage-class: default
persistentVolume.subPath Subdirectory of Persistent Volume to mount ""
rbac.create Create required role and rolebindings true
serviceAccount.create If true, create a new service account true
serviceAccount.name Service account to be used. If not set and serviceAccount.create is true, a name is generated using the fullname template nil

Specify each parameter using the --set key=value[,key=value] argument to helm install.

Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,

$ helm install --name my-release -f values.yaml incubator/patroni

Tip: You can use the default values.yaml

Cleanup

To remove the spawned pods you can run a simple helm delete <release-name>.

Helm will however preserve created persistent volume claims, to also remove them execute the commands below.

$ release=<release-name>
$ helm delete $release
$ kubectl delete pvc -l release=$release

Internals

Patroni is responsible for electing a PostgreSQL master pod by leveraging the DCS of your choice. After election it adds a spilo-role=master label to the elected master and set the label to spilo-role=replica for all replicas. Simultaneously it will update the <release-name>-patroni endpoint to let the service route traffic to the elected master.

$ kubectl get pods -l spilo-role -L spilo-role
NAME                   READY     STATUS    RESTARTS   AGE       SPILO-ROLE
my-release-patroni-0   1/1       Running   0          9m        replica
my-release-patroni-1   1/1       Running   0          9m        master
my-release-patroni-2   1/1       Running   0          8m        replica
my-release-patroni-3   1/1       Running   0          8m        replica
my-release-patroni-4   1/1       Running   0          8m        replica

patroni-helm's People

Contributors

cliu- avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.