From 714f26e9dbbebd23f13454cea1393b6d7e721d66 Mon Sep 17 00:00:00 2001 From: Josh Heyer Date: Fri, 12 Nov 2021 06:12:35 +0000 Subject: [PATCH] cnp demo: update kubernetes & cnp Switch to k3d for updated Kubernetes version Update output to match CNP 1.10 --- .../interactive_demo.mdx | 166 +++++++++++------- .../interactive_demo.mdx | 166 +++++++++++------- 2 files changed, 208 insertions(+), 124 deletions(-) diff --git a/advocacy_docs/kubernetes/cloud_native_postgresql/interactive_demo.mdx b/advocacy_docs/kubernetes/cloud_native_postgresql/interactive_demo.mdx index 233edcfdba0..49dc2ee7979 100644 --- a/advocacy_docs/kubernetes/cloud_native_postgresql/interactive_demo.mdx +++ b/advocacy_docs/kubernetes/cloud_native_postgresql/interactive_demo.mdx @@ -1,6 +1,6 @@ --- title: "Installation, Configuration and Deployment Demo" -description: "Walk through the process of installing, configuring and deploying the Cloud Native PostgreSQL Operator via a browser-hosted Minikube console" +description: "Walk through the process of installing, configuring and deploying the Cloud Native PostgreSQL Operator via a browser-hosted Kubernetes environment" navTitle: Install, Configure, Deploy product: 'Cloud Native Operator' platform: ubuntu @@ -8,10 +8,11 @@ tags: - postgresql - cloud-native-postgresql-operator - kubernetes - - minikube + - k3d - live-demo katacodaPanel: - scenario: minikube + scenario: ubuntu:2004 + initializeCommand: clear; echo -e \\\\033[1mPreparing k3d and kubectl...\\\\n\\\\033[0m; snap install kubectl --classic; wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash; clear; echo -e \\\\033[2mk3d is ready\\ - enjoy Kubernetes\\!\\\\033[0m; codelanguages: shell, yaml showInteractiveBadge: true --- @@ -30,22 +31,34 @@ It will take roughly 5-10 minutes to work through. -[Minikube](https://kubernetes.io/docs/setup/learning-environment/minikube/) is already installed in this environment; we just need to start the cluster: +Once [k3d](https://k3d.io/) is ready, we need to start a cluster: ```shell -minikube start +k3d cluster create __OUTPUT__ -* minikube v1.8.1 on Ubuntu 18.04 -* Using the none driver based on user configuration -* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ... -* OS release is Ubuntu 18.04.4 LTS -* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ... - - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf -* Launching Kubernetes ... -* Enabling addons: default-storageclass, storage-provisioner -* Configuring local host environment ... -* Waiting for cluster to come online ... -* Done! kubectl is now configured to use "minikube" +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3s-default' +INFO[0000] Created volume 'k3d-k3s-default-images' +INFO[0000] Starting new tools node... +INFO[0000] Pulling image 'docker.io/rancher/k3d-tools:5.1.0' +INFO[0001] Creating node 'k3d-k3s-default-server-0' +INFO[0001] Pulling image 'docker.io/rancher/k3s:v1.21.5-k3s2' +INFO[0002] Starting Node 'k3d-k3s-default-tools' +INFO[0006] Creating LoadBalancer 'k3d-k3s-default-serverlb' +INFO[0007] Pulling image 'docker.io/rancher/k3d-proxy:5.1.0' +INFO[0011] Using the k3d-tools node to gather environment information +INFO[0011] HostIP: using network gateway... +INFO[0011] Starting cluster 'k3s-default' +INFO[0011] Starting servers... +INFO[0011] Starting Node 'k3d-k3s-default-server-0' +INFO[0018] Starting agents... +INFO[0018] Starting helpers... +INFO[0018] Starting Node 'k3d-k3s-default-serverlb' +INFO[0024] Injecting '172.19.0.1 host.k3d.internal' into /etc/hosts of all nodes... +INFO[0024] Injecting records for host.k3d.internal and for 2 network members into CoreDNS configmap... +INFO[0025] Cluster 'k3s-default' created successfully! +INFO[0025] You can now use it like this: +kubectl cluster-info ``` This will create the Kubernetes cluster, and you will be ready to use it. @@ -54,29 +67,30 @@ Verify that it works with the following command: ```shell kubectl get nodes __OUTPUT__ -NAME STATUS ROLES AGE VERSION -minikube Ready master 66s v1.17.3 +NAME STATUS ROLES AGE VERSION +k3d-k3s-default-server-0 Ready control-plane,master 16s v1.21.5+k3s2 ``` -You will see one node called `minikube`. If the status isn't yet "Ready", wait for a few seconds and run the command above again. +You will see one node called `k3d-k3s-default-server-0`. If the status isn't yet "Ready", wait for a few seconds and run the command above again. ## Install Cloud Native PostgreSQL -Now that the Minikube cluster is running, you can proceed with Cloud Native PostgreSQL installation as described in the ["Installation"](installation_upgrade.md) section: +Now that the Kubernetes cluster is running, you can proceed with Cloud Native PostgreSQL installation as described in the ["Installation and upgrades"](installation_upgrade.md) section: ```shell -kubectl apply -f https://get.enterprisedb.io/cnp/postgresql-operator-1.9.1.yaml +kubectl apply -f https://get.enterprisedb.io/cnp/postgresql-operator-1.10.0.yaml __OUTPUT__ namespace/postgresql-operator-system created customresourcedefinition.apiextensions.k8s.io/backups.postgresql.k8s.enterprisedb.io created customresourcedefinition.apiextensions.k8s.io/clusters.postgresql.k8s.enterprisedb.io created +customresourcedefinition.apiextensions.k8s.io/poolers.postgresql.k8s.enterprisedb.io created customresourcedefinition.apiextensions.k8s.io/scheduledbackups.postgresql.k8s.enterprisedb.io created -mutatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-mutating-webhook-configuration created serviceaccount/postgresql-operator-manager created clusterrole.rbac.authorization.k8s.io/postgresql-operator-manager created clusterrolebinding.rbac.authorization.k8s.io/postgresql-operator-manager-rolebinding created service/postgresql-operator-webhook-service created deployment.apps/postgresql-operator-controller-manager created +mutatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-mutating-webhook-configuration created validatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-validating-webhook-configuration created ``` @@ -166,13 +180,12 @@ metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"postgresql.k8s.enterprisedb.io/v1","kind":"Cluster","metadata":{"annotations":{},"name":"cluster-example","namespace":"default"},"spec":{"instances":3,"primaryUpdateStrategy":"unsupervised","storage":{"size":"1Gi"}}} - creationTimestamp: "2021-09-30T19:52:07Z" + creationTimestamp: "2021-11-12T05:56:37Z" generation: 1 name: cluster-example namespace: default - resourceVersion: "2292" - selfLink: /apis/postgresql.k8s.enterprisedb.io/v1/namespaces/default/clusters/cluster-example - uid: af696791-b82a-45a9-a1c2-6e4577128d0e + resourceVersion: "2005" + uid: 621d46bc-8a3b-4039-a9f3-6f21ab4ef68d spec: affinity: podAntiAffinityType: preferred @@ -180,10 +193,19 @@ spec: bootstrap: initdb: database: app + encoding: UTF8 + localeCType: C + localeCollate: C owner: app - imageName: quay.io/enterprisedb/postgresql:14.0 + enableSuperuserAccess: true + imageName: quay.io/enterprisedb/postgresql:14.1 + imagePullPolicy: IfNotPresent instances: 3 logLevel: info + maxSyncReplicas: 0 + minSyncReplicas: 0 + postgresGID: 26 + postgresUID: 26 postgresql: parameters: log_destination: csvlog @@ -200,15 +222,18 @@ spec: wal_keep_size: 512MB primaryUpdateStrategy: unsupervised resources: {} + startDelay: 30 + stopDelay: 30 storage: + resizeInUseVolumes: true size: 1Gi status: certificates: clientCASecret: cluster-example-ca expirations: - cluster-example-ca: 2021-12-29 19:47:07 +0000 UTC - cluster-example-replication: 2021-12-29 19:47:07 +0000 UTC - cluster-example-server: 2021-12-29 19:47:07 +0000 UTC + cluster-example-ca: 2022-02-10 05:51:37 +0000 UTC + cluster-example-replication: 2022-02-10 05:51:37 +0000 UTC + cluster-example-server: 2022-02-10 05:51:37 +0000 UTC replicationTLSSecret: cluster-example-replication serverAltDNSNames: - cluster-example-rw @@ -222,9 +247,11 @@ status: - cluster-example-ro.default.svc serverCASecret: cluster-example-ca serverTLSSecret: cluster-example-server - cloudNativePostgresqlCommitHash: c88bd8a + cloudNativePostgresqlCommitHash: f616a0d + cloudNativePostgresqlOperatorHash: 02abbad9215f5118906c0c91d61bfbdb33278939861d2e8ea21978ce48f37421 configMapResourceVersion: {} currentPrimary: cluster-example-1 + currentPrimaryTimestamp: "2021-11-12T05:57:15Z" healthyPVC: - cluster-example-1 - cluster-example-2 @@ -239,22 +266,25 @@ status: licenseStatus: isImplicit: true isTrial: true - licenseExpiration: "2021-10-30T19:52:07Z" + licenseExpiration: "2021-12-12T05:56:37Z" licenseStatus: Implicit trial license repositoryAccess: false valid: true phase: Cluster in healthy state + poolerIntegrations: + pgBouncerIntegration: {} pvcCount: 3 readService: cluster-example-r readyInstances: 3 secretsResourceVersion: - applicationSecretVersion: "884" - clientCaSecretVersion: "880" - replicationSecretVersion: "882" - serverCaSecretVersion: "880" - serverSecretVersion: "881" - superuserSecretVersion: "883" + applicationSecretVersion: "934" + clientCaSecretVersion: "930" + replicationSecretVersion: "932" + serverCaSecretVersion: "930" + serverSecretVersion: "931" + superuserSecretVersion: "933" targetPrimary: cluster-example-1 + targetPrimaryTimestamp: "2021-11-12T05:56:38Z" writeService: cluster-example-rw ``` @@ -273,7 +303,7 @@ status: ## Install the kubectl-cnp plugin -Cloud Native PostgreSQL provides a plugin for kubectl to manage a cluster in Kubernetes, along with a script to install it: +Cloud Native PostgreSQL provides [a plugin for kubectl](cnp-plugin) to manage a cluster in Kubernetes, along with a script to install it: ```shell curl -sSfL \ @@ -281,7 +311,7 @@ curl -sSfL \ sudo sh -s -- -b /usr/local/bin __OUTPUT__ EnterpriseDB/kubectl-cnp info checking GitHub for latest tag -EnterpriseDB/kubectl-cnp info found version: 1.9.1 for v1.9.1/linux/x86_64 +EnterpriseDB/kubectl-cnp info found version: 1.10.0 for v1.10.0/linux/x86_64 EnterpriseDB/kubectl-cnp info installed /usr/local/bin/kubectl-cnp ``` @@ -293,17 +323,22 @@ __OUTPUT__ Cluster in healthy state Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 Primary instance: cluster-example-1 Instances: 3 Ready instances: 3 +Current Timeline: 1 +Current WAL file: 000000010000000000000005 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 0/5000060 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-2 0/5000060 0/5000060 7013817246676054032 ✗ ✓ ✗ ✗ OK -cluster-example-3 0/5000060 0/5000060 7013817246676054032 ✗ ✓ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-1 0/5000060 7029558504442904594 ✓ ✗ ✗ ✗ OK +1.10.0 cluster-example-2 0/5000060 0/5000060 7029558504442904594 ✗ ✓ ✗ ✗ OK +1.10.0 cluster-example-3 0/5000060 0/5000060 7029558504442904594 ✗ ✓ ✗ ✗ OK ``` !!! Note "There's more" @@ -326,20 +361,24 @@ Now if we check the status... kubectl cnp status cluster-example __OUTPUT__ Failing over Failing over to cluster-example-2 -Switchover in progress Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 -Primary instance: cluster-example-1 (switching to cluster-example-2) +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 +Primary instance: cluster-example-2 Instances: 3 Ready instances: 2 +Current Timeline: 2 +Current WAL file: 000000020000000000000006 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 - - - - - - - - pod not available -cluster-example-2 0/60010F0 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-3 0/60000A0 0/60000A0 7013817246676054032 ✗ ✗ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-3 0/60000A0 0/60000A0 7029558504442904594 ✗ ✗ ✗ ✗ OK +45 cluster-example-1 - - - - - - - - pod not available +1.10.0 cluster-example-2 0/6000F58 7029558504442904594 ✓ ✗ ✗ ✗ OK ``` ...the failover process has begun, with the second pod promoted to primary. Once the failed pod has restarted, it will become a replica of the new primary: @@ -350,17 +389,22 @@ __OUTPUT__ Cluster in healthy state Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 Primary instance: cluster-example-2 Instances: 3 Ready instances: 3 +Current Timeline: 2 +Current WAL file: 000000020000000000000006 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 0/6004E70 0/6004E70 7013817246676054032 ✗ ✓ ✗ ✗ OK -cluster-example-2 0/6004E70 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-3 0/6004E70 0/6004E70 7013817246676054032 ✗ ✓ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-3 0/60000A0 0/60000A0 7029558504442904594 ✗ ✗ ✗ ✗ OK +1.10.0 cluster-example-2 0/6004CA0 7029558504442904594 ✓ ✗ ✗ ✗ OK +1.10.0 cluster-example-1 0/6004CA0 0/6004CA0 7029558504442904594 ✗ ✓ ✗ ✗ OK ``` @@ -368,8 +412,6 @@ cluster-example-3 0/6004E70 0/6004E70 7013817246676054032 This is all it takes to get a PostgreSQL cluster up and running, but of course there's a lot more possible - and certainly much more that is prudent before you should ever deploy in a production environment! -- Deploying on public cloud platforms: see the [Cloud Setup](cloud_setup/) section. - - Design goals and possibilities offered by the Cloud Native PostgreSQL Operator: check out the [Architecture](architecture/) and [Use cases](use_cases/) sections. - Configuring a secure and reliable system: read through the [Security](security/), [Failure Modes](failure_modes/) and [Backup and Recovery](backup_recovery/) sections. diff --git a/merge_sources/kubernetes/cloud_native_postgresql/interactive_demo.mdx b/merge_sources/kubernetes/cloud_native_postgresql/interactive_demo.mdx index 233edcfdba0..49dc2ee7979 100644 --- a/merge_sources/kubernetes/cloud_native_postgresql/interactive_demo.mdx +++ b/merge_sources/kubernetes/cloud_native_postgresql/interactive_demo.mdx @@ -1,6 +1,6 @@ --- title: "Installation, Configuration and Deployment Demo" -description: "Walk through the process of installing, configuring and deploying the Cloud Native PostgreSQL Operator via a browser-hosted Minikube console" +description: "Walk through the process of installing, configuring and deploying the Cloud Native PostgreSQL Operator via a browser-hosted Kubernetes environment" navTitle: Install, Configure, Deploy product: 'Cloud Native Operator' platform: ubuntu @@ -8,10 +8,11 @@ tags: - postgresql - cloud-native-postgresql-operator - kubernetes - - minikube + - k3d - live-demo katacodaPanel: - scenario: minikube + scenario: ubuntu:2004 + initializeCommand: clear; echo -e \\\\033[1mPreparing k3d and kubectl...\\\\n\\\\033[0m; snap install kubectl --classic; wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash; clear; echo -e \\\\033[2mk3d is ready\\ - enjoy Kubernetes\\!\\\\033[0m; codelanguages: shell, yaml showInteractiveBadge: true --- @@ -30,22 +31,34 @@ It will take roughly 5-10 minutes to work through. -[Minikube](https://kubernetes.io/docs/setup/learning-environment/minikube/) is already installed in this environment; we just need to start the cluster: +Once [k3d](https://k3d.io/) is ready, we need to start a cluster: ```shell -minikube start +k3d cluster create __OUTPUT__ -* minikube v1.8.1 on Ubuntu 18.04 -* Using the none driver based on user configuration -* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ... -* OS release is Ubuntu 18.04.4 LTS -* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ... - - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf -* Launching Kubernetes ... -* Enabling addons: default-storageclass, storage-provisioner -* Configuring local host environment ... -* Waiting for cluster to come online ... -* Done! kubectl is now configured to use "minikube" +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3s-default' +INFO[0000] Created volume 'k3d-k3s-default-images' +INFO[0000] Starting new tools node... +INFO[0000] Pulling image 'docker.io/rancher/k3d-tools:5.1.0' +INFO[0001] Creating node 'k3d-k3s-default-server-0' +INFO[0001] Pulling image 'docker.io/rancher/k3s:v1.21.5-k3s2' +INFO[0002] Starting Node 'k3d-k3s-default-tools' +INFO[0006] Creating LoadBalancer 'k3d-k3s-default-serverlb' +INFO[0007] Pulling image 'docker.io/rancher/k3d-proxy:5.1.0' +INFO[0011] Using the k3d-tools node to gather environment information +INFO[0011] HostIP: using network gateway... +INFO[0011] Starting cluster 'k3s-default' +INFO[0011] Starting servers... +INFO[0011] Starting Node 'k3d-k3s-default-server-0' +INFO[0018] Starting agents... +INFO[0018] Starting helpers... +INFO[0018] Starting Node 'k3d-k3s-default-serverlb' +INFO[0024] Injecting '172.19.0.1 host.k3d.internal' into /etc/hosts of all nodes... +INFO[0024] Injecting records for host.k3d.internal and for 2 network members into CoreDNS configmap... +INFO[0025] Cluster 'k3s-default' created successfully! +INFO[0025] You can now use it like this: +kubectl cluster-info ``` This will create the Kubernetes cluster, and you will be ready to use it. @@ -54,29 +67,30 @@ Verify that it works with the following command: ```shell kubectl get nodes __OUTPUT__ -NAME STATUS ROLES AGE VERSION -minikube Ready master 66s v1.17.3 +NAME STATUS ROLES AGE VERSION +k3d-k3s-default-server-0 Ready control-plane,master 16s v1.21.5+k3s2 ``` -You will see one node called `minikube`. If the status isn't yet "Ready", wait for a few seconds and run the command above again. +You will see one node called `k3d-k3s-default-server-0`. If the status isn't yet "Ready", wait for a few seconds and run the command above again. ## Install Cloud Native PostgreSQL -Now that the Minikube cluster is running, you can proceed with Cloud Native PostgreSQL installation as described in the ["Installation"](installation_upgrade.md) section: +Now that the Kubernetes cluster is running, you can proceed with Cloud Native PostgreSQL installation as described in the ["Installation and upgrades"](installation_upgrade.md) section: ```shell -kubectl apply -f https://get.enterprisedb.io/cnp/postgresql-operator-1.9.1.yaml +kubectl apply -f https://get.enterprisedb.io/cnp/postgresql-operator-1.10.0.yaml __OUTPUT__ namespace/postgresql-operator-system created customresourcedefinition.apiextensions.k8s.io/backups.postgresql.k8s.enterprisedb.io created customresourcedefinition.apiextensions.k8s.io/clusters.postgresql.k8s.enterprisedb.io created +customresourcedefinition.apiextensions.k8s.io/poolers.postgresql.k8s.enterprisedb.io created customresourcedefinition.apiextensions.k8s.io/scheduledbackups.postgresql.k8s.enterprisedb.io created -mutatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-mutating-webhook-configuration created serviceaccount/postgresql-operator-manager created clusterrole.rbac.authorization.k8s.io/postgresql-operator-manager created clusterrolebinding.rbac.authorization.k8s.io/postgresql-operator-manager-rolebinding created service/postgresql-operator-webhook-service created deployment.apps/postgresql-operator-controller-manager created +mutatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-mutating-webhook-configuration created validatingwebhookconfiguration.admissionregistration.k8s.io/postgresql-operator-validating-webhook-configuration created ``` @@ -166,13 +180,12 @@ metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"postgresql.k8s.enterprisedb.io/v1","kind":"Cluster","metadata":{"annotations":{},"name":"cluster-example","namespace":"default"},"spec":{"instances":3,"primaryUpdateStrategy":"unsupervised","storage":{"size":"1Gi"}}} - creationTimestamp: "2021-09-30T19:52:07Z" + creationTimestamp: "2021-11-12T05:56:37Z" generation: 1 name: cluster-example namespace: default - resourceVersion: "2292" - selfLink: /apis/postgresql.k8s.enterprisedb.io/v1/namespaces/default/clusters/cluster-example - uid: af696791-b82a-45a9-a1c2-6e4577128d0e + resourceVersion: "2005" + uid: 621d46bc-8a3b-4039-a9f3-6f21ab4ef68d spec: affinity: podAntiAffinityType: preferred @@ -180,10 +193,19 @@ spec: bootstrap: initdb: database: app + encoding: UTF8 + localeCType: C + localeCollate: C owner: app - imageName: quay.io/enterprisedb/postgresql:14.0 + enableSuperuserAccess: true + imageName: quay.io/enterprisedb/postgresql:14.1 + imagePullPolicy: IfNotPresent instances: 3 logLevel: info + maxSyncReplicas: 0 + minSyncReplicas: 0 + postgresGID: 26 + postgresUID: 26 postgresql: parameters: log_destination: csvlog @@ -200,15 +222,18 @@ spec: wal_keep_size: 512MB primaryUpdateStrategy: unsupervised resources: {} + startDelay: 30 + stopDelay: 30 storage: + resizeInUseVolumes: true size: 1Gi status: certificates: clientCASecret: cluster-example-ca expirations: - cluster-example-ca: 2021-12-29 19:47:07 +0000 UTC - cluster-example-replication: 2021-12-29 19:47:07 +0000 UTC - cluster-example-server: 2021-12-29 19:47:07 +0000 UTC + cluster-example-ca: 2022-02-10 05:51:37 +0000 UTC + cluster-example-replication: 2022-02-10 05:51:37 +0000 UTC + cluster-example-server: 2022-02-10 05:51:37 +0000 UTC replicationTLSSecret: cluster-example-replication serverAltDNSNames: - cluster-example-rw @@ -222,9 +247,11 @@ status: - cluster-example-ro.default.svc serverCASecret: cluster-example-ca serverTLSSecret: cluster-example-server - cloudNativePostgresqlCommitHash: c88bd8a + cloudNativePostgresqlCommitHash: f616a0d + cloudNativePostgresqlOperatorHash: 02abbad9215f5118906c0c91d61bfbdb33278939861d2e8ea21978ce48f37421 configMapResourceVersion: {} currentPrimary: cluster-example-1 + currentPrimaryTimestamp: "2021-11-12T05:57:15Z" healthyPVC: - cluster-example-1 - cluster-example-2 @@ -239,22 +266,25 @@ status: licenseStatus: isImplicit: true isTrial: true - licenseExpiration: "2021-10-30T19:52:07Z" + licenseExpiration: "2021-12-12T05:56:37Z" licenseStatus: Implicit trial license repositoryAccess: false valid: true phase: Cluster in healthy state + poolerIntegrations: + pgBouncerIntegration: {} pvcCount: 3 readService: cluster-example-r readyInstances: 3 secretsResourceVersion: - applicationSecretVersion: "884" - clientCaSecretVersion: "880" - replicationSecretVersion: "882" - serverCaSecretVersion: "880" - serverSecretVersion: "881" - superuserSecretVersion: "883" + applicationSecretVersion: "934" + clientCaSecretVersion: "930" + replicationSecretVersion: "932" + serverCaSecretVersion: "930" + serverSecretVersion: "931" + superuserSecretVersion: "933" targetPrimary: cluster-example-1 + targetPrimaryTimestamp: "2021-11-12T05:56:38Z" writeService: cluster-example-rw ``` @@ -273,7 +303,7 @@ status: ## Install the kubectl-cnp plugin -Cloud Native PostgreSQL provides a plugin for kubectl to manage a cluster in Kubernetes, along with a script to install it: +Cloud Native PostgreSQL provides [a plugin for kubectl](cnp-plugin) to manage a cluster in Kubernetes, along with a script to install it: ```shell curl -sSfL \ @@ -281,7 +311,7 @@ curl -sSfL \ sudo sh -s -- -b /usr/local/bin __OUTPUT__ EnterpriseDB/kubectl-cnp info checking GitHub for latest tag -EnterpriseDB/kubectl-cnp info found version: 1.9.1 for v1.9.1/linux/x86_64 +EnterpriseDB/kubectl-cnp info found version: 1.10.0 for v1.10.0/linux/x86_64 EnterpriseDB/kubectl-cnp info installed /usr/local/bin/kubectl-cnp ``` @@ -293,17 +323,22 @@ __OUTPUT__ Cluster in healthy state Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 Primary instance: cluster-example-1 Instances: 3 Ready instances: 3 +Current Timeline: 1 +Current WAL file: 000000010000000000000005 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 0/5000060 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-2 0/5000060 0/5000060 7013817246676054032 ✗ ✓ ✗ ✗ OK -cluster-example-3 0/5000060 0/5000060 7013817246676054032 ✗ ✓ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-1 0/5000060 7029558504442904594 ✓ ✗ ✗ ✗ OK +1.10.0 cluster-example-2 0/5000060 0/5000060 7029558504442904594 ✗ ✓ ✗ ✗ OK +1.10.0 cluster-example-3 0/5000060 0/5000060 7029558504442904594 ✗ ✓ ✗ ✗ OK ``` !!! Note "There's more" @@ -326,20 +361,24 @@ Now if we check the status... kubectl cnp status cluster-example __OUTPUT__ Failing over Failing over to cluster-example-2 -Switchover in progress Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 -Primary instance: cluster-example-1 (switching to cluster-example-2) +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 +Primary instance: cluster-example-2 Instances: 3 Ready instances: 2 +Current Timeline: 2 +Current WAL file: 000000020000000000000006 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 - - - - - - - - pod not available -cluster-example-2 0/60010F0 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-3 0/60000A0 0/60000A0 7013817246676054032 ✗ ✗ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-3 0/60000A0 0/60000A0 7029558504442904594 ✗ ✗ ✗ ✗ OK +45 cluster-example-1 - - - - - - - - pod not available +1.10.0 cluster-example-2 0/6000F58 7029558504442904594 ✓ ✗ ✗ ✗ OK ``` ...the failover process has begun, with the second pod promoted to primary. Once the failed pod has restarted, it will become a replica of the new primary: @@ -350,17 +389,22 @@ __OUTPUT__ Cluster in healthy state Name: cluster-example Namespace: default -PostgreSQL Image: quay.io/enterprisedb/postgresql:14.0 +PostgreSQL Image: quay.io/enterprisedb/postgresql:14.1 Primary instance: cluster-example-2 Instances: 3 Ready instances: 3 +Current Timeline: 2 +Current WAL file: 000000020000000000000006 + +Continuous Backup status +Not configured Instances status -Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status --------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ -cluster-example-1 0/6004E70 0/6004E70 7013817246676054032 ✗ ✓ ✗ ✗ OK -cluster-example-2 0/6004E70 7013817246676054032 ✓ ✗ ✗ ✗ OK -cluster-example-3 0/6004E70 0/6004E70 7013817246676054032 ✗ ✓ ✗ ✗ OK +Manager Version Pod name Current LSN Received LSN Replay LSN System ID Primary Replicating Replay paused Pending restart Status +--------------- -------- ----------- ------------ ---------- --------- ------- ----------- ------------- --------------- ------ +1.10.0 cluster-example-3 0/60000A0 0/60000A0 7029558504442904594 ✗ ✗ ✗ ✗ OK +1.10.0 cluster-example-2 0/6004CA0 7029558504442904594 ✓ ✗ ✗ ✗ OK +1.10.0 cluster-example-1 0/6004CA0 0/6004CA0 7029558504442904594 ✗ ✓ ✗ ✗ OK ``` @@ -368,8 +412,6 @@ cluster-example-3 0/6004E70 0/6004E70 7013817246676054032 This is all it takes to get a PostgreSQL cluster up and running, but of course there's a lot more possible - and certainly much more that is prudent before you should ever deploy in a production environment! -- Deploying on public cloud platforms: see the [Cloud Setup](cloud_setup/) section. - - Design goals and possibilities offered by the Cloud Native PostgreSQL Operator: check out the [Architecture](architecture/) and [Use cases](use_cases/) sections. - Configuring a secure and reliable system: read through the [Security](security/), [Failure Modes](failure_modes/) and [Backup and Recovery](backup_recovery/) sections.