diff --git a/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md b/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md index 3b731eb72..8e676f799 100644 --- a/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md +++ b/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md @@ -9,7 +9,7 @@ assignees: '' Please, answer some short questions which should help us to understand your problem / question better? -- **Which image of the operator are you using?** e.g. ghcr.io/zalando/postgres-operator:v1.15.1 +- **Which image of the operator are you using?** e.g. ghcr.io/zalando/postgres-operator:v2.0.0 - **Where do you run it - cloud or metal? Kubernetes or OpenShift?** [AWS K8s | GCP ... | Bare Metal K8s] - **Are you running Postgres Operator in production?** [yes | no] - **Type of issue?** [Bug report, question, feature request, etc.] diff --git a/README.md b/README.md index 31e9c1748..a61af4568 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,13 @@ pipelines with no access to Kubernetes API directly, promoting infrastructure as * Pod protection during bootstrap phase and configurable maintenance windows * Restore and cloning Postgres clusters on AWS, GCS and Azure * Additionally logical backups to S3 or GCS bucket can be configured -* Standby cluster from S3 or GCS WAL archive +* Standby cluster from S3 or GCS WAL archive or remote host * Configurable for non-cloud environments * Basic credential and user management on K8s, eases application deployments * Support for custom TLS certificates * UI to create and edit Postgres cluster manifests * Compatible with OpenShift +* Multi-arch support ### PostgreSQL features @@ -63,23 +64,21 @@ production for over five years. | Release | Postgres versions | K8s versions | Golang | | :-------- | :---------------: | :---------------: | :-----: | -| next | 14 → 18 | 1.27+ | 1.26.4 | +| v2.0.0 | 14 → 18 | 1.27+ | 1.26.4 | | v1.15.1 | 13 → 17 | 1.27+ | 1.25.3 | | v1.14.0 | 13 → 17 | 1.27+ | 1.23.4 | | v1.13.0 | 12 → 16 | 1.27+ | 1.22.5 | | v1.12.0 | 11 → 16 | 1.27+ | 1.22.3 | | v1.11.0 | 11 → 16 | 1.27+ | 1.21.7 | -| v1.10.1 | 10 → 15 | 1.21+ | 1.19.8 | ## Getting started For a quick first impression follow the instructions of this [tutorial](docs/quickstart.md). -## Supported setups of Postgres and Applications +## Migrating from v1 to v2 operator -![Features](docs/diagrams/neutral_operator_dark.png#gh-dark-mode-only) -![Features](docs/diagrams/neutral_operator_light.png#gh-light-mode-only) +If you have been using Postgres Operator since v1.x (thank you), make sure you have read the [migration docs](docs/migrate.md) before deploying a v2 operator. ## Documentation diff --git a/charts/postgres-operator-ui/Chart.yaml b/charts/postgres-operator-ui/Chart.yaml index 871640467..7dba22103 100644 --- a/charts/postgres-operator-ui/Chart.yaml +++ b/charts/postgres-operator-ui/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: postgres-operator-ui -version: 1.15.1 -appVersion: 1.15.1 +version: 2.0.0 +appVersion: 2.0.0 home: https://github.com/zalando/postgres-operator description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience keywords: diff --git a/charts/postgres-operator-ui/index.yaml b/charts/postgres-operator-ui/index.yaml index 20408aeaf..98bd89a9a 100644 --- a/charts/postgres-operator-ui/index.yaml +++ b/charts/postgres-operator-ui/index.yaml @@ -1,9 +1,32 @@ apiVersion: v1 entries: postgres-operator-ui: + - apiVersion: v2 + appVersion: 2.0.0 + created: "2026-07-28T16:30:58.763571+02:00" + description: Postgres Operator UI provides a graphical interface for a convenient + database-as-a-service user experience + digest: 80098eb9290d77fcaaf813347386c3b7d34de0d4e846b50ac177d4ac4a9e2ecb + home: https://github.com/zalando/postgres-operator + keywords: + - postgres + - operator + - ui + - cloud-native + - patroni + - spilo + maintainers: + - email: opensource@zalando.de + name: Zalando + name: postgres-operator-ui + sources: + - https://github.com/zalando/postgres-operator + urls: + - postgres-operator-ui-2.0.0.tgz + version: 2.0.0 - apiVersion: v2 appVersion: 1.15.1 - created: "2025-12-11T12:44:25.470723322+01:00" + created: "2026-07-28T16:30:58.7632+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: 4bbb750934366038d692711f924151182b7be131b6822d011f5a4e51cf609482 @@ -26,7 +49,7 @@ entries: version: 1.15.1 - apiVersion: v2 appVersion: 1.14.0 - created: "2025-12-11T12:44:25.468680645+01:00" + created: "2026-07-28T16:30:58.76293+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e87ed898079a852957a67a4caf3fbd27b9098e413f5d961b7a771a6ae8b3e17c @@ -49,7 +72,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2025-12-11T12:44:25.466716836+01:00" + created: "2026-07-28T16:30:58.762624+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e0444e516b50f82002d1a733527813c51759a627cefdd1005cea73659f824ea8 @@ -72,7 +95,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2025-12-11T12:44:25.464739895+01:00" + created: "2026-07-28T16:30:58.762247+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: cbcef400c23ccece27d97369ad629278265c013e0a45c0b7f33e7568a082fedd @@ -95,7 +118,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2025-12-11T12:44:25.462698399+01:00" + created: "2026-07-28T16:30:58.761377+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: a45f2284045c2a9a79750a36997386444f39b01ac722b17c84b431457577a3a2 @@ -116,27 +139,4 @@ entries: urls: - postgres-operator-ui-1.11.0.tgz version: 1.11.0 - - apiVersion: v2 - appVersion: 1.10.1 - created: "2025-12-11T12:44:25.460357063+01:00" - description: Postgres Operator UI provides a graphical interface for a convenient - database-as-a-service user experience - digest: 2e5e7a82aebee519ec57c6243eb8735124aa4585a3a19c66ffd69638fbeb11ce - home: https://github.com/zalando/postgres-operator - keywords: - - postgres - - operator - - ui - - cloud-native - - patroni - - spilo - maintainers: - - email: opensource@zalando.de - name: Zalando - name: postgres-operator-ui - sources: - - https://github.com/zalando/postgres-operator - urls: - - postgres-operator-ui-1.10.1.tgz - version: 1.10.1 -generated: "2025-12-11T12:44:25.45732896+01:00" +generated: "2026-07-28T16:30:58.760884+02:00" diff --git a/charts/postgres-operator-ui/postgres-operator-ui-1.10.1.tgz b/charts/postgres-operator-ui/postgres-operator-ui-1.10.1.tgz deleted file mode 100644 index c0719f7bf..000000000 Binary files a/charts/postgres-operator-ui/postgres-operator-ui-1.10.1.tgz and /dev/null differ diff --git a/charts/postgres-operator-ui/postgres-operator-ui-2.0.0.tgz b/charts/postgres-operator-ui/postgres-operator-ui-2.0.0.tgz new file mode 100644 index 000000000..66886b83a Binary files /dev/null and b/charts/postgres-operator-ui/postgres-operator-ui-2.0.0.tgz differ diff --git a/charts/postgres-operator-ui/templates/deployment.yaml b/charts/postgres-operator-ui/templates/deployment.yaml index d4a2a88b8..a5729fcdc 100644 --- a/charts/postgres-operator-ui/templates/deployment.yaml +++ b/charts/postgres-operator-ui/templates/deployment.yaml @@ -88,7 +88,7 @@ spec: "17", "16", "15", - "14", + "14" ] } {{- if .Values.extraEnvs }} diff --git a/charts/postgres-operator-ui/values.yaml b/charts/postgres-operator-ui/values.yaml index c308335b2..4f15dd565 100644 --- a/charts/postgres-operator-ui/values.yaml +++ b/charts/postgres-operator-ui/values.yaml @@ -8,7 +8,7 @@ replicaCount: 1 image: registry: ghcr.io repository: zalando/postgres-operator-ui - tag: v1.15.1 + tag: v2.0.0 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. diff --git a/charts/postgres-operator/Chart.yaml b/charts/postgres-operator/Chart.yaml index 6f0d2e762..e33d783eb 100644 --- a/charts/postgres-operator/Chart.yaml +++ b/charts/postgres-operator/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: postgres-operator -version: 1.15.1 -appVersion: 1.15.1 +version: 2.0.0 +appVersion: 2.0.0 home: https://github.com/zalando/postgres-operator description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes keywords: diff --git a/charts/postgres-operator/crds/operatorconfigurations.yaml b/charts/postgres-operator/crds/operatorconfigurations.yaml index 215e23749..f9b29a4be 100644 --- a/charts/postgres-operator/crds/operatorconfigurations.yaml +++ b/charts/postgres-operator/crds/operatorconfigurations.yaml @@ -139,7 +139,7 @@ spec: type: boolean type: object docker_image: - default: ghcr.io/zalando/spilo-18:4.1-p1 + default: ghcr.io/zalando/spilo-18:4.1-p2 type: string enable_crd_registration: default: true @@ -228,24 +228,7 @@ spec: type: string type: array infrastructure_roles_secret_name: - description: |- - NamespacedName comprises a resource name, with a mandatory namespace, - rendered as "/". Being a type captures intent and - helps make sure that UIDs, namespaced names and non-namespaced names - do not get conflated in code. For most use cases, namespace and name - will already have been format validated at the API entry point, so we - don't do that here. Where that's not the case (e.g. in testing), - consider using NamespacedNameOrDie() in testing.go in this package. - - from: https://github.com/kubernetes/apimachinery/blob/master/pkg/types/namespacedname.go - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string infrastructure_roles_secrets: description: namespaced name of the secret containing infrastructure roles names and passwords @@ -267,14 +250,7 @@ spec: description: |- Name of a secret which describes the role, and optionally name of a configmap with an extra information - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string template: type: boolean userkey: @@ -460,14 +436,7 @@ spec: default: postgres-operator description: namespaced name of the secret containing the OAuth2 token to pass to the teams API - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pdb_master_label_selector: default: true type: boolean @@ -487,14 +456,7 @@ spec: pod_environment_configmap: description: namespaced name of the ConfigMap with environment variables to populate on every pod - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pod_environment_secret: type: string pod_management_policy: @@ -646,7 +608,7 @@ spec: logical_backup_cronjob_environment_secret: type: string logical_backup_docker_image: - default: ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1 + default: ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0 type: string logical_backup_failed_jobs_history_limit: default: 3 diff --git a/charts/postgres-operator/index.yaml b/charts/postgres-operator/index.yaml index 7128b8eb9..d85e6f3c0 100644 --- a/charts/postgres-operator/index.yaml +++ b/charts/postgres-operator/index.yaml @@ -1,9 +1,31 @@ apiVersion: v1 entries: postgres-operator: + - apiVersion: v2 + appVersion: 2.0.0 + created: "2026-07-28T16:30:13.110262+02:00" + description: Postgres Operator creates and manages PostgreSQL clusters running + in Kubernetes + digest: 2622899b573e4c46cd2a70677d5941a9e5da24c7db2a0ff774ddc49ad9d5c544 + home: https://github.com/zalando/postgres-operator + keywords: + - postgres + - operator + - cloud-native + - patroni + - spilo + maintainers: + - email: opensource@zalando.de + name: Zalando + name: postgres-operator + sources: + - https://github.com/zalando/postgres-operator + urls: + - postgres-operator-2.0.0.tgz + version: 2.0.0 - apiVersion: v2 appVersion: 1.15.1 - created: "2025-12-17T14:48:33.832345061+01:00" + created: "2026-07-28T16:30:13.108848+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 9f3edc3d796105c02c04eaae28a78e58fb08c1847a9de012245fd6ac2c0d2c00 @@ -25,7 +47,7 @@ entries: version: 1.15.1 - apiVersion: v2 appVersion: 1.15.0 - created: "2025-12-17T14:48:33.826117296+01:00" + created: "2026-07-28T16:30:13.108147+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 002dd47647bf51fbba023bd1762d807be478cf37de7a44b80cd01ac1f20bd94a @@ -47,7 +69,7 @@ entries: version: 1.15.0 - apiVersion: v2 appVersion: 1.14.0 - created: "2025-12-17T14:48:33.819729144+01:00" + created: "2026-07-28T16:30:13.107421+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 36e1571f3f455b213f16cdda7b1158648e8e84deb804ba47ed6b9b6d19263ba8 @@ -69,7 +91,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2025-12-17T14:48:33.81038602+01:00" + created: "2026-07-28T16:30:13.106643+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: a839601689aea0a7e6bc0712a5244d435683cf3314c95794097ff08540e1dfef @@ -91,7 +113,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2025-12-17T14:48:33.803256825+01:00" + created: "2026-07-28T16:30:13.105204+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 65858d14a40d7fd90c32bd9fc60021acc9555c161079f43a365c70171eaf21d8 @@ -113,7 +135,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2025-12-17T14:48:33.797369053+01:00" + created: "2026-07-28T16:30:13.104449+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 3914b5e117bda0834f05c9207f007e2ac372864cf6e86dcc2e1362bbe46c14d9 @@ -133,26 +155,4 @@ entries: urls: - postgres-operator-1.11.0.tgz version: 1.11.0 - - apiVersion: v2 - appVersion: 1.10.1 - created: "2025-12-17T14:48:33.791368349+01:00" - description: Postgres Operator creates and manages PostgreSQL clusters running - in Kubernetes - digest: cc3baa41753da92466223d0b334df27e79c882296577b404a8e9071411fcf19c - home: https://github.com/zalando/postgres-operator - keywords: - - postgres - - operator - - cloud-native - - patroni - - spilo - maintainers: - - email: opensource@zalando.de - name: Zalando - name: postgres-operator - sources: - - https://github.com/zalando/postgres-operator - urls: - - postgres-operator-1.10.1.tgz - version: 1.10.1 -generated: "2025-12-17T14:48:33.785159183+01:00" +generated: "2026-07-28T16:30:13.103286+02:00" diff --git a/charts/postgres-operator/postgres-operator-1.10.1.tgz b/charts/postgres-operator/postgres-operator-1.10.1.tgz deleted file mode 100644 index 5ecb27a5b..000000000 Binary files a/charts/postgres-operator/postgres-operator-1.10.1.tgz and /dev/null differ diff --git a/charts/postgres-operator/postgres-operator-2.0.0.tgz b/charts/postgres-operator/postgres-operator-2.0.0.tgz new file mode 100644 index 000000000..2b65213ce Binary files /dev/null and b/charts/postgres-operator/postgres-operator-2.0.0.tgz differ diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml index 1985c4157..c0cc31ec0 100644 --- a/charts/postgres-operator/values.yaml +++ b/charts/postgres-operator/values.yaml @@ -1,7 +1,7 @@ image: registry: ghcr.io repository: zalando/postgres-operator - tag: v1.15.1 + tag: v2.0.0 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. @@ -41,7 +41,7 @@ configGeneral: # etcd connection string for Patroni. Empty uses K8s-native DCS. etcd_host: "" # Spilo docker image - docker_image: ghcr.io/zalando/spilo-18:4.1-p1 + docker_image: ghcr.io/zalando/spilo-18:4.1-p2 # key name for annotation to ignore globally configured instance limits # ignore_instance_limits_annotation_key: "" @@ -385,7 +385,7 @@ configLogicalBackup: # logical_backup_memory_request: "" # image for pods of the logical backup job (example runs pg_dumpall) - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" # path of google cloud service account json file # logical_backup_google_application_credentials: "" diff --git a/docs/administrator.md b/docs/administrator.md index f7f0cb982..9bff446c3 100644 --- a/docs/administrator.md +++ b/docs/administrator.md @@ -734,9 +734,9 @@ that cannot be overridden to guarantee core functionality. Only variables with shipping to be specified differently. There are three ways to specify extra environment variables (or override existing ones) for database pods: -* [Via ConfigMap](#via-configmap) -* [Via Secret](#via-secret) -* [Via Postgres Cluster Manifest](#via-postgres-cluster-manifest) +* [Globally via ConfigMap](#via-configmap) +* [Globally via Secret](#via-secret) +* [Locally via Postgres Cluster Manifest](#via-postgres-cluster-manifest) The first two options must be referenced from the operator configuration making them global settings for all Postgres cluster the operator watches. @@ -745,10 +745,10 @@ environment variables. Another case could be to provide custom cloud provider or backup settings. The last options allows for specifying environment variables individual to -every cluster via the `env` section in the manifest. For example, if you use -individual backup locations for each of your clusters. Or you want to disable -WAL archiving for a certain cluster by setting `WAL_S3_BUCKET`, `WAL_GS_BUCKET` -or `AZURE_STORAGE_ACCOUNT` to an empty string. +every cluster via the `env` or `envFrom` section in the manifest. For example, +if you use individual backup locations for each of your clusters. Or you want +to disable WAL archiving for a certain cluster by setting `WAL_S3_BUCKET`, +`WAL_GS_BUCKET` or `AZURE_STORAGE_ACCOUNT` to an empty string. The operator will give precedence to environment variables in the following order (e.g. a variable defined in 4. overrides a variable with the same name @@ -762,6 +762,9 @@ in 5.): 6. Pod environment config map via operator config 7. WAL and logical backup settings from operator config +The `envFrom` section is treated separately and allows for a very flexible +local configuration referencing a ConfigMap or a Secret. + ### Via ConfigMap The ConfigMap with the additional settings is referenced in the operator's @@ -1574,7 +1577,7 @@ make docker # build in image in minikube docker env eval $(minikube docker-env) -docker buildx build --load -t ghcr.io/zalando/postgres-operator-ui:v1.15.1 . +docker buildx build --load -t ghcr.io/zalando/postgres-operator-ui:v2.0.0 . # apply UI manifests next to a running Postgres Operator kubectl apply -f manifests/ diff --git a/docs/diagrams/operator.png b/docs/diagrams/operator.png deleted file mode 100644 index 5e1cbfe83..000000000 Binary files a/docs/diagrams/operator.png and /dev/null differ diff --git a/docs/diagrams/operator.tex b/docs/diagrams/operator.tex deleted file mode 100644 index a8ee0a05f..000000000 --- a/docs/diagrams/operator.tex +++ /dev/null @@ -1,101 +0,0 @@ -\documentclass{article} -\usepackage{tikz} -\usepackage[graphics,tightpage,active]{preview} -\usetikzlibrary{arrows, shadows.blur, positioning, fit, calc, backgrounds} -\usepackage{lscape} - -\pagenumbering{gobble} - -\PreviewEnvironment{tikzpicture} -\PreviewEnvironment{equation} -\PreviewEnvironment{equation*} -\newlength{\imagewidth} -\newlength{\imagescale} -\pagestyle{empty} -\thispagestyle{empty} - -\begin{document} -\begin{center} -\begin{tikzpicture}[ - scale=0.5,transform shape, - font=\sffamily, - every matrix/.style={ampersand replacement=\&,column sep=2cm,row sep=2cm}, - operator/.style={draw,solid,thick,circle,fill=red!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - component/.style={draw,solid,thick,rounded corners,fill=yellow!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - border/.style={draw,dashed,rounded corners,fill=gray!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - pod/.style={draw,solid,thick,rounded corners,fill=blue!20, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - service/.style={draw,solid,thick,rounded corners,fill=blue!20, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - endpoint/.style={draw,solid,thick,rounded corners,fill=blue!20, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - secret/.style={draw,solid,thick,rounded corners,fill=blue!20, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - pvc/.style={draw,solid,thick,rounded corners,fill=blue!20, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - label/.style={rectangle,inner sep=0,outer sep=0}, - to/.style={->,>=stealth',shorten >=1pt,semithick,font=\sffamily\footnotesize}, - every node/.style={align=center}] - - % Position the nodes using a matrix layout - - \matrix{ - \& \node[component] (crd) {CRD}; \\ - \& \node[operator] (operator) {Operator}; \\ - \path - node[service] (service-master) {Master} - node[label, right of=service-master] (service-middle) {} - node[label, below of=service-middle] (services-label) {Services} - node[service, right=.5cm of service-master] (service-replica) {Replica} - node[border, behind path, - fit=(service-master)(service-replica)(services-label) - ] (services) {}; - \& - \node[component] (sts) {Statefulset}; \& \node[component] (pdb) {Pod Disruption Budget}; \\ - \path - node[service] (master-endpoint) {Master} - node[service, right=.5cm of master-endpoint] (replica-endpoint) {Replica} - node[label, right of=master-endpoint] (endpoint-middle) {} - node[label, below of=endpoint-middle] (endpoint-label) {Endpoints} - node[border, behind path, - fit=(master-endpoint)(replica-endpoint)(endpoint-label) - ] (endpoints) {}; \& - \node[component] (pod-template) {Pod Template}; \& - \node[border] (secrets) { - \begin{tikzpicture}[] - \node[secret] (users-secret) at (0, 0) {Users}; - \node[secret] (robots-secret) at (2, 0) {Robots}; - \node[secret] (standby-secret) at (4, 0) {Standby}; - \end{tikzpicture} \\ - Secrets - }; \\ \& - \path - node[pod] (replica1-pod) {Replica} - node[pod, left=.5cm of replica1-pod] (master-pod) {Master} - node[pod, right=.5cm of replica1-pod] (replica2-pod) {Replica} - node[label, below of=replica1-pod] (pod-label) {Pods} - node[border, behind path, - fit=(master-pod)(replica1-pod)(replica2-pod)(pod-label) - ] (pods) {}; \\ \& - \path - node[pvc] (replica1-pvc) {Replica} - node[pvc, left=.5cm of replica1-pvc] (master-pvc) {Master} - node[pvc, right=.5cm of replica1-pvc] (replica2-pvc) {Replica} - node[label, below of=replica1-pvc] (pvc-label) {Persistent Volume Claims} - node[border, behind path, - fit=(master-pvc)(replica1-pvc)(replica2-pvc)(pvc-label) - ] (pvcs) {}; \& - \\ \& \\ - }; - - % Draw the arrows between the nodes and label them. - \draw[to] (crd) -- node[midway,above] {} node[midway,below] {} (operator); - \draw[to] (operator) -- node[midway,above] {} node[midway,below] {} (sts); - \draw[to] (operator) -- node[midway,above] {} node[midway,below] {} (secrets); - \draw[to] (operator) -| node[midway,above] {} node[midway,below] {} (pdb); - \draw[to] (service-master) -- node[midway,above] {} node[midway,below] {} (master-endpoint); - \draw[to] (service-replica) -- node[midway,above] {} node[midway,below] {} (replica-endpoint); - \draw[to] (master-pod) -- node[midway,above] {} node[midway,below] {} (master-pvc); - \draw[to] (replica1-pod) -- node[midway,above] {} node[midway,below] {} (replica1-pvc); - \draw[to] (replica2-pod) -- node[midway,above] {} node[midway,below] {} (replica2-pvc); - \draw[to] (operator) -| node[midway,above] {} node[midway,below] {} (services); - \draw[to] (sts) -- node[midway,above] {} node[midway,below] {} (pod-template); - \draw[to] (pod-template) -- node[midway,above] {} node[midway,below] {} (pods); -\end{tikzpicture} -\end{center} -\end{document} diff --git a/docs/diagrams/pod.png b/docs/diagrams/pod.png deleted file mode 100644 index f54d1a2bd..000000000 Binary files a/docs/diagrams/pod.png and /dev/null differ diff --git a/docs/diagrams/pod.tex b/docs/diagrams/pod.tex deleted file mode 100644 index 291384642..000000000 --- a/docs/diagrams/pod.tex +++ /dev/null @@ -1,92 +0,0 @@ -\documentclass{article} -\usepackage{tikz} -\usepackage[graphics,tightpage,active]{preview} -\usetikzlibrary{arrows, shadows.blur, positioning, fit, calc, backgrounds} -\usepackage{lscape} - -\pagenumbering{gobble} - -\PreviewEnvironment{tikzpicture} -\PreviewEnvironment{equation} -\PreviewEnvironment{equation*} -\newlength{\imagewidth} -\newlength{\imagescale} -\pagestyle{empty} -\thispagestyle{empty} - -\begin{document} -\begin{center} -\begin{tikzpicture}[ - scale=0.5,transform shape, - font=\sffamily, - every matrix/.style={ampersand replacement=\&,column sep=2cm,row sep=2cm}, - pod/.style={draw,solid,thick,circle,fill=red!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - component/.style={draw,solid,thick,rounded corners,fill=yellow!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - border/.style={draw,dashed,rounded corners,fill=gray!20,inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - volume/.style={draw,solid,thick,rounded corners,fill=blue!20, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - sidecar/.style={draw,solid,thick,rounded corners,fill=blue!20, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - k8s-label/.style={draw,solid,thick,rounded corners,fill=blue!20, minimum width=1.5cm, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - affinity/.style={draw,solid,thick,rounded corners,fill=blue!20, minimum width=2cm, inner sep=.3cm, blur shadow={shadow blur steps=5,shadow blur extra rounding=1.3pt}}, - label/.style={rectangle,inner sep=0,outer sep=0}, - to/.style={->,>=stealth',shorten >=1pt,semithick,font=\sffamily\footnotesize}, - every node/.style={align=center}] - - % Position the nodes using a matrix layout - - \matrix{ - \path - node[k8s-label] (app-label) {App} - node[k8s-label, right=.25cm of app-label] (role-label) {Role} - node[k8s-label, right=.25cm of role-label] (custom-label) {Custom} - node[label, below of=role-label] (k8s-label-label) {K8s Labels} - node[border, behind path, - fit=(app-label)(role-label)(custom-label)(k8s-label-label) - ] (k8s-labels) {}; \& \& - \path - node[affinity] (affinity) {Affinity} - node[label, right=.25cm of affinity] (affinity-middle) {} - node[affinity, right=.25cm of affinity-middle] (anti-affinity) {Anti-affinity} - node[label, below of=affinity-middle] (affinity-label) {Assigning to nodes} - node[border, behind path, - fit=(affinity)(anti-affinity)(affinity-label) - ] (affinity) {}; \\ - \& \node[pod] (pod) {Pod}; \& \\ - \path - node[volume, minimum width={width("shm-volume")}] (data-volume) {Data} - node[volume, right=.25cm of data-volume, minimum width={width("shm-volume")}] (tokens-volume) {Tokens} - node[volume, right=.25cm of tokens-volume] (shm-volume) {/dev/shm} - node[label, below of=tokens-volume] (volumes-label) {Volumes} - node[border, behind path, - fit=(data-volume)(shm-volume)(tokens-volume)(volumes-label) - ] (volumes) {}; \& - \node[component] (spilo) {Spilo}; \& - \node[sidecar] (scalyr) {Scalyr}; \& \\ \& - \path - node[component] (patroni) {Patroni} - node[component, below=.25cm of patroni] (postgres) {PostgreSQL} - node[border, behind path, - fit=(postgres)(patroni) - ] (spilo-components) {}; \& - \path - node[sidecar] (custom-sidecar1) {User defined} - node[label, right=.25cm of custom-sidecar1] (sidecars-middle) {} - node[sidecar, right=.25cm of sidecars-middle] (custom-sidecar2) {User defined} - node[label, below of=sidecars-middle] (sidecars-label) {Custom sidecars} - node[border, behind path, - fit=(custom-sidecar1)(custom-sidecar2)(sidecars-label) - ] (sidecars) {}; - \\ \& \\ - }; - - % Draw the arrows between the nodes and label them. - \draw[to] (pod) to [bend left=25] (volumes); - \draw[to] (pod) to [bend left=25] (k8s-labels); - \draw[to] (pod) to [bend right=25] (affinity); - \draw[to] (pod) to [bend right=25] (scalyr); - \draw[to] (pod) to [bend right=25] (sidecars); - \draw[to] (pod) -- node[midway,above] {} node[midway,below] {} (spilo); - \draw[to] (spilo) -- node[midway,above] {} node[midway,below] {} (spilo-components); - -\end{tikzpicture} -\end{center} -\end{document} diff --git a/docs/index.md b/docs/index.md index 1aeac0ccb..40626e25b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,15 +47,8 @@ flexibility to complement it with other tools like [ZMON](https://opensource.zal Here is a diagram, that summarizes what would be created by the operator, when a new Postgres cluster CRD is submitted: -![postgresql-operator](diagrams/operator.png "K8s resources, created by operator") - -This picture is not complete without an overview of what is inside a single -cluster pod, so let's zoom in: - -![pod](diagrams/pod.png "Database pod components") - -These two diagrams should help you to understand the basics of what kind of -functionality the operator provides. +![Features](diagrams/neutral_operator_dark.png#gh-dark-mode-only) +![Features](diagrams/neutral_operator_light.png#gh-light-mode-only) ## Status diff --git a/docs/migrate.md b/docs/migrate.md index e4ccd76b1..33aa847c6 100644 --- a/docs/migrate.md +++ b/docs/migrate.md @@ -2,6 +2,12 @@ Version 2.0 changes some default settings and removes deprecated fields. Please read the following sections before upgrading the Postgres Operator deployment. +## scram-sha-256 by default + +The new operator will default password encryption to `scram-sha-256`. Unless you configure `password_encryption: md5` in the manifest under `spec.postgresql.parameters` the operator will encrypt existing passwords in the secrets with `scram-sha-256` and alter the database passwords. Make sure that your used clients and drivers support `scram-sha-256` as pods will get rotated in rolling fashion after updating to Postgres Operator v2. + +The default Spilo image (`spilo-18:4.1-p2`) still configures the pg_hba.conf file to allow `md5` passwords but Postgres will validate `scram-sha-256` passwords correctly. Passwords of users that are not managed by the operator and are still `md5` encrypted need be altered before the next tagged Spilo image which will drop `md5` completely. + ## K8s Endpoints are deprecated If your current operator v1.x deployment is relying on K8s endpoints (the default setup) for Patroni to manage the HA state you have to start planning to switch to configmaps, because endpoints are deprecated from K8s 1.33 onwards. The default of the corresponding parameter `kubernetes_use_configmaps` is changing to `true` with v2.0 of the operator. This means you have to explicity set it to `false` in your configuration before you start the upgrade. @@ -16,7 +22,6 @@ We explicitly warn you to go straight to configmap-based HA management with data 4. The orphaned endpoints, which use the same names like the new configmaps, have to be deleted by you or your K8s garbage collection. - ## Dropped manifest fields We removed some deprecated fields from the Postgresql CRD. Please, make sure that you do not specify them in any of your cluster manifests. If you do, switch to the listed alternative: diff --git a/docs/reference/operator_parameters.md b/docs/reference/operator_parameters.md index 07ac4ccb4..78500e709 100644 --- a/docs/reference/operator_parameters.md +++ b/docs/reference/operator_parameters.md @@ -839,7 +839,7 @@ grouped under the `logical_backup` key. runs `pg_dumpall` on a replica if possible and uploads compressed results to an S3 bucket under the key `////logical_backups`. The default image is the same image built with the Zalando-internal CI - pipeline. Default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + pipeline. Default: "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" * **logical_backup_google_application_credentials** Specifies the path of the google cloud service account json file. Default is empty. diff --git a/e2e/run.sh b/e2e/run.sh index 0bcf67989..71d2c0f40 100755 --- a/e2e/run.sh +++ b/e2e/run.sh @@ -8,7 +8,7 @@ IFS=$'\n\t' readonly cluster_name="postgres-operator-e2e-tests" readonly kubeconfig_path="${HOME}/kind-config-${cluster_name}" -readonly spilo_image="ghcr.io/zalando/spilo-18:4.1-p1" +readonly spilo_image="ghcr.io/zalando/spilo-18:4.1-p2" readonly e2e_test_runner_image="ghcr.io/zalando/postgres-operator-e2e-tests-runner:latest" export GOPATH=${GOPATH-~/go} diff --git a/e2e/tests/test_e2e.py b/e2e/tests/test_e2e.py index 8b64185e9..ca13966ed 100644 --- a/e2e/tests/test_e2e.py +++ b/e2e/tests/test_e2e.py @@ -14,7 +14,7 @@ from kubernetes.client.rest import ApiException SPILO_CURRENT = "ghcr.io/zalando/spilo-e2e:dev-18.3" SPILO_LAZY = "ghcr.io/zalando/spilo-e2e:dev-18.4" -SPILO_FULL_IMAGE = "ghcr.io/zalando/spilo-18:4.1-p1" +SPILO_FULL_IMAGE = "ghcr.io/zalando/spilo-18:4.1-p2" def to_selector(labels): return ",".join(["=".join(lbl) for lbl in labels.items()]) diff --git a/manifests/complete-postgres-manifest.yaml b/manifests/complete-postgres-manifest.yaml index 535f3a9f8..eff115cab 100644 --- a/manifests/complete-postgres-manifest.yaml +++ b/manifests/complete-postgres-manifest.yaml @@ -10,7 +10,7 @@ metadata: # "delete-date": "2020-08-31" # can only be deleted on that day if "delete-date "key is configured # "delete-clustername": "acid-test-cluster" # can only be deleted when name matches if "delete-clustername" key is configured spec: - dockerImage: ghcr.io/zalando/spilo-18:4.1-p1 + dockerImage: ghcr.io/zalando/spilo-18:4.1-p2 teamId: "acid" numberOfInstances: 2 users: # Application/Robot users diff --git a/manifests/configmap.yaml b/manifests/configmap.yaml index f66f0b72e..a3114cc10 100644 --- a/manifests/configmap.yaml +++ b/manifests/configmap.yaml @@ -35,7 +35,7 @@ data: default_memory_request: 100Mi # delete_annotation_date_key: delete-date # delete_annotation_name_key: delete-clustername - docker_image: ghcr.io/zalando/spilo-18:4.1-p1 + docker_image: ghcr.io/zalando/spilo-18:4.1-p2 # downscaler_annotations: "deployment-time,downscaler/*" enable_admin_role_for_users: "true" enable_crd_registration: "true" @@ -87,7 +87,7 @@ data: # logical_backup_cpu_limit: "" # logical_backup_cpu_request: "" logical_backup_cronjob_environment_secret: "" - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" # logical_backup_google_application_credentials: "" logical_backup_job_prefix: "logical-backup-" # logical_backup_memory_limit: "" diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index 215e23749..f9b29a4be 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -139,7 +139,7 @@ spec: type: boolean type: object docker_image: - default: ghcr.io/zalando/spilo-18:4.1-p1 + default: ghcr.io/zalando/spilo-18:4.1-p2 type: string enable_crd_registration: default: true @@ -228,24 +228,7 @@ spec: type: string type: array infrastructure_roles_secret_name: - description: |- - NamespacedName comprises a resource name, with a mandatory namespace, - rendered as "/". Being a type captures intent and - helps make sure that UIDs, namespaced names and non-namespaced names - do not get conflated in code. For most use cases, namespace and name - will already have been format validated at the API entry point, so we - don't do that here. Where that's not the case (e.g. in testing), - consider using NamespacedNameOrDie() in testing.go in this package. - - from: https://github.com/kubernetes/apimachinery/blob/master/pkg/types/namespacedname.go - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string infrastructure_roles_secrets: description: namespaced name of the secret containing infrastructure roles names and passwords @@ -267,14 +250,7 @@ spec: description: |- Name of a secret which describes the role, and optionally name of a configmap with an extra information - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string template: type: boolean userkey: @@ -460,14 +436,7 @@ spec: default: postgres-operator description: namespaced name of the secret containing the OAuth2 token to pass to the teams API - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pdb_master_label_selector: default: true type: boolean @@ -487,14 +456,7 @@ spec: pod_environment_configmap: description: namespaced name of the ConfigMap with environment variables to populate on every pod - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pod_environment_secret: type: string pod_management_policy: @@ -646,7 +608,7 @@ spec: logical_backup_cronjob_environment_secret: type: string logical_backup_docker_image: - default: ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1 + default: ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0 type: string logical_backup_failed_jobs_history_limit: default: 3 diff --git a/manifests/postgres-operator.yaml b/manifests/postgres-operator.yaml index 253649078..80e4fa28b 100644 --- a/manifests/postgres-operator.yaml +++ b/manifests/postgres-operator.yaml @@ -19,7 +19,7 @@ spec: serviceAccountName: postgres-operator containers: - name: postgres-operator - image: ghcr.io/zalando/postgres-operator:v1.15.1 + image: ghcr.io/zalando/postgres-operator:v2.0.0 imagePullPolicy: IfNotPresent resources: requests: diff --git a/manifests/postgresql-operator-default-configuration.yaml b/manifests/postgresql-operator-default-configuration.yaml index 1a0427104..ad6c20255 100644 --- a/manifests/postgresql-operator-default-configuration.yaml +++ b/manifests/postgresql-operator-default-configuration.yaml @@ -3,7 +3,7 @@ kind: OperatorConfiguration metadata: name: postgresql-operator-default-configuration configuration: - docker_image: ghcr.io/zalando/spilo-18:4.1-p1 + docker_image: ghcr.io/zalando/spilo-18:4.1-p2 # enable_crd_registration: true # crd_categories: # - all @@ -182,7 +182,7 @@ configuration: # logical_backup_cpu_request: "" # logical_backup_memory_limit: "" # logical_backup_memory_request: "" - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" # logical_backup_google_application_credentials: "" logical_backup_job_prefix: "logical-backup-" logical_backup_provider: "s3" diff --git a/mkdocs.yml b/mkdocs.yml index b8e8c3e04..09fc841e6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,6 +5,7 @@ theme: readthedocs nav: - Concepts: 'index.md' - Quickstart: 'quickstart.md' + - Migration from v1: 'migrate.md' - Postgres Operator UI: 'operator-ui.md' - Admin guide: 'administrator.md' - User guide: 'user.md' diff --git a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go index f4f7310d1..f33ba2791 100644 --- a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go +++ b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go @@ -353,7 +353,7 @@ type OperatorLogicalBackupConfiguration struct { // +kubebuilder:validation:Pattern=`^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$` // +kubebuilder:default="30 00 * * *" Schedule string `json:"logical_backup_schedule,omitempty"` - // +kubebuilder:default="ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + // +kubebuilder:default="ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" DockerImage string `json:"logical_backup_docker_image,omitempty"` // +kubebuilder:validation:Enum=az;gcs;s3 // +kubebuilder:default=s3 @@ -411,7 +411,7 @@ type OperatorConfigurationData struct { EtcdHost string `json:"etcd_host,omitempty"` // +kubebuilder:default=true KubernetesUseConfigMaps *bool `json:"kubernetes_use_configmaps,omitempty"` - // +kubebuilder:default="ghcr.io/zalando/spilo-18:4.1-p1" + // +kubebuilder:default="ghcr.io/zalando/spilo-18:4.1-p2" DockerImage string `json:"docker_image,omitempty"` // +kubebuilder:validation:Minimum=1 // +kubebuilder:default=8 diff --git a/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml b/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml index 215e23749..f9b29a4be 100644 --- a/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml +++ b/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml @@ -139,7 +139,7 @@ spec: type: boolean type: object docker_image: - default: ghcr.io/zalando/spilo-18:4.1-p1 + default: ghcr.io/zalando/spilo-18:4.1-p2 type: string enable_crd_registration: default: true @@ -228,24 +228,7 @@ spec: type: string type: array infrastructure_roles_secret_name: - description: |- - NamespacedName comprises a resource name, with a mandatory namespace, - rendered as "/". Being a type captures intent and - helps make sure that UIDs, namespaced names and non-namespaced names - do not get conflated in code. For most use cases, namespace and name - will already have been format validated at the API entry point, so we - don't do that here. Where that's not the case (e.g. in testing), - consider using NamespacedNameOrDie() in testing.go in this package. - - from: https://github.com/kubernetes/apimachinery/blob/master/pkg/types/namespacedname.go - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string infrastructure_roles_secrets: description: namespaced name of the secret containing infrastructure roles names and passwords @@ -267,14 +250,7 @@ spec: description: |- Name of a secret which describes the role, and optionally name of a configmap with an extra information - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string template: type: boolean userkey: @@ -460,14 +436,7 @@ spec: default: postgres-operator description: namespaced name of the secret containing the OAuth2 token to pass to the teams API - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pdb_master_label_selector: default: true type: boolean @@ -487,14 +456,7 @@ spec: pod_environment_configmap: description: namespaced name of the ConfigMap with environment variables to populate on every pod - properties: - name: - type: string - namespace: - type: string - required: - - name - type: object + type: string pod_environment_secret: type: string pod_management_policy: @@ -646,7 +608,7 @@ spec: logical_backup_cronjob_environment_secret: type: string logical_backup_docker_image: - default: ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1 + default: ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0 type: string logical_backup_failed_jobs_history_limit: default: 3 diff --git a/pkg/cluster/cluster_test.go b/pkg/cluster/cluster_test.go index 2db1223b4..94e237815 100644 --- a/pkg/cluster/cluster_test.go +++ b/pkg/cluster/cluster_test.go @@ -1692,8 +1692,8 @@ func newCronJob(image, schedule string, vars []v1.EnvVar, mounts []v1.VolumeMoun func TestCompareLogicalBackupJob(t *testing.T) { - img1 := "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0" - img2 := "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + img1 := "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" + img2 := "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0" clientSet := fake.NewSimpleClientset() acidClientSet := fakeacidv1.NewSimpleClientset() diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 7cd76d038..22a207f04 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -36,7 +36,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.EnableTeamIdClusternamePrefix = fromCRD.EnableTeamIdClusternamePrefix result.EtcdHost = fromCRD.EtcdHost result.KubernetesUseConfigMaps = util.CoalesceBool(fromCRD.KubernetesUseConfigMaps, util.True()) - result.DockerImage = util.Coalesce(fromCRD.DockerImage, "ghcr.io/zalando/spilo-18:4.1-p1") + result.DockerImage = util.Coalesce(fromCRD.DockerImage, "ghcr.io/zalando/spilo-18:4.1-p2") result.Workers = util.CoalesceUInt32(fromCRD.Workers, 8) result.MinInstances = fromCRD.MinInstances result.MaxInstances = fromCRD.MaxInstances @@ -184,7 +184,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur // logical backup config result.LogicalBackupSchedule = util.Coalesce(fromCRD.LogicalBackup.Schedule, "30 00 * * *") - result.LogicalBackupDockerImage = util.Coalesce(fromCRD.LogicalBackup.DockerImage, "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1") + result.LogicalBackupDockerImage = util.Coalesce(fromCRD.LogicalBackup.DockerImage, "ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0") result.LogicalBackupProvider = util.Coalesce(fromCRD.LogicalBackup.BackupProvider, "s3") result.LogicalBackupAzureStorageAccountName = fromCRD.LogicalBackup.AzureStorageAccountName result.LogicalBackupAzureStorageAccountKey = fromCRD.LogicalBackup.AzureStorageAccountKey diff --git a/pkg/spec/types.go b/pkg/spec/types.go index 3f4abb70f..642f3fd9b 100644 --- a/pkg/spec/types.go +++ b/pkg/spec/types.go @@ -23,6 +23,11 @@ import ( // consider using NamespacedNameOrDie() in testing.go in this package. // // from: https://github.com/kubernetes/apimachinery/blob/master/pkg/types/namespacedname.go +// +// NamespacedName marshals to and unmarshals from a plain JSON string +// ("/") via its custom MarshalJSON/UnmarshalJSON, so its CRD +// schema must be a string rather than the struct controller-gen would infer. +// +kubebuilder:validation:Type=string type NamespacedName struct { Namespace string `json:"namespace,omitempty"` Name string `json:"name"` diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index 9944e7e70..ca0d1f0d7 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -128,7 +128,7 @@ type Scalyr struct { // LogicalBackup defines configuration for logical backup type LogicalBackup struct { LogicalBackupSchedule string `name:"logical_backup_schedule" default:"30 00 * * *"` - LogicalBackupDockerImage string `name:"logical_backup_docker_image" default:"ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1"` + LogicalBackupDockerImage string `name:"logical_backup_docker_image" default:"ghcr.io/zalando/postgres-operator/logical-backup:v2.0.0"` LogicalBackupProvider string `name:"logical_backup_provider" default:"s3"` LogicalBackupAzureStorageAccountName string `name:"logical_backup_azure_storage_account_name" default:""` LogicalBackupAzureStorageContainer string `name:"logical_backup_azure_storage_container" default:""` @@ -182,7 +182,7 @@ type Config struct { EtcdHost string `name:"etcd_host" default:""` // special values: the empty string "" means Patroni will use K8s as a DCS EnableMaintenanceWindows *bool `name:"enable_maintenance_windows" default:"true"` MaintenanceWindows []string `name:"maintenance_windows"` - DockerImage string `name:"docker_image" default:"ghcr.io/zalando/spilo-18:4.1-p1"` + DockerImage string `name:"docker_image" default:"ghcr.io/zalando/spilo-18:4.1-p2"` SidecarImages map[string]string `name:"sidecar_docker_images"` // deprecated in favour of SidecarContainers SidecarContainers []v1.Container `name:"sidecars"` PodServiceAccountName string `name:"pod_service_account_name" default:"postgres-pod"` diff --git a/ui/app/package.json b/ui/app/package.json index c5f1e61df..91aa478b0 100644 --- a/ui/app/package.json +++ b/ui/app/package.json @@ -1,6 +1,6 @@ { "name": "postgres-operator-ui", - "version": "1.15.1", + "version": "2.0.0", "description": "PostgreSQL Operator UI", "main": "src/app.js", "config": { diff --git a/ui/manifests/deployment.yaml b/ui/manifests/deployment.yaml index eb48d9605..5facce7c6 100644 --- a/ui/manifests/deployment.yaml +++ b/ui/manifests/deployment.yaml @@ -18,7 +18,7 @@ spec: serviceAccountName: postgres-operator-ui containers: - name: "service" - image: ghcr.io/zalando/postgres-operator-ui:v1.15.1 + image: ghcr.io/zalando/postgres-operator-ui:v2.0.0 ports: - containerPort: 8081 protocol: "TCP" diff --git a/ui/run_local.sh b/ui/run_local.sh index 13d8f053a..917f1dc50 100755 --- a/ui/run_local.sh +++ b/ui/run_local.sh @@ -35,7 +35,7 @@ default_operator_ui_config='{ "17", "16", "15", - "14", + "14" ], "static_network_whitelist": { "localhost": ["172.0.0.1/32"]