From 8c7886aca6f46f9ae555d08cd3e5286488a17d18 Mon Sep 17 00:00:00 2001 From: Vegetto Date: Thu, 1 Apr 2021 13:24:16 +0200 Subject: [PATCH] [postgres-cluster] New chart to create Postgres clusters with local storage (#739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * first release of postgres-cluster * increase path version * Fix .Values access * Use common.labels.selectorLabels * 1.0.4 - Use .Value and not $.Value * 1.0.5 - fix schedule * 1.0.6 * 1.0.6 - Remove unneded service * 1.0.8 * 1.0.9 - fix .Value.replicaNodes * 1.0.10 * move chart * WIP * Ready for test * update readme * fix secret name * Merge branch 'postgres-cluster' * add labels * gen secret * fix labels * keep DB content * Ready to submit * rename chart Co-authored-by: angelnu Co-authored-by: ᗪєνιη ᗷυнʟ --- .github/ct-install.yaml | 1 + .../zalando-postgres-cluster/.helmignore | 24 +++ .../zalando-postgres-cluster/CHANGELOG.md | 12 ++ .../zalando-postgres-cluster/Chart.yaml | 20 +++ .../stable/zalando-postgres-cluster/README.md | 142 +++++++++++++++++ .../zalando-postgres-cluster/README.md.gotmpl | 145 ++++++++++++++++++ .../README_CHANGELOG.md.gotmpl | 27 ++++ .../README_CONFIG.md.gotmpl | 17 ++ .../templates/backupCronjob.yaml | 56 +++++++ .../templates/common.yaml | 37 +++++ .../templates/db.yaml | 18 +++ .../templates/persistentVolumes.yaml | 40 +++++ .../templates/secret.yaml | 16 ++ .../templates/storageClass.yaml | 10 ++ .../templates/tests/test-db.yaml | 42 +++++ .../zalando-postgres-cluster/values.yaml | 83 ++++++++++ 16 files changed, 690 insertions(+) create mode 100644 charts/stable/zalando-postgres-cluster/.helmignore create mode 100644 charts/stable/zalando-postgres-cluster/CHANGELOG.md create mode 100644 charts/stable/zalando-postgres-cluster/Chart.yaml create mode 100644 charts/stable/zalando-postgres-cluster/README.md create mode 100644 charts/stable/zalando-postgres-cluster/README.md.gotmpl create mode 100644 charts/stable/zalando-postgres-cluster/README_CHANGELOG.md.gotmpl create mode 100644 charts/stable/zalando-postgres-cluster/README_CONFIG.md.gotmpl create mode 100644 charts/stable/zalando-postgres-cluster/templates/backupCronjob.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/common.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/db.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/persistentVolumes.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/secret.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/storageClass.yaml create mode 100644 charts/stable/zalando-postgres-cluster/templates/tests/test-db.yaml create mode 100644 charts/stable/zalando-postgres-cluster/values.yaml diff --git a/.github/ct-install.yaml b/.github/ct-install.yaml index a4f4d119..e9b0e2e4 100644 --- a/.github/ct-install.yaml +++ b/.github/ct-install.yaml @@ -8,6 +8,7 @@ excluded-charts: - charts/stable/alertmanager-bot - charts/stable/dnsmadeeasy-webhook - charts/stable/ser2sock +- charts/stable/zalando-postgres-cluster - charts/stable/zigbee2mqtt chart-repos: - bitnami=https://charts.bitnami.com/bitnami diff --git a/charts/stable/zalando-postgres-cluster/.helmignore b/charts/stable/zalando-postgres-cluster/.helmignore new file mode 100644 index 00000000..e559de0a --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS diff --git a/charts/stable/zalando-postgres-cluster/CHANGELOG.md b/charts/stable/zalando-postgres-cluster/CHANGELOG.md new file mode 100644 index 00000000..e0af0ab8 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [1.0.0] + +### Changed + +- Initial version \ No newline at end of file diff --git a/charts/stable/zalando-postgres-cluster/Chart.yaml b/charts/stable/zalando-postgres-cluster/Chart.yaml new file mode 100644 index 00000000..6d8e17cc --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/Chart.yaml @@ -0,0 +1,20 @@ +apiVersion: v2 +version: 1.0.0 +description: Creates a postgres cluster using the Zalando Postgres operator and local storage +name: zalando-postgres-cluster +appVersion: 1.0.0 +keywords: +- postgres +- operator +- zalando +home: https://github.com/k8s-at-home/charts/tree/master/charts/stable/zalando-postgres-cluster +icon: https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/1200px-Postgresql_elephant.svg.png +sources: +- https://github.com/zalando/postgres-operator +maintainers: +- name: angelnu + email: git@angelnu.com +dependencies: +- name: common + repository: https://library-charts.k8s-at-home.com + version: 2.1.0 diff --git a/charts/stable/zalando-postgres-cluster/README.md b/charts/stable/zalando-postgres-cluster/README.md new file mode 100644 index 00000000..71a5edff --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/README.md @@ -0,0 +1,142 @@ +# zalando-postgres-cluster + +![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square) + +Creates a postgres cluster using the Zalando Postgres operator and local storage + +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/k8s-at-home/charts/issues/new/choose)** + +## Source Code + +* + +## Requirements + +## Dependencies + +| Repository | Name | Version | +|------------|------|---------| +| https://library-charts.k8s-at-home.com | common | 2.1.0 | + +## TL;DR + +```console +helm repo add k8s-at-home https://k8s-at-home.com/charts/ +helm repo update +helm install zalando-postgres-cluster k8s-at-home/zalando-postgres-cluster +``` + +## Installing the Chart + +To install the chart with the release name `zalando-postgres-cluster` + +```console +helm install zalando-postgres-cluster k8s-at-home/zalando-postgres-cluster +``` + +## Uninstalling the Chart + +To uninstall the `zalando-postgres-cluster` deployment + +```console +helm uninstall zalando-postgres-cluster +``` + +The command removes all the Kubernetes components associated with the chart **including persistent volumes** and deletes the release. + +## Configuration + +Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. +Other values may be used from the [values.yaml](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common/values.yaml) from the [common library](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common). + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. + +```console +helm install zalando-postgres-cluster \ + --set env.TZ="America/New York" \ + k8s-at-home/zalando-postgres-cluster +``` + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. + +```console +helm install zalando-postgres-cluster k8s-at-home/zalando-postgres-cluster -f values.yaml +``` + +## Custom configuration + +This chart is a wrapper for the [Zalando postgres operator](https://github.com/zalando/postgres-operator) to create +a high available Postgres cluster using nodes local storage. + +Features added by this wrapper: +- creates an storage class using local storage in the nodes specified in `persistentVolumes.replicaNodes`. These replicas survive + a tear-down and tear-up of the cluster. +- (optional) does sql dumps to an existing PVC with K8S cronjobs. The Operator only supports backups to cloud, not NFS PVC for example. +- Define the password for the DB so that it can be used accross tear-down and tear-up of the cluster. + +## Values + +**Important**: When deploying an application Helm chart you can add more values from our common library chart [here](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| controllerType | string | `""` | | +| dumpBackup.existingClaim | string | `nil` | | +| dumpBackup.image.pullPolicy | string | `"IfNotPresent"` | | +| dumpBackup.image.repository | string | `"postgres"` | | +| dumpBackup.image.tag | string | `"latest"` | | +| dumpBackup.resources.requests.cpu | string | `"5m"` | | +| dumpBackup.resources.requests.memory | string | `"10Mi"` | | +| dumpBackup.schedule | string | `"@daily"` | Backup schedule for postgres dumps | +| dumpBackup.subpath | string | `nil` | Persistent volume claim subpath for the backups @default: | +| dumpBackup.subpathPrefix | string | `"backup/db"` | Persistent volume claim subpath prefix for the backups | +| persistentVolumes.accessModes[0] | string | `"ReadWriteOnce"` | | +| persistentVolumes.annotations | object | `{}` | | +| persistentVolumes.hostPath | string | `nil` | Local path for the persistent volumes @default: | +| persistentVolumes.hostPathPrefix | string | `"/run/db"` | Local prefix for persistent volumes NOTE: The default is in tempfs - you should change to a persistent place for production!!! | +| persistentVolumes.labels | object | `{}` | | +| persistentVolumes.reclaimPolicy | string | `"Retain"` | persistentVolumeReclaimPolicy for the persistent volumes Recicle will delete content once DB is deleted while Retain (default) will keep it. | +| persistentVolumes.replicaNodes | list | `["node1.example.com","node2.example.com"]` | Replica nodes Must set with at least 2 nodes for the cluster to be highly available | +| postgresql.databases | object | `{"postgres":"postgres"}` | databases to create and their user | +| postgresql.numberOfInstances | string | `nil` | Number of replicas It will be automatically set with the number of replicaNodes so any values set here are ignored. | +| postgresql.postgresql.version | string | `"13"` | Postgres version to deploy - see which versions are supported by the operator | +| postgresql.teamId | string | `nil` | team Id for the DB cluster | +| postgresql.users | object | `{"postgres":["superuser","createdb"]}` | DB users to create (see operator) | +| postgresql.volume.size | string | `"1Gi"` | Size of the persistance volume to allocate | +| postgresql.volume.storageClass | string | `nil` | Name of the storage class | +| service.enabled | bool | `false` | | +| superuser.password | string | `nil` | Superuser password | +| superuser.secret | string | `nil` | Superuser k8s secret name. It must match the patter used by the operator | +| superuser.user | string | `nil` | Superuser user used for cronjobs | + +## Changelog + +All notable changes to this application Helm chart will be documented in this file but does not include changes from our common library. To read those click [here](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/commonREADME.md#Changelog). + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +### [1.0.0] + +#### Added + +- N/A + +#### Changed + +- N/A + +#### Removed + +- N/A + +[1.0.0]: #1.0.0 + +## Support + +- See the [Docs](https://docs.k8s-at-home.com/our-helm-charts/getting-started/) +- Open an [issue](https://github.com/k8s-at-home/charts/issues/new/choose) +- Ask a [question](https://github.com/k8s-at-home/organization/discussions) +- Join our [Discord](https://discord.gg/sTMX7Vh) community + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0) \ No newline at end of file diff --git a/charts/stable/zalando-postgres-cluster/README.md.gotmpl b/charts/stable/zalando-postgres-cluster/README.md.gotmpl new file mode 100644 index 00000000..c21f99b3 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/README.md.gotmpl @@ -0,0 +1,145 @@ +{{- define "custom.repository.organization" -}} +k8s-at-home +{{- end -}} + +{{- define "custom.repository.url" -}} +https://github.com/k8s-at-home/charts +{{- end -}} + +{{- define "custom.helm.url" -}} +https://k8s-at-home.com/charts/ +{{- end -}} + +{{- define "custom.helm.path" -}} +{{ template "custom.repository.organization" . }}/{{ template "chart.name" . }} +{{- end -}} + +{{- define "custom.notes" -}} +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/k8s-at-home/charts/issues/new/choose)** +{{- end -}} + +{{- define "custom.requirements" -}} +## Requirements + +{{ template "chart.kubeVersionLine" . }} +{{- end -}} + +{{- define "custom.dependencies" -}} +## Dependencies + +{{ template "chart.requirementsTable" . }} +{{- end -}} + +{{- define "custom.install.tldr" -}} +## TL;DR + +```console +helm repo add {{ template "custom.repository.organization" . }} {{ template "custom.helm.url" . }} +helm repo update +helm install {{ template "chart.name" . }} {{ template "custom.helm.path" . }} +``` +{{- end -}} + +{{- define "custom.install" -}} +## Installing the Chart + +To install the chart with the release name `{{ template "chart.name" . }}` + +```console +helm install {{ template "chart.name" . }} {{ template "custom.helm.path" . }} +``` +{{- end -}} + +{{- define "custom.uninstall" -}} +## Uninstalling the Chart + +To uninstall the `{{ template "chart.name" . }}` deployment + +```console +helm uninstall {{ template "chart.name" . }} +``` + +The command removes all the Kubernetes components associated with the chart **including persistent volumes** and deletes the release. +{{- end -}} + +{{- define "custom.configuration.header" -}} +## Configuration +{{- end -}} + +{{- define "custom.configuration.readValues" -}} +Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. +Other values may be used from the [values.yaml](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common/values.yaml) from the [common library](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common). +{{- end -}} + +{{- define "custom.configuration.example.set" -}} +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. + +```console +helm install {{ template "chart.name" . }} \ + --set env.TZ="America/New York" \ + {{ template "custom.helm.path" . }} +``` +{{- end -}} + +{{- define "custom.configuration.example.file" -}} +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. + +```console +helm install {{ template "chart.name" . }} {{ template "custom.helm.path" . }} -f values.yaml +``` +{{- end -}} + +{{- define "custom.valuesSection" -}} +## Values + +**Important**: When deploying an application Helm chart you can add more values from our common library chart [here](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common) + +{{ template "chart.valuesTable" . }} +{{- end -}} + +{{- define "custom.support" -}} +## Support + +- See the [Docs](https://docs.k8s-at-home.com/our-helm-charts/getting-started/) +- Open an [issue](https://github.com/k8s-at-home/charts/issues/new/choose) +- Ask a [question](https://github.com/k8s-at-home/organization/discussions) +- Join our [Discord](https://discord.gg/sTMX7Vh) community +{{- end -}} + +{{ template "chart.header" . }} + +{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} + +{{ template "chart.description" . }} + +{{ template "custom.notes" . }} + +{{ template "chart.sourcesSection" . }} + +{{ template "custom.requirements" . }} + +{{ template "custom.dependencies" . }} + +{{ template "custom.install.tldr" . }} + +{{ template "custom.install" . }} + +{{ template "custom.uninstall" . }} + +{{ template "custom.configuration.header" . }} + +{{ template "custom.configuration.readValues" . }} + +{{ template "custom.configuration.example.set" . }} + +{{ template "custom.configuration.example.file" . }} + +{{ template "custom.custom.configuration" . }} + +{{ template "custom.valuesSection" . }} + +{{ template "custom.changelog" . }} + +{{ template "custom.support" . }} + +{{ template "helm-docs.versionFooter" . }} diff --git a/charts/stable/zalando-postgres-cluster/README_CHANGELOG.md.gotmpl b/charts/stable/zalando-postgres-cluster/README_CHANGELOG.md.gotmpl new file mode 100644 index 00000000..d456fa08 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/README_CHANGELOG.md.gotmpl @@ -0,0 +1,27 @@ +{{- define "custom.changelog.header" -}} +## Changelog +{{- end -}} + +{{- define "custom.changelog" -}} +{{ template "custom.changelog.header" . }} + +All notable changes to this application Helm chart will be documented in this file but does not include changes from our common library. To read those click [here](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/commonREADME.md#Changelog). + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +### [1.0.0] + +#### Added + +- N/A + +#### Changed + +- N/A + +#### Removed + +- N/A + +[1.0.0]: #1.0.0 +{{- end -}} diff --git a/charts/stable/zalando-postgres-cluster/README_CONFIG.md.gotmpl b/charts/stable/zalando-postgres-cluster/README_CONFIG.md.gotmpl new file mode 100644 index 00000000..aedbddf5 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/README_CONFIG.md.gotmpl @@ -0,0 +1,17 @@ +{{- define "custom.custom.configuration.header" -}} +## Custom configuration +{{- end -}} + +{{- define "custom.custom.configuration" -}} +{{ template "custom.custom.configuration.header" . }} + +This chart is a wrapper for the [Zalando postgres operator](https://github.com/zalando/postgres-operator) to create +a high available Postgres cluster using nodes local storage. + +Features added by this wrapper: +- creates an storage class using local storage in the nodes specified in `persistentVolumes.replicaNodes`. These replicas survive + a tear-down and tear-up of the cluster. +- (optional) does sql dumps to an existing PVC with K8S cronjobs. The Operator only supports backups to cloud, not NFS PVC for example. +- Define the password for the DB so that it can be used accross tear-down and tear-up of the cluster. + +{{- end -}} diff --git a/charts/stable/zalando-postgres-cluster/templates/backupCronjob.yaml b/charts/stable/zalando-postgres-cluster/templates/backupCronjob.yaml new file mode 100644 index 00000000..a483c3d2 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/backupCronjob.yaml @@ -0,0 +1,56 @@ +{{- if .Values.dumpBackup.existingClaim -}} +# ------------------- CronJob ------------------- # +apiVersion: batch/v1beta1 +kind: CronJob +metadata: + name: {{ include "common.names.fullname" . }}-backup + labels: + {{- include "common.labels" . | nindent 4 }} +spec: + schedule: {{ .Values.dumpBackup.schedule | quote }} + concurrencyPolicy: Replace + jobTemplate: + spec: + template: + metadata: + name: {{ include "common.names.fullname" . }}-backup + labels: + {{- include "common.labels.selectorLabels" . | nindent 12 }} + spec: + containers: + - name: backup + image: "{{ .Values.dumpBackup.image.repository}}:{{ .Values.dumpBackup.image.tag}}" + imagePullPolicy: {{ .Values.dumpBackup.image.imagePullPolicy}} + command: + - /bin/sh + - -ce + - | + echo "$(date) - Start dump" + pg_dumpall > /backup/new && mv /backup/new /backup/backup + echo "$(date) - End dump" + ls -lh /backup + resources: + {{- .Values.dumpBackup.resources | toYaml | nindent 16 }} + env: + - name: PGHOST + value: {{ include "zalando-postgres-cluster.db" . }} + - name: PGUSER + valueFrom: + secretKeyRef: + name: {{ include "zalando-postgres-cluster.superuser_secret" . }} + key: username + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: {{ include "zalando-postgres-cluster.superuser_secret" . }} + key: password + volumeMounts: + - mountPath: /backup + name: backup-volume + subPath: {{ include "zalando-postgres-cluster.backupPVCSubpath" . }} + restartPolicy: OnFailure + volumes: + - name: backup-volume + persistentVolumeClaim: + claimName: {{ .Values.dumpBackup.existingClaim }} +{{- end -}} diff --git a/charts/stable/zalando-postgres-cluster/templates/common.yaml b/charts/stable/zalando-postgres-cluster/templates/common.yaml new file mode 100644 index 00000000..a80fca9f --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/common.yaml @@ -0,0 +1,37 @@ +{{/* Make sure all variables are set properly */}} +{{- include "common.values.setup" . }} + +{{- define "zalando-postgres-cluster.db" -}} +{{- include "common.names.fullname" .|lower -}}-postgres +{{- end -}} + +{{- define "zalando-postgres-cluster.superuser" -}} +{{- default (keys .Values.postgresql.users | first ) .Values.superuser.user -}} +{{- end -}} + +{{- define "zalando-postgres-cluster.superuser_secret" -}} +{{ default (printf "%s.%s.credentials.postgresql.acid.zalan.do" (include "zalando-postgres-cluster.superuser" .) (include "zalando-postgres-cluster.db" .)) .Values.superuser.secret }} +{{- end -}} + +{{- define "zalando-postgres-cluster.superuser_password" -}} +{{- default (randAlphaNum 50) .Values.superuser.password -}} +{{- end -}} + +{{- define "zalando-postgres-cluster.storageClass" -}} +{{- default (include "common.names.fullname" .|lower ) .Values.postgresql.volume.storageClass -}} +{{- end -}} + +{{- define "zalando-postgres-cluster.pvName" -}} +{{- include "common.names.fullname" .|lower -}} +{{- end -}} + +{{- define "zalando-postgres-cluster.localPath" -}} +{{- default (printf "%s/%s" .Values.persistentVolumes.hostPathPrefix (include "common.names.fullname" .)) .Values.persistentVolumes.hostPath -}} +{{- end -}} + +{{- define "zalando-postgres-cluster.backupPVCSubpath" -}} +{{- default (printf "%s/%s" .Values.dumpBackup.subpathPrefix (include "common.names.fullname" .)) .Values.dumpBackup.subpath -}} +{{- end -}} + +{{/* Render the templates */}} +{{ include "common.all" . }} diff --git a/charts/stable/zalando-postgres-cluster/templates/db.yaml b/charts/stable/zalando-postgres-cluster/templates/db.yaml new file mode 100644 index 00000000..e6607bc2 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/db.yaml @@ -0,0 +1,18 @@ +{{- if not .Values.postgresql.volume.storageClass -}} + {{- $_ := set .Values.postgresql.volume "storageClass" (include "zalando-postgres-cluster.storageClass" .) }} +{{- end}} + +{{- if not .Values.postgresql.teamId -}} + {{- $_ := set .Values.postgresql "teamId" (include "common.names.fullname" .) }} +{{- end}} + +{{- $_ := set .Values.postgresql "numberOfInstances" (len $.Values.persistentVolumes.replicaNodes) }} + +apiVersion: "acid.zalan.do/v1" +kind: postgresql +metadata: + name: {{ include "zalando-postgres-cluster.db" . }} + labels: + {{- include "common.labels" . | nindent 4 }} +spec: + {{- .Values.postgresql | toYaml | nindent 2 }} diff --git a/charts/stable/zalando-postgres-cluster/templates/persistentVolumes.yaml b/charts/stable/zalando-postgres-cluster/templates/persistentVolumes.yaml new file mode 100644 index 00000000..941933b2 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/persistentVolumes.yaml @@ -0,0 +1,40 @@ +{{- range $i:= untilStep 0 (len $.Values.persistentVolumes.replicaNodes) 1 -}} +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ include "zalando-postgres-cluster.pvName" $ }}-{{ $i }} + labels: + {{- include "common.labels" $ | nindent 4 }} + {{- if gt (len $.Values.persistentVolumes.labels) 0 }} + {{- $.Values.persistentVolumes.labels | toYaml | nindent 4 }} + {{- end }} + {{- if gt (len $.Values.persistentVolumes.annotations) 0 }} + annotations: + {{- $.Values.persistentVolumes.annotations | toYaml | nindent 4 }} + {{- end }} + finalizers: + - kubernetes.io/pv-protection +spec: + storageClassName: {{ include "zalando-postgres-cluster.storageClass" $ }} + volumeMode: Filesystem + capacity: + storage: "{{ $.Values.postgresql.volume.size }}" + accessModes: + {{- $.Values.persistentVolumes.accessModes | toYaml | nindent 4 }} + hostPath: + path: {{ include "zalando-postgres-cluster.localPath" $ }} + #Since it is created directly this does not delete it from cluster + persistentVolumeReclaimPolicy: "{{ $.Values.persistentVolumes.reclaimPolicy }}" + + {{- $e := index $.Values.persistentVolumes.replicaNodes $i }} + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: + - {{ $e }} + +{{ end }} diff --git a/charts/stable/zalando-postgres-cluster/templates/secret.yaml b/charts/stable/zalando-postgres-cluster/templates/secret.yaml new file mode 100644 index 00000000..b5e18a14 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + labels: + {{- include "common.labels" . | nindent 4 }} + application: spilo + team: {{ include "common.names.fullname" . }} + # xref: https://github.com/helm/helm/issues/3053 + # xref: https://github.com/helm/helm/pull/5290 + "helm.sh/hook": "pre-install" + "helm.sh/hook-delete-policy": "before-hook-creation" + name: {{ include "zalando-postgres-cluster.superuser_secret" . }} +stringData: + username: {{ include "zalando-postgres-cluster.superuser" . }} + password: {{ include "zalando-postgres-cluster.superuser_password" . }} +type: Opaque diff --git a/charts/stable/zalando-postgres-cluster/templates/storageClass.yaml b/charts/stable/zalando-postgres-cluster/templates/storageClass.yaml new file mode 100644 index 00000000..1102ec16 --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/storageClass.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: {{ include "zalando-postgres-cluster.storageClass" . }} + labels: + {{- include "common.labels" . | nindent 4 }} + annotations: +provisioner: kubernetes.io/no-provisioner +reclaimPolicy: Delete +volumeBindingMode: WaitForFirstConsumer diff --git a/charts/stable/zalando-postgres-cluster/templates/tests/test-db.yaml b/charts/stable/zalando-postgres-cluster/templates/tests/test-db.yaml new file mode 100644 index 00000000..ed07c43e --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/templates/tests/test-db.yaml @@ -0,0 +1,42 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: "{{ include "common.names.fullname" .|lower }}-test-db" + labels: +{{ include "common.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test-success +spec: + template: + metadata: + name: "{{ include "common.names.fullname" .|lower }}-test-db" + labels: + {{ include "common.labels" . | nindent 8 }} + spec: + containers: + - name: psql + image: "{{ .Values.dumpBackup.image.repository}}:{{ .Values.dumpBackup.image.tag}}" + imagePullPolicy: {{ .Values.dumpBackup.image.imagePullPolicy}} + command: ['sh'] + args: + - "-ecx" + - | + echo ";"|psql + + env: + - name: PGHOST + value: {{ include "zalando-postgres-cluster.db" . | quote }} + - name: PGSSLMODE + value: require + - name: PGUSER + valueFrom: + secretKeyRef: + name: {{ include "zalando-postgres-cluster.superuser_secret" . }} + key: username + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: {{ include "zalando-postgres-cluster.superuser_secret" . }} + key: password + restartPolicy: Never + diff --git a/charts/stable/zalando-postgres-cluster/values.yaml b/charts/stable/zalando-postgres-cluster/values.yaml new file mode 100644 index 00000000..9f352f0e --- /dev/null +++ b/charts/stable/zalando-postgres-cluster/values.yaml @@ -0,0 +1,83 @@ +# See all operator values at https://github.com/zalando/postgres-operator/blob/master/docs/reference/cluster_manifest.md +postgresql: + # -- team Id for the DB cluster + teamId: + volume: + # -- Size of the persistance volume to allocate + size: "1Gi" + # -- (string) Name of the storage class + # @default -- chart fullname + storageClass: + # -- Number of replicas + # It will be automatically set with the number of replicaNodes so any values set here are ignored. + numberOfInstances: + # -- DB users to create (see operator) + users: + postgres: + - superuser + - createdb + + # -- databases to create and their user + databases: + postgres: postgres + postgresql: + # -- Postgres version to deploy - see which versions are supported by the operator + version: "13" + +superuser: + # -- Superuser user used for cronjobs + # @default -- first user in postgresql.users + user: + # -- Superuser password + # @default -- randomly generated on first install of the chart + password: + # -- Superuser k8s secret name. It must match the patter used by the operator + # @default -- ..credentials.postgresql.acid.zalan.do + secret: + +persistentVolumes: + # -- Local prefix for persistent volumes + # NOTE: The default is in tempfs - you should change to a persistent place for production!!! + hostPathPrefix: "/run/db" + # -- Local path for the persistent volumes + # @default: + hostPath: + # -- persistentVolumeReclaimPolicy for the persistent volumes + # Recicle will delete content once DB is deleted while Retain (default) will keep it. + reclaimPolicy: Retain + + accessModes: + - ReadWriteOnce + # -- Replica nodes + # Must set with at least 2 nodes for the cluster to be highly available + replicaNodes: + - node1.example.com + - node2.example.com + labels: {} + # foo: a + annotations: {} + + +dumpBackup: + # Enable backups to a PVC + existingClaim: + # -- Backup schedule for postgres dumps + schedule: "@daily" + # -- Persistent volume claim subpath prefix for the backups + subpathPrefix: "backup/db" + # -- Persistent volume claim subpath for the backups + # @default: + subpath: + image: + repository: postgres + pullPolicy: IfNotPresent + tag: latest + resources: + requests: + memory: "10Mi" + cpu: "5m" + +# Dissable Deployment and Service +controllerType: "" +service: + enabled: false