From 33ccabca148f0b527ed4afae6cb670bed74bc436 Mon Sep 17 00:00:00 2001 From: Hiranmoy Das Chowdhury Date: Wed, 27 Nov 2024 17:19:46 +0600 Subject: [PATCH] Horizontal scaling done Signed-off-by: Hiranmoy Das Chowdhury --- .../scaling/horizontal-scaling-down-ops.yaml | 11 + .../scaling/horizontal-scaling-ops.yaml | 11 + .../pgbouncer/scaling/pb-horizontal.yaml | 23 ++ .../horizontal-scaling/horizontal-ops.md | 220 +++++++----------- .../scaling/horizontal-scaling/overview.md | 36 +-- .../pgbouncer/horizontal-scaling.png | Bin 0 -> 44824 bytes 6 files changed, 148 insertions(+), 153 deletions(-) create mode 100644 docs/examples/pgbouncer/scaling/horizontal-scaling-down-ops.yaml create mode 100644 docs/examples/pgbouncer/scaling/horizontal-scaling-ops.yaml create mode 100644 docs/examples/pgbouncer/scaling/pb-horizontal.yaml create mode 100644 docs/images/day-2-operation/pgbouncer/horizontal-scaling.png diff --git a/docs/examples/pgbouncer/scaling/horizontal-scaling-down-ops.yaml b/docs/examples/pgbouncer/scaling/horizontal-scaling-down-ops.yaml new file mode 100644 index 000000000..7447bb29e --- /dev/null +++ b/docs/examples/pgbouncer/scaling/horizontal-scaling-down-ops.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: PgBouncerOpsRequest +metadata: + name: pgbouncer-horizontal-scale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: pb-horizontal + horizontalScaling: + replicas: 2 \ No newline at end of file diff --git a/docs/examples/pgbouncer/scaling/horizontal-scaling-ops.yaml b/docs/examples/pgbouncer/scaling/horizontal-scaling-ops.yaml new file mode 100644 index 000000000..75dc3397f --- /dev/null +++ b/docs/examples/pgbouncer/scaling/horizontal-scaling-ops.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: PgBouncerOpsRequest +metadata: + name: pgbouncer-horizontal-scale-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: pb-horizontal + horizontalScaling: + replicas: 3 \ No newline at end of file diff --git a/docs/examples/pgbouncer/scaling/pb-horizontal.yaml b/docs/examples/pgbouncer/scaling/pb-horizontal.yaml new file mode 100644 index 000000000..512304f10 --- /dev/null +++ b/docs/examples/pgbouncer/scaling/pb-horizontal.yaml @@ -0,0 +1,23 @@ +apiVersion: kubedb.com/v1 +kind: PgBouncer +metadata: + name: pb-horizontal + namespace: demo +spec: + replicas: 1 + version: "1.18.0" + database: + syncUsers: true + databaseName: "postgres" + databaseRef: + name: "ha-postgres" + namespace: demo + connectionPool: + poolMode: session + port: 5432 + reservePoolSize: 5 + maxClientConnections: 87 + defaultPoolSize: 2 + minPoolSize: 1 + authType: md5 + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/pgbouncer/scaling/horizontal-scaling/horizontal-ops.md b/docs/guides/pgbouncer/scaling/horizontal-scaling/horizontal-ops.md index 06491c627..f11927fc8 100644 --- a/docs/guides/pgbouncer/scaling/horizontal-scaling/horizontal-ops.md +++ b/docs/guides/pgbouncer/scaling/horizontal-scaling/horizontal-ops.md @@ -87,8 +87,8 @@ Now, wait until `pb-horizontal ` has status `Ready`. i.e, ```bash $ kubectl get pb -n demo -NAME TYPE VERSION STATUS AGE -pb-horizontal kubedb.com/v1 1.18.0 Ready 2m +NAME VERSION STATUS AGE +pb-horizontal 1.18.0 Ready 2m19s ``` Let's check the number of replicas this pgbouncer has from the PgBouncer object, number of pods the petset have, @@ -101,7 +101,7 @@ $ kubectl get petset -n demo pb-horizontal -o json | jq '.spec.replicas' 1 ``` -We can see from both command that the pgbouncer has 3 replicas. +We can see from both command that the pgbouncer has 1 replicas. We are now ready to apply the `PgBouncerOpsRequest` CR to scale this pgbouncer. @@ -136,7 +136,7 @@ Here, Let's create the `PgBouncerOpsRequest` CR we have shown above, ```bash -$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/pgbouncer/scaling/horizontal-scaling/pbops-hscale-up-ops.yaml +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/pgbouncer/scaling/horizontal-scaling-ops.yaml pgbounceropsrequest.ops.kubedb.com/pgbouncer-horizontal-scale-up created ``` @@ -164,91 +164,59 @@ Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: PgBouncerOpsRequest Metadata: - Creation Timestamp: 2024-07-17T08:35:13Z + Creation Timestamp: 2024-11-27T11:12:29Z Generation: 1 - Resource Version: 62002 - UID: ce44f7a1-e78d-4248-a691-62fe1efd11f3 + Resource Version: 49162 + UID: ce390f66-e10f-490f-ad47-f28894d0569a Spec: Apply: IfReady Database Ref: Name: pb-horizontal Horizontal Scaling: - Node: 3 - Type: HorizontalScaling + Replicas: 3 + Type: HorizontalScaling Status: Conditions: - Last Transition Time: 2024-07-17T08:35:13Z - Message: PgBouncer ops-request has started to horizontally scaling the nodes + Last Transition Time: 2024-11-27T11:12:29Z + Message: Controller has started to Progress with HorizontalScaling of PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-up Observed Generation: 1 - Reason: HorizontalScaling + Reason: Running Status: True - Type: HorizontalScaling - Last Transition Time: 2024-07-17T08:35:16Z - Message: Successfully paused database + Type: Running + Last Transition Time: 2024-11-27T11:12:32Z + Message: Horizontal scaling started in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up Observed Generation: 1 - Reason: DatabasePauseSucceeded + Reason: HorizontalScaleStarted Status: True - Type: DatabasePauseSucceeded - Last Transition Time: 2024-07-17T08:35:41Z - Message: Successfully Scaled Up Node - Observed Generation: 1 - Reason: HorizontalScaleUp - Status: True - Type: HorizontalScaleUp - Last Transition Time: 2024-07-17T08:35:21Z - Message: patch petset; ConditionStatus:True; PodName:pb-horizontal-1 - Observed Generation: 1 - Status: True - Type: PatchPetset--pb-horizontal-1 - Last Transition Time: 2024-07-17T08:35:26Z - Message: is pod ready; ConditionStatus:True; PodName:pb-horizontal-1 - Observed Generation: 1 - Status: True - Type: IsPodReady--pb-horizontal-1 - Last Transition Time: 2024-07-17T08:35:26Z - Message: client failure; ConditionStatus:True; PodName:pb-horizontal-1 - Observed Generation: 1 - Status: True - Type: ClientFailure--pb-horizontal-1 - Last Transition Time: 2024-07-17T08:35:26Z - Message: is node healthy; ConditionStatus:True; PodName:pb-horizontal-1 - Observed Generation: 1 - Status: True - Type: IsNodeHealthy--pb-horizontal-1 - Last Transition Time: 2024-07-17T08:35:31Z - Message: patch petset; ConditionStatus:True; PodName:pb-horizontal-2 - Observed Generation: 1 - Status: True - Type: PatchPetset--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:35:31Z - Message: pb-horizontal already has desired replicas + Type: HorizontalScale + Last Transition Time: 2024-11-27T11:12:37Z + Message: patch p s; ConditionStatus:True; PodName:pb-horizontal-1 Observed Generation: 1 - Reason: HorizontalScale Status: True - Type: HorizontalScale - Last Transition Time: 2024-07-17T08:35:36Z - Message: is pod ready; ConditionStatus:True; PodName:pb-horizontal-2 + Type: PatchPS--pb-horizontal-1 + Last Transition Time: 2024-11-27T11:12:42Z + Message: is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-1 Observed Generation: 1 Status: True - Type: IsPodReady--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:35:36Z - Message: client failure; ConditionStatus:True; PodName:pb-horizontal-2 + Type: IsPgBouncerRunning--pb-horizontal-1 + Last Transition Time: 2024-11-27T11:12:47Z + Message: patch p s; ConditionStatus:True; PodName:pb-horizontal-2 Observed Generation: 1 Status: True - Type: ClientFailure--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:35:36Z - Message: is node healthy; ConditionStatus:True; PodName:pb-horizontal-2 + Type: PatchPS--pb-horizontal-2 + Last Transition Time: 2024-11-27T11:12:52Z + Message: is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-2 Observed Generation: 1 Status: True - Type: IsNodeHealthy--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:35:41Z - Message: Successfully updated PgBouncer + Type: IsPgBouncerRunning--pb-horizontal-2 + Last Transition Time: 2024-11-27T11:12:57Z + Message: Horizontal scaling Up performed successfully in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up Observed Generation: 1 - Reason: UpdateDatabase + Reason: HorizontalScaleSucceeded Status: True - Type: UpdateDatabase - Last Transition Time: 2024-07-17T08:35:41Z - Message: Successfully completed horizontally scale pgbouncer cluster + Type: HorizontalScaleUp + Last Transition Time: 2024-11-27T11:13:07Z + Message: Controller has successfully completed with HorizontalScaling of PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-up Observed Generation: 1 Reason: Successful Status: True @@ -256,21 +224,20 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Starting 4m5s KubeDB Ops-manager Operator Start processing for PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-up - Normal Starting 4m5s KubeDB Ops-manager Operator Pausing PgBouncer databse: demo/pb-horizontal - Normal Successful 4m5s KubeDB Ops-manager Operator Successfully paused PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up - Normal patch petset; ConditionStatus:True; PodName:pb-horizontal-1 3m57s KubeDB Ops-manager Operator patch petset; ConditionStatus:True; PodName:pb-horizontal-1 - Normal is pod ready; ConditionStatus:True; PodName:pb-horizontal-1 3m52s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:pb-horizontal-1 - Normal is node healthy; ConditionStatus:True; PodName:pb-horizontal-1 3m52s KubeDB Ops-manager Operator is node healthy; ConditionStatus:True; PodName:pb-horizontal-1 - Normal patch petset; ConditionStatus:True; PodName:pb-horizontal-2 3m47s KubeDB Ops-manager Operator patch petset; ConditionStatus:True; PodName:pb-horizontal-2 - Normal is pod ready; ConditionStatus:True; PodName:pb-horizontal-2 3m42s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:pb-horizontal-2 - Normal is node healthy; ConditionStatus:True; PodName:pb-horizontal-2 3m42s KubeDB Ops-manager Operator is node healthy; ConditionStatus:True; PodName:pb-horizontal-2 - Normal HorizontalScaleUp 3m37s KubeDB Ops-manager Operator Successfully Scaled Up Node - Normal UpdateDatabase 3m37s KubeDB Ops-manager Operator Successfully updated PgBouncer - Normal Starting 3m37s KubeDB Ops-manager Operator Resuming PgBouncer database: demo/pb-horizontal - Normal Successful 3m37s KubeDB Ops-manager Operator Successfully resumed PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m13s KubeDB Ops-manager Operator Start processing for PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-up + Normal Starting 2m13s KubeDB Ops-manager Operator Pausing PgBouncer databse: demo/pb-horizontal + Normal Successful 2m13s KubeDB Ops-manager Operator Successfully paused PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up + Normal Starting 2m10s KubeDB Ops-manager Operator Horizontal scaling started in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up + Warning patch p s; ConditionStatus:True; PodName:pb-horizontal-1 2m5s KubeDB Ops-manager Operator patch p s; ConditionStatus:True; PodName:pb-horizontal-1 + Warning is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-1 2m KubeDB Ops-manager Operator is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-1 + Warning patch p s; ConditionStatus:True; PodName:pb-horizontal-2 115s KubeDB Ops-manager Operator patch p s; ConditionStatus:True; PodName:pb-horizontal-2 + Warning is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-2 110s KubeDB Ops-manager Operator is pg bouncer running; ConditionStatus:True; PodName:pb-horizontal-2 + Normal Successful 105s KubeDB Ops-manager Operator Horizontal scaling Up performed successfully in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-up + Normal Starting 95s KubeDB Ops-manager Operator Resuming PgBouncer database: demo/pb-horizontal + Normal Successful 95s KubeDB Ops-manager Operator Successfully resumed PgBouncer database: demo/pb-horizontal + Normal Successful 95s KubeDB Ops-manager Operator Controller has Successfully scaled the PgBouncer database: demo/pb-horizontal ``` Now, we are going to verify the number of replicas this pgbouncer has from the PgBouncer object, number of pods the petset have, @@ -316,7 +283,7 @@ Here, Let's create the `PgBouncerOpsRequest` CR we have shown above, ```bash -$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/pgbouncer/scaling/horizontal-scaling/pbops-hscale-down-ops.yaml +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/pgbouncer/scaling/horizontal-scaling-down-ops.yaml pgbounceropsrequest.ops.kubedb.com/pgbouncer-horizontal-scale-down created ``` @@ -344,66 +311,49 @@ Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: PgBouncerOpsRequest Metadata: - Creation Timestamp: 2024-07-17T08:52:28Z + Creation Timestamp: 2024-11-27T11:16:05Z Generation: 1 - Resource Version: 63600 - UID: 019f9d8f-c2b0-4154-b3d3-b715b8805fd7 + Resource Version: 49481 + UID: cf4bc042-8316-4dce-b6a2-60981af7f4db Spec: Apply: IfReady Database Ref: Name: pb-horizontal Horizontal Scaling: - Node: 2 - Type: HorizontalScaling + Replicas: 2 + Type: HorizontalScaling Status: Conditions: - Last Transition Time: 2024-07-17T08:52:28Z - Message: PgBouncer ops-request has started to horizontally scaling the nodes - Observed Generation: 1 - Reason: HorizontalScaling - Status: True - Type: HorizontalScaling - Last Transition Time: 2024-07-17T08:52:31Z - Message: Successfully paused database - Observed Generation: 1 - Reason: DatabasePauseSucceeded - Status: True - Type: DatabasePauseSucceeded - Last Transition Time: 2024-07-17T08:53:16Z - Message: Successfully Scaled Down Node - Observed Generation: 1 - Reason: HorizontalScaleDown - Status: True - Type: HorizontalScaleDown - Last Transition Time: 2024-07-17T08:52:36Z - Message: patch petset; ConditionStatus:True; PodName:pb-horizontal-2 + Last Transition Time: 2024-11-27T11:16:05Z + Message: Controller has started to Progress with HorizontalScaling of PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-down Observed Generation: 1 + Reason: Running Status: True - Type: PatchPetset--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:52:36Z - Message: pb-horizontal already has desired replicas + Type: Running + Last Transition Time: 2024-11-27T11:16:08Z + Message: Horizontal scaling started in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down Observed Generation: 1 - Reason: HorizontalScale + Reason: HorizontalScaleStarted Status: True Type: HorizontalScale - Last Transition Time: 2024-07-17T08:52:41Z - Message: get pod; ConditionStatus:False + Last Transition Time: 2024-11-27T11:16:13Z + Message: patch p s; ConditionStatus:True; PodName:pb-horizontal-3 Observed Generation: 1 - Status: False - Type: GetPod - Last Transition Time: 2024-07-17T08:53:11Z + Status: True + Type: PatchPS--pb-horizontal-3 + Last Transition Time: 2024-11-27T11:16:18Z Message: get pod; ConditionStatus:True; PodName:pb-horizontal-2 Observed Generation: 1 Status: True Type: GetPod--pb-horizontal-2 - Last Transition Time: 2024-07-17T08:53:16Z - Message: Successfully updated PgBouncer + Last Transition Time: 2024-11-27T11:16:23Z + Message: Horizontal scaling down performed successfully in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down Observed Generation: 1 - Reason: UpdateDatabase + Reason: HorizontalScaleSucceeded Status: True - Type: UpdateDatabase - Last Transition Time: 2024-07-17T08:53:16Z - Message: Successfully completed horizontally scale pgbouncer cluster + Type: HorizontalScaleDown + Last Transition Time: 2024-11-27T11:16:33Z + Message: Controller has successfully completed with HorizontalScaling of PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-down Observed Generation: 1 Reason: Successful Status: True @@ -411,18 +361,18 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Starting 96s KubeDB Ops-manager Operator Start processing for PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-down - Normal Starting 96s KubeDB Ops-manager Operator Pausing PgBouncer databse: demo/pb-horizontal - Normal Successful 96s KubeDB Ops-manager Operator Successfully paused PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down - Normal patch petset; ConditionStatus:True; PodName:pb-horizontal-2 88s KubeDB Ops-manager Operator patch petset; ConditionStatus:True; PodName:pb-horizontal-2 - Normal get pod; ConditionStatus:False 83s KubeDB Ops-manager Operator get pod; ConditionStatus:False - Normal get pod; ConditionStatus:True; PodName:pb-horizontal-2 53s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:pb-horizontal-2 - Normal HorizontalScaleDown 48s KubeDB Ops-manager Operator Successfully Scaled Down Node - Normal UpdateDatabase 48s KubeDB Ops-manager Operator Successfully updated PgBouncer - Normal Starting 48s KubeDB Ops-manager Operator Resuming PgBouncer database: demo/pb-horizontal - Normal Successful 48s KubeDB Ops-manager Operator Successfully resumed PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m38s KubeDB Ops-manager Operator Start processing for PgBouncerOpsRequest: demo/pgbouncer-horizontal-scale-down + Normal Starting 2m38s KubeDB Ops-manager Operator Pausing PgBouncer databse: demo/pb-horizontal + Normal Successful 2m38s KubeDB Ops-manager Operator Successfully paused PgBouncer database: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down + Normal Starting 2m35s KubeDB Ops-manager Operator Horizontal scaling started in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down + Warning patch p s; ConditionStatus:True; PodName:pb-horizontal-3 2m30s KubeDB Ops-manager Operator patch p s; ConditionStatus:True; PodName:pb-horizontal-3 + Warning get pod; ConditionStatus:True; PodName:pb-horizontal-2 2m25s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:pb-horizontal-2 + Normal Successful 2m20s KubeDB Ops-manager Operator Horizontal scaling down performed successfully in PgBouncer: demo/pb-horizontal for PgBouncerOpsRequest: pgbouncer-horizontal-scale-down + Normal Starting 2m10s KubeDB Ops-manager Operator Resuming PgBouncer database: demo/pb-horizontal + Normal Successful 2m10s KubeDB Ops-manager Operator Successfully resumed PgBouncer database: demo/pb-horizontal + Normal Successful 2m10s KubeDB Ops-manager Operator Controller has Successfully scaled the PgBouncer database: demo/pb-horizontal ``` Now, we are going to verify the number of replicas this pgbouncer has from the PgBouncer object, number of pods the petset have, diff --git a/docs/guides/pgbouncer/scaling/horizontal-scaling/overview.md b/docs/guides/pgbouncer/scaling/horizontal-scaling/overview.md index 06eeb25f8..44681355b 100644 --- a/docs/guides/pgbouncer/scaling/horizontal-scaling/overview.md +++ b/docs/guides/pgbouncer/scaling/horizontal-scaling/overview.md @@ -1,5 +1,5 @@ --- -title: Pgpool Horizontal Scaling Overview +title: PgBouncer Horizontal Scaling Overview menu: docs_{{ .version }}: identifier: pb-horizontal-scaling-overview @@ -12,43 +12,43 @@ section_menu_id: guides > New to KubeDB? Please start [here](/docs/README.md). -# Pgpool Horizontal Scaling +# PgBouncer Horizontal Scaling -This guide will give an overview on how KubeDB Ops-manager operator scales up or down `Pgpool` replicas of PetSet. +This guide will give an overview on how KubeDB Ops-manager operator scales up or down `PgBouncer` replicas of PetSet. ## Before You Begin - You should be familiar with the following `KubeDB` concepts: - - [Pgpool](/docs/guides/pgpool/concepts/pgpool.md) - - [PgpoolOpsRequest](/docs/guides/pgpool/concepts/opsrequest.md) + - [PgBouncer](/docs/guides/pgbouncer/concepts/pgbouncer.md) + - [PgBouncerOpsRequest](/docs/guides/pgbouncer/concepts/opsrequest.md) ## How Horizontal Scaling Process Works -The following diagram shows how KubeDB Ops-manager operator scales up or down `Pgpool` database components. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator scales up or down `PgBouncer` database components. Open the image in a new tab to see the enlarged version.
-  Horizontal scaling process of Pgpool -
Fig: Horizontal scaling process of Pgpool
+  Horizontal scaling process of PgBouncer +
Fig: Horizontal scaling process of PgBouncer
The Horizontal scaling process consists of the following steps: -1. At first, a user creates a `Pgpool` Custom Resource (CR). +1. At first, a user creates a `PgBouncer` Custom Resource (CR). -2. `KubeDB` Provisioner operator watches the `Pgpool` CR. +2. `KubeDB` Provisioner operator watches the `PgBouncer` CR. -3. When the operator finds a `Pgpool` CR, it creates `PetSet` and related necessary stuff like secrets, services, etc. +3. When the operator finds a `PgBouncer` CR, it creates `PetSet` and related necessary stuff like secrets, services, etc. -4. Then, in order to scale the `PetSet` of the `Pgpool` database the user creates a `PgpoolOpsRequest` CR with desired information. +4. Then, in order to scale the `PetSet` of the `PgBouncer` database the user creates a `PgBouncerOpsRequest` CR with desired information. -5. `KubeDB` Ops-manager operator watches the `PgpoolOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `PgBouncerOpsRequest` CR. -6. When it finds a `PgpoolOpsRequest` CR, it pauses the `Pgpool` object which is referred from the `PgpoolOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Pgpool` object during the horizontal scaling process. +6. When it finds a `PgBouncerOpsRequest` CR, it pauses the `PgBouncer` object which is referred from the `PgBouncerOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `PgBouncer` object during the horizontal scaling process. -7. Then the `KubeDB` Ops-manager operator will scale the related PetSet Pods to reach the expected number of replicas defined in the `PgpoolOpsRequest` CR. +7. Then the `KubeDB` Ops-manager operator will scale the related PetSet Pods to reach the expected number of replicas defined in the `PgBouncerOpsRequest` CR. -8. After the successfully scaling the replicas of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the number of replicas in the `Pgpool` object to reflect the updated state. +8. After the successfully scaling the replicas of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the number of replicas in the `PgBouncer` object to reflect the updated state. -9. After the successful scaling of the `Pgpool` replicas, the `KubeDB` Ops-manager operator resumes the `Pgpool` object so that the `KubeDB` Provisioner operator resumes its usual operations. +9. After the successful scaling of the `PgBouncer` replicas, the `KubeDB` Ops-manager operator resumes the `PgBouncer` object so that the `KubeDB` Provisioner operator resumes its usual operations. -In the next docs, we are going to show a step-by-step guide on horizontal scaling of Pgpool using `PgpoolOpsRequest` CRD. \ No newline at end of file +In the next docs, we are going to show a step-by-step guide on horizontal scaling of PgBouncer using `PgBouncerOpsRequest` CRD. \ No newline at end of file diff --git a/docs/images/day-2-operation/pgbouncer/horizontal-scaling.png b/docs/images/day-2-operation/pgbouncer/horizontal-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae39092c6f7ddcc2a4d68280446fc7fe8d223e9 GIT binary patch literal 44824 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 i(?8PO3BZ93CsN-cM5|pABohHol08tTxz|4+97 literal 0 HcmV?d00001