From 44768aa74fa6e2d7bb5493594c190b24cef6e613 Mon Sep 17 00:00:00 2001 From: Arnob kumar saha Date: Wed, 26 Oct 2022 19:16:59 +0600 Subject: [PATCH] Update mongo doc upto release v2022.10.18 Signed-off-by: Arnob kumar saha --- .../mongodb/autoscaling/compute/mg-as-rs.yaml | 11 +- .../autoscaling/compute/mg-as-shard.yaml | 9 +- .../autoscaling/compute/mg-as-standalone.yaml | 9 +- .../mongodb/autoscaler/compute/overview.md | 19 +- .../mongodb/autoscaler/compute/replicaset.md | 465 +++++++---------- .../mongodb/autoscaler/compute/sharding.md | 477 +++++++----------- .../mongodb/autoscaler/compute/standalone.md | 443 ++++++---------- .../mongodb/autoscaler/storage/overview.md | 25 +- .../mongodb/autoscaler/storage/replicaset.md | 19 +- .../mongodb/autoscaler/storage/sharding.md | 19 +- .../mongodb/autoscaler/storage/standalone.md | 19 +- .../mongodb/backup/customization/index.md | 11 +- .../backup/logical/replicaset/index.md | 29 +- .../mongodb/backup/logical/sharding/index.md | 29 +- .../backup/logical/standalone/index.md | 29 +- docs/guides/mongodb/cli/cli.md | 20 +- docs/guides/mongodb/concepts/appbinding.md | 66 ++- docs/guides/mongodb/concepts/catalog.md | 32 +- docs/guides/mongodb/concepts/mongodb.md | 35 +- docs/guides/mongodb/concepts/opsrequest.md | 26 + .../configuration/using-config-file.md | 5 + .../configuration/using-podtemplate.md | 6 + .../mongodb/custom-rbac/using-custom-rbac.md | 4 +- docs/guides/mongodb/monitoring/overview.md | 8 +- .../monitoring/using-prometheus-operator.md | 161 ++---- .../using-private-registry.md | 66 +-- .../mongodb/reconfigure-tls/overview.md | 16 +- .../reconfigure-tls/reconfigure-tls.md | 45 +- docs/guides/mongodb/reconfigure/overview.md | 16 +- docs/guides/mongodb/reconfigure/replicaset.md | 68 ++- docs/guides/mongodb/reconfigure/sharding.md | 49 +- docs/guides/mongodb/reconfigure/standalone.md | 65 ++- .../scaling/horizontal-scaling/overview.md | 16 +- .../scaling/horizontal-scaling/replicaset.md | 32 +- .../scaling/horizontal-scaling/sharding.md | 64 +-- .../scaling/vertical-scaling/overview.md | 16 +- .../scaling/vertical-scaling/replicaset.md | 92 ++-- .../scaling/vertical-scaling/sharding.md | 129 +++-- .../scaling/vertical-scaling/standalone.md | 75 +-- .../deploy-mongodbdatabase/index.md | 4 +- .../initializing-with-script/index.md | 4 +- .../initializing-with-snapshot/index.md | 4 +- docs/guides/mongodb/tls/overview.md | 6 +- docs/guides/mongodb/upgrading/overview.md | 16 +- docs/guides/mongodb/upgrading/replicaset.md | 220 ++++---- docs/guides/mongodb/upgrading/sharding.md | 159 +++--- docs/guides/mongodb/upgrading/standalone.md | 220 ++++---- .../mongodb/volume-expansion/overview.md | 18 +- .../mongodb/volume-expansion/replicaset.md | 14 +- .../mongodb/volume-expansion/sharding.md | 16 +- .../mongodb/volume-expansion/standalone.md | 14 +- docs/images/mongodb/compute-process.png | Bin 0 -> 746128 bytes docs/images/mongodb/storage-process.png | Bin 0 -> 743322 bytes 53 files changed, 1647 insertions(+), 1773 deletions(-) create mode 100644 docs/images/mongodb/compute-process.png create mode 100644 docs/images/mongodb/storage-process.png diff --git a/docs/examples/mongodb/autoscaling/compute/mg-as-rs.yaml b/docs/examples/mongodb/autoscaling/compute/mg-as-rs.yaml index 2a3dd688c4..f2936d8b80 100644 --- a/docs/examples/mongodb/autoscaling/compute/mg-as-rs.yaml +++ b/docs/examples/mongodb/autoscaling/compute/mg-as-rs.yaml @@ -6,14 +6,19 @@ metadata: spec: databaseRef: name: mg-rs + opsRequestOptions: + timeout: 3m + apply: IfReady compute: replicaSet: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 200m - memory: 300Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi - controlledResources: ["cpu", "memory"] \ No newline at end of file + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" \ No newline at end of file diff --git a/docs/examples/mongodb/autoscaling/compute/mg-as-shard.yaml b/docs/examples/mongodb/autoscaling/compute/mg-as-shard.yaml index 65b5e06459..8f298fedfa 100644 --- a/docs/examples/mongodb/autoscaling/compute/mg-as-shard.yaml +++ b/docs/examples/mongodb/autoscaling/compute/mg-as-shard.yaml @@ -6,14 +6,19 @@ metadata: spec: databaseRef: name: mg-sh + opsRequestOptions: + timeout: 3m + apply: IfReady compute: shard: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 250m - memory: 350Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" \ No newline at end of file diff --git a/docs/examples/mongodb/autoscaling/compute/mg-as-standalone.yaml b/docs/examples/mongodb/autoscaling/compute/mg-as-standalone.yaml index 4d1d2b6be5..eac02b0818 100644 --- a/docs/examples/mongodb/autoscaling/compute/mg-as-standalone.yaml +++ b/docs/examples/mongodb/autoscaling/compute/mg-as-standalone.yaml @@ -6,14 +6,19 @@ metadata: spec: databaseRef: name: mg-standalone + opsRequestOptions: + timeout: 3m + apply: IfReady compute: standalone: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 250m - memory: 350Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" \ No newline at end of file diff --git a/docs/guides/mongodb/autoscaler/compute/overview.md b/docs/guides/mongodb/autoscaler/compute/overview.md index 7d038e364b..cc2071de5b 100644 --- a/docs/guides/mongodb/autoscaler/compute/overview.md +++ b/docs/guides/mongodb/autoscaler/compute/overview.md @@ -29,16 +29,15 @@ This guide will give an overview on how KubeDB Autoscaler operator autoscales th The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `MongoDB` database components. Open the image in a new tab to see the enlarged version. -
-  Auto Scaling process of MongoDB -
Fig: Auto Scaling process of MongoDB
-
+

+  Compute Auto Scaling process of MongoDB +

The Auto Scaling process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource Object (CRO). -2. `KubeDB` Community operator watches the `MongoDB` CRO. +2. `KubeDB` Provisioner operator watches the `MongoDB` CRO. 3. When the operator finds a `MongoDB` CRO, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. @@ -46,14 +45,12 @@ The Auto Scaling process consists of the following steps: 5. `KubeDB` Autoscaler operator watches the `MongoDBAutoscaler` CRO. -6. `KubeDB` Autoscaler operator creates required number of Vertical Pod Autoscaler [VPA](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#intro) for different components of the database, as specified in the `mongodbautoscaler` CRO. +6. `KubeDB` Autoscaler operator generates recommendation using the modified version of kubernetes [official recommender](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/pkg/recommender) for different components of the database, as specified in the `MongoDBAutoscaler` CRO. -7. Then `KubeDB` Autoscaler operator continuously watches the VPA objects for recommendation. +7. If the generated recommendation doesn't match the current resources of the database, then `KubeDB` Autoscaler operator creates a `MongoDBOpsRequest` CRO to scale the database to match the recommendation generated. -8. If the VPA generated recommendation doesn't match the current resources of the database, then `KubeDB` Autoscaler operator creates a `MongoDBOpsRequest` CRO to scale the database to match the recommendation provided by the VPA object. +8. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CRO. -9. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CRO. - -10. Then the `KubeDB` Enterprise operator will scale the database component vertically as specified on the `MongoDBOpsRequest` CRO. +9. Then the `KubeDB` Ops-manager operator will scale the database component vertically as specified on the `MongoDBOpsRequest` CRO. In the next docs, we are going to show a step by step guide on Autoscaling of various MongoDB database components using `MongoDBAutoscaler` CRD. diff --git a/docs/guides/mongodb/autoscaler/compute/replicaset.md b/docs/guides/mongodb/autoscaler/compute/replicaset.md index 3753021adb..0f38a916a2 100644 --- a/docs/guides/mongodb/autoscaler/compute/replicaset.md +++ b/docs/guides/mongodb/autoscaler/compute/replicaset.md @@ -26,8 +26,6 @@ This guide will show you how to use `KubeDB` to autoscale compute resources i.e. - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) - [MongoDBAutoscaler](/docs/guides/mongodb/concepts/autoscaler.md) @@ -49,7 +47,7 @@ Here, we are going to deploy a `MongoDB` Replicaset using a supported version by #### Deploy MongoDB Replicaset -In this section, we are going to deploy a MongoDB Replicaset database with version `4.2.3`. Then, in the next section we will set up autoscaling for this database using `MongoDBAutoscaler` CRD. Below is the YAML of the `MongoDB` CR that we are going to create, +In this section, we are going to deploy a MongoDB Replicaset database with version `4.4.6`. Then, in the next section we will set up autoscaling for this database using `MongoDBAutoscaler` CRD. Below is the YAML of the `MongoDB` CR that we are going to create, ```yaml apiVersion: kubedb.com/v1alpha2 @@ -59,6 +57,9 @@ metadata: namespace: demo spec: version: "4.2.3" + replicaSet: + name: "replicaset" + replicas: 3 storageType: Durable storage: resources: @@ -74,6 +75,7 @@ spec: cpu: "200m" memory: "300Mi" terminationPolicy: WipeOut + ``` Let's create the `MongoDB` CRO we have shown above, @@ -143,17 +145,22 @@ metadata: spec: databaseRef: name: mg-rs + opsRequestOptions: + timeout: 3m + apply: IfReady compute: replicaSet: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 250m - memory: 350Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" ``` Here, @@ -161,9 +168,32 @@ Here, - `spec.databaseRef.name` specifies that we are performing compute resource scaling operation on `mg-rs` database. - `spec.compute.replicaSet.trigger` specifies that compute autoscaling is enabled for this database. - `spec.compute.replicaSet.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.replicaset.resourceDiffPercentage` specifies the minimum resource difference in percentage. The default is 10%. + If the difference between current & recommended resource is less than ResourceDiffPercentage, Autoscaler Operator will ignore the updating. - `spec.compute.replicaSet.minAllowed` specifies the minimum allowed resources for the database. - `spec.compute.replicaSet.maxAllowed` specifies the maximum allowed resources for the database. - `spec.compute.replicaSet.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.mariadb.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.opsRequestOptions.timeout` Timeout is used for each step of the ops request (in second). If a step doesn't finish within the specified timeout, the ops request will result in failure. +- `spec.opsRequestOptions.apply` is to control the execution of OpsRequest depending on the database state. It can have one from `IfReady` & `Always`. + +If it was an `InMemory database`, we could also autoscaler the inMemory resources using MongoDB compute autoscaler, like below. + +#### Autoscale inMemory database +To autoscale inMemory databases, you need to specify the `spec.compute.replicaSet.inMemoryStorage` section. + +```yaml + ... + inMemoryStorage: + usageThresholdPercentage: 80 + scalingFactorPercentage: 30 + ... +``` +It has two fields inside it. +- `usageThresholdPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased. Default usage threshold is 70%. +- `scalingFactorPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased by this given scaling percentage. Default scaling percentage is 50%. + +> Note: To inform you, We use `db.serverStatus().inMemory.cache["bytes currently in the cache"]` & `db.serverStatus().inMemory.cache["maximum bytes configured"]` to calculate the used & maximum inMemory storage respectively. Let's create the `MongoDBAutoscaler` CR we have shown above, @@ -189,7 +219,7 @@ Annotations: API Version: autoscaling.kubedb.com/v1alpha1 Kind: MongoDBAutoscaler Metadata: - Creation Timestamp: 2021-03-06T19:10:46Z + Creation Timestamp: 2022-10-27T06:56:34Z Generation: 1 Managed Fields: API Version: autoscaling.kubedb.com/v1alpha1 @@ -205,6 +235,7 @@ Metadata: .: f:replicaSet: .: + f:containerControlledValues: f:controlledResources: f:maxAllowed: .: @@ -215,249 +246,120 @@ Metadata: f:cpu: f:memory: f:podLifeTimeThreshold: + f:resourceDiffPercentage: f:trigger: f:databaseRef: + f:opsRequestOptions: .: - f:name: - Manager: kubectl-client-side-apply - Operation: Update - Time: 2021-03-06T19:10:46Z - Resource Version: 839193 - Self Link: /apis/autoscaling.kubedb.com/v1alpha1/namespaces/demo/mongodbautoscalers/mg-as-rs - UID: 9be99253-7475-43fe-a68a-34eaec3225c6 -Spec: - Compute: - Replica Set: - Controlled Resources: - cpu - memory - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 250m - Memory: 350Mi - Pod Life Time Threshold: 5m0s - Trigger: On - Database Ref: - Name: mg-rs -Events: -``` -So, the `mongodbautoscaler` resource is created successfully. - -Now, lets verify that the vertical pod autoscaler (vpa) resource is created successfully, - -```bash -$ kubectl get vpa -n demo -NAME AGE -vpa-mg-rs 7s - -$ kubectl describe vpa vpa-mg-rs -n demo -Name: vpa-mg-rs -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-06T19:10:46Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"9be99253-7475-43fe-a68a-34eaec3225c6"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: - .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler + f:apply: + f:timeout: + Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-06T19:10:46Z - API Version: autoscaling.k8s.io/v1 + Time: 2022-10-27T06:56:34Z + API Version: autoscaling.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:status: - f:conditions: - f:recommendation: - .: - f:containerRecommendations: - Manager: recommender - Operation: Update - Time: 2021-03-06T19:10:59Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as-rs - UID: 9be99253-7475-43fe-a68a-34eaec3225c6 - Resource Version: 839239 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-rs - UID: fd2d9896-2eee-43df-85a6-1b968f8d2862 -Spec: - Resource Policy: - Container Policies: - Container Name: mongodb - Controlled Resources: - cpu - memory - Controlled Values: RequestsAndLimits - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 250m - Memory: 350Mi - Container Name: replication-mode-detector - Mode: Off - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-rs - Update Policy: - Update Mode: Off -Status: - Conditions: - Last Transition Time: 2021-03-06T07:21:58Z - Status: False - Type: RecommendationProvided - Recommendation: -Events: -``` - -So, we can verify from the above output that the `vpa` resource is created successfully. But you can see that the `RecommendationProvided` is false and also the `Recommendation` section of the `vpa` is empty. Let's wait some time and describe the vpa again. - -```shell -$ kubectl describe vpa vpa-mg-rs -n demo -Name: vpa-mg-rs -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-06T19:10:46Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"9be99253-7475-43fe-a68a-34eaec3225c6"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler - Operation: Update - Time: 2021-03-06T19:10:46Z - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:status: + f:checkpoints: f:conditions: - f:recommendation: - .: - f:containerRecommendations: - Manager: recommender - Operation: Update - Time: 2021-03-06T19:10:59Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as-rs - UID: 9be99253-7475-43fe-a68a-34eaec3225c6 - Resource Version: 839239 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-rs - UID: fd2d9896-2eee-43df-85a6-1b968f8d2862 + f:vpas: + Manager: kubedb-autoscaler + Operation: Update + Subresource: status + Time: 2022-10-27T07:01:05Z + Resource Version: 640314 + UID: ab03414a-67a2-4da4-8960-6e67ae56b503 Spec: - Resource Policy: - Container Policies: - Container Name: mongodb + Compute: + Replica Set: + Container Controlled Values: RequestsAndLimits Controlled Resources: cpu memory - Controlled Values: RequestsAndLimits Max Allowed: Cpu: 1 Memory: 1Gi Min Allowed: - Cpu: 250m - Memory: 350Mi - Container Name: replication-mode-detector - Mode: Off - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-rs - Update Policy: - Update Mode: Off + Cpu: 400m + Memory: 400Mi + Pod Life Time Threshold: 5m0s + Resource Diff Percentage: 20 + Trigger: On + Database Ref: + Name: mg-rs + Ops Request Options: + Apply: IfReady + Timeout: 3m0s Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 2 + Weight: 10000 + Index: 3 + Weight: 5000 + Reference Timestamp: 2022-10-27T00:00:00Z + Total Weight: 0.3673624107285783 + First Sample Start: 2022-10-27T07:00:42Z + Last Sample Start: 2022-10-27T07:00:55Z + Last Update Time: 2022-10-27T07:01:00Z + Memory Histogram: + Reference Timestamp: 2022-10-28T00:00:00Z + Ref: + Container Name: mongodb + Vpa Object Name: mg-rs + Total Samples Count: 3 + Version: v3 + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 10000 + Reference Timestamp: 2022-10-27T00:00:00Z + Total Weight: 0.3673624107285783 + First Sample Start: 2022-10-27T07:00:42Z + Last Sample Start: 2022-10-27T07:00:55Z + Last Update Time: 2022-10-27T07:01:00Z + Memory Histogram: + Reference Timestamp: 2022-10-28T00:00:00Z + Ref: + Container Name: replication-mode-detector + Vpa Object Name: mg-rs + Total Samples Count: 3 + Version: v3 Conditions: - Last Transition Time: 2021-03-06T19:10:59Z + Last Transition Time: 2022-10-27T07:01:05Z + Message: Successfully created mongoDBOpsRequest demo/mops-mg-rs-cxhsy1 + Observed Generation: 1 + Reason: CreateOpsRequest Status: True - Type: RecommendationProvided - Recommendation: - Container Recommendations: - Container Name: mongodb - Lower Bound: - Cpu: 250m - Memory: 350Mi - Target: - Cpu: 250m - Memory: 350Mi - Uncapped Target: - Cpu: 182m - Memory: 262144k - Upper Bound: - Cpu: 1 - Memory: 1Gi -Events: + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2022-10-27T07:01:00Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: mongodb + Lower Bound: + Cpu: 400m + Memory: 400Mi + Target: + Cpu: 400m + Memory: 400Mi + Uncapped Target: + Cpu: 49m + Memory: 262144k + Upper Bound: + Cpu: 1 + Memory: 1Gi + Vpa Name: mg-rs +Events: ``` +So, the `mongodbautoscaler` resource is created successfully. -As you can see from the output the vpa has generated a recommendation for our database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. +you can see in the `Status.VPAs.Recommendation` section, that recommendation has been generated for our database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. Let's watch the `mongodbopsrequest` in the demo namespace to see if any `mongodbopsrequest` object is created. After some time you'll see that a `mongodbopsrequest` will be created based on the recommendation. @@ -465,7 +367,7 @@ Let's watch the `mongodbopsrequest` in the demo namespace to see if any `mongodb $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo NAME TYPE STATUS AGE -mops-vpa-mg-rs-l3ulmr VerticalScaling Progressing 10s +mops-mg-rs-cxhsy1 VerticalScaling Progressing 10s ``` Let's wait for the ops request to become successful. @@ -474,43 +376,35 @@ Let's wait for the ops request to become successful. $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo NAME TYPE STATUS AGE -mops-vpa-mg-rs-l3ulmr VerticalScaling Successful 68s +mops-mg-rs-cxhsy1 VerticalScaling Successful 68s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to scale the database. ```bash -$ kubectl describe mongodbopsrequest -n demo mops-vpa-mg-rs-l3ulmr -Name: mops-vpa-mg-rs-l3ulmr +$ kubectl describe mongodbopsrequest -n demo mops-mg-rs-cxhsy1 +Name: mops-mg-rs-cxhsy1 Namespace: demo -Labels: app.kubernetes.io/component=database - app.kubernetes.io/instance=mg-rs - app.kubernetes.io/managed-by=kubedb.com - app.kubernetes.io/name=mongodbs.kubedb.com +Labels: Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-07T15:55:12Z + Creation Timestamp: 2022-10-27T07:01:05Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:metadata: - f:labels: - .: - f:app.kubernetes.io/component: - f:app.kubernetes.io/instance: - f:app.kubernetes.io/managed-by: - f:app.kubernetes.io/name: f:ownerReferences: + .: + k:{"uid":"ab03414a-67a2-4da4-8960-6e67ae56b503"}: f:spec: .: - f:configuration: + f:apply: f:databaseRef: - .: - f:name: + f:timeout: f:type: f:verticalScaling: .: @@ -526,7 +420,7 @@ Metadata: f:memory: Manager: kubedb-autoscaler Operation: Update - Time: 2021-03-07T15:55:12Z + Time: 2022-10-27T07:01:05Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: @@ -535,53 +429,48 @@ Metadata: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise - Operation: Update - Time: 2021-03-07T15:55:12Z + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2022-10-27T07:02:31Z Owner References: API Version: autoscaling.kubedb.com/v1alpha1 Block Owner Deletion: true Controller: true Kind: MongoDBAutoscaler Name: mg-as-rs - UID: 9be99253-7475-43fe-a68a-34eaec3225c6 - Resource Version: 868114 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vpa-mg-rs-l3ulmr - UID: 2029223c-25d3-4ecb-b71f-ff0f93a2e4b6 + UID: ab03414a-67a2-4da4-8960-6e67ae56b503 + Resource Version: 640598 + UID: f7c6db00-dd0e-4850-8bad-5f0855ce3850 Spec: - Configuration: + Apply: IfReady Database Ref: - Name: mg-rs - Type: VerticalScaling + Name: mg-rs + Timeout: 3m0s + Type: VerticalScaling Vertical Scaling: Replica Set: Limits: - Cpu: 250m - Memory: 350Mi + Cpu: 400m + Memory: 400Mi Requests: - Cpu: 250m - Memory: 350Mi + Cpu: 400m + Memory: 400Mi Status: Conditions: - Last Transition Time: 2021-03-07T15:55:12Z + Last Transition Time: 2022-10-27T07:01:05Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-07T15:55:12Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-07T15:57:22Z + Last Transition Time: 2022-10-27T07:02:30Z Message: Successfully Vertically Scaled Replicaset Resources Observed Generation: 1 Reason: UpdateReplicaSetResources Status: True Type: UpdateReplicaSetResources - Last Transition Time: 2021-03-07T15:57:22Z + Last Transition Time: 2022-10-27T07:02:31Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -590,14 +479,20 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Starting 2m21s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-rs - Normal UpdateStatefulSetResources 2m21s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal UpdateReplicaSetResources 11s KubeDB Enterprise Operator Successfully Vertically Scaled Replicaset Resources - Normal ResumeDatabase 11s KubeDB Enterprise Operator Resuming MongoDB demo/mg-rs - Normal ResumeDatabase 11s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-rs - Normal Successful 11s KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 4m9s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-rs + Normal PauseDatabase 4m9s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-rs + Normal Starting 4m9s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-rs + Normal UpdateReplicaSetResources 4m9s KubeDB Ops-manager Operator Successfully updated replicaset Resources + Normal Starting 4m9s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-rs + Normal UpdateReplicaSetResources 4m9s KubeDB Ops-manager Operator Successfully updated replicaset Resources + Normal UpdateReplicaSetResources 2m44s KubeDB Ops-manager Operator Successfully Vertically Scaled Replicaset Resources + Normal ResumeDatabase 2m43s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-rs + Normal ResumeDatabase 2m43s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-rs + Normal Successful 2m43s KubeDB Ops-manager Operator Successfully Vertically Scaled Database + Normal UpdateReplicaSetResources 2m43s KubeDB Ops-manager Operator Successfully Vertically Scaled Replicaset Resources + ``` Now, we are going to verify from the Pod, and the MongoDB yaml whether the resources of the replicaset database has updated to meet up the desired state, Let's check, @@ -606,24 +501,24 @@ Now, we are going to verify from the Pod, and the MongoDB yaml whether the resou $ kubectl get pod -n demo mg-rs-0 -o json | jq '.spec.containers[].resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } $ kubectl get mongodb -n demo mg-rs -o json | jq '.spec.podTemplate.spec.resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } ``` diff --git a/docs/guides/mongodb/autoscaler/compute/sharding.md b/docs/guides/mongodb/autoscaler/compute/sharding.md index ad247b2f6f..2e76ce3060 100644 --- a/docs/guides/mongodb/autoscaler/compute/sharding.md +++ b/docs/guides/mongodb/autoscaler/compute/sharding.md @@ -26,8 +26,6 @@ This guide will show you how to use `KubeDB` to autoscale compute resources i.e. - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) - [MongoDBAutoscaler](/docs/guides/mongodb/concepts/autoscaler.md) @@ -164,17 +162,22 @@ metadata: spec: databaseRef: name: mg-sh + opsRequestOptions: + timeout: 3m + apply: IfReady compute: shard: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 250m - memory: 350Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" ``` Here, @@ -182,11 +185,35 @@ Here, - `spec.databaseRef.name` specifies that we are performing compute resource scaling operation on `mg-sh` database. - `spec.compute.shard.trigger` specifies that compute autoscaling is enabled for the shard pods of this database. - `spec.compute.shard.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.replicaset.resourceDiffPercentage` specifies the minimum resource difference in percentage. The default is 10%. + If the difference between current & recommended resource is less than ResourceDiffPercentage, Autoscaler Operator will ignore the updating. - `spec.compute.shard.minAllowed` specifies the minimum allowed resources for the database. - `spec.compute.shard.maxAllowed` specifies the maximum allowed resources for the database. - `spec.compute.shard.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.mariadb.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.opsRequestOptions.timeout` Timeout is used for each step of the ops request (in second). If a step doesn't finish within the specified timeout, the ops request will result in failure. +- `spec.opsRequestOptions.apply` is to control the execution of OpsRequest depending on the database state. It can have one from `IfReady` & `Always`. + +> Note: In this demo we are only setting up the autoscaling for the shard pods, that's why we only specified the shard section of the autoscaler. You can enable autoscaling for mongos and configServer pods in the same yaml, by specifying the `spec.compute.mongos` and `spec.compute.configServer` section, similar to the `spec.comput.shard` section we have configured in this demo. + +If it was an `InMemory database`, we could also autoscaler the inMemory resources using MongoDB compute autoscaler, like below. + +#### Autoscale inMemory database +To autoscale inMemory databases, you need to specify the `spec.compute.shard.inMemoryStorage` section. + +```yaml + ... + inMemoryStorage: + usageThresholdPercentage: 80 + scalingFactorPercentage: 30 + ... +``` +It has two fields inside it. +- `usageThresholdPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased. Default usage threshold is 70%. +- `scalingFactorPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased by this given scaling percentage. Default scaling percentage is 50%. + +> Note: To inform you, We use `db.serverStatus().inMemory.cache["bytes currently in the cache"]` & `db.serverStatus().inMemory.cache["maximum bytes configured"]` to calculate the used & maximum inMemory storage respectively. -> Note: In this demo we are only setting up the autoscaling for the shard pods, that's why we only specified the shard section of the autoscaler. You can enable autoscaling for mongos and configServer pods in the same yaml, by specifying the `spec.mongos` and `spec.configServer` section, similar to the `spec.shard` section we have configured in this demo. Let's create the `MongoDBAutoscaler` CR we have shown above, @@ -212,7 +239,7 @@ Annotations: API Version: autoscaling.kubedb.com/v1alpha1 Kind: MongoDBAutoscaler Metadata: - Creation Timestamp: 2021-03-07T16:49:09Z + Creation Timestamp: 2022-10-27T09:46:48Z Generation: 1 Managed Fields: API Version: autoscaling.kubedb.com/v1alpha1 @@ -228,6 +255,7 @@ Metadata: .: f:shard: .: + f:containerControlledValues: f:controlledResources: f:maxAllowed: .: @@ -238,28 +266,34 @@ Metadata: f:cpu: f:memory: f:podLifeTimeThreshold: + f:resourceDiffPercentage: f:trigger: f:databaseRef: + f:opsRequestOptions: .: - f:name: + f:apply: + f:timeout: Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-07T16:49:09Z + Time: 2022-10-27T09:46:48Z API Version: autoscaling.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:status: .: + f:checkpoints: f:conditions: + f:vpas: Manager: kubedb-autoscaler Operation: Update - Time: 2021-03-07T16:50:13Z - Resource Version: 879550 - Self Link: /apis/autoscaling.kubedb.com/v1alpha1/namespaces/demo/mongodbautoscalers/mg-as-sh - UID: 7e6880f1-42ba-4d78-ba1c-02aa9ea522e9 + Subresource: status + Time: 2022-10-27T09:47:08Z + Resource Version: 654853 + UID: 36878e8e-f100-409e-aa76-e6f46569df76 Spec: Compute: Shard: + Container Controlled Values: RequestsAndLimits Controlled Resources: cpu memory @@ -267,227 +301,106 @@ Spec: Cpu: 1 Memory: 1Gi Min Allowed: - Cpu: 250m - Memory: 350Mi - Pod Life Time Threshold: 5m0s - Trigger: On + Cpu: 400m + Memory: 400Mi + Pod Life Time Threshold: 5m0s + Resource Diff Percentage: 20 + Trigger: On Database Ref: Name: mg-sh + Ops Request Options: + Apply: IfReady + Timeout: 3m0s Status: -Events: -``` -So, the `mongodbautoscaler` resource is created successfully. - -Now, lets verify that the vertical pod autoscaler (vpa) resource is created successfully, - -```bash -$ kubectl get vpa -n demo -NAME AGE -vpa-mg-sh-shard0 110s -vpa-mg-sh-shard1 110s - -$ kubectl describe vpa vpa-mg-sh-shard0 -n demo -Name: vpa-mg-sh-shard0 -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-07T16:49:09Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"7e6880f1-42ba-4d78-ba1c-02aa9ea522e9"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: - .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler - Operation: Update - Time: 2021-03-07T16:49:09Z - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:status: - f:conditions: - f:recommendation: - .: - f:containerRecommendations: - Manager: recommender - Operation: Update - Time: 2021-03-07T16:50:03Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as-sh - UID: 7e6880f1-42ba-4d78-ba1c-02aa9ea522e9 - Resource Version: 879512 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-sh-shard0 - UID: e73e9920-5c4d-4e8e-887e-38b06120c9a6 -Spec: - Resource Policy: - Container Policies: - Container Name: mongodb - Controlled Resources: - cpu - memory - Controlled Values: RequestsAndLimits - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 250m - Memory: 350Mi - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-sh-shard0 - Update Policy: - Update Mode: Off -Status: - Conditions: - Last Transition Time: 2021-03-07T16:50:03Z - Status: False - Type: RecommendationProvided - Recommendation: -Events: -``` - -So, we can verify from the above output that two `vpa` resources are created for our two shard successfully, but you can see that the `RecommendationProvided` condition is false and also the `Recommendation` section of the `vpa` is empty. Let's wait some time and describe the vpa again. - -```shell -$ kubectl describe vpa vpa-mg-sh-shard0 -n demo -Name: vpa-mg-sh-shard0 -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-07T16:49:09Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"7e6880f1-42ba-4d78-ba1c-02aa9ea522e9"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: - .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler - Operation: Update - Time: 2021-03-07T16:49:09Z - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:status: - f:conditions: - f:recommendation: - .: - f:containerRecommendations: - Manager: recommender - Operation: Update - Time: 2021-03-07T16:50:03Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as-sh - UID: 7e6880f1-42ba-4d78-ba1c-02aa9ea522e9 - Resource Version: 879512 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-sh-shard0 - UID: e73e9920-5c4d-4e8e-887e-38b06120c9a6 -Spec: - Resource Policy: - Container Policies: - Container Name: mongodb - Controlled Resources: - cpu - memory - Controlled Values: RequestsAndLimits - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 250m - Memory: 350Mi - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-sh-shard0 - Update Policy: - Update Mode: Off -Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 1 + Weight: 5001 + Index: 2 + Weight: 10000 + Reference Timestamp: 2022-10-27T00:00:00Z + Total Weight: 0.397915611757652 + First Sample Start: 2022-10-27T09:46:43Z + Last Sample Start: 2022-10-27T09:46:57Z + Last Update Time: 2022-10-27T09:47:06Z + Memory Histogram: + Reference Timestamp: 2022-10-28T00:00:00Z + Ref: + Container Name: mongodb + Vpa Object Name: mg-sh-shard0 + Total Samples Count: 3 + Version: v3 + Cpu Histogram: + Bucket Weights: + Index: 1 + Weight: 10000 + Reference Timestamp: 2022-10-27T00:00:00Z + Total Weight: 0.39793263724156597 + First Sample Start: 2022-10-27T09:46:50Z + Last Sample Start: 2022-10-27T09:46:56Z + Last Update Time: 2022-10-27T09:47:06Z + Memory Histogram: + Reference Timestamp: 2022-10-28T00:00:00Z + Ref: + Container Name: mongodb + Vpa Object Name: mg-sh-shard1 + Total Samples Count: 3 + Version: v3 Conditions: - Last Transition Time: 2021-03-07T16:50:03Z + Last Transition Time: 2022-10-27T09:47:08Z + Message: Successfully created mongoDBOpsRequest demo/mops-vpa-mg-sh-shard-ml75qi + Observed Generation: 1 + Reason: CreateOpsRequest Status: True - Type: RecommendationProvided - Recommendation: - Container Recommendations: - Container Name: mongodb - Lower Bound: - Cpu: 250m - Memory: 350Mi - Target: - Cpu: 250m - Memory: 350Mi - Uncapped Target: - Cpu: 203m - Memory: 262144k - Upper Bound: - Cpu: 1 - Memory: 1Gi -Events: + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2022-10-27T09:47:06Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: mongodb + Lower Bound: + Cpu: 400m + Memory: 400Mi + Target: + Cpu: 400m + Memory: 400Mi + Uncapped Target: + Cpu: 35m + Memory: 262144k + Upper Bound: + Cpu: 1 + Memory: 1Gi + Vpa Name: mg-sh-shard0 + Conditions: + Last Transition Time: 2022-10-27T09:47:06Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: mongodb + Lower Bound: + Cpu: 400m + Memory: 400Mi + Target: + Cpu: 400m + Memory: 400Mi + Uncapped Target: + Cpu: 25m + Memory: 262144k + Upper Bound: + Cpu: 1 + Memory: 1Gi + Vpa Name: mg-sh-shard1 +Events: + ``` +So, the `mongodbautoscaler` resource is created successfully. -As you can see from the output the vpa has generated a recommendation for the shard pod of the database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. +you can see in the `Status.VPAs.Recommendation` section, that recommendation has been generated for our database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. Let's watch the `mongodbopsrequest` in the demo namespace to see if any `mongodbopsrequest` object is created. After some time you'll see that a `mongodbopsrequest` will be created based on the recommendation. @@ -495,7 +408,7 @@ Let's watch the `mongodbopsrequest` in the demo namespace to see if any `mongodb $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo NAME TYPE STATUS AGE -mops-vpa-mg-sh-shard-3uqbrq VerticalScaling Progressing 19s +mops-vpa-mg-sh-shard-ml75qi VerticalScaling Progressing 19s ``` Let's wait for the ops request to become successful. @@ -504,43 +417,35 @@ Let's wait for the ops request to become successful. $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo NAME TYPE STATUS AGE -mops-vpa-mg-sh-shard-3uqbrq VerticalScaling Successful 5m8s +mops-vpa-mg-sh-shard-ml75qi VerticalScaling Successful 5m8s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to scale the database. ```bash -$ kubectl describe mongodbopsrequest -n demo mops-vpa-mg-sh-shard-3uqbrq -Name: mops-vpa-mg-sh-shard-3uqbrq +$ kubectl describe mongodbopsrequest -n demo mops-vpa-mg-sh-shard-ml75qi +Name: mops-vpa-mg-sh-shard-ml75qi Namespace: demo -Labels: app.kubernetes.io/component=database - app.kubernetes.io/instance=mg-sh - app.kubernetes.io/managed-by=kubedb.com - app.kubernetes.io/name=mongodbs.kubedb.com +Labels: Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-07T16:50:13Z + Creation Timestamp: 2022-10-27T09:47:08Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:metadata: - f:labels: - .: - f:app.kubernetes.io/component: - f:app.kubernetes.io/instance: - f:app.kubernetes.io/managed-by: - f:app.kubernetes.io/name: f:ownerReferences: + .: + k:{"uid":"36878e8e-f100-409e-aa76-e6f46569df76"}: f:spec: .: - f:configuration: + f:apply: f:databaseRef: - .: - f:name: + f:timeout: f:type: f:verticalScaling: .: @@ -548,7 +453,6 @@ Metadata: .: f:limits: .: - f:cpu: f:memory: f:requests: .: @@ -556,7 +460,7 @@ Metadata: f:memory: Manager: kubedb-autoscaler Operation: Update - Time: 2021-03-07T16:50:13Z + Time: 2022-10-27T09:47:08Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: @@ -565,53 +469,47 @@ Metadata: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise - Operation: Update - Time: 2021-03-07T16:50:13Z + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2022-10-27T09:49:49Z Owner References: API Version: autoscaling.kubedb.com/v1alpha1 Block Owner Deletion: true Controller: true Kind: MongoDBAutoscaler Name: mg-as-sh - UID: 7e6880f1-42ba-4d78-ba1c-02aa9ea522e9 - Resource Version: 880864 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vpa-mg-sh-shard-3uqbrq - UID: a9eb9a92-3a93-441c-90b9-a272cfff4e85 + UID: 36878e8e-f100-409e-aa76-e6f46569df76 + Resource Version: 655347 + UID: c44fbd53-40f9-42ca-9b4c-823d8e998d01 Spec: - Configuration: + Apply: IfReady Database Ref: - Name: mg-sh - Type: VerticalScaling + Name: mg-sh + Timeout: 3m0s + Type: VerticalScaling Vertical Scaling: Shard: Limits: - Cpu: 250m - Memory: 350Mi + Memory: 400Mi Requests: - Cpu: 250m - Memory: 350Mi + Cpu: 400m + Memory: 400Mi Status: Conditions: - Last Transition Time: 2021-03-07T16:50:13Z + Last Transition Time: 2022-10-27T09:47:08Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-07T16:50:13Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-07T16:55:21Z + Last Transition Time: 2022-10-27T09:49:49Z Message: Successfully Vertically Scaled Shard Resources Observed Generation: 1 Reason: UpdateShardResources Status: True Type: UpdateShardResources - Last Transition Time: 2021-03-07T16:55:21Z + Last Transition Time: 2022-10-27T09:49:49Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -620,17 +518,20 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal PauseDatabase 14m KubeDB Enterprise Operator Pausing MongoDB demo/mg-sh - Normal PauseDatabase 14m KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sh - Normal Starting 14m KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sh-shard0 - Normal Starting 14m KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sh-shard1 - Normal UpdateStatefulSetResources 14m KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal UpdateShardResources 9m13s KubeDB Enterprise Operator Successfully Vertically Scaled Shard Resources - Normal ResumeDatabase 9m13s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sh - Normal ResumeDatabase 9m13s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sh - Normal Successful 9m13s KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 3m27s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-sh + Normal PauseDatabase 3m27s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-sh + Normal Starting 3m27s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sh-shard0 + Normal Starting 3m27s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sh-shard1 + Normal UpdateShardResources 3m27s KubeDB Ops-manager Operator Successfully updated Shard Resources + Normal Starting 3m27s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sh-shard0 + Normal Starting 3m27s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sh-shard1 + Normal UpdateShardResources 3m27s KubeDB Ops-manager Operator Successfully updated Shard Resources + Normal UpdateShardResources 46s KubeDB Ops-manager Operator Successfully Vertically Scaled Shard Resources + Normal ResumeDatabase 46s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-sh + Normal ResumeDatabase 46s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-sh + Normal Successful 46s KubeDB Ops-manager Operator Successfully Vertically Scaled Database ``` Now, we are going to verify from the Pod, and the MongoDB yaml whether the resources of the shard pod of the database has updated to meet up the desired state, Let's check, @@ -639,26 +540,26 @@ Now, we are going to verify from the Pod, and the MongoDB yaml whether the resou $ kubectl get pod -n demo mg-sh-shard0-0 -o json | jq '.spec.containers[].resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } + $ kubectl get mongodb -n demo mg-sh -o json | jq '.spec.shardTopology.shard.podTemplate.spec.resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } + ``` diff --git a/docs/guides/mongodb/autoscaler/compute/standalone.md b/docs/guides/mongodb/autoscaler/compute/standalone.md index 8a8be5bab3..4315e5c13b 100644 --- a/docs/guides/mongodb/autoscaler/compute/standalone.md +++ b/docs/guides/mongodb/autoscaler/compute/standalone.md @@ -25,8 +25,6 @@ This guide will show you how to use `KubeDB` to autoscale compute resources i.e. - Install `KubeDB` Community, Enterprise and Autoscaler operator in your cluster following the steps [here](/docs/setup/README.md). - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) - -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -143,17 +141,22 @@ metadata: spec: databaseRef: name: mg-standalone + opsRequestOptions: + timeout: 3m + apply: IfReady compute: standalone: trigger: "On" podLifeTimeThreshold: 5m + resourceDiffPercentage: 20 minAllowed: - cpu: 250m - memory: 350Mi + cpu: 400m + memory: 400Mi maxAllowed: cpu: 1 memory: 1Gi controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" ``` Here, @@ -161,9 +164,33 @@ Here, - `spec.databaseRef.name` specifies that we are performing compute resource autoscaling on `mg-standalone` database. - `spec.compute.standalone.trigger` specifies that compute resource autoscaling is enabled for this database. - `spec.compute.standalone.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.replicaset.resourceDiffPercentage` specifies the minimum resource difference in percentage. The default is 10%. + If the difference between current & recommended resource is less than ResourceDiffPercentage, Autoscaler Operator will ignore the updating. - `spec.compute.standalone.minAllowed` specifies the minimum allowed resources for the database. - `spec.compute.standalone.maxAllowed` specifies the maximum allowed resources for the database. - `spec.compute.standalone.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.mariadb.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.opsRequestOptions.timeout` Timeout is used for each step of the ops request (in second). If a step doesn't finish within the specified timeout, the ops request will result in failure. +- `spec.opsRequestOptions.apply` is to control the execution of OpsRequest depending on the database state. It can have one from `IfReady` & `Always`. + +If it was an `InMemory database`, we could also autoscaler the inMemory resources using MongoDB compute autoscaler, like below. + +#### Autoscale inMemory database +To autoscale inMemory databases, you need to specify the `spec.compute.standalone.inMemoryStorage` section. + +```yaml + ... + inMemoryStorage: + usageThresholdPercentage: 80 + scalingFactorPercentage: 30 + ... +``` +It has two fields inside it. +- `usageThresholdPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased. Default usage threshold is 70%. +- `scalingFactorPercentage`. If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased by this given scaling percentage. Default scaling percentage is 50%. + +> Note: To inform you, We use `db.serverStatus().inMemory.cache["bytes currently in the cache"]` & `db.serverStatus().inMemory.cache["maximum bytes configured"]` to calculate the used & maximum inMemory storage respectively. + Let's create the `MongoDBAutoscaler` CR we have shown above, @@ -189,7 +216,7 @@ Annotations: API Version: autoscaling.kubedb.com/v1alpha1 Kind: MongoDBAutoscaler Metadata: - Creation Timestamp: 2021-03-06T07:33:49Z + Creation Timestamp: 2022-10-27T09:54:35Z Generation: 1 Managed Fields: API Version: autoscaling.kubedb.com/v1alpha1 @@ -205,6 +232,7 @@ Metadata: .: f:standalone: .: + f:containerControlledValues: f:controlledResources: f:maxAllowed: .: @@ -215,251 +243,111 @@ Metadata: f:cpu: f:memory: f:podLifeTimeThreshold: + f:resourceDiffPercentage: f:trigger: f:databaseRef: + f:opsRequestOptions: .: - f:name: - Manager: kubectl-client-side-apply - Operation: Update - Time: 2021-03-06T07:33:49Z - Resource Version: 743892 - Self Link: /apis/autoscaling.kubedb.com/v1alpha1/namespaces/demo/mongodbautoscalers/mg-as - UID: 27f835d6-5821-45c9-b679-b38e6c1196cf -Spec: - Compute: - Standalone: - Controlled Resources: - cpu - memory - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 250m - Memory: 350Mi - Pod Life Time Threshold: 5m0s - Trigger: On - Database Ref: - Name: mg-standalone -Events: -``` -So, the `mongodbautoscaler` resource is created successfully. - -Now, lets verify that the vertical pod autoscaler (vpa) resource is created successfully, - -```bash -$ kubectl get vpa -n demo -NAME AGE -vpa-mg-standalone 7s - -$ kubectl describe vpa vpa-mg-standalone -n demo -Name: vpa-mg-standalone -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-06T07:21:36Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"b841e4c9-8ebd-4256-b855-fc7eb2a35ebd"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: - .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler + f:apply: + f:timeout: + Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-06T07:21:36Z - API Version: autoscaling.k8s.io/v1 + Time: 2022-10-27T09:54:35Z + API Version: autoscaling.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:status: - f:conditions: - f:recommendation: - Manager: recommender - Operation: Update - Time: 2021-03-06T07:21:58Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as - UID: b841e4c9-8ebd-4256-b855-fc7eb2a35ebd - Resource Version: 741459 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-standalone - UID: a81a69d4-73bf-4aa5-8161-9b23444ce851 -Spec: - Resource Policy: - Container Policies: - Container Name: mongodb - Controlled Resources: - cpu - memory - Controlled Values: RequestsAndLimits - Max Allowed: - Cpu: 1 - Memory: 1Gi - Min Allowed: - Cpu: 200m - Memory: 300Mi - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-standalone - Update Policy: - Update Mode: Off -Status: - Conditions: - Last Transition Time: 2021-03-06T07:21:58Z - Status: False - Type: RecommendationProvided - Recommendation: -Events: -``` - -So, we can verify from the above output that the `vpa` resource is created successfully. But you can see that the `RecommendationProvided` is false and also the `Recommendation` section of the `vpa` is empty. Let's wait some time and describe the vpa again. - -```shell -$ kubectl describe vpa vpa-mg-standalone -n demo -Name: vpa-mg-standalone -Namespace: demo -Labels: -Annotations: -API Version: autoscaling.k8s.io/v1 -Kind: VerticalPodAutoscaler -Metadata: - Creation Timestamp: 2021-03-06T07:33:50Z - Generation: 2 - Managed Fields: - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:ownerReferences: - .: - k:{"uid":"27f835d6-5821-45c9-b679-b38e6c1196cf"}: - .: - f:apiVersion: - f:blockOwnerDeletion: - f:controller: - f:kind: - f:name: - f:uid: - f:spec: .: - f:resourcePolicy: - .: - f:containerPolicies: - f:targetRef: - .: - f:apiVersion: - f:kind: - f:name: - f:updatePolicy: - .: - f:updateMode: - f:status: - Manager: kubedb-autoscaler - Operation: Update - Time: 2021-03-06T07:33:50Z - API Version: autoscaling.k8s.io/v1 - Fields Type: FieldsV1 - fieldsV1: - f:status: + f:checkpoints: f:conditions: - f:recommendation: - .: - f:containerRecommendations: - Manager: recommender - Operation: Update - Time: 2021-03-06T07:34:58Z - Owner References: - API Version: autoscaling.kubedb.com/v1alpha1 - Block Owner Deletion: true - Controller: true - Kind: MongoDBAutoscaler - Name: mg-as - UID: 27f835d6-5821-45c9-b679-b38e6c1196cf - Resource Version: 744123 - Self Link: /apis/autoscaling.k8s.io/v1/namespaces/demo/verticalpodautoscalers/vpa-mg-standalone - UID: f99c8679-b3cf-46a9-af52-269cdea12b91 + f:vpas: + Manager: kubedb-autoscaler + Operation: Update + Subresource: status + Time: 2022-10-27T09:55:08Z + Resource Version: 656164 + UID: 439c148f-7c22-456f-a4b4-758cead29932 Spec: - Resource Policy: - Container Policies: - Container Name: mongodb + Compute: + Standalone: + Container Controlled Values: RequestsAndLimits Controlled Resources: cpu memory - Controlled Values: RequestsAndLimits Max Allowed: Cpu: 1 Memory: 1Gi Min Allowed: - Cpu: 250m - Memory: 350Mi - Target Ref: - API Version: apps/v1 - Kind: StatefulSet - Name: mg-standalone - Update Policy: - Update Mode: Off + Cpu: 400m + Memory: 400Mi + Pod Life Time Threshold: 5m0s + Resource Diff Percentage: 20 + Trigger: On + Database Ref: + Name: mg-standalone + Ops Request Options: + Apply: IfReady + Timeout: 3m0s Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 6 + Weight: 10000 + Reference Timestamp: 2022-10-27T00:00:00Z + Total Weight: 0.133158834498727 + First Sample Start: 2022-10-27T09:54:56Z + Last Sample Start: 2022-10-27T09:54:56Z + Last Update Time: 2022-10-27T09:55:07Z + Memory Histogram: + Reference Timestamp: 2022-10-28T00:00:00Z + Ref: + Container Name: mongodb + Vpa Object Name: mg-standalone + Total Samples Count: 1 + Version: v3 Conditions: - Last Transition Time: 2021-03-06T07:34:58Z + Last Transition Time: 2022-10-27T09:55:08Z + Message: Successfully created mongoDBOpsRequest demo/mops-mg-standalone-57huq2 + Observed Generation: 1 + Reason: CreateOpsRequest Status: True - Type: RecommendationProvided - Recommendation: - Container Recommendations: - Container Name: mongodb - Lower Bound: - Cpu: 250m - Memory: 350Mi - Target: - Cpu: 250m - Memory: 350Mi - Uncapped Target: - Cpu: 126m - Memory: 297164212 - Upper Bound: - Cpu: 1 - Memory: 1Gi -Events: + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2022-10-27T09:55:07Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: mongodb + Lower Bound: + Cpu: 400m + Memory: 400Mi + Target: + Cpu: 400m + Memory: 400Mi + Uncapped Target: + Cpu: 93m + Memory: 262144k + Upper Bound: + Cpu: 1 + Memory: 1Gi + Vpa Name: mg-standalone +Events: + ``` +So, the `mongodbautoscaler` resource is created successfully. -As you can see from the output the vpa has generated a recommendation for our database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. +you can see in the `Status.VPAs.Recommendation` section, that recommendation has been generated for our database. Our autoscaler operator continuously watches the recommendation generated and creates an `mongodbopsrequest` based on the recommendations, if the database pods are needed to scaled up or down. Let's watch the `mongodbopsrequest` in the demo namespace to see if any `mongodbopsrequest` object is created. After some time you'll see that a `mongodbopsrequest` will be created based on the recommendation. ```bash $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo -NAME TYPE STATUS AGE -mops-vpa-mg-standalone-rlc1bh VerticalScaling Progressing 10s +NAME TYPE STATUS AGE +mops-mg-standalone-57huq2 VerticalScaling Progressing 10s ``` Let's wait for the ops request to become successful. @@ -467,44 +355,36 @@ Let's wait for the ops request to become successful. ```bash $ watch kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo -NAME TYPE STATUS AGE -mops-vpa-mg-standalone-rlc1bh VerticalScaling Successful 68s +NAME TYPE STATUS AGE +mops-mg-standalone-57huq2 VerticalScaling Successful 68s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to scale the database. ```bash -$ kubectl describe mongodbopsrequest -n demo mops-vpa-mg-standalone-rlc1bh -Name: mops-vpa-mg-standalone-rlc1bh +$ kubectl describe mongodbopsrequest -n demo mops-mg-standalone-57huq2 +Name: mops-mg-standalone-57huq2 Namespace: demo -Labels: app.kubernetes.io/component=database - app.kubernetes.io/instance=mg-standalone - app.kubernetes.io/managed-by=kubedb.com - app.kubernetes.io/name=mongodbs.kubedb.com +Labels: Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-06T07:35:04Z + Creation Timestamp: 2022-10-27T09:55:08Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: f:metadata: - f:labels: - .: - f:app.kubernetes.io/component: - f:app.kubernetes.io/instance: - f:app.kubernetes.io/managed-by: - f:app.kubernetes.io/name: f:ownerReferences: + .: + k:{"uid":"439c148f-7c22-456f-a4b4-758cead29932"}: f:spec: .: - f:configuration: + f:apply: f:databaseRef: - .: - f:name: + f:timeout: f:type: f:verticalScaling: .: @@ -520,7 +400,7 @@ Metadata: f:memory: Manager: kubedb-autoscaler Operation: Update - Time: 2021-03-06T07:35:04Z + Time: 2022-10-27T09:55:08Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: @@ -529,53 +409,48 @@ Metadata: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise - Operation: Update - Time: 2021-03-06T07:35:04Z + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2022-10-27T09:55:33Z Owner References: API Version: autoscaling.kubedb.com/v1alpha1 Block Owner Deletion: true Controller: true Kind: MongoDBAutoscaler Name: mg-as - UID: 27f835d6-5821-45c9-b679-b38e6c1196cf - Resource Version: 744322 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vpa-mg-standalone-rlc1bh - UID: 525d53d2-53c6-4fb6-bd0a-aaa9aabaf4f7 + UID: 439c148f-7c22-456f-a4b4-758cead29932 + Resource Version: 656279 + UID: 29908a23-7cba-4f81-b787-3f9d226993f8 Spec: - Configuration: + Apply: IfReady Database Ref: - Name: mg-standalone - Type: VerticalScaling + Name: mg-standalone + Timeout: 3m0s + Type: VerticalScaling Vertical Scaling: Standalone: Limits: - Cpu: 250m - Memory: 350Mi + Cpu: 400m + Memory: 400Mi Requests: - Cpu: 250m - Memory: 350Mi + Cpu: 400m + Memory: 400Mi Status: Conditions: - Last Transition Time: 2021-03-06T07:35:04Z + Last Transition Time: 2022-10-27T09:55:08Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-06T07:35:04Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-06T07:35:34Z + Last Transition Time: 2022-10-27T09:55:33Z Message: Successfully Vertically Scaled Standalone Resources Observed Generation: 1 Reason: UpdateStandaloneResources Status: True Type: UpdateStandaloneResources - Last Transition Time: 2021-03-06T07:35:34Z + Last Transition Time: 2022-10-27T09:55:33Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -584,18 +459,18 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal PauseDatabase 3m30s KubeDB Enterprise Operator Pausing MongoDB demo/mg-standalone - Normal PauseDatabase 3m30s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-standalone - Normal Starting 3m30s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-standalone - Normal UpdateStatefulSetResources 3m30s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal Starting 3m30s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-standalone - Normal UpdateStatefulSetResources 3m30s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal UpdateStandaloneResources 3m KubeDB Enterprise Operator Successfully Vertically Scaled Standalone Resources - Normal ResumeDatabase 3m KubeDB Enterprise Operator Resuming MongoDB demo/mg-standalone - Normal ResumeDatabase 3m KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-standalone - Normal Successful 3m KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 2m40s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 2m40s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-standalone + Normal Starting 2m40s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-standalone + Normal UpdateStandaloneResources 2m40s KubeDB Ops-manager Operator Successfully updated standalone Resources + Normal Starting 2m40s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-standalone + Normal UpdateStandaloneResources 2m40s KubeDB Ops-manager Operator Successfully updated standalone Resources + Normal UpdateStandaloneResources 2m15s KubeDB Ops-manager Operator Successfully Vertically Scaled Standalone Resources + Normal ResumeDatabase 2m15s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 2m15s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-standalone + Normal Successful 2m15s KubeDB Ops-manager Operator Successfully Vertically Scaled Database ``` Now, we are going to verify from the Pod, and the MongoDB yaml whether the resources of the standalone database has updated to meet up the desired state, Let's check, @@ -604,24 +479,24 @@ Now, we are going to verify from the Pod, and the MongoDB yaml whether the resou $ kubectl get pod -n demo mg-standalone-0 -o json | jq '.spec.containers[].resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } $ kubectl get mongodb -n demo mg-standalone -o json | jq '.spec.podTemplate.spec.resources' { "limits": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" }, "requests": { - "cpu": "250m", - "memory": "350Mi" + "cpu": "400m", + "memory": "400Mi" } } ``` diff --git a/docs/guides/mongodb/autoscaler/storage/overview.md b/docs/guides/mongodb/autoscaler/storage/overview.md index 626540d815..1b4927211d 100644 --- a/docs/guides/mongodb/autoscaler/storage/overview.md +++ b/docs/guides/mongodb/autoscaler/storage/overview.md @@ -29,31 +29,30 @@ This guide will give an overview on how KubeDB Autoscaler operator autoscales th The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `MongoDB` database components. Open the image in a new tab to see the enlarged version. -
-  Storage Autoscaling process of MongoDB -
Fig: Storage Autoscaling process of MongoDB
-
+

+  Storage Auto Scaling process of MongoDB +

+ The Auto Scaling process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. -4. Each StatefulSet creates a Persistent Volume according to the Volume Claim Template provided in the statefulset configuration. This Persistent Volume will be expanded by the `KubeDB` Enterprise operator. - -5. Then, in order to set up storage autoscaling of the various components (ie. ReplicaSet, Shard, ConfigServer etc.) of the `MongoDB` database the user creates a `MongoDBAutoscaler` CRO with desired configuration. +- Each StatefulSet creates a Persistent Volume according to the Volume Claim Template provided in the statefulset configuration. -6. `KubeDB` Autoscaler operator watches the `MongoDBAutoscaler` CRO. +4. Then, in order to set up storage autoscaling of the various components (ie. ReplicaSet, Shard, ConfigServer etc.) of the `MongoDB` database the user creates a `MongoDBAutoscaler` CRO with desired configuration. -7. `KubeDB` Autoscaler operator continuously watches persistent volumes of the databases to check if it exceeds the specified usage threshold. +5. `KubeDB` Autoscaler operator watches the `MongoDBAutoscaler` CRO. -8. If the usage exceeds the specified usage threshold, then `KubeDB` Autoscaler operator creates a `MongoDBOpsRequest` to expand the storage of the database. +6. `KubeDB` Autoscaler operator continuously watches persistent volumes of the databases to check if it exceeds the specified usage threshold. +- If the usage exceeds the specified usage threshold, then `KubeDB` Autoscaler operator creates a `MongoDBOpsRequest` to expand the storage of the database. -9. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CRO. +7. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CRO. -10. Then the `KubeDB` Enterprise operator will expand the storage of the database component as specified on the `MongoDBOpsRequest` CRO. +8. Then the `KubeDB` Ops-manager operator will expand the storage of the database component as specified on the `MongoDBOpsRequest` CRO. In the next docs, we are going to show a step by step guide on Autoscaling storage of various MongoDB database components using `MongoDBAutoscaler` CRD. diff --git a/docs/guides/mongodb/autoscaler/storage/replicaset.md b/docs/guides/mongodb/autoscaler/storage/replicaset.md index eb3e23e67b..ca56f53d3a 100644 --- a/docs/guides/mongodb/autoscaler/storage/replicaset.md +++ b/docs/guides/mongodb/autoscaler/storage/replicaset.md @@ -26,8 +26,6 @@ This guide will show you how to use `KubeDB` to autoscale the storage of a Mongo - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - - Install Prometheus from [here](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) - You must have a `StorageClass` that supports volume expansion. @@ -148,6 +146,7 @@ Here, - `spec.storage.replicaSet.trigger` specifies that storage autoscaling is enabled for this database. - `spec.storage.replicaSet.usageThreshold` specifies storage usage threshold, if storage usage exceeds `60%` then storage autoscaling will be triggered. - `spec.storage.replicaSet.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `50%` of the current amount. +- It has another field `spec.storage.replicaSet.expansionMode` to set the opsRequest volumeExpansionMode, which support two values: `Online` & `Offline`. Default value is `Online`. Let's create the `MongoDBAutoscaler` CR we have shown above, @@ -355,14 +354,14 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 2m36s KubeDB Enterprise Operator Pausing MongoDB demo/mg-rs - Normal PauseDatabase 2m36s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-rs - Normal ReplicasetVolumeExpansion 86s KubeDB Enterprise Operator Successfully Expanded Volume - Normal 81s KubeDB Enterprise Operator Successfully Expanded Volume - Normal ResumeDatabase 81s KubeDB Enterprise Operator Resuming MongoDB demo/mg-rs - Normal ResumeDatabase 81s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-rs - Normal ReadyStatefulSets 76s KubeDB Enterprise Operator StatefulSet is recreated - Normal Successful 76s KubeDB Enterprise Operator Successfully Expanded Volume + Normal PauseDatabase 2m36s KubeDB Ops-manager operator Pausing MongoDB demo/mg-rs + Normal PauseDatabase 2m36s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-rs + Normal ReplicasetVolumeExpansion 86s KubeDB Ops-manager operator Successfully Expanded Volume + Normal 81s KubeDB Ops-manager operator Successfully Expanded Volume + Normal ResumeDatabase 81s KubeDB Ops-manager operator Resuming MongoDB demo/mg-rs + Normal ResumeDatabase 81s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-rs + Normal ReadyStatefulSets 76s KubeDB Ops-manager operator StatefulSet is recreated + Normal Successful 76s KubeDB Ops-manager operator Successfully Expanded Volume ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volume` whether the volume of the replicaset database has expanded to meet the desired state, Let's check, diff --git a/docs/guides/mongodb/autoscaler/storage/sharding.md b/docs/guides/mongodb/autoscaler/storage/sharding.md index b562dd361a..52339424bb 100644 --- a/docs/guides/mongodb/autoscaler/storage/sharding.md +++ b/docs/guides/mongodb/autoscaler/storage/sharding.md @@ -26,8 +26,6 @@ This guide will show you how to use `KubeDB` to autoscale the storage of a Mongo - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - - Install Prometheus from [here](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) - You must have a `StorageClass` that supports volume expansion. @@ -164,6 +162,7 @@ Here, - `spec.storage.shard.trigger` specifies that storage autoscaling is enabled for this database. - `spec.storage.shard.usageThreshold` specifies storage usage threshold, if storage usage exceeds `60%` then storage autoscaling will be triggered. - `spec.storage.shard.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `50%` of the current amount. +- It has another field `spec.storage.replicaSet.expansionMode` to set the opsRequest volumeExpansionMode, which support two values: `Online` & `Offline`. Default value is `Online`. > Note: In this demo we are only setting up the storage autoscaling for the shard pods, that's why we only specified the shard section of the autoscaler. You can enable autoscaling for configServer pods in the same yaml, by specifying the `spec.configServer` section, similar to the `spec.shard` section we have configured in this demo. @@ -374,14 +373,14 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 3m21s KubeDB Enterprise Operator Pausing MongoDB demo/mg-sh - Normal PauseDatabase 3m21s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sh - Normal ShardVolumeExpansion 41s KubeDB Enterprise Operator Successfully Expanded Volume - Normal 36s KubeDB Enterprise Operator Successfully Expanded Volume - Normal ResumeDatabase 36s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sh - Normal ResumeDatabase 36s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sh - Normal ReadyStatefulSets 31s KubeDB Enterprise Operator StatefulSet is recreated - Normal Successful 31s KubeDB Enterprise Operator Successfully Expanded Volume + Normal PauseDatabase 3m21s KubeDB Ops-manager operator Pausing MongoDB demo/mg-sh + Normal PauseDatabase 3m21s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-sh + Normal ShardVolumeExpansion 41s KubeDB Ops-manager operator Successfully Expanded Volume + Normal 36s KubeDB Ops-manager operator Successfully Expanded Volume + Normal ResumeDatabase 36s KubeDB Ops-manager operator Resuming MongoDB demo/mg-sh + Normal ResumeDatabase 36s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-sh + Normal ReadyStatefulSets 31s KubeDB Ops-manager operator StatefulSet is recreated + Normal Successful 31s KubeDB Ops-manager operator Successfully Expanded Volume ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volume` whether the volume of the shard nodes of the database has expanded to meet the desired state, Let's check, diff --git a/docs/guides/mongodb/autoscaler/storage/standalone.md b/docs/guides/mongodb/autoscaler/storage/standalone.md index 34db97d60e..6a0f535e57 100644 --- a/docs/guides/mongodb/autoscaler/storage/standalone.md +++ b/docs/guides/mongodb/autoscaler/storage/standalone.md @@ -26,8 +26,6 @@ This guide will show you how to use `KubeDB` to autoscale the storage of a Mongo - Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) -- Install `Vertical Pod Autoscaler` from [here](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation) - - Install Prometheus from [here](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) - You must have a `StorageClass` that supports volume expansion. @@ -143,6 +141,7 @@ Here, - `spec.storage.standalone.trigger` specifies that storage autoscaling is enabled for this database. - `spec.storage.standalone.usageThreshold` specifies storage usage threshold, if storage usage exceeds `60%` then storage autoscaling will be triggered. - `spec.storage.standalone.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `50%` of the current amount. +- It has another field `spec.storage.replicaSet.expansionMode` to set the opsRequest volumeExpansionMode, which support two values: `Online` & `Offline`. Default value is `Online`. Let's create the `MongoDBAutoscaler` CR we have shown above, @@ -350,14 +349,14 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 110s KubeDB Enterprise Operator Pausing MongoDB demo/mg-standalone - Normal PauseDatabase 110s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-standalone - Normal StandaloneVolumeExpansion 55s KubeDB Enterprise Operator Successfully Expanded Volume - Normal 50s KubeDB Enterprise Operator Successfully Expanded Volume - Normal ResumeDatabase 50s KubeDB Enterprise Operator Resuming MongoDB demo/mg-standalone - Normal ResumeDatabase 50s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-standalone - Normal ReadyStatefulSets 45s KubeDB Enterprise Operator StatefulSet is recreated - Normal Successful 45s KubeDB Enterprise Operator Successfully Expanded Volume + Normal PauseDatabase 110s KubeDB Ops-manager operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 110s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-standalone + Normal StandaloneVolumeExpansion 55s KubeDB Ops-manager operator Successfully Expanded Volume + Normal 50s KubeDB Ops-manager operator Successfully Expanded Volume + Normal ResumeDatabase 50s KubeDB Ops-manager operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 50s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-standalone + Normal ReadyStatefulSets 45s KubeDB Ops-manager operator StatefulSet is recreated + Normal Successful 45s KubeDB Ops-manager operator Successfully Expanded Volume ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volume` whether the volume of the standalone database has expanded to meet the desired state, Let's check, diff --git a/docs/guides/mongodb/backup/customization/index.md b/docs/guides/mongodb/backup/customization/index.md index bd685b7a3d..fb170573b0 100644 --- a/docs/guides/mongodb/backup/customization/index.md +++ b/docs/guides/mongodb/backup/customization/index.md @@ -21,7 +21,7 @@ In this section, we are going to show you how to customize the backup process. H ### Passing arguments to the backup process -Stash MongoDB addon uses [mongoump](https://docs.mongodb.com/database-tools/mongodump/) for backup. You can pass arguments to the `mysqldump` through `args` param under `task.params` section. +Stash MongoDB addon uses [mongoump](https://docs.mongodb.com/database-tools/mongodump/) for backup. You can pass arguments to the `mongodump` through `args` param under `task.params` section. The below example shows how you can pass the `--db testdb` to take backup for a specific mongodb databases named `testdb`. @@ -271,3 +271,12 @@ spec: rules: - snapshots: [latest] ``` + +## Cleanup +To cleanup the resources crated by this tutorial, run the following commands, + +```bash +❯ kubectl delete backupconfiguration -n demo +❯ kubectl delete restoresession -n demo +``` + diff --git a/docs/guides/mongodb/backup/logical/replicaset/index.md b/docs/guides/mongodb/backup/logical/replicaset/index.md index 387e813603..ad7523ca61 100644 --- a/docs/guides/mongodb/backup/logical/replicaset/index.md +++ b/docs/guides/mongodb/backup/logical/replicaset/index.md @@ -124,6 +124,11 @@ $ kubectl get appbindings -n demo sample-mgo-rs -o yaml apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"MongoDB","metadata":{"annotations":{},"name":"sample-mgo-rs","namespace":"demo"},"spec":{"replicaSet":{"name":"rs0"},"replicas":3,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"},"terminationPolicy":"WipeOut","version":"4.2.3"}} + creationTimestamp: "2022-10-26T04:42:05Z" + generation: 1 labels: app.kubernetes.io/component: database app.kubernetes.io/instance: sample-mgo-rs @@ -131,7 +136,21 @@ metadata: app.kubernetes.io/name: mongodbs.kubedb.com name: sample-mgo-rs namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: MongoDB + name: sample-mgo-rs + uid: 658bf7d1-3772-4c89-84db-5ac74a6c5851 + resourceVersion: "577375" + uid: b0cd9885-53d9-4a2b-93a9-cf9fa90594fd spec: + appRef: + apiGroup: kubedb.com + kind: MongoDB + name: sample-mgo-rs + namespace: demo clientConfig: service: name: sample-mgo-rs @@ -141,7 +160,7 @@ spec: apiVersion: config.kubedb.com/v1alpha1 kind: MongoConfiguration replicaSets: - host-0: rs0/sample-mgo-rs-0.sample-mgo-rs-gvr.demo.svc,sample-mgo-rs-1.sample-mgo-rs-gvr.demo.svc,sample-mgo-rs-2.sample-mgo-rs-gvr.demo.svc + host-0: rs0/sample-mgo-rs-0.sample-mgo-rs-pods.demo.svc:27017,sample-mgo-rs-1.sample-mgo-rs-pods.demo.svc:27017,sample-mgo-rs-2.sample-mgo-rs-pods.demo.svc:27017 stash: addon: backupTask: @@ -151,11 +170,13 @@ spec: secret: name: sample-mgo-rs-auth type: kubedb.com/mongodb - version: "4.2.3" + version: 4.2.3 ``` Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. +- `spec.appRef` refers to the underlying application. +- `spec.clientConfig` defines how to communicate with the application. - `spec.clientConfig.service.name` specifies the name of the service that connects to the database. - `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. - `spec.parameters.replicaSets` contains the dsn of replicaset. The DSNs are in key-value pair. If there is only one replicaset (replicaset can be multiple, because of sharding), then ReplicaSets field contains only one key-value pair where the key is host-0 and the value is dsn of that replicaset. @@ -643,8 +664,8 @@ $ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" restoresession.stash.appscode.com/sample-mongodb-restore created $ kubectl get mg -n demo restored-mongodb -NAME VERSION STATUS AGE -restored-mongodb 4.2.3 Running 2m +NAME VERSION STATUS AGE +restored-mongodb 4.2.3 Ready 2m ``` Now, exec into the database pod and list available tables, diff --git a/docs/guides/mongodb/backup/logical/sharding/index.md b/docs/guides/mongodb/backup/logical/sharding/index.md index bdeb15dda4..151d7225c7 100644 --- a/docs/guides/mongodb/backup/logical/sharding/index.md +++ b/docs/guides/mongodb/backup/logical/sharding/index.md @@ -135,6 +135,11 @@ $ kubectl get appbindings -n demo sample-mgo-sh -o yaml apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"MongoDB","metadata":{"annotations":{},"name":"sample-mgo-sh","namespace":"demo"},"spec":{"shardTopology":{"configServer":{"replicas":3,"storage":{"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"}},"mongos":{"replicas":2},"shard":{"replicas":3,"shards":3,"storage":{"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"}}},"terminationPolicy":"WipeOut","version":"4.2.3"}} + creationTimestamp: "2022-10-26T05:11:20Z" + generation: 1 labels: app.kubernetes.io/component: database app.kubernetes.io/instance: sample-mgo-sh @@ -142,7 +147,21 @@ metadata: app.kubernetes.io/name: mongodbs.kubedb.com name: sample-mgo-sh namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: MongoDB + name: sample-mgo-sh + uid: 22f704c3-1a4d-468c-9404-7efa739ad0da + resourceVersion: "580483" + uid: 69092658-2f4a-45f2-a899-14884bf74a8b spec: + appRef: + apiGroup: kubedb.com + kind: MongoDB + name: sample-mgo-sh + namespace: demo clientConfig: service: name: sample-mgo-sh @@ -150,12 +169,12 @@ spec: scheme: mongodb parameters: apiVersion: config.kubedb.com/v1alpha1 + configServer: cnfRepSet/sample-mgo-sh-configsvr-0.sample-mgo-sh-configsvr-pods.demo.svc:27017,sample-mgo-sh-configsvr-1.sample-mgo-sh-configsvr-pods.demo.svc:27017,sample-mgo-sh-configsvr-2.sample-mgo-sh-configsvr-pods.demo.svc:27017 kind: MongoConfiguration - configServer: cnfRepSet/sample-mgo-sh-configsvr-0.sample-mgo-sh-configsvr-gvr.demo.svc:27017,sample-mgo-sh-configsvr-1.sample-mgo-sh-configsvr-gvr.demo.svc:27017,sample-mgo-sh-configsvr-2.sample-mgo-sh-configsvr-gvr.demo.svc:27017 replicaSets: - host-0: shard0/sample-mgo-sh-shard0-0.sample-mgo-sh-shard0-gvr.demo.svc:27017,sample-mgo-sh-shard0-1.sample-mgo-sh-shard0-gvr.demo.svc:27017,sample-mgo-sh-shard0-2.sample-mgo-sh-shard0-gvr.demo.svc:27017 - host-1: shard1/sample-mgo-sh-shard1-0.sample-mgo-sh-shard1-gvr.demo.svc:27017,sample-mgo-sh-shard1-1.sample-mgo-sh-shard1-gvr.demo.svc:27017,sample-mgo-sh-shard1-2.sample-mgo-sh-shard1-gvr.demo.svc:27017 - host-2: shard2/sample-mgo-sh-shard2-0.sample-mgo-sh-shard2-gvr.demo.svc:27017,sample-mgo-sh-shard2-1.sample-mgo-sh-shard2-gvr.demo.svc:27017,sample-mgo-sh-shard2-2.sample-mgo-sh-shard2-gvr.demo.svc:27017 + host-0: shard0/sample-mgo-sh-shard0-0.sample-mgo-sh-shard0-pods.demo.svc:27017,sample-mgo-sh-shard0-1.sample-mgo-sh-shard0-pods.demo.svc:27017,sample-mgo-sh-shard0-2.sample-mgo-sh-shard0-pods.demo.svc:27017 + host-1: shard1/sample-mgo-sh-shard1-0.sample-mgo-sh-shard1-pods.demo.svc:27017,sample-mgo-sh-shard1-1.sample-mgo-sh-shard1-pods.demo.svc:27017,sample-mgo-sh-shard1-2.sample-mgo-sh-shard1-pods.demo.svc:27017 + host-2: shard2/sample-mgo-sh-shard2-0.sample-mgo-sh-shard2-pods.demo.svc:27017,sample-mgo-sh-shard2-1.sample-mgo-sh-shard2-pods.demo.svc:27017,sample-mgo-sh-shard2-2.sample-mgo-sh-shard2-pods.demo.svc:27017 stash: addon: backupTask: @@ -170,6 +189,8 @@ spec: Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. +- `spec.appRef` refers to the underlying application. +- `spec.clientConfig` defines how to communicate with the application. - `spec.clientConfig.service.name` specifies the name of the service that connects to the database. - `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. - `spec.parameters.configServer` specifies the dsn of config server of mongodb sharding. The dsn includes the port no too. diff --git a/docs/guides/mongodb/backup/logical/standalone/index.md b/docs/guides/mongodb/backup/logical/standalone/index.md index 1e01211d82..588a1d149e 100644 --- a/docs/guides/mongodb/backup/logical/standalone/index.md +++ b/docs/guides/mongodb/backup/logical/standalone/index.md @@ -121,21 +121,38 @@ $ kubectl get appbindings -n demo sample-mongodb -o yaml apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"MongoDB","metadata":{"annotations":{},"name":"sample-mongodb","namespace":"demo"},"spec":{"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"},"storageType":"Durable","terminationPolicy":"WipeOut","version":"4.2.3"}} + creationTimestamp: "2022-10-26T05:13:07Z" + generation: 1 labels: app.kubernetes.io/component: database + app.kubernetes.io/instance: sample-mongodb app.kubernetes.io/managed-by: kubedb.com app.kubernetes.io/name: mongodbs.kubedb.com - app.kubernetes.io/instance: sample-mongodb name: sample-mongodb namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: MongoDB + name: sample-mongodb + uid: 51676df9-682a-40ab-8f99-c6050b35f2f2 + resourceVersion: "580968" + uid: ca88e369-a15a-4149-9386-24e876c5aa4b spec: + appRef: + apiGroup: kubedb.com + kind: MongoDB + name: sample-mongodb + namespace: demo clientConfig: service: name: sample-mongodb port: 27017 scheme: mongodb - secret: - name: sample-mongodb-auth parameters: apiVersion: config.kubedb.com/v1alpha1 kind: MongoConfiguration @@ -145,12 +162,16 @@ spec: name: mongodb-backup-4.2.3 restoreTask: name: mongodb-restore-4.2.3 + secret: + name: sample-mongodb-auth type: kubedb.com/mongodb - version: "4.2.3" + version: 4.2.3 ``` Stash uses the `AppBinding` crd to connect with the target database. It requires the following two fields to set in AppBinding's `Spec` section. +- `spec.appRef` refers to the underlying application. +- `spec.clientConfig` defines how to communicate with the application. - `spec.clientConfig.service.name` specifies the name of the service that connects to the database. - `spec.secret` specifies the name of the secret that holds necessary credentials to access the database. - `spec.parameters.stash` contains the Stash Addon information that will be used to backup/restore this MongoDB database. diff --git a/docs/guides/mongodb/cli/cli.md b/docs/guides/mongodb/cli/cli.md index 40671a0f0f..7d9dd92bb4 100644 --- a/docs/guides/mongodb/cli/cli.md +++ b/docs/guides/mongodb/cli/cli.md @@ -47,10 +47,10 @@ cat mongodb-demo.yaml | kubectl create -f - ```bash $ kubectl get mongodb NAME VERSION STATUS AGE -mongodb-demo 3.4-v3 Running 13m -mongodb-dev 3.4-v3 Running 11m -mongodb-prod 3.4-v3 Running 11m -mongodb-qa 3.4-v3 Running 10m +mongodb-demo 3.4-v3 Ready 13m +mongodb-dev 3.4-v3 Ready 11m +mongodb-prod 3.4-v3 Ready 11m +mongodb-qa 3.4-v3 Ready 10m ``` To get YAML of an object, use `--output=yaml` flag. @@ -111,7 +111,7 @@ spec: version: 3.4-v3 status: observedGeneration: 2$4213139756412538772 - phase: Running + phase: Ready ``` To get JSON of an object, use `--output=json` flag. @@ -125,10 +125,10 @@ To list all KubeDB objects, use following command: ```bash $ kubectl get kubedb -o wide NAME VERSION STATUS AGE -mg/mongodb-demo 3.4 Running 3h -mg/mongodb-dev 3.4 Running 3h -mg/mongodb-prod 3.4 Running 3h -mg/mongodb-qa 3.4 Running 3h +mg/mongodb-demo 3.4 Ready 3h +mg/mongodb-dev 3.4 Ready 3h +mg/mongodb-prod 3.4 Ready 3h +mg/mongodb-qa 3.4 Ready 3h NAME DATABASE BUCKET STATUS AGE snap/mongodb-demo-20170605-073557 mg/mongodb-demo gs:bucket-name Succeeded 9m @@ -185,7 +185,7 @@ CreationTimestamp: Wed, 06 Feb 2019 16:31:04 +0600 Labels: Annotations: Replicas: 1 total -Status: Running +Status: Ready StorageType: Durable Volume: StorageClass: standard diff --git a/docs/guides/mongodb/concepts/appbinding.md b/docs/guides/mongodb/concepts/appbinding.md index 6cac182970..038766f3e7 100644 --- a/docs/guides/mongodb/concepts/appbinding.md +++ b/docs/guides/mongodb/concepts/appbinding.md @@ -32,33 +32,53 @@ An `AppBinding` object created by `KubeDB` for PostgreSQL database is shown belo apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: - name: quick-postgres - namespace: demo + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"MongoDB","metadata":{"annotations":{},"name":"sample-mgo-rs","namespace":"demo"},"spec":{"replicaSet":{"name":"rs0"},"replicas":3,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"},"terminationPolicy":"WipeOut","version":"4.2.3"}} + creationTimestamp: "2022-10-26T04:42:05Z" + generation: 1 labels: app.kubernetes.io/component: database - app.kubernetes.io/instance: quick-postgres + app.kubernetes.io/instance: sample-mgo-rs app.kubernetes.io/managed-by: kubedb.com - app.kubernetes.io/name: postgres - app.kubernetes.io/version: "10.2"-v2 + app.kubernetes.io/name: mongodbs.kubedb.com + name: sample-mgo-rs + namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: MongoDB + name: sample-mgo-rs + uid: 658bf7d1-3772-4c89-84db-5ac74a6c5851 + resourceVersion: "577375" + uid: b0cd9885-53d9-4a2b-93a9-cf9fa90594fd spec: - type: kubedb.com/postgres - secret: - name: quick-postgres-auth + appRef: + apiGroup: kubedb.com + kind: MongoDB + name: sample-mgo-rs + namespace: demo clientConfig: service: - name: quick-postgres - path: / - port: 5432 - query: sslmode=disable - scheme: postgresql - secretTransforms: - - renameKey: - from: POSTGRES_USER - to: username - - renameKey: - from: POSTGRES_PASSWORD - to: password - version: "13.2" + name: sample-mgo-rs + port: 27017 + scheme: mongodb + parameters: + apiVersion: config.kubedb.com/v1alpha1 + kind: MongoConfiguration + replicaSets: + host-0: rs0/sample-mgo-rs-0.sample-mgo-rs-pods.demo.svc:27017,sample-mgo-rs-1.sample-mgo-rs-pods.demo.svc:27017,sample-mgo-rs-2.sample-mgo-rs-pods.demo.svc:27017 + stash: + addon: + backupTask: + name: mongodb-backup-4.2.3 + restoreTask: + name: mongodb-restore-4.2.3 + secret: + name: sample-mgo-rs-auth + type: kubedb.com/mongodb + version: 4.2.3 ``` Here, we are going to describe the sections of an `AppBinding` crd. @@ -115,6 +135,10 @@ Elasticsearch: | `ADMIN_USERNAME` | Admin username | | `ADMIN_PASSWORD` | Password for admin user | + +#### spec.appRef +appRef refers to the underlying application. It has `apiGroup`, `kind`, `name` & `namespace`. + #### spec.clientConfig `spec.clientConfig` defines how to communicate with the target database. You can use either an URL or a Kubernetes service to connect with the database. You don't have to specify both of them. diff --git a/docs/guides/mongodb/concepts/catalog.md b/docs/guides/mongodb/concepts/catalog.md index 51887dd313..3cac30b690 100644 --- a/docs/guides/mongodb/concepts/catalog.md +++ b/docs/guides/mongodb/concepts/catalog.md @@ -34,18 +34,27 @@ metadata: labels: app: kubedb spec: - version: "4.2.3" - deprecated: false db: - image: "${KUBEDB_DOCKER_REGISTRY}/mongo:4.2.3" + image: mongo:4.2.3 + distribution: Official exporter: - image: "${KUBEDB_DOCKER_REGISTRY}/percona-mongodb-exporter:v0.8.0" + image: kubedb/mongodb_exporter:v0.32.0 initContainer: - image: "${KUBEDB_DOCKER_REGISTRY}/mongodb-init:4.2-v1" + image: kubedb/mongodb-init:4.2-v7 podSecurityPolicies: databasePolicyName: mongodb-db replicationModeDetector: - image: "${KUBEDB_DOCKER_REGISTRY}/replication-mode-detector:v0.3.2" + image: kubedb/replication-mode-detector:v0.16.0 + stash: + addon: + backupTask: + name: mongodb-backup-4.2.3 + restoreTask: + name: mongodb-restore-4.2.3 + upgradeConstraints: + allowlist: + - '>= 4.4.0, < 5.0.0' + version: 4.2.3 ``` ### metadata.name @@ -72,13 +81,20 @@ The default value of this field is `false`. If `spec.deprecated` is set to `true `spec.db.image` is a required field that specifies the docker image which will be used to create Statefulset by KubeDB operator to create expected MongoDB database. +### spec.initContainer.image +`spec.initContainer.image` is a required field that specifies the image for init container. + + ### spec.exporter.image `spec.exporter.image` is a required field that specifies the image which will be used to export Prometheus metrics. -### spec.tools.image +### spec.stash +This holds the Backup & Restore task definitions, where a `TaskRef` has a `Name` & `Params` section. Params specifies a list of parameters to pass to the task. -`spec.tools.image` is a required field that specifies the image which will be used to take backup and initialize database from a snapshot. +### spec.upgradeConstraints +UpgradeConstraints specifies the constraints that need to be considered during version upgrade. Here `allowList` contains the versions those are allowed for upgrading from the current version. +On the other hand ### spec.podSecurityPolicies.databasePolicyName diff --git a/docs/guides/mongodb/concepts/mongodb.md b/docs/guides/mongodb/concepts/mongodb.md index d2f95d9425..8b733a719a 100644 --- a/docs/guides/mongodb/concepts/mongodb.md +++ b/docs/guides/mongodb/concepts/mongodb.md @@ -29,10 +29,13 @@ metadata: name: mgo1 namespace: demo spec: + autoOps: + disabled: true version: "4.2.3" replicas: 3 authSecret: name: mgo1-auth + externallyManaged: false replicaSet: name: rs0 shardTopology: @@ -77,6 +80,7 @@ spec: - abc@appscode.com clusterAuthMode: x509 storageType: "Durable" + storageEngine: wiredTiger storage: storageClassName: "standard" accessModes: @@ -104,9 +108,13 @@ spec: metadata: annotations: passMe: ToDatabasePod + labels: + thisLabel: willGoToPod controller: annotations: passMe: ToStatefulSet + labels: + thisLabel: willGoToSts spec: serviceAccountName: my-service-account schedulerName: my-scheduler @@ -161,9 +169,16 @@ spec: memory: 500Mi securityContext: runAsUser: 1001 - + healthChecker: + periodSeconds: 15 + timeoutSeconds: 10 + failureThreshold: 2 + disableWriteCheck: false ``` +### spec.autoOps +AutoOps is an optional field to control the generation of versionUpgrade & TLS-related recommendations. + ### spec.version `spec.version` is a required field specifying the name of the [MongoDBVersion](/docs/guides/mongodb/concepts/catalog.md) crd where the docker images are specified. Currently, when you install KubeDB, it creates the following `MongoDBVersion` resources, @@ -189,9 +204,12 @@ KubeDB uses `PodDisruptionBudget` to ensure that majority of these replicas are ### spec.authSecret -`spec.authSecret` is an optional field that points to a Secret used to hold credentials for `mongodb` superuser. If not set, KubeDB operator creates a new Secret `{mongodb-object-name}-auth` for storing the password for `mongodb` superuser for each MongoDB object. If you want to use an existing secret please specify that when creating the MongoDB object using `spec.authSecret.name`. +`spec.authSecret` is an optional field that points to a Secret used to hold credentials for `mongodb` superuser. If not set, KubeDB operator creates a new Secret `{mongodb-object-name}-auth` for storing the password for `mongodb` superuser for each MongoDB object. +If you want to use an external secret please specify that when creating the MongoDB object using `spec.authSecret.name` & set `spec.authSecret.externallyManaged` to true. -This secret contains a `user` key and a `password` key which contains the `username` and `password` respectively for `mongodb` superuser. +You can specify the auth secret name only & let KubeDB create a secret with the required keys with that name. In this case, you need to specify the name, but set `spec.authSecret.externallyManaged` to false. + +AuthSecret contains a `user` key and a `password` key which contains the `username` and `password` respectively for `mongodb` superuser. Example: @@ -435,8 +453,10 @@ KubeDB accept following fields to set in `spec.podTemplate:` - metadata: - annotations (pod's annotation) + - labels (pod's labels) - controller: - annotations (statefulset's annotation) + - labels (statefulset's labels) - spec: - args - env @@ -455,7 +475,7 @@ KubeDB accept following fields to set in `spec.podTemplate:` - readinessProbe - lifecycle -Uses of some field of `spec.podTemplate` is described below, +You can checkout the full list [here](https://github.com/kmodules/offshoot-api/blob/ea366935d5bad69d7643906c7556923271592513/api/v1/types.go#L42-L259). Uses of some field of `spec.podTemplate` is described below, NB. If `spec.shardTopology` is set, then `spec.podTemplate` needs to be empty. Instead use `spec.shardTopology..podTemplate` @@ -589,6 +609,13 @@ Possible values are : i) `All` to allow all namespaces, ii) `Same` to allow only We use a dedicated container, named `replication-mode-detector`, to continuously select primary pod and add label as primary. By specifying `spec.coordinator.resources` & `spec.coordinator.securityContext`, you can set the resources and securityContext of that mode-detector container. +## spec.healthChecker +It defines the attributes for the health checker. +- `spec.healthChecker.periodSeconds` specifies how often to perform the health check. +- `spec.healthChecker.timeoutSeconds` specifies the number of seconds after which the probe times out. +- `spec.healthChecker.failureThreshold` specifies minimum consecutive failures for the healthChecker to be considered failed. +- `spec.healthChecker.disableWriteCheck` specifies whether to disable the writeCheck or not. + ## Next Steps - Learn how to use KubeDB to run a MongoDB database [here](/docs/guides/mongodb/README.md). diff --git a/docs/guides/mongodb/concepts/opsrequest.md b/docs/guides/mongodb/concepts/opsrequest.md index 7b5b9cf5df..a1efe82bd8 100644 --- a/docs/guides/mongodb/concepts/opsrequest.md +++ b/docs/guides/mongodb/concepts/opsrequest.md @@ -585,6 +585,7 @@ If you want to scale-up or scale-down your MongoDB cluster or different componen - `spec.verticalScaling.configServer` indicates the desired resources for ConfigServer nodes of Sharded MongoDB database after scaling. - `spec.verticalScaling.shard` indicates the desired resources for Shard nodes of Sharded MongoDB database after scaling. - `spec.verticalScaling.exporter` indicates the desired resources for the `exporter` container. +- `spec.verticalScaling.arbiter` indicates the desired resources for arbiter node of MongoDB database after scaling. All of them has the below structure: @@ -631,6 +632,7 @@ If you want to reconfigure your Running MongoDB cluster or different components - `spec.configuration.configServer` indicates the desired new custom configuration for config servers of a sharded MongoDB database. - `spec.configuration.mongos` indicates the desired new custom configuration for the mongos nodes of a sharded MongoDB database. - `spec.configuration.shard` indicates the desired new custom configuration for the shard nodes of a sharded MongoDB database. +- `spec.verticalScaling.arbiter` indicates the desired new custom configuration for arbiter node of MongoDB database after scaling. All of them has the following sub-fields: @@ -646,6 +648,30 @@ If you want to reconfigure the TLS configuration of your database i.e. add TLS, - `spec.tls.rotateCertificates` specifies that we want to rotate the certificate of this database. - `spec.tls.remove` specifies that we want to remove tls from this database. +### spec.readinessCriteria + +`spec.readinessCriteria` is the criteria for checking readiness of a MongoDB pod after restarting it. It has two fields. +- `spec.readinessCriteria.oplogMaxLagSeconds` defines the maximum allowed lagging time between the primary & secondary. +- `spec.readinessCriteria.objectsCountDiffPercentage` denotes the maximum allowed object-count-difference between the primary & secondary. + +```yaml +... +spec: + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 +... +``` +Exceeding these thresholds results in opsRequest failure. One thing to note that, readinessCriteria field will make impact only if pod restarting is associated with the opsRequest type. + +### spec.timeout +As we internally retry the ops request steps multiple times, This `timeout` field helps the users to specify the timeout for those steps of the ops request (in second). +If a step doesn't finish within the specified timeout, the ops request will result in failure. + +### spec.apply +This field controls the execution of obsRequest depending on the database state. It has two supported values: `Always` & `IfReady`. +Use IfReady, if you want to process the opsRequest only when the database is Ready. And use Always, if you want to process the execution of opsReq irrespective of the Database state. + ### MongoDBOpsRequest `Status` diff --git a/docs/guides/mongodb/configuration/using-config-file.md b/docs/guides/mongodb/configuration/using-config-file.md index 326768212b..fb22bcc2a9 100644 --- a/docs/guides/mongodb/configuration/using-config-file.md +++ b/docs/guides/mongodb/configuration/using-config-file.md @@ -39,6 +39,11 @@ MongoDB allows configuring database via configuration file. The default configur At first, you have to create a secret with your configuration file contents as the value of this key `mongod.conf`. Then, you have to specify the name of this secret in `spec.configSecret.name` section while creating MongoDB crd. KubeDB will mount this secret into `/configdb-readonly/` directory of the database pod. +Here one important thing to note that, `spec.configSecret.name` will be used for standard replicaset members & standalone mongodb only. If you want to configure a specific type of mongo nodes, you have to set the name in respective fields. +For example, to configure shard topology node, set `spec.shardTopology..configSecret.name` field. +Similarly, To configure arbiter node, set `spec.arbiter.configSecret.name` field. +For hidden node, set `spec.hidden.configSecret.name` field, & so on. + In this tutorial, we will configure [net.maxIncomingConnections](https://docs.mongodb.com/manual/reference/configuration-options/#net.maxIncomingConnections) (default value: 65536) via a custom config file. ## Custom Configuration diff --git a/docs/guides/mongodb/configuration/using-podtemplate.md b/docs/guides/mongodb/configuration/using-podtemplate.md index 00265d4b67..4146cf1127 100644 --- a/docs/guides/mongodb/configuration/using-podtemplate.md +++ b/docs/guides/mongodb/configuration/using-podtemplate.md @@ -39,8 +39,10 @@ KubeDB accept following fields to set in `spec.podTemplate:` - metadata: - annotations (pod's annotation) + - labels (pod's labels) - controller: - annotations (statefulset's annotation) + - labels (statefulset's labels) - spec: - args - env @@ -49,11 +51,15 @@ KubeDB accept following fields to set in `spec.podTemplate:` - imagePullSecrets - nodeSelector - affinity + - serviceAccountName - schedulerName - tolerations - priorityClassName - priority - securityContext + - livenessProbe + - readinessProbe + - lifecycle Read about the fields in details in [PodTemplate concept](/docs/guides/mongodb/concepts/mongodb.md#specpodtemplate), diff --git a/docs/guides/mongodb/custom-rbac/using-custom-rbac.md b/docs/guides/mongodb/custom-rbac/using-custom-rbac.md index cb06b0b8f4..8afedbfba7 100644 --- a/docs/guides/mongodb/custom-rbac/using-custom-rbac.md +++ b/docs/guides/mongodb/custom-rbac/using-custom-rbac.md @@ -39,7 +39,7 @@ If a service account name is given, but there's no existing service account by t If a service account name is given, and there's an existing service account by that name, the KubeDB operator will use that existing service account. Since this service account is not managed by KubeDB, users are responsible for providing necessary access permissions manually. -This guide will show you how to create custom `Service Account`, `Role`, and `RoleBinding` for a MongoDB instance named `quick-postges` to provide the bare minimum access permissions. +This guide will show you how to create custom `Service Account`, `Role`, and `RoleBinding` for a MongoDB instance named `quick-mongodb` to provide the bare minimum access permissions. ## Custom RBAC for MongoDB @@ -110,7 +110,7 @@ $ kubectl get rolebinding -n demo my-custom-rolebinding -o yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - creationTimestamp: "kubectl get rolebinding -n demo my-custom-rolebinding -o yaml" + creationTimestamp: "2019-05-30T04:33:39Z" name: my-custom-rolebinding namespace: demo resourceVersion: "1405" diff --git a/docs/guides/mongodb/monitoring/overview.md b/docs/guides/mongodb/monitoring/overview.md index f63392df93..f9d6b57f54 100644 --- a/docs/guides/mongodb/monitoring/overview.md +++ b/docs/guides/mongodb/monitoring/overview.md @@ -70,7 +70,7 @@ spec: prometheus: serviceMonitor: labels: - k8s-app: prometheus + release: prometheus exporter: args: - --collect.database @@ -92,7 +92,11 @@ spec: allowPrivilegeEscalation: false ``` -Here, we have specified that we are going to monitor this server using Prometheus operator through `spec.monitor.agent: prometheus.io/operator`. KubeDB will create a `ServiceMonitor` crd in `monitoring` namespace and this `ServiceMonitor` will have `k8s-app: prometheus` label. +Here, we have specified that we are going to monitor this server using Prometheus operator through `spec.monitor.agent: prometheus.io/operator`. KubeDB will create a `ServiceMonitor` crd in databases namespace and this `ServiceMonitor` will have `release: prometheus` label. + +One thing to note that, we internally use `--collect-all` args, if the mongodb exporter version >= v0.31.0 . You can check the exporter version by getting the mgversion object, like this, +`kubectl get mgversion -o=jsonpath='{.spec.exporter.image}' 4.2.3` +In that case, specifying args to collect something (as we used `--collect.database` above) will not have any effect. ## Next Steps diff --git a/docs/guides/mongodb/monitoring/using-prometheus-operator.md b/docs/guides/mongodb/monitoring/using-prometheus-operator.md index c44f5e22d1..ac354e4a97 100644 --- a/docs/guides/mongodb/monitoring/using-prometheus-operator.md +++ b/docs/guides/mongodb/monitoring/using-prometheus-operator.md @@ -40,14 +40,14 @@ section_menu_id: guides ## Find out required labels for ServiceMonitor -We need to know the labels used to select `ServiceMonitor` by a `Prometheus` crd. We are going to provide these labels in `spec.monitor.prometheus.labels` field of MongoDB crd so that KubeDB creates `ServiceMonitor` object accordingly. +We need to know the labels used to select `ServiceMonitor` by a `Prometheus` crd. We are going to provide these labels in `spec.monitor.prometheus.serviceMonitor.labels` field of MongoDB crd so that KubeDB creates `ServiceMonitor` object accordingly. At first, let's find out the available Prometheus server in our cluster. ```bash $ kubectl get prometheus --all-namespaces NAMESPACE NAME VERSION REPLICAS AGE -monitoring prometheus-kube-prometheus-prometheus v2.24.0 1 6h48m +monitoring prometheus-kube-prometheus-prometheus v2.39.0 1 13d ``` > If you don't have any Prometheus server running in your cluster, deploy one following the guide specified in **Before You Begin** section. @@ -62,88 +62,21 @@ metadata: annotations: meta.helm.sh/release-name: prometheus meta.helm.sh/release-namespace: monitoring - creationTimestamp: "2021-03-09T10:47:17Z" + creationTimestamp: "2022-10-11T07:12:20Z" generation: 1 labels: app: kube-prometheus-stack-prometheus + app.kubernetes.io/instance: prometheus app.kubernetes.io/managed-by: Helm - chart: kube-prometheus-stack-13.13.0 + app.kubernetes.io/part-of: kube-prometheus-stack + app.kubernetes.io/version: 40.5.0 + chart: kube-prometheus-stack-40.5.0 heritage: Helm release: prometheus - managedFields: - - apiVersion: monitoring.coreos.com/v1 - fieldsType: FieldsV1 - fieldsV1: - f:metadata: - f:annotations: - .: {} - f:meta.helm.sh/release-name: {} - f:meta.helm.sh/release-namespace: {} - f:labels: - .: {} - f:app: {} - f:app.kubernetes.io/managed-by: {} - f:chart: {} - f:heritage: {} - f:release: {} - f:spec: - .: {} - f:alerting: - .: {} - f:alertmanagers: {} - f:enableAdminAPI: {} - f:externalUrl: {} - f:image: {} - f:listenLocal: {} - f:logFormat: {} - f:logLevel: {} - f:paused: {} - f:podMonitorNamespaceSelector: {} - f:podMonitorSelector: - .: {} - f:matchLabels: - .: {} - f:release: {} - f:portName: {} - f:probeNamespaceSelector: {} - f:probeSelector: - .: {} - f:matchLabels: - .: {} - f:release: {} - f:replicas: {} - f:retention: {} - f:routePrefix: {} - f:ruleNamespaceSelector: {} - f:ruleSelector: - .: {} - f:matchLabels: - .: {} - f:app: {} - f:release: {} - f:securityContext: - .: {} - f:fsGroup: {} - f:runAsGroup: {} - f:runAsNonRoot: {} - f:runAsUser: {} - f:serviceAccountName: {} - f:serviceMonitorNamespaceSelector: {} - f:serviceMonitorSelector: - .: {} - f:matchLabels: - .: {} - f:release: {} - f:shards: {} - f:version: {} - manager: Go-http-client - operation: Update - time: "2021-03-09T10:47:17Z" name: prometheus-kube-prometheus-prometheus namespace: monitoring - resourceVersion: "100084" - selfLink: /apis/monitoring.coreos.com/v1/namespaces/monitoring/prometheuses/prometheus-kube-prometheus-prometheus - uid: 4b7a8c5b-09c4-4858-8232-13cbb71c766b + resourceVersion: "490475" + uid: 7e36caf3-228a-40f3-bff9-a1c0c78dedb0 spec: alerting: alertmanagers: @@ -151,10 +84,11 @@ spec: name: prometheus-kube-prometheus-alertmanager namespace: monitoring pathPrefix: / - port: web + port: http-web enableAdminAPI: false + evaluationInterval: 30s externalUrl: http://prometheus-kube-prometheus-prometheus.monitoring:9090 - image: quay.io/prometheus/prometheus:v2.24.0 + image: quay.io/prometheus/prometheus:v2.39.0 listenLocal: false logFormat: logfmt logLevel: info @@ -163,19 +97,19 @@ spec: podMonitorSelector: matchLabels: release: prometheus - portName: web + portName: http-web probeNamespaceSelector: {} probeSelector: matchLabels: release: prometheus replicas: 1 - retention: "10d" + retention: 10d routePrefix: / ruleNamespaceSelector: {} ruleSelector: matchLabels: - app: kube-prometheus-stack release: prometheus + scrapeInterval: 30s securityContext: fsGroup: 2000 runAsGroup: 2000 @@ -187,10 +121,11 @@ spec: matchLabels: release: prometheus shards: 1 - version: v2.24.0 + version: v2.39.0 + walCompression: true ``` -Notice the `spec.serviceMonitorSelector` section. Here, `release: prometheus` label is used to select `ServiceMonitor` crd. So, we are going to use this label in `spec.monitor.prometheus.labels` field of MongoDB crd. +Notice the `spec.serviceMonitorSelector` section. Here, `release: prometheus` label is used to select `ServiceMonitor` crd. So, we are going to use this label in `spec.monitor.prometheus.serviceMonitor.labels` field of MongoDB crd. ## Deploy MongoDB with Monitoring Enabled @@ -224,8 +159,7 @@ spec: Here, - `monitor.agent: prometheus.io/operator` indicates that we are going to monitor this server using Prometheus operator. -- `monitor.prometheus.namespace: monitoring` specifies that KubeDB should create `ServiceMonitor` in `monitoring` namespace. -- `monitor.prometheus.labels` specifies that KubeDB should create `ServiceMonitor` with these labels. +- `monitor.prometheus.serviceMonitor.labels` specifies that KubeDB should create `ServiceMonitor` with these labels. - `monitor.prometheus.interval` indicates that the Prometheus server should scrape metrics from this database with 10 seconds interval. Let's create the MongoDB object that we have shown above, @@ -261,21 +195,24 @@ Let's describe this stats service. $ kubectl describe svc -n demo coreos-prom-mgo-stats Name: coreos-prom-mgo-stats Namespace: demo -Labels: app.kubernetes.io/instance=coreos-prom-mgo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=coreos-prom-mgo app.kubernetes.io/managed-by=kubedb.com app.kubernetes.io/name=mongodbs.kubedb.com kubedb.com/role=stats Annotations: monitoring.appscode.com/agent: prometheus.io/operator Selector: app.kubernetes.io/instance=coreos-prom-mgo,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=mongodbs.kubedb.com Type: ClusterIP -IP Families: -IP: 10.96.218.41 -IPs: +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.96.240.52 +IPs: 10.96.240.52 Port: metrics 56790/TCP TargetPort: metrics/TCP -Endpoints: 10.244.0.110:56790 +Endpoints: 10.244.0.149:56790 Session Affinity: None Events: + ``` Notice the `Labels` and `Port` fields. `ServiceMonitor` will use this information to target its endpoints. @@ -295,7 +232,7 @@ $ kubectl get servicemonitor -n demo coreos-prom-mgo-stats -o yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: - creationTimestamp: "2021-03-09T17:40:16Z" + creationTimestamp: "2022-10-24T11:51:08Z" generation: 1 labels: app.kubernetes.io/component: database @@ -303,36 +240,6 @@ metadata: app.kubernetes.io/managed-by: kubedb.com app.kubernetes.io/name: mongodbs.kubedb.com release: prometheus - managedFields: - - apiVersion: monitoring.coreos.com/v1 - fieldsType: FieldsV1 - fieldsV1: - f:metadata: - f:labels: - .: {} - f:app.kubernetes.io/component: {} - f:app.kubernetes.io/instance: {} - f:app.kubernetes.io/managed-by: {} - f:app.kubernetes.io/name: {} - f:release: {} - f:ownerReferences: {} - f:spec: - .: {} - f:endpoints: {} - f:namespaceSelector: - .: {} - f:matchNames: {} - f:selector: - .: {} - f:matchLabels: - .: {} - f:app.kubernetes.io/instance: {} - f:app.kubernetes.io/managed-by: {} - f:app.kubernetes.io/name: {} - f:kubedb.com/role: {} - manager: mg-operator - operation: Update - time: "2021-03-09T17:40:16Z" name: coreos-prom-mgo-stats namespace: demo ownerReferences: @@ -341,10 +248,9 @@ metadata: controller: true kind: Service name: coreos-prom-mgo-stats - uid: 906358eb-90dc-4a06-b9d3-89f557ad6ef4 - resourceVersion: "184540" - selfLink: /apis/monitoring.coreos.com/v1/namespaces/demo/servicemonitors/coreos-prom-mgo-stats - uid: b0df2b5e-b6dd-4e8b-bf48-9da14f099d83 + uid: 68b0e8c4-cba4-4dcb-9016-4e1901ca1fd0 + resourceVersion: "528373" + uid: 56eb596b-d2cf-4d2c-a204-c43dbe8fe896 spec: endpoints: - bearerTokenSecret: @@ -358,6 +264,7 @@ spec: - demo selector: matchLabels: + app.kubernetes.io/component: database app.kubernetes.io/instance: coreos-prom-mgo app.kubernetes.io/managed-by: kubedb.com app.kubernetes.io/name: mongodbs.kubedb.com @@ -373,9 +280,9 @@ Also notice that the `ServiceMonitor` has selector which match the labels we hav At first, let's find out the respective Prometheus pod for `prometheus` Prometheus server. ```bash -$ kubectl get pod -n monitoring -l=app=prometheus +$ kubectl get pod -n monitoring -l=app.kubernetes.io/name=prometheus NAME READY STATUS RESTARTS AGE -prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 1 6h58m +prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 1 13d ``` Prometheus server is listening to port `9090` of `prometheus-prometheus-kube-prometheus-prometheus-0` pod. We are going to use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to access Prometheus dashboard. diff --git a/docs/guides/mongodb/private-registry/using-private-registry.md b/docs/guides/mongodb/private-registry/using-private-registry.md index 232f745210..161158d87b 100644 --- a/docs/guides/mongodb/private-registry/using-private-registry.md +++ b/docs/guides/mongodb/private-registry/using-private-registry.md @@ -24,25 +24,29 @@ KubeDB operator supports using private Docker registry. This tutorial will show - You will also need a docker private [registry](https://docs.docker.com/registry/) or [private repository](https://docs.docker.com/docker-hub/repos/#private-repositories). In this tutorial we will use private repository of [docker hub](https://hub.docker.com/). -- You have to push the required images from KubeDB's [Docker hub account](https://hub.docker.com/r/kubedb/) into your private registry. For mongodb, push `DB_IMAGE`, `TOOLS_IMAGE`, `EXPORTER_IMAGE` of following MongoDBVersions, where `deprecated` is not true, to your private registry. +- You have to push the required images into your private registry. For mongodb, push `DB_IMAGE`, `TOOLS_IMAGE`, `EXPORTER_IMAGE` of following MongoDBVersions, where `deprecated` is not true, to your private registry. ```bash $ kubectl get mongodbversions -n kube-system -o=custom-columns=NAME:.metadata.name,VERSION:.spec.version,INITCONTAINER_IMAGE:.spec.initContainer.image,DB_IMAGE:.spec.db.image,EXPORTER_IMAGE:.spec.exporter.image - NAME VERSION INITCONTAINER_IMAGE DB_IMAGE EXPORTER_IMAGE - 3.4.17-v1 3.4.17 kubedb/mongodb-init:4.1 kubedb/mongo:3.4.17-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 3.4.22-v1 3.4.22 kubedb/mongodb-init:4.1 kubedb/mongo:3.4.22-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 3.6.13-v1 3.6.13 kubedb/mongodb-init:4.1 kubedb/mongo:3.6.13-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 3.6.18-percona 3.6.18 kubedb/mongodb-init:4.1 percona/percona-server-mongodb:3.6.18 kubedb/percona-mongodb-exporter:v0.8.0 - 3.6.8-v1 3.6.8 kubedb/mongodb-init:4.1 kubedb/mongo:3.6.8-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 4.0.10-percona 4.0.10 kubedb/mongodb-init:4.1 percona/percona-server-mongodb:4.0.10 kubedb/percona-mongodb-exporter:v0.8.0 - 4.0.11-v1 4.0.11 kubedb/mongodb-init:4.1 kubedb/mongo:4.0.11-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 4.0.3-v1 4.0.3 kubedb/mongodb-init:4.1 kubedb/mongo:4.0.3-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 4.0.5-v3 4.0.5 kubedb/mongodb-init:4.1 kubedb/mongo:4.0.5-v3 kubedb/percona-mongodb-exporter:v0.8.0 - 4.1.13-v1 4.1.13 kubedb/mongodb-init:4.2 kubedb/mongo:4.1.13-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 4.1.4-v1 4.1.4 kubedb/mongodb-init:4.1.4 kubedb/mongo:4.1.4-v1 kubedb/percona-mongodb-exporter:v0.8.0 - 4.1.7-v3 4.1.7 kubedb/mongodb-init:4.2 kubedb/mongo:4.1.7-v3 kubedb/percona-mongodb-exporter:v0.8.0 - 4.2.3 4.2.3 kubedb/mongodb-init:4.2 kubedb/mongo:4.2.3 kubedb/percona-mongodb-exporter:v0.8.0 - 4.2.7-percona 4.2.7 kubedb/mongodb-init:4.2 percona/percona-server-mongodb:4.2.7-7 kubedb/percona-mongodb-exporter:v0.8.0 + NAME VERSION INITCONTAINER_IMAGE DB_IMAGE EXPORTER_IMAGE + 3.4.17-v1 3.4.17 kubedb/mongodb-init:4.1-v7 mongo:3.4.17 kubedb/mongodb_exporter:v0.20.4 + 3.4.22-v1 3.4.22 kubedb/mongodb-init:4.1-v7 mongo:3.4.22 kubedb/mongodb_exporter:v0.32.0 + 3.6.13-v1 3.6.13 kubedb/mongodb-init:4.1-v7 mongo:3.6.13 kubedb/mongodb_exporter:v0.32.0 + 3.6.8-v1 3.6.8 kubedb/mongodb-init:4.1-v7 mongo:3.6.8 kubedb/mongodb_exporter:v0.32.0 + 4.0.11-v1 4.0.11 kubedb/mongodb-init:4.1-v7 mongo:4.0.11 kubedb/mongodb_exporter:v0.32.0 + 4.0.3-v1 4.0.3 kubedb/mongodb-init:4.1-v7 mongo:4.0.3 kubedb/mongodb_exporter:v0.32.0 + 4.0.5-v3 4.0.5 kubedb/mongodb-init:4.1-v7 mongo:4.0.5 kubedb/mongodb_exporter:v0.32.0 + 4.1.13-v1 4.1.13 kubedb/mongodb-init:4.2-v7 mongo:4.1.13 kubedb/mongodb_exporter:v0.32.0 + 4.1.4-v1 4.1.4 kubedb/mongodb-init:4.1.4-v7 mongo:4.1.4 kubedb/mongodb_exporter:v0.32.0 + 4.1.7-v3 4.1.7 kubedb/mongodb-init:4.2-v7 mongo:4.1.7 kubedb/mongodb_exporter:v0.32.0 + 4.2.3 4.2.3 kubedb/mongodb-init:4.2-v7 mongo:4.2.3 kubedb/mongodb_exporter:v0.32.0 + 4.4.6 4.4.6 kubedb/mongodb-init:4.2-v7 mongo:4.4.6 kubedb/mongodb_exporter:v0.32.0 + 5.0.2 5.0.2 kubedb/mongodb-init:4.2-v7 mongo:5.0.2 kubedb/mongodb_exporter:v0.32.0 + 5.0.3 5.0.3 kubedb/mongodb-init:4.2-v7 mongo:5.0.3 kubedb/mongodb_exporter:v0.32.0 + percona-3.6.18 3.6.18 kubedb/mongodb-init:4.1-v7 percona/percona-server-mongodb:3.6.18 kubedb/mongodb_exporter:v0.32.0 + percona-4.0.10 4.0.10 kubedb/mongodb-init:4.1-v7 percona/percona-server-mongodb:4.0.10 kubedb/mongodb_exporter:v0.32.0 + percona-4.2.7 4.2.7 kubedb/mongodb-init:4.2-v7 percona/percona-server-mongodb:4.2.7-7 kubedb/mongodb_exporter:v0.32.0 + percona-4.4.10 4.4.10 kubedb/mongodb-init:4.2-v7 percona/percona-server-mongodb:4.4.10 kubedb/mongodb_exporter:v0.32.0 ``` Docker hub repositories: @@ -52,6 +56,15 @@ KubeDB operator supports using private Docker registry. This tutorial will show - [kubedb/mongo-tools](https://hub.docker.com/r/kubedb/mongo-tools) - [kubedb/mongodb_exporter](https://hub.docker.com/r/kubedb/mongodb_exporter) + +## Install KubeDB operator from Private Registry + +If you want to install KubeDB operator with some private registry images, set the flags `--registry` and `--imagePullSecret` to appropriate value, when installing the operator. +Follow the steps [install KubeDB operator](/docs/setup/README.md) properly. The list configuration arguments of the helm installation command will be found [here](https://github.com/kubedb/installer/tree/v2022.10.18/charts/kubedb#configuration). + + +## Use DB related images from Private Registry + - Update KubeDB catalog for private Docker registry. Ex: ```yaml @@ -75,7 +88,7 @@ spec: image: "PRIVATE_DOCKER_REGISTRY/replication-mode-detector:v0.3.2" ``` -## Create ImagePullSecret +### Create ImagePullSecret ImagePullSecrets is a type of a Kubernete Secret whose sole purpose is to pull private images from a Docker registry. It allows you to specify the url of the docker registry, credentials for logging in and the image name of your private docker image. @@ -90,15 +103,13 @@ $ kubectl create secret docker-registry -n demo myregistrykey \ secret/myregistrykey created ``` +DOCKER_REGISTRY_SERVER value will be `docker.io` for docker hub. + If you wish to follow other ways to pull private images see [official docs](https://kubernetes.io/docs/concepts/containers/images/) of Kubernetes. NB: If you are using `kubectl` 1.9.0, update to 1.9.1 or later to avoid this [issue](https://github.com/kubernetes/kubernetes/issues/57427). -## Install KubeDB operator - -When installing KubeDB operator, set the flags `--docker-registry` and `--image-pull-secret` to appropriate value. Follow the steps to [install KubeDB operator](/docs/setup/README.md) properly in cluster so that to points to the DOCKER_REGISTRY you wish to pull images from. - -## Create Demo namespace +### Create Demo namespace To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. Run the following command to prepare your cluster for this tutorial: @@ -107,7 +118,7 @@ $ kubectl create ns demo namespace/demo created ``` -## Deploy MongoDB database from Private Registry +### Deploy MongoDB While deploying `MongoDB` from private repository, you have to add `myregistrykey` secret in `MongoDB` `spec.imagePullSecrets`. Below is the MongoDB CRD object we will create. @@ -143,11 +154,8 @@ mongodb.kubedb.com/mgo-pvt-reg created To check if the images pulled successfully from the repository, see if the `MongoDB` is in running state: ```bash -$ kubectl get pods -n demo -w +$ kubectl get pods -n demo NAME READY STATUS RESTARTS AGE -mgo-pvt-reg-0 0/1 Pending 0 0s -mgo-pvt-reg-0 0/1 Pending 0 0s -mgo-pvt-reg-0 0/1 ContainerCreating 0 0s mgo-pvt-reg-0 1/1 Running 0 5m @@ -156,10 +164,6 @@ NAME VERSION STATUS AGE mgo-pvt-reg 4.2.3 Ready 38s ``` -## Snapshot - -You can specify `imagePullSecret` for Snapshot objects in `spec.podTemplate.spec.imagePullSecrets` field of Snapshot object. If you are using scheduled backup, you can also provide `imagePullSecret` in `backupSchedule.podTemplate.spec.imagePullSecrets` field of MongoDB crd. KubeDB also reuses `imagePullSecret` for Snapshot object from `spec.podTemplate.spec.imagePullSecrets` field of MongoDB crd. - ## Cleaning up To cleanup the Kubernetes resources created by this tutorial, run: diff --git a/docs/guides/mongodb/reconfigure-tls/overview.md b/docs/guides/mongodb/reconfigure-tls/overview.md index ba616124ef..e7bc1e68a0 100644 --- a/docs/guides/mongodb/reconfigure-tls/overview.md +++ b/docs/guides/mongodb/reconfigure-tls/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # Reconfiguring TLS of MongoDB Database -This guide will give an overview on how KubeDB Enterprise operator reconfigures TLS configuration i.e. add TLS, remove TLS, update issuer/cluster issuer or Certificates and rotate the certificates of a `MongoDB` database. +This guide will give an overview on how KubeDB Ops-manager operator reconfigures TLS configuration i.e. add TLS, remove TLS, update issuer/cluster issuer or Certificates and rotate the certificates of a `MongoDB` database. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give an overview on how KubeDB Enterprise operator reconfigures ## How Reconfiguring MongoDB TLS Configuration Process Works -The following diagram shows how KubeDB Enterprise operator reconfigures TLS of a `MongoDB` database. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator reconfigures TLS of a `MongoDB` database. Open the image in a new tab to see the enlarged version.
  Reconfiguring TLS process of MongoDB @@ -37,20 +37,20 @@ The Reconfiguring MongoDB TLS process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource Object (CRO). -2. `KubeDB` Community operator watches the `MongoDB` CRO. +2. `KubeDB` Provisioner operator watches the `MongoDB` CRO. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. 4. Then, in order to reconfigure the TLS configuration of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with desired information. -5. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -6. When it finds a `MongoDBOpsRequest` CR, it pauses the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the reconfiguring TLS process. +6. When it finds a `MongoDBOpsRequest` CR, it pauses the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the reconfiguring TLS process. -7. Then the `KubeDB` Enterprise operator will add, remove, update or rotate TLS configuration based on the Ops Request yaml. +7. Then the `KubeDB` Ops-manager operator will add, remove, update or rotate TLS configuration based on the Ops Request yaml. -8. Then the `KubeDB` Enterprise operator will restart all the Pods of the database so that they restart with the new TLS configuration defined in the `MongoDBOpsRequest` CR. +8. Then the `KubeDB` Ops-manager operator will restart all the Pods of the database so that they restart with the new TLS configuration defined in the `MongoDBOpsRequest` CR. -9. After the successful reconfiguring of the `MongoDB` TLS, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator resumes its usual operations. +9. After the successful reconfiguring of the `MongoDB` TLS, the `KubeDB` Ops-manager operator resumes the `MongoDB` 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 reconfiguring TLS configuration of a MongoDB database using `MongoDBOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/mongodb/reconfigure-tls/reconfigure-tls.md b/docs/guides/mongodb/reconfigure-tls/reconfigure-tls.md index 1bcc0bad7a..a5dfc47c0a 100644 --- a/docs/guides/mongodb/reconfigure-tls/reconfigure-tls.md +++ b/docs/guides/mongodb/reconfigure-tls/reconfigure-tls.md @@ -293,6 +293,11 @@ spec: - mongo organizationalUnits: - client + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -419,13 +424,13 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 2m10s KubeDB Enterprise Operator Pausing MongoDB demo/mg-rs - Normal PauseDatabase 2m10s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-rs - Normal TLSAdded 2m10s KubeDB Enterprise Operator Successfully Updated StatefulSets - Normal RestartReplicaSet 10s KubeDB Enterprise Operator Successfully Restarted ReplicaSet nodes - Normal ResumeDatabase 10s KubeDB Enterprise Operator Resuming MongoDB demo/mg-rs - Normal ResumeDatabase 10s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-rs - Normal Successful 10s KubeDB Enterprise Operator Successfully Reconfigured TLS + Normal PauseDatabase 2m10s KubeDB Ops-manager operator Pausing MongoDB demo/mg-rs + Normal PauseDatabase 2m10s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-rs + Normal TLSAdded 2m10s KubeDB Ops-manager operator Successfully Updated StatefulSets + Normal RestartReplicaSet 10s KubeDB Ops-manager operator Successfully Restarted ReplicaSet nodes + Normal ResumeDatabase 10s KubeDB Ops-manager operator Resuming MongoDB demo/mg-rs + Normal ResumeDatabase 10s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-rs + Normal Successful 10s KubeDB Ops-manager operator Successfully Reconfigured TLS ``` Now, Let's exec into a database primary node and find out the username to connect in a mongo shell, @@ -609,9 +614,9 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal CertificateIssuingSuccessful 2m10s KubeDB Enterprise Operator Successfully Issued New Certificates - Normal RestartReplicaSet 25s KubeDB Enterprise Operator Successfully Restarted ReplicaSet nodes - Normal Successful 25s KubeDB Enterprise Operator Successfully Reconfigured TLS + Normal CertificateIssuingSuccessful 2m10s KubeDB Ops-manager operator Successfully Issued New Certificates + Normal RestartReplicaSet 25s KubeDB Ops-manager operator Successfully Restarted ReplicaSet nodes + Normal Successful 25s KubeDB Ops-manager operator Successfully Reconfigured TLS ``` Now, let's check the expiration date of the certificate. @@ -805,9 +810,9 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal CertificateIssuingSuccessful 2m27s KubeDB Enterprise Operator Successfully Issued New Certificates - Normal RestartReplicaSet 42s KubeDB Enterprise Operator Successfully Restarted ReplicaSet nodes - Normal Successful 42s KubeDB Enterprise Operator Successfully Reconfigured TLS + Normal CertificateIssuingSuccessful 2m27s KubeDB Ops-manager operator Successfully Issued New Certificates + Normal RestartReplicaSet 42s KubeDB Ops-manager operator Successfully Restarted ReplicaSet nodes + Normal Successful 42s KubeDB Ops-manager operator Successfully Reconfigured TLS ``` Now, Let's exec into a database node and find out the ca subject to see if it matches the one we have provided. @@ -950,13 +955,13 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 2m5s KubeDB Enterprise Operator Pausing MongoDB demo/mg-rs - Normal PauseDatabase 2m5s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-rs - Normal TLSRemoved 2m5s KubeDB Enterprise Operator Successfully Updated StatefulSets - Normal RestartReplicaSet 35s KubeDB Enterprise Operator Successfully Restarted ReplicaSet nodes - Normal ResumeDatabase 35s KubeDB Enterprise Operator Resuming MongoDB demo/mg-rs - Normal ResumeDatabase 35s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-rs - Normal Successful 35s KubeDB Enterprise Operator Successfully Reconfigured TLS + Normal PauseDatabase 2m5s KubeDB Ops-manager operator Pausing MongoDB demo/mg-rs + Normal PauseDatabase 2m5s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-rs + Normal TLSRemoved 2m5s KubeDB Ops-manager operator Successfully Updated StatefulSets + Normal RestartReplicaSet 35s KubeDB Ops-manager operator Successfully Restarted ReplicaSet nodes + Normal ResumeDatabase 35s KubeDB Ops-manager operator Resuming MongoDB demo/mg-rs + Normal ResumeDatabase 35s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-rs + Normal Successful 35s KubeDB Ops-manager operator Successfully Reconfigured TLS ``` Now, Let's exec into the database primary node and find out that TLS is disabled or not. diff --git a/docs/guides/mongodb/reconfigure/overview.md b/docs/guides/mongodb/reconfigure/overview.md index 1b258d778a..0c04df1f3d 100644 --- a/docs/guides/mongodb/reconfigure/overview.md +++ b/docs/guides/mongodb/reconfigure/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # Reconfiguring MongoDB -This guide will give an overview on how KubeDB Enterprise operator reconfigures `MongoDB` database components such as ReplicaSet, Shard, ConfigServer, Mongos, etc. +This guide will give an overview on how KubeDB Ops-manager operator reconfigures `MongoDB` database components such as ReplicaSet, Shard, ConfigServer, Mongos, etc. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give an overview on how KubeDB Enterprise operator reconfigures ## How Reconfiguring MongoDB Process Works -The following diagram shows how KubeDB Enterprise operator reconfigures `MongoDB` database components. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator reconfigures `MongoDB` database components. Open the image in a new tab to see the enlarged version.
  Reconfiguring process of MongoDB @@ -37,20 +37,20 @@ The Reconfiguring MongoDB process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. 4. Then, in order to reconfigure the various components (ie. ReplicaSet, Shard, ConfigServer, Mongos, etc.) of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with desired information. -5. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the reconfiguring process. +6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the reconfiguring process. -7. Then the `KubeDB` Enterprise operator will replace the existing configuration with the new configuration provided or merge the new configuration with the existing configuration according to the `MogoDBOpsRequest` CR. +7. Then the `KubeDB` Ops-manager operator will replace the existing configuration with the new configuration provided or merge the new configuration with the existing configuration according to the `MogoDBOpsRequest` CR. -8. Then the `KubeDB` Enterprise operator will restart the related StatefulSet Pods so that they restart with the new configuration defined in the `MongoDBOpsRequest` CR. +8. Then the `KubeDB` Ops-manager operator will restart the related StatefulSet Pods so that they restart with the new configuration defined in the `MongoDBOpsRequest` CR. -9. After the successful reconfiguring of the `MongoDB` components, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator resumes its usual operations. +9. After the successful reconfiguring of the `MongoDB` components, the `KubeDB` Ops-manager operator resumes the `MongoDB` 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 reconfiguring MongoDB database components using `MongoDBOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/mongodb/reconfigure/replicaset.md b/docs/guides/mongodb/reconfigure/replicaset.md index 93311cf1b8..7043d6c8ec 100644 --- a/docs/guides/mongodb/reconfigure/replicaset.md +++ b/docs/guides/mongodb/reconfigure/replicaset.md @@ -16,13 +16,13 @@ section_menu_id: guides # Reconfigure MongoDB Replicaset Database -This guide will show you how to use `KubeDB` Enterprise operator to reconfigure a MongoDB Replicaset. +This guide will show you how to use `KubeDB` Ops-manager operator to reconfigure a MongoDB Replicaset. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -206,6 +206,11 @@ spec: replicaSet: configSecret: name: new-custom-config + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -213,6 +218,8 @@ Here, - `spec.databaseRef.name` specifies that we are reconfiguring `mops-reconfigure-replicaset` database. - `spec.type` specifies that we are performing `Reconfigure` on our database. - `spec.customConfig.replicaSet.configSecret.name` specifies the name of the new secret. +- `spec.customConfig.arbiter.configSecret.name` could also be specified with a config-secret. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -223,7 +230,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-replicaset created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will update the `configSecret` of `MongoDB` object. +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `MongoDB` object. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -257,6 +264,7 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:configuration: .: f:replicaSet: @@ -267,6 +275,11 @@ Metadata: f:databaseRef: .: f:name: + f:readinessCriteria: + .: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: Manager: kubectl-client-side-apply Operation: Update @@ -296,12 +309,17 @@ Metadata: Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-reconfigure-replicaset UID: 064733d6-19db-4153-82f7-bc0580116ee6 Spec: + Apply: IfReady Configuration: Replica Set: Config Secret: Name: new-custom-config Database Ref: Name: mg-replicaset + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m Type: Reconfigure Status: Conditions: @@ -328,12 +346,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 2m55s KubeDB Enterprise Operator Pausing MongoDB demo/mg-replicaset - Normal PauseDatabase 2m55s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-replicaset - Normal ReconfigureReplicaset 65s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ResumeDatabase 65s KubeDB Enterprise Operator Resuming MongoDB demo/mg-replicaset - Normal ResumeDatabase 65s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-replicaset - Normal Successful 65s KubeDB Enterprise Operator Successfully Reconfigured Database + Normal PauseDatabase 2m55s KubeDB Ops-manager operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 2m55s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-replicaset + Normal ReconfigureReplicaset 65s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ResumeDatabase 65s KubeDB Ops-manager operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 65s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 65s KubeDB Ops-manager operator Successfully Reconfigured Database ``` Now let's connect to a mongodb instance and run a mongodb internal command to check the new configuration we have provided. @@ -415,6 +433,11 @@ spec: inlineConfig: | net: maxIncomingConnections: 30000 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -422,6 +445,8 @@ Here, - `spec.databaseRef.name` specifies that we are reconfiguring `mops-reconfigure-inline-replicaset` database. - `spec.type` specifies that we are performing `Reconfigure` on our database. - `spec.configuration.replicaSet.inlineConfig` specifies the new configuration that will be merged in the existing secret. +- `spec.customConfig.arbiter.configSecret.name` could also be specified with a config-secret. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -432,7 +457,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-inline-replicaset created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will merge this new config with the existing configuration. +If everything goes well, `KubeDB` Ops-manager operator will merge this new config with the existing configuration. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -466,6 +491,7 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:configuration: .: f:replicaSet: @@ -474,6 +500,11 @@ Metadata: f:databaseRef: .: f:name: + f:readinessCriteria: + .: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: Manager: kubectl-client-side-apply Operation: Update @@ -503,6 +534,7 @@ Metadata: Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-reconfigure-inline-replicaset UID: 0137442b-1b04-43ed-8de7-ecd913b44065 Spec: + Apply: IfReady Configuration: Replica Set: Inline Config: net: @@ -510,6 +542,10 @@ Spec: Database Ref: Name: mg-replicaset + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m Type: Reconfigure Status: Conditions: @@ -536,12 +572,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 9m20s KubeDB Enterprise Operator Pausing MongoDB demo/mg-replicaset - Normal PauseDatabase 9m20s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-replicaset - Normal ReconfigureReplicaset 7m45s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ResumeDatabase 7m45s KubeDB Enterprise Operator Resuming MongoDB demo/mg-replicaset - Normal ResumeDatabase 7m45s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-replicaset - Normal Successful 7m45s KubeDB Enterprise Operator Successfully Reconfigured Database + Normal PauseDatabase 9m20s KubeDB Ops-manager operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 9m20s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-replicaset + Normal ReconfigureReplicaset 7m45s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ResumeDatabase 7m45s KubeDB Ops-manager operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 7m45s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 7m45s KubeDB Ops-manager operator Successfully Reconfigured Database ``` Now let's connect to a mongodb instance and run a mongodb internal command to check the new configuration we have provided. diff --git a/docs/guides/mongodb/reconfigure/sharding.md b/docs/guides/mongodb/reconfigure/sharding.md index 930e44f7ed..044a857961 100644 --- a/docs/guides/mongodb/reconfigure/sharding.md +++ b/docs/guides/mongodb/reconfigure/sharding.md @@ -16,13 +16,13 @@ section_menu_id: guides # Reconfigure MongoDB Shard -This guide will show you how to use `KubeDB` Enterprise operator to reconfigure a MongoDB shard. +This guide will show you how to use `KubeDB` Ops-manager operator to reconfigure a MongoDB shard. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -207,6 +207,11 @@ spec: mongos: configSecret: name: new-custom-config + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -216,6 +221,8 @@ Here, - `spec.configuration.shard.configSecret.name` specifies the name of the new secret for shard nodes. - `spec.configuration.configServer.configSecret.name` specifies the name of the new secret for configServer nodes. - `spec.configuration.mongos.configSecret.name` specifies the name of the new secret for mongos nodes. +- `spec.customConfig.arbiter.configSecret.name` could also be specified with a config-secret. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. > **Note:** If you don't want to reconfigure all the components together, you can only specify the components (shard, configServer and mongos) that you want to reconfigure. @@ -228,7 +235,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-shard created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will update the `configSecret` of `MongoDB` object. +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `MongoDB` object. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -313,6 +320,11 @@ spec: inlineConfig: | net: maxIncomingConnections: 30000 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -322,6 +334,8 @@ Here, - `spec.configuration.shard.inlineConfig` specifies the new configuration that will be merged in the existing secret for shard nodes. - `spec.configuration.configServer.inlineConfig` specifies the new configuration that will be merged in the existing secret for configServer nodes. - `spec.configuration.mongos.inlineConfig` specifies the new configuration that will be merged in the existing secret for mongos nodes. +- `spec.customConfig.arbiter.configSecret.name` could also be specified with a config-secret. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. > **Note:** If you don't want to reconfigure all the components together, you can only specify the components (shard, configServer and mongos) that you want to reconfigure. @@ -334,7 +348,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-inline-shard created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will merge this new config with the existing configuration. +If everything goes well, `KubeDB` Ops-manager operator will merge this new config with the existing configuration. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -368,6 +382,7 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:configuration: .: f:configServer: @@ -388,6 +403,11 @@ Metadata: f:databaseRef: .: f:name: + f:readinessCriteria: + .: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: Manager: kubectl-client-side-apply Operation: Update @@ -433,6 +453,7 @@ Metadata: Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-reconfigure-inline-shard UID: ab454bcb-164c-4fa2-9eaa-dd47c60fe874 Spec: + Apply: IfReady Configuration: Config Server: Inline Config: net: @@ -448,6 +469,10 @@ Spec: Database Ref: Name: mg-sharding + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m Type: Reconfigure Status: Conditions: @@ -486,14 +511,14 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 13m KubeDB Enterprise Operator Pausing MongoDB demo/mg-sharding - Normal PauseDatabase 13m KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sharding - Normal ReconfigureConfigServer 12m KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ReconfigureShard 9m7s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ReconfigureMongos 8m12s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ResumeDatabase 8m12s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sharding - Normal ResumeDatabase 8m12s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sharding - Normal Successful 8m12s KubeDB Enterprise Operator Successfully Reconfigured Database + Normal PauseDatabase 13m KubeDB Ops-manager operator Pausing MongoDB demo/mg-sharding + Normal PauseDatabase 13m KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-sharding + Normal ReconfigureConfigServer 12m KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ReconfigureShard 9m7s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ReconfigureMongos 8m12s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ResumeDatabase 8m12s KubeDB Ops-manager operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 8m12s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-sharding + Normal Successful 8m12s KubeDB Ops-manager operator Successfully Reconfigured Database ``` Now let's connect to a mongodb instance from each type of nodes and run a mongodb internal command to check the new configuration we have provided. diff --git a/docs/guides/mongodb/reconfigure/standalone.md b/docs/guides/mongodb/reconfigure/standalone.md index 7c411b6518..1097ec4cec 100644 --- a/docs/guides/mongodb/reconfigure/standalone.md +++ b/docs/guides/mongodb/reconfigure/standalone.md @@ -16,13 +16,13 @@ section_menu_id: guides # Reconfigure MongoDB Standalone Database -This guide will show you how to use `KubeDB` Enterprise operator to reconfigure a MongoDB standalone database. +This guide will show you how to use `KubeDB` Ops-manager operator to reconfigure a MongoDB standalone database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -186,6 +186,11 @@ spec: standalone: configSecret: name: new-custom-config + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -193,6 +198,7 @@ Here, - `spec.databaseRef.name` specifies that we are reconfiguring `mops-reconfigure-standalone` database. - `spec.type` specifies that we are performing `Reconfigure` on our database. - `spec.configuration.standalone.configSecret.name` specifies the name of the new secret. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -203,7 +209,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-standalone created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will update the `configSecret` of `MongoDB` object. +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `MongoDB` object. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -237,6 +243,7 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:configuration: .: f:standalone: @@ -247,6 +254,11 @@ Metadata: f:databaseRef: .: f:name: + f:readinessCriteria: + .: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: Manager: kubectl-client-side-apply Operation: Update @@ -276,12 +288,17 @@ Metadata: Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-reconfigure-standalone UID: f63bb606-9df5-4516-9901-97dfe5b46b15 Spec: + Apply: IfReady Configuration: Standalone: Config Secret: Name: new-custom-config Database Ref: Name: mg-standalone + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m Type: Reconfigure Status: Conditions: @@ -308,12 +325,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 60s KubeDB Enterprise Operator Pausing MongoDB demo/mg-standalone - Normal PauseDatabase 60s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-standalone - Normal ReconfigureStandalone 35s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ResumeDatabase 35s KubeDB Enterprise Operator Resuming MongoDB demo/mg-standalone - Normal ResumeDatabase 35s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-standalone - Normal Successful 35s KubeDB Enterprise Operator Successfully Reconfigured Database + Normal PauseDatabase 60s KubeDB Ops-manager operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 60s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-standalone + Normal ReconfigureStandalone 35s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ResumeDatabase 35s KubeDB Ops-manager operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 35s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-standalone + Normal Successful 35s KubeDB Ops-manager operator Successfully Reconfigured Database ``` Now let's connect to a mongodb instance and run a mongodb internal command to check the new configuration we have provided. @@ -379,6 +396,11 @@ spec: inlineConfig: | net: maxIncomingConnections: 30000 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -396,7 +418,7 @@ mongodbopsrequest.ops.kubedb.com/mops-reconfigure-inline-standalone created #### Verify the new configuration is working -If everything goes well, `KubeDB` Enterprise operator will merge this new config with the existing configuration. +If everything goes well, `KubeDB` Ops-manager operator will merge this new config with the existing configuration. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -430,6 +452,7 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:configuration: .: f:standalone: @@ -438,6 +461,11 @@ Metadata: f:databaseRef: .: f:name: + f:readinessCriteria: + .: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: Manager: kubectl-client-side-apply Operation: Update @@ -467,6 +495,7 @@ Metadata: Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-reconfigure-inline-standalone UID: 33eea32f-e2af-4e36-b612-c528549e3d65 Spec: + Apply: IfReady Configuration: Standalone: Inline Config: net: @@ -474,6 +503,10 @@ Spec: Database Ref: Name: mg-standalone + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m Type: Reconfigure Status: Conditions: @@ -500,12 +533,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 118s KubeDB Enterprise Operator Pausing MongoDB demo/mg-standalone - Normal PauseDatabase 118s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-standalone - Normal ReconfigureStandalone 93s KubeDB Enterprise Operator Successfully Reconfigured MongoDB - Normal ResumeDatabase 93s KubeDB Enterprise Operator Resuming MongoDB demo/mg-standalone - Normal ResumeDatabase 93s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-standalone - Normal Successful 93s KubeDB Enterprise Operator Successfully Reconfigured Database + Normal PauseDatabase 118s KubeDB Ops-manager operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 118s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-standalone + Normal ReconfigureStandalone 93s KubeDB Ops-manager operator Successfully Reconfigured MongoDB + Normal ResumeDatabase 93s KubeDB Ops-manager operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 93s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-standalone + Normal Successful 93s KubeDB Ops-manager operator Successfully Reconfigured Database ``` Now let's connect to a mongodb instance and run a mongodb internal command to check the new configuration we have provided. diff --git a/docs/guides/mongodb/scaling/horizontal-scaling/overview.md b/docs/guides/mongodb/scaling/horizontal-scaling/overview.md index 487ad013e8..c344d0b2ec 100644 --- a/docs/guides/mongodb/scaling/horizontal-scaling/overview.md +++ b/docs/guides/mongodb/scaling/horizontal-scaling/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Horizontal Scaling -This guide will give an overview on how KubeDB Enterprise operator scales up or down `MongoDB` database replicas of various component such as ReplicaSet, Shard, ConfigServer, Mongos, etc. +This guide will give an overview on how KubeDB Ops-manager operator scales up or down `MongoDB` database replicas of various component such as ReplicaSet, Shard, ConfigServer, Mongos, etc. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give an overview on how KubeDB Enterprise operator scales up or ## How Horizontal Scaling Process Works -The following diagram shows how KubeDB Enterprise operator scales up or down `MongoDB` 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 `MongoDB` database components. Open the image in a new tab to see the enlarged version.
  Horizontal scaling process of MongoDB @@ -37,20 +37,20 @@ The Horizontal scaling process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. 4. Then, in order to scale the various components (ie. ReplicaSet, Shard, ConfigServer, Mongos, etc.) of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with desired information. -5. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the horizontal scaling process. +6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the horizontal scaling process. -7. Then the `KubeDB` Enterprise operator will scale the related StatefulSet Pods to reach the expected number of replicas defined in the `MongoDBOpsRequest` CR. +7. Then the `KubeDB` Ops-manager operator will scale the related StatefulSet Pods to reach the expected number of replicas defined in the `MongoDBOpsRequest` CR. -8. After the successfully scaling the replicas of the related StatefulSet Pods, the `KubeDB` Enterprise operator updates the number of replicas in the `MongoDB` object to reflect the updated state. +8. After the successfully scaling the replicas of the related StatefulSet Pods, the `KubeDB` Ops-manager operator updates the number of replicas in the `MongoDB` object to reflect the updated state. -9. After the successful scaling of the `MongoDB` replicas, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator resumes its usual operations. +9. After the successful scaling of the `MongoDB` replicas, the `KubeDB` Ops-manager operator resumes the `MongoDB` 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 MongoDB database using `MongoDBOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/mongodb/scaling/horizontal-scaling/replicaset.md b/docs/guides/mongodb/scaling/horizontal-scaling/replicaset.md index 5a3c5654d2..97b09ec1cd 100644 --- a/docs/guides/mongodb/scaling/horizontal-scaling/replicaset.md +++ b/docs/guides/mongodb/scaling/horizontal-scaling/replicaset.md @@ -16,13 +16,13 @@ section_menu_id: guides # Horizontal Scale MongoDB Replicaset -This guide will show you how to use `KubeDB` Enterprise operator to scale the replicaset of a MongoDB database. +This guide will show you how to use `KubeDB` Ops-manager operator to scale the replicaset of a MongoDB database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -235,7 +235,7 @@ mongodbopsrequest.ops.kubedb.com/mops-hscale-up-replicaset created #### Verify Replicaset replicas scaled up successfully -If everything goes well, `KubeDB` Enterprise operator will update the replicas of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the replicas of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -324,12 +324,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 91s KubeDB Enterprise Operator Pausing MongoDB demo/mg-replicaset - Normal PauseDatabase 91s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-replicaset - Normal ScaleUpReplicaSet 45s KubeDB Enterprise Operator Successfully Horizontally Scaled Up ReplicaSet - Normal ResumeDatabase 45s KubeDB Enterprise Operator Resuming MongoDB demo/mg-replicaset - Normal ResumeDatabase 45s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-replicaset - Normal Successful 45s KubeDB Enterprise Operator Successfully Horizontally Scaled Database + Normal PauseDatabase 91s KubeDB Ops-manager operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 91s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-replicaset + Normal ScaleUpReplicaSet 45s KubeDB Ops-manager operator Successfully Horizontally Scaled Up ReplicaSet + Normal ResumeDatabase 45s KubeDB Ops-manager operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 45s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 45s KubeDB Ops-manager operator Successfully Horizontally Scaled Database ``` Now, we are going to verify the number of replicas this database has from the MongoDB object, number of pods the statefulset have, @@ -492,7 +492,7 @@ mongodbopsrequest.ops.kubedb.com/mops-hscale-down-replicaset created #### Verify Replicaset replicas scaled down successfully -If everything goes well, `KubeDB` Enterprise operator will update the replicas of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the replicas of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -581,12 +581,12 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 50s KubeDB Enterprise Operator Pausing MongoDB demo/mg-replicaset - Normal PauseDatabase 50s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-replicaset - Normal ScaleDownReplicaSet 30s KubeDB Enterprise Operator Successfully Horizontally Scaled Down ReplicaSet - Normal ResumeDatabase 30s KubeDB Enterprise Operator Resuming MongoDB demo/mg-replicaset - Normal ResumeDatabase 30s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-replicaset - Normal Successful 30s KubeDB Enterprise Operator Successfully Horizontally Scaled Database + Normal PauseDatabase 50s KubeDB Ops-manager operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 50s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-replicaset + Normal ScaleDownReplicaSet 30s KubeDB Ops-manager operator Successfully Horizontally Scaled Down ReplicaSet + Normal ResumeDatabase 30s KubeDB Ops-manager operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 30s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 30s KubeDB Ops-manager operator Successfully Horizontally Scaled Database ``` Now, we are going to verify the number of replicas this database has from the MongoDB object, number of pods the statefulset have, diff --git a/docs/guides/mongodb/scaling/horizontal-scaling/sharding.md b/docs/guides/mongodb/scaling/horizontal-scaling/sharding.md index bc27150040..8a18937dc3 100644 --- a/docs/guides/mongodb/scaling/horizontal-scaling/sharding.md +++ b/docs/guides/mongodb/scaling/horizontal-scaling/sharding.md @@ -16,13 +16,13 @@ section_menu_id: guides # Horizontal Scale MongoDB Shard -This guide will show you how to use `KubeDB` Enterprise operator to scale the shard of a MongoDB database. +This guide will show you how to use `KubeDB` Ops-manager operator to scale the shard of a MongoDB database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -446,7 +446,7 @@ mongodbopsrequest.ops.kubedb.com/mops-hscale-up-shard created #### Verify scaling up is successful -If everything goes well, `KubeDB` Enterprise operator will update the shard and replicas of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the shard and replicas of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -568,23 +568,23 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 13m KubeDB Enterprise Operator Pausing MongoDB demo/mg-sharding - Normal PauseDatabase 13m KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sharding - Normal ScaleUpShardReplicas 11m KubeDB Enterprise Operator Successfully Horizontally Scaled Up Shard Replicas - Normal ResumeDatabase 11m KubeDB Enterprise Operator Resuming MongoDB demo/mg-sharding - Normal ResumeDatabase 11m KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sharding - Normal ScaleUpShardReplicas 11m KubeDB Enterprise Operator Successfully Horizontally Scaled Up Shard Replicas - Normal ScaleUpShardReplicas 11m KubeDB Enterprise Operator Successfully Horizontally Scaled Up Shard Replicas - Normal Progressing 8m20s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal Progressing 4m5s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal ScaleUpShard 3m59s KubeDB Enterprise Operator Successfully Horizontally Scaled Up Shard - Normal PauseDatabase 3m59s KubeDB Enterprise Operator Pausing MongoDB demo/mg-sharding - Normal PauseDatabase 3m59s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sharding - Normal ScaleUpConfigServer 2m31s KubeDB Enterprise Operator Successfully Horizontally Scaled Up ConfigServer - Normal ScaleMongos 36s KubeDB Enterprise Operator Successfully Horizontally Scaled Mongos - Normal ResumeDatabase 36s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sharding - Normal ResumeDatabase 36s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sharding - Normal Successful 36s KubeDB Enterprise Operator Successfully Horizontally Scaled Database + Normal PauseDatabase 13m KubeDB Ops-manager operator Pausing MongoDB demo/mg-sharding + Normal PauseDatabase 13m KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-sharding + Normal ScaleUpShardReplicas 11m KubeDB Ops-manager operator Successfully Horizontally Scaled Up Shard Replicas + Normal ResumeDatabase 11m KubeDB Ops-manager operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 11m KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-sharding + Normal ScaleUpShardReplicas 11m KubeDB Ops-manager operator Successfully Horizontally Scaled Up Shard Replicas + Normal ScaleUpShardReplicas 11m KubeDB Ops-manager operator Successfully Horizontally Scaled Up Shard Replicas + Normal Progressing 8m20s KubeDB Ops-manager operator Successfully updated StatefulSets Resources + Normal Progressing 4m5s KubeDB Ops-manager operator Successfully updated StatefulSets Resources + Normal ScaleUpShard 3m59s KubeDB Ops-manager operator Successfully Horizontally Scaled Up Shard + Normal PauseDatabase 3m59s KubeDB Ops-manager operator Pausing MongoDB demo/mg-sharding + Normal PauseDatabase 3m59s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-sharding + Normal ScaleUpConfigServer 2m31s KubeDB Ops-manager operator Successfully Horizontally Scaled Up ConfigServer + Normal ScaleMongos 36s KubeDB Ops-manager operator Successfully Horizontally Scaled Mongos + Normal ResumeDatabase 36s KubeDB Ops-manager operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 36s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-sharding + Normal Successful 36s KubeDB Ops-manager operator Successfully Horizontally Scaled Database ``` #### Verify Number of Shard and Shard Replicas @@ -989,7 +989,7 @@ mongodbopsrequest.ops.kubedb.com/mops-hscale-down-shard created #### Verify scaling down is successful -If everything goes well, `KubeDB` Enterprise operator will update the shards and replicas `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the shards and replicas `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -1117,17 +1117,17 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal PauseDatabase 6m29s KubeDB Enterprise Operator Pausing MongoDB demo/mg-sharding - Normal PauseDatabase 6m29s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sharding - Normal ScaleDownShardReplicas 5m29s KubeDB Enterprise Operator Successfully Horizontally Scaled Down Shard Replicas - Normal StartingBalancer 5m29s KubeDB Enterprise Operator Starting Balancer - Normal StartingBalancer 5m28s KubeDB Enterprise Operator Successfully Started Balancer - Normal ScaleDownShard 4m37s KubeDB Enterprise Operator Successfully Horizontally Scaled Down Shard - Normal ScaleDownConfigServer 4m16s KubeDB Enterprise Operator Successfully Horizontally Scaled Down ConfigServer - Normal ScaleMongos 4m6s KubeDB Enterprise Operator Successfully Horizontally Scaled Mongos - Normal ResumeDatabase 4m6s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sharding - Normal ResumeDatabase 4m6s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sharding - Normal Successful 4m6s KubeDB Enterprise Operator Successfully Horizontally Scaled Database + Normal PauseDatabase 6m29s KubeDB Ops-manager operator Pausing MongoDB demo/mg-sharding + Normal PauseDatabase 6m29s KubeDB Ops-manager operator Successfully paused MongoDB demo/mg-sharding + Normal ScaleDownShardReplicas 5m29s KubeDB Ops-manager operator Successfully Horizontally Scaled Down Shard Replicas + Normal StartingBalancer 5m29s KubeDB Ops-manager operator Starting Balancer + Normal StartingBalancer 5m28s KubeDB Ops-manager operator Successfully Started Balancer + Normal ScaleDownShard 4m37s KubeDB Ops-manager operator Successfully Horizontally Scaled Down Shard + Normal ScaleDownConfigServer 4m16s KubeDB Ops-manager operator Successfully Horizontally Scaled Down ConfigServer + Normal ScaleMongos 4m6s KubeDB Ops-manager operator Successfully Horizontally Scaled Mongos + Normal ResumeDatabase 4m6s KubeDB Ops-manager operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 4m6s KubeDB Ops-manager operator Successfully resumed MongoDB demo/mg-sharding + Normal Successful 4m6s KubeDB Ops-manager operator Successfully Horizontally Scaled Database ``` ##### Verify Number of Shard and Shard Replicas diff --git a/docs/guides/mongodb/scaling/vertical-scaling/overview.md b/docs/guides/mongodb/scaling/vertical-scaling/overview.md index e9b2880e40..6187144510 100644 --- a/docs/guides/mongodb/scaling/vertical-scaling/overview.md +++ b/docs/guides/mongodb/scaling/vertical-scaling/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Vertical Scaling -This guide will give an overview on how KubeDB Enterprise operator updates the resources(for example CPU and Memory etc.) of the `MongoDB` database. +This guide will give an overview on how KubeDB Ops-manager operator updates the resources(for example CPU and Memory etc.) of the `MongoDB` database. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give an overview on how KubeDB Enterprise operator updates the r ## How Vertical Scaling Process Works -The following diagram shows how KubeDB Enterprise operator updates the resources of the `MongoDB` database. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator updates the resources of the `MongoDB` database. Open the image in a new tab to see the enlarged version.
  Vertical scaling process of MongoDB @@ -37,20 +37,20 @@ The vertical scaling process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. 4. Then, in order to update the resources(for example `CPU`, `Memory` etc.) of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with desired information. -5. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the vertical scaling process. +6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the vertical scaling process. -7. Then the `KubeDB` Enterprise operator will update resources of the StatefulSet Pods to reach desired state. +7. Then the `KubeDB` Ops-manager operator will update resources of the StatefulSet Pods to reach desired state. -8. After the successful update of the resources of the StatefulSet's replica, the `KubeDB` Enterprise operator updates the `MongoDB` object to reflect the updated state. +8. After the successful update of the resources of the StatefulSet's replica, the `KubeDB` Ops-manager operator updates the `MongoDB` object to reflect the updated state. -9. After the successful update of the `MongoDB` resources, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator resumes its usual operations. +9. After the successful update of the `MongoDB` resources, the `KubeDB` Ops-manager operator resumes the `MongoDB` 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 updating resources of MongoDB database using `MongoDBOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/mongodb/scaling/vertical-scaling/replicaset.md b/docs/guides/mongodb/scaling/vertical-scaling/replicaset.md index aba51b9476..70855a447f 100644 --- a/docs/guides/mongodb/scaling/vertical-scaling/replicaset.md +++ b/docs/guides/mongodb/scaling/vertical-scaling/replicaset.md @@ -16,13 +16,13 @@ section_menu_id: guides # Vertical Scale MongoDB Replicaset -This guide will show you how to use `KubeDB` Enterprise operator to update the resources of a MongoDB replicaset database. +This guide will show you how to use `KubeDB` Ops-manager operator to update the resources of a MongoDB replicaset database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -133,6 +133,11 @@ spec: limits: memory: "1.2Gi" cpu: "0.6" + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -140,6 +145,8 @@ Here, - `spec.databaseRef.name` specifies that we are performing vertical scaling operation on `mops-vscale-replicaset` database. - `spec.type` specifies that we are performing `VerticalScaling` on our database. - `spec.VerticalScaling.replicaSet` specifies the desired resources after scaling. +- `spec.VerticalScaling.arbiter` could also be specified in similar fashion to get the desired resources for arbiter pod. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -150,7 +157,7 @@ mongodbopsrequest.ops.kubedb.com/mops-vscale-replicaset created #### Verify MongoDB Replicaset resources updated successfully -If everything goes well, `KubeDB` Enterprise operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -172,7 +179,7 @@ Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-02T17:03:37Z + Creation Timestamp: 2022-10-26T10:41:56Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 @@ -184,46 +191,52 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:databaseRef: + f:readinessCriteria: .: - f:name: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: f:verticalScaling: .: f:replicaSet: .: f:limits: + .: + f:cpu: + f:memory: f:requests: + .: + f:cpu: + f:memory: Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-02T17:03:37Z + Time: 2022-10-26T10:41:56Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: - f:spec: - f:verticalScaling: - f:replicaSet: - f:limits: - f:cpu: - f:memory: - f:requests: - f:cpu: - f:memory: f:status: .: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise + Manager: kubedb-ops-manager Operation: Update - Time: 2021-03-02T17:03:37Z - Resource Version: 154015 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vscale-replicaset - UID: 5149dd51-7538-421d-b3ca-23dfa2b77b95 + Subresource: status + Time: 2022-10-26T10:44:33Z + Resource Version: 611468 + UID: 474053a7-90a8-49fd-9b27-c9bf7b4660e7 Spec: + Apply: IfReady Database Ref: Name: mg-replicaset - Type: VerticalScaling + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: VerticalScaling Vertical Scaling: Replica Set: Limits: @@ -234,25 +247,19 @@ Spec: Memory: 1.2Gi Status: Conditions: - Last Transition Time: 2021-03-02T17:03:37Z + Last Transition Time: 2022-10-26T10:43:21Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-02T17:03:37Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-02T17:05:33Z + Last Transition Time: 2022-10-26T10:44:33Z Message: Successfully Vertically Scaled Replicaset Resources Observed Generation: 1 Reason: UpdateReplicaSetResources Status: True Type: UpdateReplicaSetResources - Last Transition Time: 2021-03-02T17:05:33Z + Last Transition Time: 2022-10-26T10:44:33Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -261,18 +268,19 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal PauseDatabase 2m13s KubeDB Enterprise Operator Pausing MongoDB demo/mg-replicaset - Normal PauseDatabase 2m13s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-replicaset - Normal Starting 2m13s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-replicaset - Normal UpdateStatefulSetResources 2m13s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal Starting 2m13s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-replicaset - Normal UpdateStatefulSetResources 2m13s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal UpdateReplicaSetResources 17s KubeDB Enterprise Operator Successfully Vertically Scaled Replicaset Resources - Normal ResumeDatabase 17s KubeDB Enterprise Operator Resuming MongoDB demo/mg-replicaset - Normal ResumeDatabase 17s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-replicaset - Normal Successful 17s KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 82s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 82s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-replicaset + Normal Starting 82s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-replicaset + Normal UpdateReplicaSetResources 82s KubeDB Ops-manager Operator Successfully updated replicaset Resources + Normal Starting 82s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-replicaset + Normal UpdateReplicaSetResources 82s KubeDB Ops-manager Operator Successfully updated replicaset Resources + Normal UpdateReplicaSetResources 10s KubeDB Ops-manager Operator Successfully Vertically Scaled Replicaset Resources + Normal ResumeDatabase 10s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 10s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 10s KubeDB Ops-manager Operator Successfully Vertically Scaled Database + ``` Now, we are going to verify from one of the Pod yaml whether the resources of the replicaset database has updated to meet up the desired state, Let's check, diff --git a/docs/guides/mongodb/scaling/vertical-scaling/sharding.md b/docs/guides/mongodb/scaling/vertical-scaling/sharding.md index 0c32286ba8..90183da2e4 100644 --- a/docs/guides/mongodb/scaling/vertical-scaling/sharding.md +++ b/docs/guides/mongodb/scaling/vertical-scaling/sharding.md @@ -16,13 +16,13 @@ section_menu_id: guides # Vertical Scale MongoDB Replicaset -This guide will show you how to use `KubeDB` Enterprise operator to update the resources of a MongoDB replicaset database. +This guide will show you how to use `KubeDB` Ops-manager operator to update the resources of a MongoDB replicaset database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -178,6 +178,11 @@ spec: limits: memory: "1100Mi" cpu: "0.55" + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -187,6 +192,8 @@ Here, - `spec.VerticalScaling.shard` specifies the desired resources after scaling for the shard nodes. - `spec.VerticalScaling.configServer` specifies the desired resources after scaling for the configServer nodes. - `spec.VerticalScaling.mongos` specifies the desired resources after scaling for the mongos nodes. +- `spec.VerticalScaling.arbiter` could also be specified in similar fashion to get the desired resources for arbiter pod. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. > **Note:** If you don't want to scale all the components together, you can only specify the components (shard, configServer and mongos) that you want to scale. @@ -199,7 +206,7 @@ mongodbopsrequest.ops.kubedb.com/mops-vscale-shard created #### Verify MongoDB Shard resources updated successfully -If everything goes well, `KubeDB` Enterprise operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods` of shard nodes. +If everything goes well, `KubeDB` Ops-manager operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods` of shard nodes. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -221,7 +228,7 @@ Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-02T17:10:43Z + Creation Timestamp: 2022-10-26T10:45:56Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 @@ -233,9 +240,13 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:databaseRef: + f:readinessCriteria: .: - f:name: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: f:verticalScaling: .: @@ -243,64 +254,58 @@ Metadata: .: f:limits: .: + f:cpu: f:memory: f:requests: .: + f:cpu: f:memory: f:mongos: .: f:limits: .: + f:cpu: f:memory: f:requests: .: + f:cpu: f:memory: f:shard: .: f:limits: .: + f:cpu: f:memory: f:requests: .: + f:cpu: f:memory: Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-02T17:10:43Z + Time: 2022-10-26T10:45:56Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: - f:spec: - f:verticalScaling: - f:configServer: - f:limits: - f:cpu: - f:requests: - f:cpu: - f:mongos: - f:limits: - f:cpu: - f:requests: - f:cpu: - f:shard: - f:limits: - f:cpu: - f:requests: - f:cpu: f:status: .: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise + Manager: kubedb-ops-manager Operation: Update - Time: 2021-03-02T17:10:43Z - Resource Version: 157614 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vscale-shard - UID: 6354eabe-0008-4ef7-8ec7-30ce58985012 + Subresource: status + Time: 2022-10-26T10:52:28Z + Resource Version: 613274 + UID: a186cc72-3629-4034-bbf8-988839f6ec23 Spec: + Apply: IfReady Database Ref: Name: mg-sharding - Type: VerticalScaling + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: VerticalScaling Vertical Scaling: Config Server: Limits: @@ -325,37 +330,31 @@ Spec: Memory: 1100Mi Status: Conditions: - Last Transition Time: 2021-03-02T17:10:43Z + Last Transition Time: 2022-10-26T10:48:06Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-02T17:10:43Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-02T17:12:39Z + Last Transition Time: 2022-10-26T10:49:37Z Message: Successfully Vertically Scaled ConfigServer Resources Observed Generation: 1 Reason: UpdateConfigServerResources Status: True Type: UpdateConfigServerResources - Last Transition Time: 2021-03-02T17:16:33Z - Message: Successfully Vertically Scaled Shard Resources - Observed Generation: 1 - Reason: UpdateShardResources - Status: True - Type: UpdateShardResources - Last Transition Time: 2021-03-02T17:17:44Z + Last Transition Time: 2022-10-26T10:50:07Z Message: Successfully Vertically Scaled Mongos Resources Observed Generation: 1 Reason: UpdateMongosResources Status: True Type: UpdateMongosResources - Last Transition Time: 2021-03-02T17:17:44Z + Last Transition Time: 2022-10-26T10:52:28Z + Message: Successfully Vertically Scaled Shard Resources + Observed Generation: 1 + Reason: UpdateShardResources + Status: True + Type: UpdateShardResources + Last Transition Time: 2022-10-26T10:52:28Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -364,26 +363,26 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal UpdateStatefulSetResources 7m9s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal PauseDatabase 7m9s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-sharding - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-mongos - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-configsvr - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-shard0 - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-shard1 - Normal UpdateStatefulSetResources 7m9s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-mongos - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-configsvr - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-shard0 - Normal Starting 7m9s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-sharding-shard1 - Normal PauseDatabase 7m9s KubeDB Enterprise Operator Pausing MongoDB demo/mg-sharding - Normal UpdateConfigServerResources 5m13s KubeDB Enterprise Operator Successfully Vertically Scaled ConfigServer Resources - Normal UpdateShardResources 79s KubeDB Enterprise Operator Successfully Vertically Scaled Shard Resources - Normal UpdateMongosResources 8s KubeDB Enterprise Operator Successfully Vertically Scaled Mongos Resources - Normal ResumeDatabase 8s KubeDB Enterprise Operator Resuming MongoDB demo/mg-sharding - Normal ResumeDatabase 8s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-sharding - Normal Successful 8s KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 4m51s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-sharding + Normal Starting 4m51s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sharding-configsvr + Normal UpdateConfigServerResources 4m51s KubeDB Ops-manager Operator Successfully updated configServer Resources + Normal Starting 4m51s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sharding-configsvr + Normal UpdateConfigServerResources 4m51s KubeDB Ops-manager Operator Successfully updated configServer Resources + Normal PauseDatabase 4m51s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-sharding + Normal UpdateConfigServerResources 3m20s KubeDB Ops-manager Operator Successfully Vertically Scaled ConfigServer Resources + Normal Starting 3m20s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sharding-mongos + Normal UpdateMongosResources 3m20s KubeDB Ops-manager Operator Successfully updated Mongos Resources + Normal UpdateShardResources 2m50s KubeDB Ops-manager Operator Successfully updated Shard Resources + Normal Starting 2m50s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sharding-shard0 + Normal Starting 2m50s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-sharding-shard1 + Normal UpdateMongosResources 2m50s KubeDB Ops-manager Operator Successfully Vertically Scaled Mongos Resources + Normal UpdateShardResources 29s KubeDB Ops-manager Operator Successfully Vertically Scaled Shard Resources + Normal ResumeDatabase 29s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 29s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-sharding + Normal Successful 29s KubeDB Ops-manager Operator Successfully Vertically Scaled Database + Normal UpdateShardResources 28s KubeDB Ops-manager Operator Successfully Vertically Scaled Shard Resources ``` Now, we are going to verify from one of the Pod yaml whether the resources of the shard nodes has updated to meet up the desired state, Let's check, diff --git a/docs/guides/mongodb/scaling/vertical-scaling/standalone.md b/docs/guides/mongodb/scaling/vertical-scaling/standalone.md index efcdc6f7e7..6a36df526e 100644 --- a/docs/guides/mongodb/scaling/vertical-scaling/standalone.md +++ b/docs/guides/mongodb/scaling/vertical-scaling/standalone.md @@ -16,13 +16,13 @@ section_menu_id: guides # Vertical Scale MongoDB Standalone -This guide will show you how to use `KubeDB` Enterprise operator to update the resources of a MongoDB standalone database. +This guide will show you how to use `KubeDB` Ops-manager operator to update the resources of a MongoDB standalone database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -129,6 +129,11 @@ spec: limits: memory: "2Gi" cpu: "1" + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -136,6 +141,7 @@ Here, - `spec.databaseRef.name` specifies that we are performing vertical scaling operation on `mops-vscale-standalone` database. - `spec.type` specifies that we are performing `VerticalScaling` on our database. - `spec.VerticalScaling.standalone` specifies the desired resources after scaling. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -146,7 +152,7 @@ mongodbopsrequest.ops.kubedb.com/mops-vscale-standalone created #### Verify MongoDB Standalone resources updated successfully -If everything goes well, `KubeDB` Enterprise operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the resources of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -168,7 +174,7 @@ Annotations: API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2021-03-02T17:19:38Z + Creation Timestamp: 2022-10-26T10:54:01Z Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 @@ -180,9 +186,13 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:databaseRef: + f:readinessCriteria: .: - f:name: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: f:verticalScaling: .: @@ -198,7 +208,7 @@ Metadata: f:memory: Manager: kubectl-client-side-apply Operation: Update - Time: 2021-03-02T17:19:38Z + Time: 2022-10-26T10:54:01Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: @@ -207,16 +217,21 @@ Metadata: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise + Manager: kubedb-ops-manager Operation: Update - Time: 2021-03-02T17:19:38Z - Resource Version: 158587 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-vscale-standalone - UID: 364672b6-31b7-4fbe-878d-3de6c05161c9 + Subresource: status + Time: 2022-10-26T10:54:52Z + Resource Version: 613933 + UID: c3bf9c3d-cf96-49ae-877f-a895e0b1d280 Spec: + Apply: IfReady Database Ref: Name: mg-standalone - Type: VerticalScaling + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: VerticalScaling Vertical Scaling: Standalone: Limits: @@ -227,25 +242,19 @@ Spec: Memory: 2Gi Status: Conditions: - Last Transition Time: 2021-03-02T17:19:38Z + Last Transition Time: 2022-10-26T10:54:21Z Message: MongoDB ops request is vertically scaling database Observed Generation: 1 Reason: VerticalScaling Status: True Type: VerticalScaling - Last Transition Time: 2021-03-02T17:19:39Z - Message: Successfully updated StatefulSets Resources - Observed Generation: 1 - Reason: UpdateStatefulSetResources - Status: True - Type: UpdateStatefulSetResources - Last Transition Time: 2021-03-02T17:20:15Z + Last Transition Time: 2022-10-26T10:54:51Z Message: Successfully Vertically Scaled Standalone Resources Observed Generation: 1 Reason: UpdateStandaloneResources Status: True Type: UpdateStandaloneResources - Last Transition Time: 2021-03-02T17:20:15Z + Last Transition Time: 2022-10-26T10:54:52Z Message: Successfully Vertically Scaled Database Observed Generation: 1 Reason: Successful @@ -254,16 +263,20 @@ Status: Observed Generation: 1 Phase: Successful Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal PauseDatabase 43s KubeDB Enterprise Operator Pausing MongoDB demo/mg-standalone - Normal PauseDatabase 42s KubeDB Enterprise Operator Successfully paused MongoDB demo/mg-standalone - Normal Starting 42s KubeDB Enterprise Operator Updating Resources of StatefulSet: mg-standalone - Normal UpdateStatefulSetResources 42s KubeDB Enterprise Operator Successfully updated StatefulSets Resources - Normal UpdateStandaloneResources 6s KubeDB Enterprise Operator Successfully Vertically Scaled Standalone Resources - Normal ResumeDatabase 6s KubeDB Enterprise Operator Resuming MongoDB demo/mg-standalone - Normal ResumeDatabase 6s KubeDB Enterprise Operator Successfully resumed MongoDB demo/mg-standalone - Normal Successful 6s KubeDB Enterprise Operator Successfully Vertically Scaled Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 34s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 34s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-standalone + Normal Starting 34s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-standalone + Normal UpdateStandaloneResources 34s KubeDB Ops-manager Operator Successfully updated standalone Resources + Normal Starting 34s KubeDB Ops-manager Operator Updating Resources of StatefulSet: mg-standalone + Normal UpdateStandaloneResources 34s KubeDB Ops-manager Operator Successfully updated standalone Resources + Normal UpdateStandaloneResources 4s KubeDB Ops-manager Operator Successfully Vertically Scaled Standalone Resources + Normal UpdateStandaloneResources 4s KubeDB Ops-manager Operator Successfully Vertically Scaled Standalone Resources + Normal ResumeDatabase 4s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 3s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-standalone + Normal Successful 3s KubeDB Ops-manager Operator Successfully Vertically Scaled Database + ``` Now, we are going to verify from the Pod yaml whether the resources of the standalone database has updated to meet up the desired state, Let's check, diff --git a/docs/guides/mongodb/schema-manager/deploy-mongodbdatabase/index.md b/docs/guides/mongodb/schema-manager/deploy-mongodbdatabase/index.md index 8a9ec26f9b..72f212be08 100644 --- a/docs/guides/mongodb/schema-manager/deploy-mongodbdatabase/index.md +++ b/docs/guides/mongodb/schema-manager/deploy-mongodbdatabase/index.md @@ -22,8 +22,8 @@ This guide will show you how to create database with MongoDB Schema Manager usin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB Enterprise Operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). -- Install `KubeVault Enterprise Operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). +- Install `KubeDB Ops-manager operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). +- Install `KubeVault Ops-manager operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). - You should be familiar with the following concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) diff --git a/docs/guides/mongodb/schema-manager/initializing-with-script/index.md b/docs/guides/mongodb/schema-manager/initializing-with-script/index.md index 26a5a1ab00..8051326353 100644 --- a/docs/guides/mongodb/schema-manager/initializing-with-script/index.md +++ b/docs/guides/mongodb/schema-manager/initializing-with-script/index.md @@ -22,8 +22,8 @@ This guide will show you how to to create database and initialize script with Mo - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB Enterprise Operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). -- Install `KubeVault Enterprise Operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). +- Install `KubeDB Ops-manager operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). +- Install `KubeVault Ops-manager operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). - You should be familiar with the following concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) diff --git a/docs/guides/mongodb/schema-manager/initializing-with-snapshot/index.md b/docs/guides/mongodb/schema-manager/initializing-with-snapshot/index.md index 27ab80aa54..a4a9645e62 100644 --- a/docs/guides/mongodb/schema-manager/initializing-with-snapshot/index.md +++ b/docs/guides/mongodb/schema-manager/initializing-with-snapshot/index.md @@ -22,8 +22,8 @@ This guide will show you how to create database and initialize snapshot with Mon - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB Enterprise Operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). -- Install `KubeVault Enterprise Operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). +- Install `KubeDB Ops-manager operator` in your cluster following the steps [here](https://kubedb.com/docs/latest/setup/install/enterprise/). +- Install `KubeVault Ops-manager operator` in your cluster following the steps [here](https://kubevault.com/docs/latest/setup/install/enterprise/). - You should be familiar with the following concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) diff --git a/docs/guides/mongodb/tls/overview.md b/docs/guides/mongodb/tls/overview.md index dc0951c0b1..b84b34d4b1 100644 --- a/docs/guides/mongodb/tls/overview.md +++ b/docs/guides/mongodb/tls/overview.md @@ -53,11 +53,11 @@ Deploying MongoDB with TLS/SSL configuration process consists of the following s 2. Then the user creates a `MongoDB` cr which refers to the `Issuer/ClusterIssuer` cr that the user created in the previous step. -3. `KubeDB` Community operator watches for the `MongoDB` cr. +3. `KubeDB` Provisioner operator watches for the `MongoDB` cr. 4. When it finds one, it creates `Secret`, `Service`, etc. for the `MongoDB` database. -5. `KubeDB` Enterprise operator watches for `MongoDB`(5c), `Issuer/ClusterIssuer`(5b), `Secret` and `Service`(5a). +5. `KubeDB` Ops-manager operator watches for `MongoDB`(5c), `Issuer/ClusterIssuer`(5b), `Secret` and `Service`(5a). 6. When it finds all the resources(`MongoDB`, `Issuer/ClusterIssuer`, `Secret`, `Service`), it creates `Certificates` by using `tls.issuerRef` and `tls.certificates` field specification from `MongoDB` cr. @@ -65,7 +65,7 @@ Deploying MongoDB with TLS/SSL configuration process consists of the following s 8. When it finds one, it creates certificate secrets `tls-secrets`(server, client, exporter secrets etc.) that holds the actual certificate signed by the CA. -9. `KubeDB` Community operator watches for the Certificate secrets `tls-secrets`. +9. `KubeDB` Provisioner operator watches for the Certificate secrets `tls-secrets`. 10. When it finds all the tls-secret, it creates the related `StatefulSets` so that MongoDB database can be configured with TLS/SSL. diff --git a/docs/guides/mongodb/upgrading/overview.md b/docs/guides/mongodb/upgrading/overview.md index 5b91ff7bfa..9b77d071c6 100644 --- a/docs/guides/mongodb/upgrading/overview.md +++ b/docs/guides/mongodb/upgrading/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # Upgrading MongoDB version Overview -This guide will give you an overview on how KubeDB Enterprise operator upgrade the version of `MongoDB` database. +This guide will give you an overview on how KubeDB Ops-manager operator upgrade the version of `MongoDB` database. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give you an overview on how KubeDB Enterprise operator upgrade t ## How Upgrade Process Works -The following diagram shows how KubeDB Enterprise operator used to upgrade the version of `MongoDB`. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator used to upgrade the version of `MongoDB`. Open the image in a new tab to see the enlarged version.
  Upgrading Process of MongoDB @@ -37,20 +37,20 @@ The upgrading process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. 4. Then, in order to upgrade the version of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with the desired version. -5. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +5. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the upgrading process. +6. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the upgrading process. -7. By looking at the target version from `MongoDBOpsRequest` CR, `KubeDB` Enterprise operator updates the images of all the `StatefulSets`. After each image update, the operator performs some checks such as if the oplog is synced and database size is almost same or not. +7. By looking at the target version from `MongoDBOpsRequest` CR, `KubeDB` Ops-manager operator updates the images of all the `StatefulSets`. After each image update, the operator performs some checks such as if the oplog is synced and database size is almost same or not. -8. After successfully updating the `StatefulSets` and their `Pods` images, the `KubeDB` Enterprise operator updates the image of the `MongoDB` object to reflect the updated state of the database. +8. After successfully updating the `StatefulSets` and their `Pods` images, the `KubeDB` Ops-manager operator updates the image of the `MongoDB` object to reflect the updated state of the database. -9. After successfully updating of `MongoDB` object, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator can resume its usual operations. +9. After successfully updating of `MongoDB` object, the `KubeDB` Ops-manager operator resumes the `MongoDB` object so that the `KubeDB` Provisioner operator can resume its usual operations. In the next doc, we are going to show a step by step guide on upgrading of a MongoDB database using upgrade operation. \ No newline at end of file diff --git a/docs/guides/mongodb/upgrading/replicaset.md b/docs/guides/mongodb/upgrading/replicaset.md index bf16f8006e..b25dc88dcf 100644 --- a/docs/guides/mongodb/upgrading/replicaset.md +++ b/docs/guides/mongodb/upgrading/replicaset.md @@ -16,13 +16,13 @@ section_menu_id: guides # Upgrade version of MongoDB ReplicaSet -This guide will show you how to use `KubeDB` Enterprise operator to upgrade the version of `MongoDB` ReplicaSet. +This guide will show you how to use `KubeDB` Ops-manager operator to upgrade the version of `MongoDB` ReplicaSet. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -105,6 +105,11 @@ spec: name: mg-replicaset upgrade: targetVersion: 4.0.5-v3 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -112,6 +117,7 @@ Here, - `spec.databaseRef.name` specifies that we are performing operation on `mg-replicaset` MongoDB database. - `spec.type` specifies that we are going to perform `Upgrade` on our database. - `spec.upgrade.targetVersion` specifies the expected version of the database `4.0.5`. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -122,128 +128,118 @@ mongodbopsrequest.ops.kubedb.com/mops-replicaset-upgrade created #### Verify MongoDB version upgraded successfully -If everything goes well, `KubeDB` Enterprise operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, ```bash $ kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo -NAME TYPE STATUS AGE -mops-replicaset-upgrade Upgrade Successful 84s +NAME TYPE STATUS AGE +mops-replicaset-upgrade UpdateVersion Successful 84s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to upgrade the database. ```bash $ kubectl describe mongodbopsrequest -n demo mops-replicaset-upgrade - Name: mops-replicaset-upgrade - Namespace: demo - Labels: - Annotations: API Version: ops.kubedb.com/v1alpha1 - Kind: MongoDBOpsRequest - Metadata: - Creation Timestamp: 2020-08-24T14:56:39Z - Finalizers: - kubedb.com - Generation: 1 - Managed Fields: - API Version: ops.kubedb.com/v1alpha1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:annotations: - .: - f:kubectl.kubernetes.io/last-applied-configuration: - f:spec: +Name: mops-replicaset-upgrade +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MongoDBOpsRequest +Metadata: + Creation Timestamp: 2022-10-26T10:19:55Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: .: - f:databaseRef: - .: - f:name: - f:type: - f:upgrade: - .: - f:targetVersion: - Manager: kubectl - Operation: Update - Time: 2020-08-24T14:56:39Z - API Version: ops.kubedb.com/v1alpha1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:finalizers: - f:status: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:readinessCriteria: .: - f:conditions: - f:observedGeneration: - f:phase: - Manager: kubedb-enterprise - Operation: Update - Time: 2020-08-24T14:57:14Z - Resource Version: 4812837 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-replicaset-upgrade - UID: 99fc9dd2-11f7-44d6-9432-e93b4028ef7b - Spec: - Database Ref: - Name: mg-replicaset - Type: Upgrade - Upgrade: - Target Version: 4.0.5-v3 - Status: - Conditions: - Last Transition Time: 2020-08-24T14:56:39Z - Message: MongoDB ops request is starting to process - Observed Generation: 1 - Reason: UpgradingVersion - Status: True - Type: UpgradingVersion - Last Transition Time: 2020-08-24T14:56:39Z - Message: Successfully halted mongodb: mg-replicaset - Observed Generation: 1 - Reason: HaltDatabase - Status: True - Type: HaltDatabase - Last Transition Time: 2020-08-24T14:56:39Z - Message: Successfully updated statefulsets update strategy type - Observed Generation: 1 - Reason: UpdateStatefulSets - Status: True - Type: UpdateStatefulSets - Last Transition Time: 2020-08-24T14:57:14Z - Message: Successfully updated ReplicaSet images - Observed Generation: 1 - Reason: UpdateReplicaSetImage - Status: True - Type: UpdateReplicaSetImage - Last Transition Time: 2020-08-24T14:57:14Z - Message: Succefully Resumed mongodb: mg-replicaset - Observed Generation: 1 - Reason: ResumeDatabase - Status: True - Type: ResumeDatabase - Last Transition Time: 2020-08-24T14:57:14Z - Message: Successfully completed the modification process. - Observed Generation: 1 - Reason: Successful - Status: True - Type: Successful - Observed Generation: 1 - Phase: Successful - Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal HaltDatabase 2m26s KubeDB Enterprise Operator Pausing Mongodb mg-replicaset in Namespace demo - Normal HaltDatabase 2m26s KubeDB Enterprise Operator Successfully Halted Mongodb mg-replicaset in Namespace demo - Normal Updating 2m26s KubeDB Enterprise Operator Updating StatefulSets - Normal Updating 2m26s KubeDB Enterprise Operator Successfully Updated StatefulSets - Normal UpdateReplicaSetImage 2m26s KubeDB Enterprise Operator Updating ReplicaSet Images - Normal UpdateReplicaSetImage 2m11s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-replicaset-1 - Normal UpdateReplicaSetImage 2m6s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-replicaset-2 - Normal UpdateReplicaSetImage 111s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-replicaset-0 - Normal UpdateReplicaSetImage 111s KubeDB Enterprise Operator Successfully Updated ReplicaSet Images - Normal ResumeDatabase 111s KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 111s KubeDB Enterprise Operator Successfully Started Balancer - Normal Successful 111s KubeDB Enterprise Operator Successfully Updated Database + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: + f:type: + f:upgrade: + .: + f:targetVersion: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2022-10-26T10:19:55Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2022-10-26T10:23:09Z + Resource Version: 607814 + UID: 38053605-47bd-4d94-9f53-ce9474ad0a98 +Spec: + Apply: IfReady + Database Ref: + Name: mg-replicaset + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: UpdateVersion + Upgrade: + Target Version: 4.0.5-v3 +Status: + Conditions: + Last Transition Time: 2022-10-26T10:21:20Z + Message: MongoDB ops request is upgrading database version + Observed Generation: 1 + Reason: UpgradeVersion + Status: True + Type: UpgradeVersion + Last Transition Time: 2022-10-26T10:21:39Z + Message: Successfully updated statefulsets update strategy type + Observed Generation: 1 + Reason: UpdateStatefulSets + Status: True + Type: UpdateStatefulSets + Last Transition Time: 2022-10-26T10:23:09Z + Message: Successfully Updated Standalone Image + Observed Generation: 1 + Reason: UpdateStandaloneImage + Status: True + Type: UpdateStandaloneImage + Last Transition Time: 2022-10-26T10:23:09Z + Message: Successfully completed the modification process. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 2m27s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-replicaset + Normal PauseDatabase 2m27s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-replicaset + Normal Updating 2m27s KubeDB Ops-manager Operator Updating StatefulSets + Normal Updating 2m8s KubeDB Ops-manager Operator Successfully Updated StatefulSets + Normal UpdateStandaloneImage 38s KubeDB Ops-manager Operator Successfully Updated Standalone Image + Normal ResumeDatabase 38s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-replicaset + Normal ResumeDatabase 38s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-replicaset + Normal Successful 38s KubeDB Ops-manager Operator Successfully Updated Database ``` Now, we are going to verify whether the `MongoDB` and the related `StatefulSets` and their `Pods` have the new version image. Let's check, @@ -253,10 +249,10 @@ $ kubectl get mg -n demo mg-replicaset -o=jsonpath='{.spec.version}{"\n"}' 4.0.5-v3 $ kubectl get sts -n demo mg-replicaset -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get pods -n demo mg-replicaset-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 ``` You can see from above, our `MongoDB` replicaset database has been updated with the new version. So, the upgrade process is successfully completed. diff --git a/docs/guides/mongodb/upgrading/sharding.md b/docs/guides/mongodb/upgrading/sharding.md index 30e6df6471..070bd2bc3a 100644 --- a/docs/guides/mongodb/upgrading/sharding.md +++ b/docs/guides/mongodb/upgrading/sharding.md @@ -16,13 +16,13 @@ section_menu_id: guides # Upgrade version of MongoDB Sharded Database -This guide will show you how to use `KubeDB` Enterprise operator to upgrade the version of `MongoDB` Sharded Database. +This guide will show you how to use `KubeDB` Ops-manager operator to upgrade the version of `MongoDB` Sharded Database. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -112,6 +112,11 @@ spec: name: mg-sharding upgrade: targetVersion: 4.0.5-v3 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -119,6 +124,7 @@ Here, - `spec.databaseRef.name` specifies that we are performing operation on `mg-sharding` MongoDB database. - `spec.type` specifies that we are going to perform `Upgrade` on our database. - `spec.upgrade.targetVersion` specifies the expected version of the database `4.0.5`. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -129,15 +135,15 @@ mongodbopsrequest.ops.kubedb.com/mops-shard-upgrade created #### Verify MongoDB version upgraded successfully -If everything goes well, `KubeDB` Enterprise operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, ```bash $ kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo -NAME TYPE STATUS AGE -mops-shard-upgrade Upgrade Successful 2m31s +NAME TYPE STATUS AGE +mops-shard-upgrade UpdateVersion Successful 2m31s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to upgrade the database. @@ -148,13 +154,12 @@ $ kubectl describe mongodbopsrequest -n demo mops-shard-upgrade Name: mops-shard-upgrade Namespace: demo Labels: -Annotations: API Version: ops.kubedb.com/v1alpha1 +Annotations: +API Version: ops.kubedb.com/v1alpha1 Kind: MongoDBOpsRequest Metadata: - Creation Timestamp: 2020-08-24T15:17:47Z - Finalizers: - kubedb.com - Generation: 1 + Creation Timestamp: 2022-10-26T10:27:24Z + Generation: 1 Managed Fields: API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 @@ -165,132 +170,116 @@ Metadata: f:kubectl.kubernetes.io/last-applied-configuration: f:spec: .: + f:apply: f:databaseRef: + f:readinessCriteria: .: - f:name: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: f:type: f:upgrade: .: f:targetVersion: - Manager: kubectl + Manager: kubectl-client-side-apply Operation: Update - Time: 2020-08-24T15:17:47Z + Time: 2022-10-26T10:27:24Z API Version: ops.kubedb.com/v1alpha1 Fields Type: FieldsV1 fieldsV1: - f:metadata: - f:finalizers: f:status: .: f:conditions: f:observedGeneration: f:phase: - Manager: kubedb-enterprise + Manager: kubedb-ops-manager Operation: Update - Time: 2020-08-24T15:19:51Z - Resource Version: 4830892 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-shard-upgrade - UID: 9683d8ed-35fa-4782-990d-0fb64160cd4a + Subresource: status + Time: 2022-10-26T10:36:12Z + Resource Version: 610193 + UID: 6459a314-c759-4002-9dff-106b836c4db0 Spec: + Apply: IfReady Database Ref: Name: mg-sharding - Type: Upgrade + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: UpdateVersion Upgrade: Target Version: 4.0.5-v3 Status: Conditions: - Last Transition Time: 2020-08-24T15:17:47Z - Message: MongoDB ops request is starting to process - Observed Generation: 1 - Reason: UpgradingVersion - Status: True - Type: UpgradingVersion - Last Transition Time: 2020-08-24T15:17:48Z - Message: Successfully halted mongodb: mg-sharding + Last Transition Time: 2022-10-26T10:36:12Z + Message: connection() error occurred during connection handshake: dial tcp 10.244.0.125:27017: i/o timeout Observed Generation: 1 - Reason: HaltDatabase - Status: True - Type: HaltDatabase - Last Transition Time: 2020-08-24T15:17:50Z - Message: Succesfully stopped mongodb load balancer + Reason: Failed + Status: False + Type: UpgradeVersion + Last Transition Time: 2022-10-26T10:29:29Z + Message: Successfully stopped mongodb load balancer Observed Generation: 1 Reason: StoppingBalancer Status: True Type: StoppingBalancer - Last Transition Time: 2020-08-24T15:17:50Z + Last Transition Time: 2022-10-26T10:30:54Z Message: Successfully updated statefulsets update strategy type Observed Generation: 1 Reason: UpdateStatefulSets Status: True Type: UpdateStatefulSets - Last Transition Time: 2020-08-24T15:18:15Z - Message: Successfully updated ConfigServer images + Last Transition Time: 2022-10-26T10:32:00Z + Message: Successfully Updated ConfigServer Image Observed Generation: 1 Reason: UpdateConfigServerImage Status: True Type: UpdateConfigServerImage - Last Transition Time: 2020-08-24T15:19:25Z - Message: Successfully updated Shard images + Last Transition Time: 2022-10-26T10:35:32Z + Message: Successfully Updated Shard Image Observed Generation: 1 Reason: UpdateShardImage Status: True Type: UpdateShardImage - Last Transition Time: 2020-08-24T15:19:50Z - Message: Successfully updated Mongos images + Last Transition Time: 2022-10-26T10:36:07Z + Message: Successfully Updated Mongos Image Observed Generation: 1 Reason: UpdateMongosImage Status: True Type: UpdateMongosImage - Last Transition Time: 2020-08-24T15:19:51Z + Last Transition Time: 2022-10-26T10:36:07Z Message: Successfully Started mongodb load balancer Observed Generation: 1 Reason: StartingBalancer Status: True Type: StartingBalancer - Last Transition Time: 2020-08-24T15:19:51Z - Message: Succefully Resumed mongodb: mg-sharding - Observed Generation: 1 - Reason: ResumeDatabase - Status: True - Type: ResumeDatabase - Last Transition Time: 2020-08-24T15:19:51Z + Last Transition Time: 2022-10-26T10:36:07Z Message: Successfully completed the modification process. Observed Generation: 1 Reason: Successful Status: True Type: Successful Observed Generation: 1 - Phase: Successful + Phase: Failed Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal HaltDatabase 3m23s KubeDB Enterprise Operator Pausing Mongodb mg-sharding in Namespace demo - Normal HaltDatabase 3m23s KubeDB Enterprise Operator Successfully Halted Mongodb mg-sharding in Namespace demo - Normal StoppingBalancer 3m23s KubeDB Enterprise Operator Stopping Balancer - Normal StoppingBalancer 3m21s KubeDB Enterprise Operator Successfully Stopped Balancer - Normal Updating 3m21s KubeDB Enterprise Operator Updating StatefulSets - Normal Updating 3m21s KubeDB Enterprise Operator Successfully Updated StatefulSets - Normal UpdateConfigServerImage 3m21s KubeDB Enterprise Operator Updating ConfigServer Images - Normal UpdateConfigServerImage 3m11s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-sharding-configsvr-1 - Normal UpdateConfigServerImage 2m56s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-configsvr-0 - Normal UpdateConfigServerImage 2m56s KubeDB Enterprise Operator Successfully Updated ConfigServer Images - Normal UpdateShardImage 2m56s KubeDB Enterprise Operator Updating Shard Images - Normal UpdateShardImage 2m36s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-sharding-shard0-1 - Normal UpdateShardImage 2m21s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-shard0-0 - Normal UpdateShardImage 2m16s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-sharding-shard1-1 - Normal UpdateShardImage 2m6s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-shard1-0 - Normal UpdateShardImage 116s KubeDB Enterprise Operator Successfully Updated Images of Pod mg-sharding-shard2-1 - Normal UpdateShardImage 106s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-shard2-0 - Normal UpdateShardImage 106s KubeDB Enterprise Operator Successfully Updated Shard Images - Normal UpdateMongosImage 106s KubeDB Enterprise Operator Updating Mongos Images - Normal UpdateMongosImage 86s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-mongos-0 - Normal UpdateMongosImage 81s KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-sharding-mongos-1 - Normal UpdateMongosImage 81s KubeDB Enterprise Operator Successfully Updated Mongos Images - Normal Updating 81s KubeDB Enterprise Operator Starting Balancer - Normal StartingBalancer 80s KubeDB Enterprise Operator Successfully Started Balancer - Normal ResumeDatabase 80s KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 80s KubeDB Enterprise Operator Successfully Started Balancer - Normal Successful 80s KubeDB Enterprise Operator Successfully Updated Database + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 8m27s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-sharding + Normal PauseDatabase 8m27s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-sharding + Normal StoppingBalancer 8m27s KubeDB Ops-manager Operator Stopping Balancer + Normal StoppingBalancer 8m27s KubeDB Ops-manager Operator Successfully Stopped Balancer + Normal Updating 8m27s KubeDB Ops-manager Operator Updating StatefulSets + Normal Updating 7m2s KubeDB Ops-manager Operator Successfully Updated StatefulSets + Normal Updating 7m2s KubeDB Ops-manager Operator Updating StatefulSets + Normal UpdateConfigServerImage 5m56s KubeDB Ops-manager Operator Successfully Updated ConfigServer Image + Normal Updating 5m45s KubeDB Ops-manager Operator Successfully Updated StatefulSets + Normal UpdateShardImage 2m24s KubeDB Ops-manager Operator Successfully Updated Shard Image + Normal UpdateMongosImage 109s KubeDB Ops-manager Operator Successfully Updated Mongos Image + Normal Updating 109s KubeDB Ops-manager Operator Starting Balancer + Normal StartingBalancer 109s KubeDB Ops-manager Operator Successfully Started Balancer + Normal ResumeDatabase 109s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-sharding + Normal ResumeDatabase 109s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-sharding + Normal Successful 109s KubeDB Ops-manager Operator Successfully Updated Database ``` Now, we are going to verify whether the `MongoDB` and the related `StatefulSets` of `Mongos`, `Shard` and `ConfigeServer` and their `Pods` have the new version image. Let's check, @@ -300,22 +289,22 @@ $ kubectl get mg -n demo mg-sharding -o=jsonpath='{.spec.version}{"\n"}' 4.0.5-v3 $ kubectl get sts -n demo mg-sharding-configsvr -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get sts -n demo mg-sharding-shard0 -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get sts -n demo mg-sharding-mongos -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get pods -n demo mg-sharding-configsvr-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get pods -n demo mg-sharding-shard0-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get pods -n demo mg-sharding-mongos-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 ``` You can see from above, our `MongoDB` sharded database has been updated with the new version. So, the upgrade process is successfully completed. diff --git a/docs/guides/mongodb/upgrading/standalone.md b/docs/guides/mongodb/upgrading/standalone.md index ef1cd4cee5..c79c621ad1 100644 --- a/docs/guides/mongodb/upgrading/standalone.md +++ b/docs/guides/mongodb/upgrading/standalone.md @@ -16,13 +16,13 @@ section_menu_id: guides # Upgrade version of MongoDB Standalone -This guide will show you how to use `KubeDB` Enterprise operator to upgrade the version of `MongoDB` standalone. +This guide will show you how to use `KubeDB` Ops-manager operator to upgrade the version of `MongoDB` standalone. ## Before You Begin - At first, you need to have a Kubernetes cluster, and the `kubectl` command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using [kind](https://kind.sigs.k8s.io/docs/user/quick-start/). -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -101,6 +101,11 @@ spec: name: mg-standalone upgrade: targetVersion: 4.0.5-v3 + readinessCriteria: + oplogMaxLagSeconds: 20 + objectsCountDiffPercentage: 10 + timeout: 5m + apply: IfReady ``` Here, @@ -108,6 +113,8 @@ Here, - `spec.databaseRef.name` specifies that we are performing operation on `mg-standalone` MongoDB database. - `spec.type` specifies that we are going to perform `Upgrade` on our database. - `spec.upgrade.targetVersion` specifies the expected version of the database `4.0.5`. +- Have a look [here](/docs/guides/mongodb/concepts/opsrequest.md#specreadinesscriteria) on the respective sections to understand the `readinessCriteria`, `timeout` & `apply` fields. + Let's create the `MongoDBOpsRequest` CR we have shown above, @@ -118,126 +125,119 @@ mongodbopsrequest.ops.kubedb.com/mops-upgrade created #### Verify MongoDB version upgraded successfully : -If everything goes well, `KubeDB` Enterprise operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. +If everything goes well, `KubeDB` Ops-manager operator will update the image of `MongoDB` object and related `StatefulSets` and `Pods`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, ```bash $ kubectl get mongodbopsrequest -n demo Every 2.0s: kubectl get mongodbopsrequest -n demo -NAME TYPE STATUS AGE -mops-upgrade Upgrade Successful 3m45s +NAME TYPE STATUS AGE +mops-upgrade UpdateVersion Successful 3m45s ``` We can see from the above output that the `MongoDBOpsRequest` has succeeded. If we describe the `MongoDBOpsRequest` we will get an overview of the steps that were followed to upgrade the database. ```bash $ kubectl describe mongodbopsrequest -n demo mops-upgrade - Name: mops-upgrade - Namespace: demo - Labels: - Annotations: API Version: ops.kubedb.com/v1alpha1 - Kind: MongoDBOpsRequest - Metadata: - Creation Timestamp: 2020-08-24T14:22:10Z - Finalizers: - kubedb.com - Generation: 1 - Managed Fields: - API Version: ops.kubedb.com/v1alpha1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:annotations: - .: - f:kubectl.kubernetes.io/last-applied-configuration: - f:spec: +Name: mops-upgrade +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MongoDBOpsRequest +Metadata: + Creation Timestamp: 2022-10-26T10:06:50Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:readinessCriteria: .: - f:databaseRef: - .: - f:name: - f:type: - f:upgrade: - .: - f:targetVersion: - Manager: kubectl - Operation: Update - Time: 2020-08-24T14:22:10Z - API Version: ops.kubedb.com/v1alpha1 - Fields Type: FieldsV1 - fieldsV1: - f:metadata: - f:finalizers: - f:status: + f:objectsCountDiffPercentage: + f:oplogMaxLagSeconds: + f:timeout: + f:type: + f:upgrade: .: - f:conditions: - f:observedGeneration: - f:phase: - Manager: kubedb-enterprise - Operation: Update - Time: 2020-08-24T14:22:26Z - Resource Version: 4786082 - Self Link: /apis/ops.kubedb.com/v1alpha1/namespaces/demo/mongodbopsrequests/mops-upgrade - UID: c5f35015-75b7-4843-8f05-9181d8bf14a5 - Spec: - Database Ref: - Name: mg-standalone - Type: Upgrade - Upgrade: - Target Version: 4.0.5-v3 - Status: - Conditions: - Last Transition Time: 2020-08-24T14:22:10Z - Message: MongoDB ops request is starting to process - Observed Generation: 1 - Reason: UpgradingVersion - Status: True - Type: UpgradingVersion - Last Transition Time: 2020-08-24T14:22:11Z - Message: Successfully halted mongodb: mg-standalone - Observed Generation: 1 - Reason: HaltDatabase - Status: True - Type: HaltDatabase - Last Transition Time: 2020-08-24T14:22:11Z - Message: Successfully updated statefulsets update strategy type - Observed Generation: 1 - Reason: UpdateStatefulSets - Status: True - Type: UpdateStatefulSets - Last Transition Time: 2020-08-24T14:22:26Z - Message: Successfully updated ReplicaSet images - Observed Generation: 1 - Reason: UpdateReplicaSetImage - Status: True - Type: UpdateReplicaSetImage - Last Transition Time: 2020-08-24T14:22:26Z - Message: Succefully Resumed mongodb: mg-standalone - Observed Generation: 1 - Reason: ResumeDatabase - Status: True - Type: ResumeDatabase - Last Transition Time: 2020-08-24T14:22:26Z - Message: Successfully completed the modification process. - Observed Generation: 1 - Reason: Successful - Status: True - Type: Successful - Observed Generation: 1 - Phase: Successful - Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal HaltDatabase 10m KubeDB Enterprise Operator Pausing Mongodb mg-standalone in Namespace demo - Normal HaltDatabase 10m KubeDB Enterprise Operator Successfully Halted Mongodb mg-standalone in Namespace demo - Normal Updating 10m KubeDB Enterprise Operator Updating StatefulSets - Normal Updating 10m KubeDB Enterprise Operator Successfully Updated StatefulSets - Normal UpdateReplicaSetImage 10m KubeDB Enterprise Operator Updating ReplicaSet Images - Normal UpdateReplicaSetImage 10m KubeDB Enterprise Operator Successfully Updated Images of Pod (master): mg-standalone-0 - Normal UpdateReplicaSetImage 10m KubeDB Enterprise Operator Successfully Updated ReplicaSet Images - Normal ResumeDatabase 10m KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 10m KubeDB Enterprise Operator Successfully Started Balancer - Normal Successful 10m KubeDB Enterprise Operator Successfully Updated Database + f:targetVersion: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2022-10-26T10:06:50Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2022-10-26T10:08:25Z + Resource Version: 605817 + UID: 79faadf6-7af9-4b74-9907-febe7d543386 +Spec: + Apply: IfReady + Database Ref: + Name: mg-standalone + Readiness Criteria: + Objects Count Diff Percentage: 10 + Oplog Max Lag Seconds: 20 + Timeout: 5m + Type: UpdateVersion + Upgrade: + Target Version: 4.0.5-v3 +Status: + Conditions: + Last Transition Time: 2022-10-26T10:07:10Z + Message: MongoDB ops request is upgrading database version + Observed Generation: 1 + Reason: UpgradeVersion + Status: True + Type: UpgradeVersion + Last Transition Time: 2022-10-26T10:07:30Z + Message: Successfully updated statefulsets update strategy type + Observed Generation: 1 + Reason: UpdateStatefulSets + Status: True + Type: UpdateStatefulSets + Last Transition Time: 2022-10-26T10:08:25Z + Message: Successfully Updated Standalone Image + Observed Generation: 1 + Reason: UpdateStandaloneImage + Status: True + Type: UpdateStandaloneImage + Last Transition Time: 2022-10-26T10:08:25Z + Message: Successfully completed the modification process. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal PauseDatabase 2m5s KubeDB Ops-manager Operator Pausing MongoDB demo/mg-standalone + Normal PauseDatabase 2m5s KubeDB Ops-manager Operator Successfully paused MongoDB demo/mg-standalone + Normal Updating 2m5s KubeDB Ops-manager Operator Updating StatefulSets + Normal Updating 105s KubeDB Ops-manager Operator Successfully Updated StatefulSets + Normal UpdateStandaloneImage 50s KubeDB Ops-manager Operator Successfully Updated Standalone Image + Normal ResumeDatabase 50s KubeDB Ops-manager Operator Resuming MongoDB demo/mg-standalone + Normal ResumeDatabase 50s KubeDB Ops-manager Operator Successfully resumed MongoDB demo/mg-standalone + Normal Successful 50s KubeDB Ops-manager Operator Successfully Updated Database + ``` Now, we are going to verify whether the `MongoDB` and the related `StatefulSets` their `Pods` have the new version image. Let's check, @@ -247,10 +247,10 @@ $ kubectl get mg -n demo mg-standalone -o=jsonpath='{.spec.version}{"\n"}' 4.0.5-v3 $ kubectl get sts -n demo mg-standalone -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 $ kubectl get pods -n demo mg-standalone-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' -kubedb/mongo:4.0.5-v3 +mongo:4.0.5 ``` You can see from above, our `MongoDB` standalone database has been updated with the new version. So, the upgrade process is successfully completed. diff --git a/docs/guides/mongodb/volume-expansion/overview.md b/docs/guides/mongodb/volume-expansion/overview.md index adf85aba61..1b9a26bbcc 100644 --- a/docs/guides/mongodb/volume-expansion/overview.md +++ b/docs/guides/mongodb/volume-expansion/overview.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Volume Expansion -This guide will give an overview on how KubeDB Enterprise operator expand the volume of various component of `MongoDB` such as ReplicaSet, Shard, ConfigServer, Mongos, etc. +This guide will give an overview on how KubeDB Ops-manager operator expand the volume of various component of `MongoDB` such as ReplicaSet, Shard, ConfigServer, Mongos, etc. ## Before You Begin @@ -26,7 +26,7 @@ This guide will give an overview on how KubeDB Enterprise operator expand the vo ## How Volume Expansion Process Works -The following diagram shows how KubeDB Enterprise operator expand the volumes of `MongoDB` database components. Open the image in a new tab to see the enlarged version. +The following diagram shows how KubeDB Ops-manager operator expand the volumes of `MongoDB` database components. Open the image in a new tab to see the enlarged version.
  Volume Expansion process of MongoDB @@ -37,22 +37,22 @@ The Volume Expansion process consists of the following steps: 1. At first, a user creates a `MongoDB` Custom Resource (CR). -2. `KubeDB` Community operator watches the `MongoDB` CR. +2. `KubeDB` Provisioner operator watches the `MongoDB` CR. 3. When the operator finds a `MongoDB` CR, it creates required number of `StatefulSets` and related necessary stuff like secrets, services, etc. -4. Each StatefulSet creates a Persistent Volume according to the Volume Claim Template provided in the statefulset configuration. This Persistent Volume will be expanded by the `KubeDB` Enterprise operator. +4. Each StatefulSet creates a Persistent Volume according to the Volume Claim Template provided in the statefulset configuration. This Persistent Volume will be expanded by the `KubeDB` Ops-manager operator. 5. Then, in order to expand the volume of the various components (ie. ReplicaSet, Shard, ConfigServer, Mongos, etc.) of the `MongoDB` database the user creates a `MongoDBOpsRequest` CR with desired information. -6. `KubeDB` Enterprise operator watches the `MongoDBOpsRequest` CR. +6. `KubeDB` Ops-manager operator watches the `MongoDBOpsRequest` CR. -7. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `MongoDB` object during the volume expansion process. +7. When it finds a `MongoDBOpsRequest` CR, it halts the `MongoDB` object which is referred from the `MongoDBOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MongoDB` object during the volume expansion process. -8. Then the `KubeDB` Enterprise operator will expand the persistent volume to reach the expected size defined in the `MongoDBOpsRequest` CR. +8. Then the `KubeDB` Ops-manager operator will expand the persistent volume to reach the expected size defined in the `MongoDBOpsRequest` CR. -9. After the successfully expansion of the volume of the related StatefulSet Pods, the `KubeDB` Enterprise operator updates the new volume size in the `MongoDB` object to reflect the updated state. +9. After the successfully expansion of the volume of the related StatefulSet Pods, the `KubeDB` Ops-manager operator updates the new volume size in the `MongoDB` object to reflect the updated state. -10. After the successful Volume Expansion of the `MongoDB` components, the `KubeDB` Enterprise operator resumes the `MongoDB` object so that the `KubeDB` Community operator resumes its usual operations. +10. After the successful Volume Expansion of the `MongoDB` components, the `KubeDB` Ops-manager operator resumes the `MongoDB` 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 Volume Expansion of various MongoDB database components using `MongoDBOpsRequest` CRD. diff --git a/docs/guides/mongodb/volume-expansion/replicaset.md b/docs/guides/mongodb/volume-expansion/replicaset.md index 464bb9672a..42078cb0c4 100644 --- a/docs/guides/mongodb/volume-expansion/replicaset.md +++ b/docs/guides/mongodb/volume-expansion/replicaset.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Replicaset Volume Expansion -This guide will show you how to use `KubeDB` Enterprise operator to expand the volume of a MongoDB Replicaset database. +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a MongoDB Replicaset database. ## Before You Begin @@ -24,7 +24,7 @@ This guide will show you how to use `KubeDB` Enterprise operator to expand the v - You must have a `StorageClass` that supports volume expansion. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -153,7 +153,7 @@ mongodbopsrequest.ops.kubedb.com/mops-volume-exp-replicaset created #### Verify MongoDB replicaset volume expanded successfully -If everything goes well, `KubeDB` Enterprise operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volumes`. +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volumes`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -218,10 +218,10 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal VolumeExpansion 3m11s KubeDB Enterprise Operator Successfully Updated Storage - Normal ResumeDatabase 3m11s KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 3m11s KubeDB Enterprise Operator Successfully Resumed mongodb - Normal Successful 3m11s KubeDB Enterprise Operator Successfully Scaled Database + Normal VolumeExpansion 3m11s KubeDB Ops-manager operator Successfully Updated Storage + Normal ResumeDatabase 3m11s KubeDB Ops-manager operator Resuming MongoDB + Normal ResumeDatabase 3m11s KubeDB Ops-manager operator Successfully Resumed mongodb + Normal Successful 3m11s KubeDB Ops-manager operator Successfully Scaled Database ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volumes` whether the volume of the database has expanded to meet the desired state, Let's check, diff --git a/docs/guides/mongodb/volume-expansion/sharding.md b/docs/guides/mongodb/volume-expansion/sharding.md index e6281de294..5a12b235b7 100644 --- a/docs/guides/mongodb/volume-expansion/sharding.md +++ b/docs/guides/mongodb/volume-expansion/sharding.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Sharded Database Volume Expansion -This guide will show you how to use `KubeDB` Enterprise operator to expand the volume of a MongoDB Sharded Database. +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a MongoDB Sharded Database. ## Before You Begin @@ -24,7 +24,7 @@ This guide will show you how to use `KubeDB` Enterprise operator to expand the v - You must have a `StorageClass` that supports volume expansion. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -171,7 +171,7 @@ mongodbopsrequest.ops.kubedb.com/mops-volume-exp-shard created #### Verify MongoDB shard volumes expanded successfully -If everything goes well, `KubeDB` Enterprise operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volumes`. +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volumes`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -242,11 +242,11 @@ Status: Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal ConfigServerVolumeExpansion 3m25s KubeDB Enterprise Operator Successfully Expanded Volume - Normal ShardVolumeExpansion 55s KubeDB Enterprise Operator Successfully Expanded Volume - Normal ResumeDatabase 50s KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 50s KubeDB Enterprise Operator Successfully Resumed mongodb - Normal Successful 50s KubeDB Enterprise Operator Successfully Expanded Volume + Normal ConfigServerVolumeExpansion 3m25s KubeDB Ops-manager operator Successfully Expanded Volume + Normal ShardVolumeExpansion 55s KubeDB Ops-manager operator Successfully Expanded Volume + Normal ResumeDatabase 50s KubeDB Ops-manager operator Resuming MongoDB + Normal ResumeDatabase 50s KubeDB Ops-manager operator Successfully Resumed mongodb + Normal Successful 50s KubeDB Ops-manager operator Successfully Expanded Volume ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volumes` whether the volume of the database has expanded to meet the desired state, Let's check, diff --git a/docs/guides/mongodb/volume-expansion/standalone.md b/docs/guides/mongodb/volume-expansion/standalone.md index b89c9adfb1..9c09475b32 100644 --- a/docs/guides/mongodb/volume-expansion/standalone.md +++ b/docs/guides/mongodb/volume-expansion/standalone.md @@ -16,7 +16,7 @@ section_menu_id: guides # MongoDB Standalone Volume Expansion -This guide will show you how to use `KubeDB` Enterprise operator to expand the volume of a MongoDB standalone database. +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a MongoDB standalone database. ## Before You Begin @@ -24,7 +24,7 @@ This guide will show you how to use `KubeDB` Enterprise operator to expand the v - You must have a `StorageClass` that supports volume expansion. -- Install `KubeDB` Community and Enterprise operator in your cluster following the steps [here](/docs/setup/README.md). +- Install `KubeDB` Provisioner and Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). - You should be familiar with the following `KubeDB` concepts: - [MongoDB](/docs/guides/mongodb/concepts/mongodb.md) @@ -147,7 +147,7 @@ mongodbopsrequest.ops.kubedb.com/mops-volume-exp-standalone created #### Verify MongoDB Standalone volume expanded successfully -If everything goes well, `KubeDB` Enterprise operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volume`. +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `MongoDB` object and related `StatefulSets` and `Persistent Volume`. Let's wait for `MongoDBOpsRequest` to be `Successful`. Run the following command to watch `MongoDBOpsRequest` CR, @@ -210,10 +210,10 @@ $ kubectl describe mongodbopsrequest -n demo mops-volume-exp-standalone Events: Type Reason Age From Message ---- ------ ---- ---- ------- - Normal VolumeExpansion 29s KubeDB Enterprise Operator Successfully Updated Storage - Normal ResumeDatabase 29s KubeDB Enterprise Operator Resuming MongoDB - Normal ResumeDatabase 29s KubeDB Enterprise Operator Successfully Resumed mongodb - Normal Successful 29s KubeDB Enterprise Operator Successfully Scaled Database + Normal VolumeExpansion 29s KubeDB Ops-manager operator Successfully Updated Storage + Normal ResumeDatabase 29s KubeDB Ops-manager operator Resuming MongoDB + Normal ResumeDatabase 29s KubeDB Ops-manager operator Successfully Resumed mongodb + Normal Successful 29s KubeDB Ops-manager operator Successfully Scaled Database ``` Now, we are going to verify from the `Statefulset`, and the `Persistent Volume` whether the volume of the standalone database has expanded to meet the desired state, Let's check, diff --git a/docs/images/mongodb/compute-process.png b/docs/images/mongodb/compute-process.png new file mode 100644 index 0000000000000000000000000000000000000000..630bbb84deb77b650369a0099faf94124b05d858 GIT binary patch literal 746128 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 z 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

VnLUd(|KZvy$4;tLL(c_x18{!cQ!B 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