From b4dde67f853a53164e9b96d3eb20393fdc0fde85 Mon Sep 17 00:00:00 2001 From: Ashraful Haque Tani <48568933+AshrafulHaqueToni@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:53:15 +0600 Subject: [PATCH] SingleStore Complete Docs (#663) * add concepts Signed-off-by: Ashraful Haque Tani --- .../compute/sdb-cluster-autoscaler.yaml | 21 + .../autoscaling/compute/sdb-compute.yaml | 52 ++ .../autoscaling/storage/sdb-compute.yaml | 52 ++ .../storage/sdb-storage-autoscaler.yaml | 15 + .../kubestash/application-level/index.md | 2 +- docs/guides/mysql/pitr/archiver.md | 4 +- .../mysql/pitr/yamls/mysqlarchiver.yaml | 4 +- .../kubestash/application-level/index.md | 2 +- .../mysqlgrp/examples/sample-proxysql-v1.yaml | 21 +- .../kubestash/application-level/index.md | 2 +- docs/guides/singlestore/README.md | 3 +- docs/guides/singlestore/_index.md | 2 +- docs/guides/singlestore/autoscaler/_index.md | 10 + .../singlestore/autoscaler/compute/_index.md | 10 + .../singlestore/autoscaler/compute/cluster.md | 538 +++++++++++++ .../autoscaler/compute/overview.md | 55 ++ .../singlestore/autoscaler/storage/_index.md | 10 + .../singlestore/autoscaler/storage/cluster.md | 476 ++++++++++++ .../autoscaler/storage/overview.md | 57 ++ docs/guides/singlestore/backup/_index.md | 2 +- .../kubestash/application-level/index.md | 18 +- docs/guides/singlestore/clustering/_index.md | 10 + .../overview/images/sdb-cluster-1.png | Bin 0 -> 456012 bytes .../overview/images/sdb-cluster-2.png | Bin 0 -> 22112 bytes .../overview/images/sdb-cluster.png | Bin 0 -> 72805 bytes .../singlestore/clustering/overview/index.md | 90 +++ .../examples/sample-sdb.yaml | 52 ++ .../singlestore-clustering/index.md | 458 +++++++++++ docs/guides/singlestore/concepts/_index.md | 10 + .../guides/singlestore/concepts/appbinding.md | 152 ++++ .../guides/singlestore/concepts/autoscaler.md | 152 ++++ docs/guides/singlestore/concepts/catalog.md | 105 +++ .../guides/singlestore/concepts/opsrequest.md | 475 ++++++++++++ .../singlestore/concepts/singlestore.md | 322 ++++++++ .../singlestore/configuration/_index.md | 10 + .../configuration/config-file/index.md | 247 ++++++ .../config-file/yamls/sdb-config.cnf | 3 + .../config-file/yamls/sdb-custom.yaml | 57 ++ .../configuration/podtemplating/index.md | 712 ++++++++++++++++++ .../podtemplating/yamls/nginx-config-map.yaml | 13 + .../yamls/sdb-custom-sidecar.yaml | 63 ++ .../podtemplating/yamls/sdb-misc-config.yaml | 57 ++ .../yamls/sdb-node-selector.yaml | 22 + .../yamls/sdb-with-tolerations.yaml | 25 + .../yamls/sdb-without-tolerations.yaml | 18 + .../singlestore/initialization/_index.md | 10 + .../using-script/example/demo-1.yaml | 56 ++ .../initialization/using-script/index.md | 406 ++++++++++ docs/guides/singlestore/monitoring/_index.md | 10 + .../images/sdb-builtin-prom-target.png | Bin 0 -> 76954 bytes .../monitoring/builtin-prometheus/index.md | 402 ++++++++++ .../yamls/builtin-prom-singlestore.yaml | 54 ++ .../builtin-prometheus/yamls/prom-config.yaml | 68 ++ .../images/database-monitoring-overview.svg | 1 + .../singlestore/monitoring/overview/index.md | 122 +++ .../images/prom-operator-sdb-target.png | Bin 0 -> 62157 bytes .../images/prometheus-operator.png | Bin 0 -> 186285 bytes .../monitoring/prometheus-operator/index.md | 361 +++++++++ .../yamls/prom-operator-singlestore.yaml | 59 ++ .../singlestore/quickstart/quickstart.md | 8 +- .../singlestore/reconfigure-tls/_index.md | 10 + .../cluster/examples/issuer.yaml | 8 + .../cluster/examples/sample-sdb.yaml | 51 ++ .../cluster/examples/sdbops-add-tls.yaml | 21 + .../cluster/examples/sdbops-remove-tls.yaml | 11 + .../cluster/examples/sdbops-rotate-tls.yaml | 11 + .../cluster/examples/sdbops-update-tls.yaml | 17 + .../reconfigure-tls/cluster/index.md | 657 ++++++++++++++++ .../overview/images/reconfigure-tls.svg | 99 +++ .../reconfigure-tls/overview/index.md | 54 ++ docs/guides/singlestore/reconfigure/_index.md | 10 + .../overview/images/sdb-reconfigure.svg | 99 +++ .../singlestore/reconfigure/overview/index.md | 54 ++ .../reconfigure/reconfigure-steps/index.md | 477 ++++++++++++ .../reconfigure-steps/yamls/custom-sdb.yaml | 56 ++ .../yamls/reconfigure-remove.yaml | 12 + .../yamls/reconfigure-using-applyConfig.yaml | 14 + docs/guides/singlestore/restart/_index.md | 10 + docs/guides/singlestore/restart/restart.md | 266 +++++++ .../restart/yamls/restart-ops.yaml | 11 + .../singlestore/restart/yamls/sdb-sample.yaml | 51 ++ docs/guides/singlestore/scaling/_index.md | 10 + .../scaling/horizontal-scaling/_index.md | 10 + .../cluster/example/sample-sdb.yaml | 52 ++ .../cluster/example/sdbops-downscale.yaml | 11 + .../cluster/example/sdbops-upscale.yaml | 11 + .../horizontal-scaling/cluster/index.md | 326 ++++++++ .../overview/images/horizontal-scaling.svg | 104 +++ .../horizontal-scaling/overview/index.md | 54 ++ .../scaling/vertical-scaling/_index.md | 10 + .../cluster/example/sample-sdb.yaml | 52 ++ .../cluster/example/sdbops-vscale.yaml | 18 + .../scaling/vertical-scaling/cluster/index.md | 226 ++++++ .../overview/images/vertical-sacling.svg | 109 +++ .../vertical-scaling/overview/index.md | 52 ++ docs/guides/singlestore/tls/_index.md | 10 + .../tls/configure/examples/issuer.yaml | 8 + .../tls/configure/examples/tls-cluster.yaml | 66 ++ .../guides/singlestore/tls/configure/index.md | 334 ++++++++ .../tls/overview/images/sdb-tls.svg | 116 +++ docs/guides/singlestore/tls/overview/index.md | 69 ++ .../singlestore/update-version/_index.md | 10 + .../overview/images/sdb-version-update.svg | 104 +++ .../update-version/overview/index.md | 54 ++ .../examples/sample-sdb.yaml | 52 ++ .../examples/sdbops-update.yaml | 11 + .../sdb update-version opsrequest/index.md | 207 +++++ .../singlestore/volume-expansion/_index.md | 10 + .../overview/images/volume-expansion.svg | 144 ++++ .../volume-expansion/overview/index.md | 56 ++ .../example/sample-sdb.yaml | 53 ++ .../example/sdb-offline-volume-expansion.yaml | 13 + .../sdb volume-expansion opsrequest/index.md | 480 ++++++++++++ docs/images/singlestore/compute-process.svg | 146 ++++ .../singlestore/storage-autoscaling.svg | 173 +++++ 115 files changed, 11103 insertions(+), 23 deletions(-) create mode 100644 docs/examples/singlestore/autoscaling/compute/sdb-cluster-autoscaler.yaml create mode 100644 docs/examples/singlestore/autoscaling/compute/sdb-compute.yaml create mode 100644 docs/examples/singlestore/autoscaling/storage/sdb-compute.yaml create mode 100644 docs/examples/singlestore/autoscaling/storage/sdb-storage-autoscaler.yaml create mode 100644 docs/guides/singlestore/autoscaler/_index.md create mode 100644 docs/guides/singlestore/autoscaler/compute/_index.md create mode 100644 docs/guides/singlestore/autoscaler/compute/cluster.md create mode 100644 docs/guides/singlestore/autoscaler/compute/overview.md create mode 100644 docs/guides/singlestore/autoscaler/storage/_index.md create mode 100644 docs/guides/singlestore/autoscaler/storage/cluster.md create mode 100644 docs/guides/singlestore/autoscaler/storage/overview.md create mode 100644 docs/guides/singlestore/clustering/_index.md create mode 100644 docs/guides/singlestore/clustering/overview/images/sdb-cluster-1.png create mode 100644 docs/guides/singlestore/clustering/overview/images/sdb-cluster-2.png create mode 100644 docs/guides/singlestore/clustering/overview/images/sdb-cluster.png create mode 100644 docs/guides/singlestore/clustering/overview/index.md create mode 100644 docs/guides/singlestore/clustering/singlestore-clustering/examples/sample-sdb.yaml create mode 100644 docs/guides/singlestore/clustering/singlestore-clustering/index.md create mode 100644 docs/guides/singlestore/concepts/_index.md create mode 100644 docs/guides/singlestore/concepts/appbinding.md create mode 100644 docs/guides/singlestore/concepts/autoscaler.md create mode 100644 docs/guides/singlestore/concepts/catalog.md create mode 100644 docs/guides/singlestore/concepts/opsrequest.md create mode 100644 docs/guides/singlestore/concepts/singlestore.md create mode 100755 docs/guides/singlestore/configuration/_index.md create mode 100644 docs/guides/singlestore/configuration/config-file/index.md create mode 100644 docs/guides/singlestore/configuration/config-file/yamls/sdb-config.cnf create mode 100644 docs/guides/singlestore/configuration/config-file/yamls/sdb-custom.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/index.md create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/nginx-config-map.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/sdb-custom-sidecar.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/sdb-misc-config.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/sdb-node-selector.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/sdb-with-tolerations.yaml create mode 100644 docs/guides/singlestore/configuration/podtemplating/yamls/sdb-without-tolerations.yaml create mode 100755 docs/guides/singlestore/initialization/_index.md create mode 100644 docs/guides/singlestore/initialization/using-script/example/demo-1.yaml create mode 100644 docs/guides/singlestore/initialization/using-script/index.md create mode 100644 docs/guides/singlestore/monitoring/_index.md create mode 100644 docs/guides/singlestore/monitoring/builtin-prometheus/images/sdb-builtin-prom-target.png create mode 100644 docs/guides/singlestore/monitoring/builtin-prometheus/index.md create mode 100644 docs/guides/singlestore/monitoring/builtin-prometheus/yamls/builtin-prom-singlestore.yaml create mode 100644 docs/guides/singlestore/monitoring/builtin-prometheus/yamls/prom-config.yaml create mode 100644 docs/guides/singlestore/monitoring/overview/images/database-monitoring-overview.svg create mode 100644 docs/guides/singlestore/monitoring/overview/index.md create mode 100644 docs/guides/singlestore/monitoring/prometheus-operator/images/prom-operator-sdb-target.png create mode 100644 docs/guides/singlestore/monitoring/prometheus-operator/images/prometheus-operator.png create mode 100644 docs/guides/singlestore/monitoring/prometheus-operator/index.md create mode 100644 docs/guides/singlestore/monitoring/prometheus-operator/yamls/prom-operator-singlestore.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/_index.md create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/issuer.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/sample-sdb.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-add-tls.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-remove-tls.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-rotate-tls.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-update-tls.yaml create mode 100644 docs/guides/singlestore/reconfigure-tls/cluster/index.md create mode 100644 docs/guides/singlestore/reconfigure-tls/overview/images/reconfigure-tls.svg create mode 100644 docs/guides/singlestore/reconfigure-tls/overview/index.md create mode 100644 docs/guides/singlestore/reconfigure/_index.md create mode 100644 docs/guides/singlestore/reconfigure/overview/images/sdb-reconfigure.svg create mode 100644 docs/guides/singlestore/reconfigure/overview/index.md create mode 100644 docs/guides/singlestore/reconfigure/reconfigure-steps/index.md create mode 100644 docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/custom-sdb.yaml create mode 100644 docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml create mode 100644 docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml create mode 100644 docs/guides/singlestore/restart/_index.md create mode 100644 docs/guides/singlestore/restart/restart.md create mode 100644 docs/guides/singlestore/restart/yamls/restart-ops.yaml create mode 100644 docs/guides/singlestore/restart/yamls/sdb-sample.yaml create mode 100644 docs/guides/singlestore/scaling/_index.md create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/_index.md create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sample-sdb.yaml create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-downscale.yaml create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-upscale.yaml create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/cluster/index.md create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/overview/images/horizontal-scaling.svg create mode 100644 docs/guides/singlestore/scaling/horizontal-scaling/overview/index.md create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/_index.md create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sample-sdb.yaml create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sdbops-vscale.yaml create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/cluster/index.md create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/overview/images/vertical-sacling.svg create mode 100644 docs/guides/singlestore/scaling/vertical-scaling/overview/index.md create mode 100644 docs/guides/singlestore/tls/_index.md create mode 100644 docs/guides/singlestore/tls/configure/examples/issuer.yaml create mode 100644 docs/guides/singlestore/tls/configure/examples/tls-cluster.yaml create mode 100644 docs/guides/singlestore/tls/configure/index.md create mode 100644 docs/guides/singlestore/tls/overview/images/sdb-tls.svg create mode 100644 docs/guides/singlestore/tls/overview/index.md create mode 100644 docs/guides/singlestore/update-version/_index.md create mode 100644 docs/guides/singlestore/update-version/overview/images/sdb-version-update.svg create mode 100644 docs/guides/singlestore/update-version/overview/index.md create mode 100644 docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sample-sdb.yaml create mode 100644 docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sdbops-update.yaml create mode 100644 docs/guides/singlestore/update-version/sdb update-version opsrequest/index.md create mode 100644 docs/guides/singlestore/volume-expansion/_index.md create mode 100644 docs/guides/singlestore/volume-expansion/overview/images/volume-expansion.svg create mode 100644 docs/guides/singlestore/volume-expansion/overview/index.md create mode 100644 docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sample-sdb.yaml create mode 100644 docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sdb-offline-volume-expansion.yaml create mode 100644 docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/index.md create mode 100644 docs/images/singlestore/compute-process.svg create mode 100644 docs/images/singlestore/storage-autoscaling.svg diff --git a/docs/examples/singlestore/autoscaling/compute/sdb-cluster-autoscaler.yaml b/docs/examples/singlestore/autoscaling/compute/sdb-cluster-autoscaler.yaml new file mode 100644 index 0000000000..82ea644abb --- /dev/null +++ b/docs/examples/singlestore/autoscaling/compute/sdb-cluster-autoscaler.yaml @@ -0,0 +1,21 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-cluster-autoscaler + namespace: demo +spec: + databaseRef: + name: sdb-sample + compute: + aggregator: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 900m + memory: 3Gi + maxAllowed: + cpu: 2000m + memory: 6Gi + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" + resourceDiffPercentage: 10 \ No newline at end of file diff --git a/docs/examples/singlestore/autoscaling/compute/sdb-compute.yaml b/docs/examples/singlestore/autoscaling/compute/sdb-compute.yaml new file mode 100644 index 0000000000..e298b63c12 --- /dev/null +++ b/docs/examples/singlestore/autoscaling/compute/sdb-compute.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: 8.7.10 + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 3 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/examples/singlestore/autoscaling/storage/sdb-compute.yaml b/docs/examples/singlestore/autoscaling/storage/sdb-compute.yaml new file mode 100644 index 0000000000..e298b63c12 --- /dev/null +++ b/docs/examples/singlestore/autoscaling/storage/sdb-compute.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: 8.7.10 + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 3 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/examples/singlestore/autoscaling/storage/sdb-storage-autoscaler.yaml b/docs/examples/singlestore/autoscaling/storage/sdb-storage-autoscaler.yaml new file mode 100644 index 0000000000..709180850b --- /dev/null +++ b/docs/examples/singlestore/autoscaling/storage/sdb-storage-autoscaler.yaml @@ -0,0 +1,15 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-cluster-autoscaler + namespace: demo +spec: + databaseRef: + name: sdb-sample + storage: + leaf: + trigger: "On" + usageThreshold: 30 + scalingThreshold: 50 + expansionMode: "Online" + upperBound: "100Gi" \ No newline at end of file diff --git a/docs/guides/mysql/backup/kubestash/application-level/index.md b/docs/guides/mysql/backup/kubestash/application-level/index.md index 3ba6030722..afe3c4a98d 100644 --- a/docs/guides/mysql/backup/kubestash/application-level/index.md +++ b/docs/guides/mysql/backup/kubestash/application-level/index.md @@ -3,7 +3,7 @@ title: Application Level Backup & Restore MySQL | KubeStash description: Application Level Backup and Restore using KubeStash menu: docs_{{ .version }}: - identifier: guides-application-level-backup-stashv2 + identifier: guides-mysql-application-level-backup-stashv2 name: Application Level Backup parent: guides-mysql-backup-stashv2 weight: 40 diff --git a/docs/guides/mysql/pitr/archiver.md b/docs/guides/mysql/pitr/archiver.md index 00ad0fae62..4be52657b9 100644 --- a/docs/guides/mysql/pitr/archiver.md +++ b/docs/guides/mysql/pitr/archiver.md @@ -143,13 +143,13 @@ spec: scheduler: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - schedule: "/30 * * * *" + schedule: "*/30 * * * *" sessionHistoryLimit: 2 manifestBackup: scheduler: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - schedule: "/30 * * * *" + schedule: "*/30 * * * *" sessionHistoryLimit: 2 backupStorage: ref: diff --git a/docs/guides/mysql/pitr/yamls/mysqlarchiver.yaml b/docs/guides/mysql/pitr/yamls/mysqlarchiver.yaml index f3818455e6..4fe652feed 100644 --- a/docs/guides/mysql/pitr/yamls/mysqlarchiver.yaml +++ b/docs/guides/mysql/pitr/yamls/mysqlarchiver.yaml @@ -28,13 +28,13 @@ spec: scheduler: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - schedule: "/30 * * * *" + schedule: "*/30 * * * *" sessionHistoryLimit: 2 manifestBackup: scheduler: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - schedule: "/30 * * * *" + schedule: "*/30 * * * *" sessionHistoryLimit: 2 backupStorage: ref: diff --git a/docs/guides/postgres/backup/kubestash/application-level/index.md b/docs/guides/postgres/backup/kubestash/application-level/index.md index 6cc1d97d44..e1a85772c7 100644 --- a/docs/guides/postgres/backup/kubestash/application-level/index.md +++ b/docs/guides/postgres/backup/kubestash/application-level/index.md @@ -3,7 +3,7 @@ title: Application Level Backup & Restore PostgreSQL | KubeStash description: Application Level Backup and Restore using KubeStash menu: docs_{{ .version }}: - identifier: guides-application-level-backup-stashv2 + identifier: guides-pg-application-level-backup-stashv2 name: Application Level Backup parent: guides-pg-backup-stashv2 weight: 40 diff --git a/docs/guides/proxysql/quickstart/mysqlgrp/examples/sample-proxysql-v1.yaml b/docs/guides/proxysql/quickstart/mysqlgrp/examples/sample-proxysql-v1.yaml index 7d4e68f246..c3f58173c7 100644 --- a/docs/guides/proxysql/quickstart/mysqlgrp/examples/sample-proxysql-v1.yaml +++ b/docs/guides/proxysql/quickstart/mysqlgrp/examples/sample-proxysql-v1.yaml @@ -5,7 +5,26 @@ metadata: namespace: demo spec: version: "2.3.2-debian" - replicas: 1 + replicas: 3 + podTemplate: + spec: + containers: + - name: proxysql + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 250m + memory: 64Mi + securityContext: + runAsGroup: 999 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + podPlacementPolicy: + name: default syncUsers: true backend: name: mysql-server diff --git a/docs/guides/redis/backup/kubestash/application-level/index.md b/docs/guides/redis/backup/kubestash/application-level/index.md index 7c07ad1eaf..15c0cdd0b2 100644 --- a/docs/guides/redis/backup/kubestash/application-level/index.md +++ b/docs/guides/redis/backup/kubestash/application-level/index.md @@ -3,7 +3,7 @@ title: Application Level Backup & Restore Redis | KubeStash description: Application Level Backup and Restore using KubeStash menu: docs_{{ .version }}: - identifier: guides-application-level-backup-stashv2 + identifier: guides-rd-application-level-backup-stashv2 name: Application Level Backup parent: guides-rd-backup-stashv2 weight: 40 diff --git a/docs/guides/singlestore/README.md b/docs/guides/singlestore/README.md index b5cfacad89..c1f29a33dd 100644 --- a/docs/guides/singlestore/README.md +++ b/docs/guides/singlestore/README.md @@ -42,7 +42,8 @@ SingleStore, a distributed SQL database for real-time analytics, transactional w KubeDB supports the following SingleSore Versions. - `8.1.32` -- `8.5.7` +- `8.5.30` +- `8.7.10` ## Life Cycle of a SingleStore Object diff --git a/docs/guides/singlestore/_index.md b/docs/guides/singlestore/_index.md index b8bca4c8b4..5548c5e483 100644 --- a/docs/guides/singlestore/_index.md +++ b/docs/guides/singlestore/_index.md @@ -5,6 +5,6 @@ menu: identifier: guides-singlestore name: SingleStore parent: guides - weight: 10 + weight: 20 menu_name: docs_{{ .version }} --- diff --git a/docs/guides/singlestore/autoscaler/_index.md b/docs/guides/singlestore/autoscaler/_index.md new file mode 100644 index 0000000000..890618438e --- /dev/null +++ b/docs/guides/singlestore/autoscaler/_index.md @@ -0,0 +1,10 @@ +--- +title: Autoscaling +menu: + docs_{{ .version }}: + identifier: sdb-auto-scaling + name: Autoscaling + parent: guides-singlestore + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/autoscaler/compute/_index.md b/docs/guides/singlestore/autoscaler/compute/_index.md new file mode 100644 index 0000000000..13d55d0e5e --- /dev/null +++ b/docs/guides/singlestore/autoscaler/compute/_index.md @@ -0,0 +1,10 @@ +--- +title: Compute Autoscaling +menu: + docs_{{ .version }}: + identifier: sdb-compute-auto-scaling + name: Compute Autoscaling + parent: sdb-auto-scaling + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/autoscaler/compute/cluster.md b/docs/guides/singlestore/autoscaler/compute/cluster.md new file mode 100644 index 0000000000..d9e2b6bb39 --- /dev/null +++ b/docs/guides/singlestore/autoscaler/compute/cluster.md @@ -0,0 +1,538 @@ +--- +title: SingleStore Compute Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: sdb-auto-scaling-cluster + name: SingleStore Compute + parent: sdb-compute-auto-scaling + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +# Autoscaling the Compute Resource of a SingleStore Cluster + +This guide will show you how to use `KubeDB` to autoscale compute resources i.e. cpu and memory of a singlestore cluster for aggregator and leaf nodes. + +## 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` Provisioner, Ops-manager 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) + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreAutoscaler](/docs/guides/singlestore/concepts/autoscaler.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Compute Resource Autoscaling Overview](/docs/guides/singlestore/autoscaler/compute/overview.md) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/examples/singlestore](/docs/examples/singlestore) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Autoscaling of SingleStore Cluster + +Here, we are going to deploy a `SingleStore` Cluster using a supported version by `KubeDB` operator. Then we are going to apply `SingleStoreAutoscaler` to set up autoscaling. + +#### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +#### Deploy SingleStore Cluster + +In this section, we are going to deploy a SingleStore with version `8.7.10`. Then, in the next section we will set up autoscaling for this database using `SingleStoreAutoscaler` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: 8.7.10 + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 3 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + +``` +Let's create the `SingleStore` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/singlestore/autoscaling/compute/sdb-cluster.yaml +singlestore.kubedb.com/sdb-cluster created +``` + +Now, wait until `sdb-sample` has status `Ready`. i.e, + +```bash +NAME TYPE VERSION STATUS AGE +singlestore.kubedb.com/sdb-sample kubedb.com/v1alpha2 8.7.10 Ready 4m35s +``` + +Let's check the aggregator pod containers resources, + +```bash +kubectl get pod -n demo sdb-sample-aggregator-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "700m", + "memory": "2Gi" + }, + "requests": { + "cpu": "700m", + "memory": "2Gi" + } +} +``` + +Let's check the SingleStore aggregator node resources, +```bash +kubectl get singlestore -n demo sdb-sample -o json | jq '.spec.topology.aggregator.podTemplate.spec.containers[] | select(.name == "singlestore") | .resources' +{ + "limits": { + "cpu": "700m", + "memory": "2Gi" + }, + "requests": { + "cpu": "700m", + "memory": "2Gi" + } +} + +``` + +You can see from the above outputs that the resources are same as the one we have assigned while deploying the singlestore. + +We are now ready to apply the `SingleStoreAutoscaler` CRO to set up autoscaling for this database. + +### Compute Resource Autoscaling + +Here, we are going to set up compute resource autoscaling using a SingleStoreAutoscaler Object. + +#### Create SingleStoreAutoscaler Object + +In order to set up compute resource autoscaling for this singlestore cluster, we have to create a `SingleStoreAutoscaler` CRO with our desired configuration. Below is the YAML of the `SingleStoreAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-cluster-autoscaler + namespace: demo +spec: + databaseRef: + name: sdb-sample + compute: + aggregator: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 900m + memory: 3Gi + maxAllowed: + cpu: 2000m + memory: 6Gi + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" + resourceDiffPercentage: 10 +``` + + +Here, + +- `spec.databaseRef.name` specifies that we are performing compute resource scaling operation on `sdb-sample` cluster. +- `spec.compute.aggregator.trigger` or `spec.compute.leaf.trigger` specifies that compute autoscaling is enabled for this cluster. +- `spec.compute.aggregator.podLifeTimeThreshold` or `spec.compute.leaf.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.aggregator.resourceDiffPercentage` or `spec.compute.leaf.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.aggregator.minAllowed` or `spec.compute.leaf.minAllowed` specifies the minimum allowed resources for the cluster. +- `spec.compute.aggregator.maxAllowed` or `spec.compute.leaf.maxAllowed` specifies the maximum allowed resources for the cluster. +- `spec.compute.aggregator.controlledResources` or `spec.compute.leaf.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.aggregator.containerControlledValues` or `spec.compute.leaf.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.opsRequestOptions` contains the options to pass to the created OpsRequest. It has 2 fields. + - `timeout` specifies the timeout for the OpsRequest. + - `apply` specifies when the OpsRequest should be applied. The default is "IfReady". + +Let's create the `SinglestoreAutoscaler` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/singlestore/autoscaler/compute/sdb-cluster-autoscaler.yaml +singlestoreautoscaler.autoscaling.kubedb.com/sdb-cluster-autoscaler created +``` + +#### Verify Autoscaling is set up successfully + +Let's check that the `singlestoreautoscaler` resource is created successfully, + +```bash +$ kubectl describe singlestoreautoscaler -n demo sdb-cluster-autoscaler +Name: sdb-cluster-autoscaler +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: SinglestoreAutoscaler +Metadata: + Creation Timestamp: 2024-09-10T08:55:26Z + Generation: 1 + Owner References: + API Version: kubedb.com/v1alpha2 + Block Owner Deletion: true + Controller: true + Kind: Singlestore + Name: sdb-sample + UID: f81d0592-9dda-428a-b0b4-e72ab3643e22 + Resource Version: 424275 + UID: 6b7b3d72-b92f-4e6f-88eb-4e891c24c550 +Spec: + Compute: + Aggregator: + Container Controlled Values: RequestsAndLimits + Controlled Resources: + cpu + memory + Max Allowed: + Cpu: 2 + Memory: 6Gi + Min Allowed: + Cpu: 900m + Memory: 3Gi + Pod Life Time Threshold: 5m0s + Resource Diff Percentage: 10 + Trigger: On + Database Ref: + Name: sdb-sample + Ops Request Options: + Apply: IfReady +Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 2455 + Index: 1 + Weight: 2089 + Index: 2 + Weight: 10000 + Index: 3 + Weight: 361 + Reference Timestamp: 2024-09-10T09:05:00Z + Total Weight: 5.5790751974302655 + First Sample Start: 2024-09-10T08:59:26Z + Last Sample Start: 2024-09-10T09:15:18Z + Last Update Time: 2024-09-10T09:15:27Z + Memory Histogram: + Bucket Weights: + Index: 1 + Weight: 1821 + Index: 2 + Weight: 10000 + Reference Timestamp: 2024-09-10T09:05:00Z + Total Weight: 14.365194626381038 + Ref: + Container Name: singlestore-coordinator + Vpa Object Name: sdb-sample-aggregator + Total Samples Count: 32 + Version: v3 + Cpu Histogram: + Bucket Weights: + Index: 5 + Weight: 3770 + Index: 6 + Weight: 10000 + Index: 7 + Weight: 132 + Index: 20 + Weight: 118 + Reference Timestamp: 2024-09-10T09:05:00Z + Total Weight: 6.533759718059768 + First Sample Start: 2024-09-10T08:59:26Z + Last Sample Start: 2024-09-10T09:16:19Z + Last Update Time: 2024-09-10T09:16:28Z + Memory Histogram: + Bucket Weights: + Index: 17 + Weight: 8376 + Index: 18 + Weight: 10000 + Reference Timestamp: 2024-09-10T09:05:00Z + Total Weight: 17.827743425726553 + Ref: + Container Name: singlestore + Vpa Object Name: sdb-sample-aggregator + Total Samples Count: 34 + Version: v3 + Conditions: + Last Transition Time: 2024-09-10T08:59:43Z + Message: Successfully created SinglestoreOpsRequest demo/sdbops-sdb-sample-aggregator-c0u141 + Observed Generation: 1 + Reason: CreateOpsRequest + Status: True + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2024-09-10T08:59:42Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: singlestore + Lower Bound: + Cpu: 900m + Memory: 3Gi + Target: + Cpu: 900m + Memory: 3Gi + Uncapped Target: + Cpu: 100m + Memory: 351198544 + Upper Bound: + Cpu: 2 + Memory: 6Gi + Vpa Name: sdb-sample-aggregator +Events: +``` +So, the `singlestoreautoscaler` resource is created successfully. + +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 `singlestoreopsrequest` based on the recommendations, if the database pods resources are needed to scaled up or down. + +Let's watch the `singlestoreopsrequest` in the demo namespace to see if any `singlestoreopsrequest` object is created. After some time you'll see that a `singlestoreopsrequest` will be created based on the recommendation. + +```bash +$ watch kubectl get singlestoreopsrequest -n demo +Every 2.0s: kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-sdb-sample-aggregator-c0u141 VerticalScaling Progressing 10s +``` + +Let's wait for the ops request to become successful. + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-sdb-sample-aggregator-c0u141 VerticalScaling Successful 3m2s +``` + +We can see from the above output that the `SinglestoreOpsRequest` has succeeded. If we describe the `SinglestoreOpsRequest` we will get an overview of the steps that were followed to scale the cluster. + +```bash +$ kubectl describe singlestoreopsrequest -n demo sdbops-sdb-sample-aggregator-c0u141 +Name: sdbops-sdb-sample-aggregator-c0u141 +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=sdb-sample + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: SinglestoreOpsRequest +Metadata: + Creation Timestamp: 2024-09-10T08:59:43Z + Generation: 1 + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: SinglestoreAutoscaler + Name: sdb-cluster-autoscaler + UID: 6b7b3d72-b92f-4e6f-88eb-4e891c24c550 + Resource Version: 406111 + UID: 978a1a00-f217-4326-b103-f66bbccf2943 +Spec: + Apply: IfReady + Database Ref: + Name: sdb-sample + Type: VerticalScaling + Vertical Scaling: + Aggregator: + Resources: + Limits: + Cpu: 900m + Memory: 3Gi + Requests: + Cpu: 900m + Memory: 3Gi +Status: + Conditions: + Last Transition Time: 2024-09-10T09:01:55Z + Message: Timeout: request did not complete within requested timeout - context deadline exceeded + Observed Generation: 1 + Reason: Failed + Status: True + Type: VerticalScaling + Last Transition Time: 2024-09-10T08:59:46Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-09-10T08:59:46Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-09-10T09:01:21Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-09-10T08:59:52Z + Message: get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Observed Generation: 1 + Status: True + Type: GetPod--sdb-sample-aggregator-0 + Last Transition Time: 2024-09-10T08:59:52Z + Message: evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Observed Generation: 1 + Status: True + Type: EvictPod--sdb-sample-aggregator-0 + Last Transition Time: 2024-09-10T09:00:31Z + Message: check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Observed Generation: 1 + Status: True + Type: CheckPodReady--sdb-sample-aggregator-0 + Last Transition Time: 2024-09-10T09:00:36Z + Message: get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Observed Generation: 1 + Status: True + Type: GetPod--sdb-sample-aggregator-1 + Last Transition Time: 2024-09-10T09:00:36Z + Message: evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Observed Generation: 1 + Status: True + Type: EvictPod--sdb-sample-aggregator-1 + Last Transition Time: 2024-09-10T09:01:16Z + Message: check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Observed Generation: 1 + Status: True + Type: CheckPodReady--sdb-sample-aggregator-1 + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 25m KubeDB Ops-manager Operator Start processing for SinglestoreOpsRequest: demo/sdbops-sdb-sample-aggregator-c0u141 + Normal Starting 25m KubeDB Ops-manager Operator Pausing Singlestore database: demo/sdb-sample + Normal Successful 25m KubeDB Ops-manager Operator Successfully paused Singlestore database: demo/sdb-sample for SinglestoreOpsRequest: sdbops-sdb-sample-aggregator-c0u141 + Normal UpdatePetSets 25m KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 25m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Warning evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 25m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Warning check pod ready; ConditionStatus:False; PodName:sdb-sample-aggregator-0 25m KubeDB Ops-manager Operator check pod ready; ConditionStatus:False; PodName:sdb-sample-aggregator-0 + Warning check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-0 24m KubeDB Ops-manager Operator check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + Warning get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 24m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Warning evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 24m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Warning check pod ready; ConditionStatus:False; PodName:sdb-sample-aggregator-1 24m KubeDB Ops-manager Operator check pod ready; ConditionStatus:False; PodName:sdb-sample-aggregator-1 + Warning check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-1 24m KubeDB Ops-manager Operator check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-1 + Normal RestartPods 24m KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting + Normal Successful +``` + +Now, we are going to verify from the Pod, and the singlestore yaml whether the resources of the topology database has updated to meet up the desired state, Let's check, + +```bash +kubectl get pod -n demo sdb-sample-aggregator-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "900m", + "memory": "3Gi" + }, + "requests": { + "cpu": "900m", + "memory": "3Gi" + } +} + + +kubectl get singlestore -n demo sdb-sample -o json | jq '.spec.topology.aggregator.podTemplate.spec.containers[] | select(.name == "singlestore") | .resources' +{ + "limits": { + "cpu": "900m", + "memory": "3Gi" + }, + "requests": { + "cpu": "900m", + "memory": "3Gi" + } +} + +``` + + +The above output verifies that we have successfully auto scaled the resources of the SingleStore cluster. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete singlestoreopsrequest -n demo sdbops-sdb-sample-aggregator-c0u141 +kubectl delete singlestoreautoscaler -n demo sdb-cluster-autoscaler +kubectl delete kf -n demo sdb-sample +kubectl delete ns demo +``` +## Next Steps + +- Detail concepts of [SingleStore object](/docs/guides/singlestore/concepts/singlestore.md). +- Different SingleStore clustering modes [here](/docs/guides/singlestore/clustering/_index.md). +- Monitor your singlestore database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/singlestore/monitoring/prometheus-operator/index.md). +- Monitor your singlestore database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/singlestore/monitoring/builtin-prometheus/index.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). + diff --git a/docs/guides/singlestore/autoscaler/compute/overview.md b/docs/guides/singlestore/autoscaler/compute/overview.md new file mode 100644 index 0000000000..11b9a28f63 --- /dev/null +++ b/docs/guides/singlestore/autoscaler/compute/overview.md @@ -0,0 +1,55 @@ +--- +title: SingleStore Compute Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: sdb-auto-scaling-overview + name: Overview + parent: sdb-compute-auto-scaling + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Compute Resource Autoscaling + +This guide will give an overview on how KubeDB Autoscaler operator autoscales the database compute resources i.e. cpu and memory using `singlestoreautoscaler` crd. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreAutoscaler](/docs/guides/singlestore/concepts/autoscaler.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Compute Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `SingleStore` database components. Open the image in a new tab to see the enlarged version. + +
+  Compute Auto Scaling process of SingleStore +
Fig: Compute Auto Scaling process of SingleStore
+
+ +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource Object (CRO). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CRO. + +3. When the operator finds a `SingleStore` CRO, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to set up autoscaling of the various components (ie. Aggregator, Leaf, Standalone) of the `SingleStore` database the user creates a `SingleStoreAutoscaler` CRO with desired configuration. + +5. `KubeDB` Autoscaler operator watches the `SingleStoreAutoscaler` 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 `SingleStoreAutoscaler` CRO. + +7. If the generated recommendation doesn't match the current resources of the database, then `KubeDB` Autoscaler operator creates a `SingleStoreOpsRequest` CRO to scale the database to match the recommendation generated. + +8. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CRO. + +9. Then the `KubeDB` Ops-manager operator will scale the database component vertically as specified on the `SingleStoreOpsRequest` CRO. + +In the next docs, we are going to show a step by step guide on Autoscaling of various SingleStore database components using `SingleStoreAutoscaler` CRD. \ No newline at end of file diff --git a/docs/guides/singlestore/autoscaler/storage/_index.md b/docs/guides/singlestore/autoscaler/storage/_index.md new file mode 100644 index 0000000000..91b59b6898 --- /dev/null +++ b/docs/guides/singlestore/autoscaler/storage/_index.md @@ -0,0 +1,10 @@ +--- +title: Storage Autoscaling +menu: + docs_{{ .version }}: + identifier: sdb-storage-auto-scaling + name: Storage Autoscaling + parent: sdb-auto-scaling + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/autoscaler/storage/cluster.md b/docs/guides/singlestore/autoscaler/storage/cluster.md new file mode 100644 index 0000000000..318406e8d6 --- /dev/null +++ b/docs/guides/singlestore/autoscaler/storage/cluster.md @@ -0,0 +1,476 @@ +--- +title: SingleStore Cluster Autoscaling +menu: + docs_{{ .version }}: + identifier: sdb-storage-auto-scaling-cluster + name: SingleStore Storage + parent: sdb-storage-auto-scaling + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Storage Autoscaling of a SingleStore Cluster + +This guide will show you how to use `KubeDB` to autoscale the storage of a SingleStore cluster. + +## 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` Provisioner, Ops-manager 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 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. + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreAutoscaler](/docs/guides/singlestore/concepts/autoscaler.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Storage Autoscaling Overview](/docs/guides/singlestore/autoscaler/storage/overview.md) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +> **Note:** YAML files used in this tutorial are stored in [docs/examples/singlestore](/docs/examples/singlestore) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Storage Autoscaling of SingleStore Cluster + +At first verify that your cluster has a storage class, that supports volume expansion. Let's check, + +```bash +$ kubectl get storageclass +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +standard (default) kubernetes.io/gce-pd Delete Immediate true 2m49s +``` + +#### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +#### Deploy SingleStore Cluster + +In this section, we are going to deploy a SingleStore with version `8.7.10`. Then, in the next section we will set up autoscaling for this database using `SingleStoreAutoscaler` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: 8.7.10 + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 3 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.7" + requests: + memory: "2Gi" + cpu: "0.7" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + +``` +Let's create the `SingleStore` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/singlestore/autoscaling/storage/sdb-cluster.yaml +singlestore.kubedb.com/sdb-cluster created +``` + +Now, wait until `sdb-sample` has status `Ready`. i.e, + +```bash +NAME TYPE VERSION STATUS AGE +singlestore.kubedb.com/sdb-sample kubedb.com/v1alpha2 8.7.10 Ready 4m35s +``` + +> **Note:** You can manage storage autoscale for aggregator and leaf nodes separately. Here, we will focus on leaf nodes. + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo sdb-sample-leaf -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"10Gi" + +$ kubectl get pv -n demo | grep 'leaf' +pvc-5cf8638e365544dd 10Gi RWO Retain Bound demo/data-sdb-sample-leaf-0 linode-block-storage-retain 50s +pvc-a99e7adb282a4f9c 10Gi RWO Retain Bound demo/data-sdb-sample-leaf-2 linode-block-storage-retain 60s +pvc-da8e9e5162a748df 10Gi RWO Retain Bound demo/data-sdb-sample-leaf-1 linode-block-storage-retain 70s + +``` + +You can see the petset of leaf has 10GB storage, and the capacity of all the persistent volume is also 10GB. + +We are now ready to apply the `SingleStoreAutoscaler` CRO to set up storage autoscaling for this cluster. + +### Storage Autoscaling + +Here, we are going to set up storage autoscaling using a SingleStoreAutoscaler Object. + +#### Create SingleStoreAutoscaler Object + +In order to set up vertical autoscaling for this singlestore cluster, we have to create a `SinglestoreAutoscaler` CRO with our desired configuration. Below is the YAML of the `SinglestoreAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-cluster-autoscaler + namespace: demo +spec: + databaseRef: + name: sdb-sample + storage: + leaf: + trigger: "On" + usageThreshold: 30 + scalingThreshold: 50 + expansionMode: "Online" + upperBound: "100Gi" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing vertical scaling operation on `sdb-sample` cluster. +- `spec.storage.leaf.trigger` specifies that storage autoscaling is enabled for leaf nodes on this cluster. +- `spec.storage.leaf.usageThreshold` specifies storage usage threshold, if storage usage exceeds `30%` then storage autoscaling will be triggered. +- `spec.storage.leaf.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `50%` of the current amount. +- It has another field `spec.storage.leaf.expansionMode` to set the opsRequest volumeExpansionMode, which support two values: `Online` & `Offline`. Default value is `Online`. + +Let's create the `SinglestoreAutoscaler` CR we have shown above, + + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/singlestore/autoscaling/storage/sdb-storage-autoscaler.yaml +singlestoreautoscaler.autoscaling.kubedb.com/sdb-storage-autoscaler created +``` + +#### Storage Autoscaling is set up successfully + +Let's check that the `singlestoreautoscaler` resource is created successfully, + +```bash +$ kubectl get singlestoreautoscaler -n demo +NAME AGE +sdb-cluster-autoscaler 2m5s + + +$ kubectl describe singlestoreautoscaler -n demo sdb-cluster-autoscaler +Name: sdb-cluster-autoscaler +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: SinglestoreAutoscaler +Metadata: + Creation Timestamp: 2024-09-11T07:05:11Z + Generation: 1 + Owner References: + API Version: kubedb.com/v1alpha2 + Block Owner Deletion: true + Controller: true + Kind: Singlestore + Name: sdb-sample + UID: e08e1f37-d869-437d-9b15-14c6aef3f406 + Resource Version: 4904325 + UID: 471afa65-6d12-4e7d-a2a6-6d28ce440c4d +Spec: + Database Ref: + Name: sdb-sample + Ops Request Options: + Apply: IfReady + Storage: + Leaf: + Expansion Mode: Online + Scaling Rules: + Applies Upto: + Threshold: 50pc + Scaling Threshold: 50 + Trigger: On + Upper Bound: 100Gi + Usage Threshold: 30 +Events: + + +``` + +So, the `singlestoreautoscaler` resource is created successfully. + +Now, for this demo, we are going to manually fill up the persistent volume to exceed the `usageThreshold` creating new database with partitions 6 to see if storage autoscaling is working or not. + +Let's exec into the cluster pod and fill the cluster volume using the following commands: + +```bash +$ kubectl exec -it -n demo sdb-sample-leaf-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-sample-leaf-0 /]$ df -h var/lib/memsql +Filesystem Size Used Avail Use% Mounted on +/dev/disk/by-id/scsi-0Linode_Volume_pvcc50e0d73d07349f9 9.8G 1.4G 8.4G 15% /var/lib/memsql + +$ kubectl exec -it -n demo sdb-sample-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-sample-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 113 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) +Copyright (c) 2000, 2022, Oracle and/or its affiliates. +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. +singlestore> create database demo partitions 6; +Query OK, 1 row affected (3.78 sec) + +$ kubectl exec -it -n demo sdb-sample-leaf-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-sample-leaf-0 /]$ df -h var/lib/memsql +Filesystem Size Used Avail Use% Mounted on +/dev/disk/by-id/scsi-0Linode_Volume_pvcc50e0d73d07349f9 9.8G 3.2G 6.7G 33% /var/lib/memsql + +``` + +So, from the above output we can see that the storage usage is 33%, which exceeded the `usageThreshold` 30%. + +Let's watch the `singlestoreopsrequest` in the demo namespace to see if any `singlestoreopsrequest` object is created. After some time you'll see that a `singlestoreopsrequest` of type `VolumeExpansion` will be created based on the `scalingThreshold`. + +```bash +$ watch kubectl get singlestoreopsrequest -n demo +Every 2.0s: kubectl get singlestoreopsrequest -n demo ashraful: Wed Sep 11 13:39:25 2024 + +NAME TYPE STATUS AGE +sdbops-sdb-sample-th2r62 VolumeExpansion Progressing 10s +``` + +Let's wait for the ops request to become successful. + +```bash +$ watch kubectl get singlestoreopsrequest -n demo +Every 2.0s: kubectl get singlestoreopsrequest -n demo ashraful: Wed Sep 11 13:41:12 2024 + +NAME TYPE STATUS AGE +sdbops-sdb-sample-th2r62 VolumeExpansion Successful 2m31s + +``` + +We can see from the above output that the `SinglestoreOpsRequest` has succeeded. If we describe the `SinglestoreOpsRequest` we will get an overview of the steps that were followed to expand the volume of the cluster. + +```bash +$ kubectl describe singlestoreopsrequest -n demo sdbops-sdb-sample-th2r62 +Name: sdbops-sdb-sample-th2r62 +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=sdb-sample + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: SinglestoreOpsRequest +Metadata: + Creation Timestamp: 2024-09-11T07:36:42Z + Generation: 1 + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: SinglestoreAutoscaler + Name: sdb-cluster-autoscaler + UID: 471afa65-6d12-4e7d-a2a6-6d28ce440c4d + Resource Version: 4909632 + UID: 3dce68d0-b5ee-4ad6-bd1f-f712bae39630 +Spec: + Apply: IfReady + Database Ref: + Name: sdb-sample + Type: VolumeExpansion + Volume Expansion: + Leaf: 15696033792 + Mode: Online +Status: + Conditions: + Last Transition Time: 2024-09-11T07:36:42Z + Message: Singlestore ops-request has started to expand volume of singlestore nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-09-11T07:36:45Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-09-11T07:37:00Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-09-11T07:36:50Z + Message: get pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetSet + Last Transition Time: 2024-09-11T07:36:50Z + Message: delete pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: DeletePetSet + Last Transition Time: 2024-09-11T07:37:40Z + Message: successfully updated Leaf node PVC sizes + Observed Generation: 1 + Reason: UpdateLeafNodePVCs + Status: True + Type: UpdateLeafNodePVCs + Last Transition Time: 2024-09-11T07:37:05Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-09-11T07:37:06Z + Message: is pvc patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPvcPatched + Last Transition Time: 2024-09-11T07:37:15Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-09-11T07:37:46Z + Message: successfully reconciled the Singlestore resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-09-11T07:37:51Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-09-11T07:38:19Z + Message: Successfully completed volumeExpansion for Singlestore + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 6m4s KubeDB Ops-manager Operator Start processing for SinglestoreOpsRequest: demo/sdbops-sdb-sample-th2r62 + Normal Starting 6m4s KubeDB Ops-manager Operator Pausing Singlestore database: demo/sdb-sample + Normal Successful 6m4s KubeDB Ops-manager Operator Successfully paused Singlestore database: demo/sdb-sample for SinglestoreOpsRequest: sdbops-sdb-sample-th2r62 + Warning get pet set; ConditionStatus:True 5m56s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning delete pet set; ConditionStatus:True 5m56s KubeDB Ops-manager Operator delete pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 5m51s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal OrphanPetSetPods 5m46s KubeDB Ops-manager Operator successfully deleted the petSets with orphan propagation policy + Warning get pvc; ConditionStatus:True 5m41s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 5m40s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m36s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:False 5m36s KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pvc; ConditionStatus:True 5m31s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 5m31s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m26s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 5m26s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m21s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 5m21s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m16s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 5m16s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m11s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 5m11s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Normal UpdateLeafNodePVCs 5m6s KubeDB Ops-manager Operator successfully updated Leaf node PVC sizes + Normal UpdatePetSets 5m KubeDB Ops-manager Operator successfully reconciled the Singlestore resources + Warning get pet set; ConditionStatus:True 4m55s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal ReadyPetSets 4m55s KubeDB Ops-manager Operator PetSet is recreated + Normal Starting 4m27s KubeDB Ops-manager Operator Resuming Singlestore database: demo/sdb-sample + Normal Successful 4m27s KubeDB Ops-manager Operator Successfully resumed Singlestore database: demo/sdb-sample for SinglestoreOpsRequest: sdbops-sdb-sample-th2r62 +``` + +Now, we are going to verify from the `Petset`, and the `Persistent Volume` whether the volume of the combined cluster has expanded to meet the desired state, Let's check, + +```bash +kubectl get petset -n demo sdb-sample-leaf -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"15696033792" + +~ $ kubectl get pv -n demo | grep 'leaf' +pvc-8df67f3178964106 15328158Ki RWO Retain Bound demo/data-sdb-sample-leaf-2 linode-block-storage-retain 42m +pvc-c50e0d73d07349f9 15328158Ki RWO Retain Bound demo/data-sdb-sample-leaf-0 linode-block-storage-retain 43m +pvc-f8b95ff9a9bd4fa2 15328158Ki RWO Retain Bound demo/data-sdb-sample-leaf-1 linode-block-storage-retain 42m + +``` + +The above output verifies that we have successfully autoscaled the volume of the SingleStore cluster. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete singlestoreopsrequests -n demo sdbops-sdb-sample-th2r62 +kubectl delete singlestoreautoscaler -n demo sdb-storage-autoscaler +kubectl delete sdb -n demo sdb-sample +``` + +## Next Steps + +- Detail concepts of [SingleStore object](/docs/guides/singlestore/concepts/singlestore.md). +- Different SingleStore clustering modes [here](/docs/guides/singlestore/clustering/_index.md). +- Monitor your SingleStore database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/singlestore/monitoring/prometheus-operator/index.md). +- Monitor your SingleStore database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/singlestore/monitoring/builtin-prometheus/index.md) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/singlestore/autoscaler/storage/overview.md b/docs/guides/singlestore/autoscaler/storage/overview.md new file mode 100644 index 0000000000..95ada0dc27 --- /dev/null +++ b/docs/guides/singlestore/autoscaler/storage/overview.md @@ -0,0 +1,57 @@ +--- +title: SingleStore Storage Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: sdn-storage-auto-scaling-overview + name: Overview + parent: sdb-storage-auto-scaling + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Vertical Autoscaling + +This guide will give an overview on how KubeDB Autoscaler operator autoscales the database storage using `singlestoreautoscaler` crd. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreAutoscaler](/docs/guides/singlestore/concepts/autoscaler.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Storage Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `SingleStore` cluster components. Open the image in a new tab to see the enlarged version. + +
+  Storage Auto Scaling process of SingleStore +
Fig: Storage Auto Scaling process of SingleStore
+
+ + +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +- Each PetSet creates a Persistent Volume according to the Volume Claim Template provided in the petset configuration. + +4. Then, in order to set up storage autoscaling of the various components (ie. Aggregator, Leaf, Standalone.) of the `singlestore` cluster, the user creates a `SingleStoreAutoscaler` CRO with desired configuration. + +5. `KubeDB` Autoscaler operator watches the `SingleStoreAutoscaler` CRO. + +6. `KubeDB` Autoscaler operator continuously watches persistent volumes of the clusters to check if it exceeds the specified usage threshold. +- If the usage exceeds the specified usage threshold, then `KubeDB` Autoscaler operator creates a `SinglestoreOpsRequest` to expand the storage of the database. + +7. `KubeDB` Ops-manager operator watches the `SinglestoreOpsRequest` CRO. + +8. Then the `KubeDB` Ops-manager operator will expand the storage of the cluster component as specified on the `SinglestoreOpsRequest` CRO. + +In the next docs, we are going to show a step by step guide on Autoscaling storage of various Kafka cluster components using `SinglestoreAutoscaler` CRD. diff --git a/docs/guides/singlestore/backup/_index.md b/docs/guides/singlestore/backup/_index.md index f6b4e6f801..60dfa7346c 100644 --- a/docs/guides/singlestore/backup/_index.md +++ b/docs/guides/singlestore/backup/_index.md @@ -1,5 +1,5 @@ --- -title: Backup & Restore SingleStore +title: Monitoring SingleStore menu: docs_{{ .version }}: identifier: guides-sdb-backup diff --git a/docs/guides/singlestore/backup/kubestash/application-level/index.md b/docs/guides/singlestore/backup/kubestash/application-level/index.md index 64b7929728..e998a33e02 100644 --- a/docs/guides/singlestore/backup/kubestash/application-level/index.md +++ b/docs/guides/singlestore/backup/kubestash/application-level/index.md @@ -3,7 +3,7 @@ title: Application Level Backup & Restore SingleStore | KubeStash description: Application Level Backup and Restore using KubeStash menu: docs_{{ .version }}: - identifier: guides-application-level-backup-stashv2 + identifier: guides-sdb-application-level-backup-stashv2 name: Application Level Backup parent: guides-sdb-backup-stashv2 weight: 40 @@ -165,7 +165,7 @@ sample-singlestore-pods ClusterIP None 3306/TCP ``` -Here, we have to use service `sample-singlestore` and secret `sample-singlestore-root-cred` to connect with the database. `KubeDB` creates an [AppBinding](/docs/guides/mysql/concepts/appbinding/index.md) CR that holds the necessary information to connect with the database. +Here, we have to use service `sample-singlestore` and secret `sample-singlestore-root-cred` to connect with the database. `KubeDB` creates an [AppBinding](/docs/guides/singlestore/concepts/appbinding.md) CR that holds the necessary information to connect with the database. **Verify AppBinding:** @@ -493,7 +493,7 @@ If everything goes well, the phase of the `BackupConfiguration` should be `Ready ```bash $ kubectl get backupconfiguration -n demo -NAME PHASE PAUSED AGE +NAME PHASE PAUSED AGE sample-singlestore-backup Ready 2m50s ``` @@ -501,7 +501,7 @@ Additionally, we can verify that the `Repository` specified in the `BackupConfig ```bash $ kubectl get repo -n demo -NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE +NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE gcs-singlestore-repo 0 0 B Ready 3m ``` @@ -515,8 +515,8 @@ Verify that the `CronJob` has been created using the following command, ```bash $ kubectl get cronjob -n demo -NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE -trigger-sample-singlestore-backup-frequent-backup */5 * * * * 0 2m45s 3m25s +NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE +trigger-sample-singlestore-backup-frequent-backup */5 * * * * 0 2m45s 3m25s ``` **Verify BackupSession:** @@ -528,7 +528,7 @@ Run the following command to watch `BackupSession` CR, ```bash $ kubectl get backupsession -n demo -w -NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE +NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE sample-singlestore-backup-frequent-backup-1724065200 BackupConfiguration sample-singlestore-backup Succeeded 7m22s ``` @@ -540,8 +540,8 @@ Once a backup is complete, KubeStash will update the respective `Repository` CR ```bash $ kubectl get repository -n demo gcs-singlestore-repo -NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE -gcs-singlestore-repo true 1 806 B Ready 8m27s 9m18s +NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE +gcs-singlestore-repo true 1 806 B Ready 8m27s 9m18s ``` At this moment we have one `Snapshot`. Run the following command to check the respective `Snapshot` which represents the state of a backup run for an application. diff --git a/docs/guides/singlestore/clustering/_index.md b/docs/guides/singlestore/clustering/_index.md new file mode 100644 index 0000000000..58610731fd --- /dev/null +++ b/docs/guides/singlestore/clustering/_index.md @@ -0,0 +1,10 @@ +--- +title: Clustering +menu: + docs_{{ .version }}: + identifier: sdb-clustering + name: Clustering + parent: guides-singlestore + weight: 25 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/singlestore/clustering/overview/images/sdb-cluster-1.png b/docs/guides/singlestore/clustering/overview/images/sdb-cluster-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b008f5198786e7a1dbbcfaf665626bcd77875b7b GIT binary patch literal 456012 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

_bh$Zf*J6G-xn<{g_vX8G$? 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�aGPL;J*4 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 z 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
  • pgg^{w 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 New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Cluster + +Here we'll discuss some concepts about SingleStore Cluster. + +### what is SingleStore Cluster + +A `SingleStore cluster` is a distributed database system that consists of multiple servers (nodes) working together to provide high performance, scalability, and fault tolerance for data storage and processing. It is specifically designed to handle both transactional (OLTP) and analytical (OLAP) workloads, making it suitable for a wide range of real-time data use cases. Here’s a detailed look at what a SingleStore cluster is and how it functions: + +
    +  SingleStore Cluster +
    Fig: SingleStore Cluster
    +
    + +### Components of a SingleStore Cluster + +A SingleStore cluster is made up of two main types of nodes: + +- Aggregators: + - Purpose: These nodes act as query routers. Aggregators handle query parsing, optimization, and distribution to the other nodes in the cluster. They do not store data themselves. + - Role: Aggregators receive SQL queries, optimize them, and then route them to the appropriate leaf nodes that actually store and process the data. + - Benefits: They help balance the workload and ensure that queries are efficiently executed by leveraging the full processing power of the cluster. + +- Leaves: + - Purpose: These are the nodes responsible for data storage and processing. They store data in distributed partitions called shards. + - Role: Leaf nodes are responsible for executing the actual query tasks. They perform data retrieval, computation, and provide results back to the aggregators. + - Benefits: Leaf nodes ensure that data is distributed across the cluster, enabling horizontal scalability and high fault tolerance. + +### How a SingleStore Cluster Works + +- Data Sharding and Partitioning: + - In a SingleStore cluster, data is partitioned into `shards` that are distributed across multiple leaf nodes. Each shard is a portion of the overall dataset, and the distribution allows the workload to be spread evenly, improving both read and write performance. + - Sharding also allows for `parallel processing`, which enhances query performance by splitting tasks among several nodes. + +- Scalability: + - SingleStore clusters can be `scaled horizontally` by adding more nodes (both leaf and aggregator). As data volume grows, adding more leaf nodes allows the system to continue performing efficiently without the need for massive hardware upgrades. + - Aggregator nodes can also be scaled to handle more queries concurrently, helping balance the load during times of high user activity. + +- High Availability and Fault Tolerance: + - SingleStore clusters maintain multiple replicas of each shard on different leaf nodes. This replication provides `high availability (HA)` because if one node fails, another node holding a replica can take over, ensuring no data loss and minimizing downtime. + - The automatic failover and `self-healing` capabilities ensure that the system continues to operate smoothly even in the face of hardware or software failures. + +- Distributed Query Processing: + - When a query is submitted to an aggregator, it breaks down the query into smaller tasks and sends them to relevant leaf nodes. + - `Parallel processing` at the leaf nodes enables quick handling of large, complex queries, making it particularly effective for real-time analytics. + +- Hybrid Workload Handling: + - SingleStore is a `unified database`, meaning it can handle `both OLTP (Online Transaction Processing)` and `OLAP (Online Analytical Processing)` workloads within the same cluster. + - This capability is achieved by storing data in rowstore for fast transactions and `columnstore` for efficient analytical queries, which can be leveraged simultaneously. + +### Key Features of a SingleStore Cluster + +- Elastic Scaling: Nodes can be added or removed without significant downtime, allowing the system to adjust to changing workload requirements. +- In-Memory Storage: Data can be stored in memory to enhance processing speed, particularly useful for applications requiring real-time performance. +- Cloud Integration: SingleStore clusters are designed to work well in cloud environments, supporting deployments on cloud infrastructure or container orchestration platforms like `Kubernetes`. + +### Use Cases + +- Real-Time Analytics: The combination of in-memory processing and distributed architecture allows SingleStore clusters to handle real-time analytical queries over large datasets, which is valuable in industries like finance, retail, and IoT. +- Mixed Workloads: SingleStore can handle simultaneous read-heavy analytics and write-heavy transactional workloads, making it a good choice for applications that need both low-latency transactions and in-depth data analysis. +- Data Warehousing: The ability to process large volumes of data quickly also makes SingleStore suitable for `modern data warehousing`, where performance is crucial for handling big data operations. + +### Benefits of SingleStore Clusters + +- High Throughput: The distributed nature allows the system to support high data ingestion rates and large-scale analytical processing. +- Fault Tolerance: With multiple replicas of each shard, SingleStore clusters provide redundancy, helping to ensure that data is not lost and the system remains available. +- Simplified Management: SingleStore offers tools that simplify the management of clusters, including auto-failover and data rebalancing. + +### Limitations + +- Resource Overhead: Running a distributed cluster comes with extra costs in terms of hardware or cloud resources, especially due to the need for replication. +- Complexity in Management: Managing a large cluster, particularly in hybrid cloud or on-prem environments, can become complex and requires knowledge of distributed systems. +- Network Dependency: The cluster performance relies heavily on the network, and any issues with network latency or bandwidth can impact overall efficiency. + +## Next Steps + +- [Deploy SingleStore Cluster](/docs/guides/singlestore/clustering/singlestore-clustering) using KubeDB. \ No newline at end of file diff --git a/docs/guides/singlestore/clustering/singlestore-clustering/examples/sample-sdb.yaml b/docs/guides/singlestore/clustering/singlestore-clustering/examples/sample-sdb.yaml new file mode 100644 index 0000000000..6724836ede --- /dev/null +++ b/docs/guides/singlestore/clustering/singlestore-clustering/examples/sample-sdb.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.6" + requests: + memory: "2Gi" + cpu: "0.6" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.6" + requests: + memory: "2Gi" + cpu: "0.6" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/clustering/singlestore-clustering/index.md b/docs/guides/singlestore/clustering/singlestore-clustering/index.md new file mode 100644 index 0000000000..02a5ebab14 --- /dev/null +++ b/docs/guides/singlestore/clustering/singlestore-clustering/index.md @@ -0,0 +1,458 @@ +--- +title: Cluster Guide +menu: + docs_{{ .version }}: + identifier: guides-sdb-clustering + name: Cluster Guide + parent: sdb-clustering + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# KubeDB - SingleStore Cluster + +This tutorial will show you how to use KubeDB to provision a `singlestore cluster`. + +## Before You Begin + +Before proceeding: + +- Read [singlestore cluster concept](/docs/guides/singlestore/clustering/overview) to learn about SingleStore cluster. + +- 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/). + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md). + +- 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: + + ```bash + $ kubectl create ns demo + namespace/demo created + ``` + +> Note: The yaml files used in this tutorial are stored in [docs/examples/singlestore](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/clustering/singlestore-clustering/examples) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Create a SingleStore database + +KubeDB implements a `Singlestore` CRD to define the specification of a SingleStore database. Below is the `Singlestore` object created in this tutorial. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.6" + requests: + memory: "2Gi" + cpu: "0.6" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "0.6" + requests: + memory: "2Gi" + cpu: "0.6" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/clustering/singlestore-clustering/examples/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` +Here, + +- `spec.version` is the name of the SinglestoreVersion CRD where the docker images are specified. In this tutorial, a SingleStore `8.7.10` database is going to be created. +- `spec.topology` specifies that it will be used as cluster mode. If this field is nil it will be work as standalone mode. +- `spec.topology.aggregator.replicas` or `spec.topology.leaf.replicas` specifies that the number replicas that will be used for aggregator or leaf. +- `spec.storageType` specifies the type of storage that will be used for SingleStore database. It can be `Durable` or `Ephemeral`. Default value of this field is `Durable`. If `Ephemeral` is used then KubeDB will create SingleStore database using `EmptyDir` volume. In this case, you don't have to specify `spec.storage` field. This is useful for testing purposes. +- `spec.topology.aggregator.storage` or `spec.topology.leaf.storage` specifies the StorageClass of PVC dynamically allocated to store data for this database. This storage spec will be passed to the PetSet created by KubeDB operator to run database pods. You can specify any StorageClass available in your cluster with appropriate resource requests. +- `spec.deletionPolicy` gives flexibility whether to `nullify`(reject) the delete operation of `Singlestore` crd or which resources KubeDB should keep or delete when you delete `Singlestore` crd. If admission webhook is enabled, It prevents users from deleting the database as long as the `spec.deletionPolicy` is set to `DoNotTerminate`. Learn details of all `DeletionPolicy` [here](/docs/guides/mysql/concepts/database/index.md#specdeletionpolicy) + +> Note: `spec.storage` section is used to create PVC for database pod. It will create PVC with storage size specified in `storage.resources.requests` field. Don't specify limits here. PVC does not get resized automatically. + +KubeDB operator watches for `Singlestore` objects using Kubernetes api. When a `Singlestore` object is created, KubeDB operator will create new PetSet and Service with the matching SingleStore object name. KubeDB operator will also create a governing service for PetSets, if one is not already present. + +```bash +$ kubectl get petset,pvc,pv,svc -n demo +NAME AGE +petset.apps.k8s.appscode.com/sample-sdb-aggregator 16m +petset.apps.k8s.appscode.com/sample-sdb-leaf 16m + +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE +persistentvolumeclaim/data-sample-sdb-aggregator-0 Bound pvc-a6c9041cba69454a 10Gi RWO linode-block-storage-retain 16m +persistentvolumeclaim/data-sample-sdb-leaf-0 Bound pvc-674ba189a2f24383 10Gi RWO linode-block-storage-retain 16m +persistentvolumeclaim/data-sample-sdb-leaf-1 Bound pvc-16e4224adec54d96 10Gi RWO linode-block-storage-retain 16m + +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +persistentvolume/pvc-16e4224adec54d96 10Gi RWO Retain Bound demo/data-sample-sdb-leaf-1 linode-block-storage-retain 16m +persistentvolume/pvc-674ba189a2f24383 10Gi RWO Retain Bound demo/data-sample-sdb-leaf-0 linode-block-storage-retain 16m +persistentvolume/pvc-a6c9041cba69454a 10Gi RWO Retain Bound demo/data-sample-sdb-aggregator-0 linode-block-storage-retain 16m + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/sample-sdb ClusterIP 10.128.15.230 3306/TCP,8081/TCP 16m +service/sample-sdb-pods ClusterIP None 3306/TCP 16m + + +``` + +KubeDB operator sets the `status.phase` to `Running` once the database is successfully created. Run the following command to see the modified Singlestore object: + +```yaml +$ kubectl get sdb -n demo sample-sdb -oyaml +kind: Singlestore +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"Singlestore","metadata":{"annotations":{},"name":"sample-sdb","namespace":"demo"},"spec":{"deletionPolicy":"WipeOut","licenseSecret":{"name":"license-secret"},"storageType":"Durable","topology":{"aggregator":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"0.6","memory":"2Gi"},"requests":{"cpu":"0.6","memory":"2Gi"}}}]}},"replicas":1,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}}}},"leaf":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"0.6","memory":"2Gi"},"requests":{"cpu":"0.6","memory":"2Gi"}}}]}},"replicas":2,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"10Gi"}}}}},"version":"8.7.10"}} + creationTimestamp: "2024-10-01T09:39:36Z" + finalizers: + - kubedb.com + generation: 2 + name: sample-sdb + namespace: demo + resourceVersion: "117016" + uid: 22b254e0-d185-413c-888f-ca4c2524e909 +spec: + authSecret: + name: sample-sdb-root-cred + deletionPolicy: WipeOut + healthChecker: + failureThreshold: 1 + periodSeconds: 10 + timeoutSeconds: 10 + licenseSecret: + name: license-secret + storageType: Durable + topology: + aggregator: + podTemplate: + controller: {} + metadata: {} + spec: + containers: + - name: singlestore + resources: + limits: + cpu: 600m + memory: 2Gi + requests: + cpu: 600m + memory: 2Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + - name: singlestore-coordinator + resources: + limits: + memory: 256Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + initContainers: + - name: singlestore-init + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 512Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + podPlacementPolicy: + name: default + securityContext: + fsGroup: 999 + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + podTemplate: + controller: {} + metadata: {} + spec: + containers: + - name: singlestore + resources: + limits: + cpu: 600m + memory: 2Gi + requests: + cpu: 600m + memory: 2Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + - name: singlestore-coordinator + resources: + limits: + memory: 256Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + initContainers: + - name: singlestore-init + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 512Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + podPlacementPolicy: + name: default + securityContext: + fsGroup: 999 + replicas: 2 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + version: 8.7.10 +status: + conditions: + - lastTransitionTime: "2024-10-01T09:39:36Z" + message: 'The KubeDB operator has started the provisioning of Singlestore: demo/sample-sdb' + observedGeneration: 1 + reason: DatabaseProvisioningStartedSuccessfully + status: "True" + type: ProvisioningStarted + - lastTransitionTime: "2024-10-01T09:57:51Z" + message: All leaf replicas are ready for Singlestore demo/sample-sdb + observedGeneration: 2 + reason: AllReplicasReady + status: "True" + type: ReplicaReady + - lastTransitionTime: "2024-10-01T09:41:04Z" + message: database demo/sample-sdb is accepting connection + observedGeneration: 2 + reason: AcceptingConnection + status: "True" + type: AcceptingConnection + - lastTransitionTime: "2024-10-01T09:41:04Z" + message: database demo/sample-sdb is ready + observedGeneration: 2 + reason: AllReplicasReady + status: "True" + type: Ready + - lastTransitionTime: "2024-10-01T09:41:05Z" + message: 'The Singlestore: demo/sample-sdb is successfully provisioned.' + observedGeneration: 2 + reason: DatabaseSuccessfullyProvisioned + status: "True" + type: Provisioned + phase: Ready + +``` + +## Connect with SingleStore database + +KubeDB operator has created a new Secret called `sample-sdb-root-cred` *(format: {singlestore-object-name}-root-cred)* for storing the password for `singlestore` superuser. This secret contains a `username` key which contains the *username* for SingleStore superuser and a `password` key which contains the *password* for SingleStore superuser. + +If you want to use an existing secret please specify that when creating the SingleStore object using `spec.authSecret.name`. While creating this secret manually, make sure the secret contains these two keys containing data `username` and `password` and also make sure of using `root` as value of `username`. For more details see [here](/docs/guides/mysql/concepts/database/index.md#specdatabasesecret). + +Now, we need `username` and `password` to connect to this database from `kubectl exec` command. In this example `sample-sdb-root-cred` secret holds username and password + +```bash +$ kubectl get pod -n demo sample-sdb-master-aggregator-0 -oyaml | grep podIP + podIP: 10.244.0.14 +$ kubectl get secrets -n demo sample-sdb-root-cred -o jsonpath='{.data.\username}' | base64 -d + root +$ kubectl get secrets -n demo sample-sdb-root-cred -o jsonpath='{.data.\password}' | base64 -d + J0h_BUdJB8mDO31u +``` +we will exec into the pod `sample-sdb-master-aggregator-0` and connect to the database using username and password + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulting container name to singlestore. +Use 'kubectl describe pod/sample-sdb-aggregator-0 -n demo' to see all of the containers in this pod. + +[memsql@sample-sdb-master-aggregator-0 /]$ memsql -uroot -p"J0h_BUdJB8mDO31u" +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 1114 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show databases; ++--------------------+ +| Database | ++--------------------+ +| cluster | +| information_schema | +| memsql | +| singlestore_health | ++--------------------+ +4 rows in set (0.00 sec) + +singlestore> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); +Query OK, 0 rows affected, 1 warning (0.27 sec) + +singlestore> SHOW TABLES IN playground; ++----------------------+ +| Tables_in_playground | ++----------------------+ +| equipment | ++----------------------+ +1 row in set (0.00 sec) + +singlestore> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue"); +Query OK, 1 row affected (1.15 sec) + +singlestore> SELECT * FROM playground.equipment; ++----+-------+-------+-------+ +| id | type | quant | color | ++----+-------+-------+-------+ +| 1 | slide | 2 | blue | ++----+-------+-------+-------+ +1 row in set (0.14 sec) + +singlestore> exit +Bye +``` +You can also connect with database management tools like [singlestore-studio](https://docs.singlestore.com/db/v8.5/reference/singlestore-tools-reference/singlestore-studio/) + +You can simply access to SingleStore studio by forwarding the Primary service port to any of your localhost port. Or, Accessing through ExternalP's 8081 port is also an option. + +```bash +$ kubectl port-forward -n demo service/sample-sdb 8081 +Forwarding from 127.0.0.1:8081 -> 8081 +Forwarding from [::1]:8081 -> 8081 +``` +Lets, open your browser and go to the http://localhost:8081 or with TLS https://localhost:8081 then click on `Add or Create Cluster` option. +Then choose `Add Existing Cluster` and click on `next` and you will get an interface like that below: + +

    +  studio-1 +

    + +After giving the all information you can see like this below UI image. + +

    +  studio-1 +

    + + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl patch -n demo singlestore/sample-sdb -p '{"spec":{"deletionPolicy":"WipeOut"}}' --type="merge" +kubectl delete -n demo singlestore/sample-sdb +kubectl delete ns demo +``` diff --git a/docs/guides/singlestore/concepts/_index.md b/docs/guides/singlestore/concepts/_index.md new file mode 100644 index 0000000000..1d9314c17b --- /dev/null +++ b/docs/guides/singlestore/concepts/_index.md @@ -0,0 +1,10 @@ +--- +title: SingleStore Concepts +menu: + docs_{{ .version }}: + identifier: sdb-concepts-singlestore + name: Concepts + parent: guides-singlestore + weight: 20 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/concepts/appbinding.md b/docs/guides/singlestore/concepts/appbinding.md new file mode 100644 index 0000000000..56aec98790 --- /dev/null +++ b/docs/guides/singlestore/concepts/appbinding.md @@ -0,0 +1,152 @@ +--- +title: AppBinding CRD +menu: + docs_{{ .version }}: + identifier: sdb-appbinding-concepts + name: AppBinding + parent: sdb-concepts-singlestore + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# AppBinding + +## What is AppBinding + +An `AppBinding` is a Kubernetes `CustomResourceDefinition`(CRD) which points to an application using either its URL (usually for a non-Kubernetes resident service instance) or a Kubernetes service object (if self-hosted in a Kubernetes cluster), some optional parameters and a credential secret. To learn more about AppBinding and the problems it solves, please read this blog post: [The case for AppBinding](https://appscode.com/blog/post/the-case-for-appbinding). + +If you deploy a database using [KubeDB](https://kubedb.com/docs/0.11.0/concepts/), `AppBinding` object will be created automatically for it. Otherwise, you have to create an `AppBinding` object manually pointing to your desired database. + +KubeDB uses [Stash](https://appscode.com/products/stash/) to perform backup/recovery of databases. Stash needs to know how to connect with a target database and the credentials necessary to access it. This is done via an `AppBinding`. + +## AppBinding CRD Specification + +Like any official Kubernetes resource, an `AppBinding` has `TypeMeta`, `ObjectMeta` and `Spec` sections. However, unlike other Kubernetes resources, it does not have a `Status` section. + +An `AppBinding` object created by `KubeDB` for SingleStore database is shown below, + +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"Singlestore","metadata":{"annotations":{},"name":"sdb","namespace":"demo"},"spec":{"deletionPolicy":"WipeOut","licenseSecret":{"name":"license-secret"},"storageType":"Durable","topology":{"aggregator":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"600m","memory":"2Gi"},"requests":{"cpu":"600m","memory":"2Gi"}}}]}},"replicas":2,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}}}},"leaf":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"600m","memory":"2Gi"},"requests":{"cpu":"600m","memory":"2Gi"}}}]}},"replicas":2,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"10Gi"}}}}},"version":"8.7.10"}} + creationTimestamp: "2024-08-15T09:04:57Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: sdb + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: singlestores.kubedb.com + name: sdb + namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: Singlestore + name: sdb + uid: efeededa-7dc8-4e98-b4e4-0e0603adc32c + resourceVersion: "5633763" + uid: 77dc8123-52f6-4832-a6e2-478795e487b7 +spec: + appRef: + apiGroup: kubedb.com + kind: Singlestore + name: sdb + namespace: demo + clientConfig: + service: + name: sdb + path: / + port: 3306 + scheme: tcp + url: tcp(sdb.demo.svc:3306)/ + parameters: + apiVersion: config.kubedb.com/v1alpha1 + kind: SinglestoreConfiguration + masterAggregator: sdb-aggregator-0.sdb-pods.demo.svc + stash: + addon: + backupTask: + name: "" + restoreTask: + name: "" + secret: + name: sdb-root-cred + type: kubedb.com/singlestore + version: 8.7.10 +``` + +Here, we are going to describe the sections of an `AppBinding` crd. + +### AppBinding `Spec` + +An `AppBinding` object has the following fields in the `spec` section: + +#### spec.type + +`spec.type` is an optional field that indicates the type of the app that this `AppBinding` is pointing to. Stash uses this field to resolve the values of `TARGET_APP_TYPE`, `TARGET_APP_GROUP` and `TARGET_APP_RESOURCE` variables of [BackupBlueprint](https://appscode.com/products/stash/latest/concepts/crds/backupblueprint/) object. + +This field follows the following format: `/`. The above AppBinding is pointing to a `postgres` resource under `kubedb.com` group. + +Here, the variables are parsed as follows: + +| Variable | Usage | +| --------------------- |--------------------------------------------------------------------------------------------------------------------------------------| +| `TARGET_APP_GROUP` | Represents the application group where the respective app belongs (i.e: `kubedb.com`). | +| `TARGET_APP_RESOURCE` | Represents the resource under that application group that this appbinding represents (i.e: `singlestore`). | +| `TARGET_APP_TYPE` | Represents the complete type of the application. It's simply `TARGET_APP_GROUP/TARGET_APP_RESOURCE` (i.e: `kubedb.com/singlestore`). | + +#### spec.secret + +`spec.secret` specifies the name of the secret which contains the credentials that are required to access the database. This secret must be in the same namespace as the `AppBinding`. + +This secret must contain the following keys: + +SingleStore : + +| Key | Usage | +|------------|------------------------------------------------| +| `username` | Username of the target database. | +| `password` | Password for the user specified by `password`. | + +#### spec.appRef +appRef refers to the underlying application. It has 4 fields named `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. + +You can configure following fields in `spec.clientConfig` section: + +- **spec.clientConfig.url** + + `spec.clientConfig.url` gives the location of the database, in standard URL form (i.e. `[scheme://]host:port/[path]`). This is particularly useful when the target database is running outside of the Kubernetes cluster. If your database is running inside the cluster, use `spec.clientConfig.service` section instead. + +> Note that, attempting to use a user or basic auth (e.g. `user:password@host:port`) is not allowed. Stash will insert them automatically from the respective secret. Fragments ("#...") and query parameters ("?...") are not allowed either. + +- **spec.clientConfig.service** + + If you are running the database inside the Kubernetes cluster, you can use Kubernetes service to connect with the database. You have to specify the following fields in `spec.clientConfig.service` section if you manually create an `AppBinding` object. + + - **name :** `name` indicates the name of the service that connects with the target database. + - **scheme :** `scheme` specifies the scheme (i.e. http, https) to use to connect with the database. + - **port :** `port` specifies the port where the target database is running. + +- **spec.clientConfig.insecureSkipTLSVerify** + + `spec.clientConfig.insecureSkipTLSVerify` is used to disable TLS certificate verification while connecting with the database. We strongly discourage to disable TLS verification during backup. You should provide the respective CA bundle through `spec.clientConfig.caBundle` field instead. + +- **spec.clientConfig.caBundle** + + `spec.clientConfig.caBundle` is a PEM encoded CA bundle which will be used to validate the serving certificate of the database. + +## Next Steps + +- Learn how to use KubeDB to manage various databases [here](/docs/guides/README.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/singlestore/concepts/autoscaler.md b/docs/guides/singlestore/concepts/autoscaler.md new file mode 100644 index 0000000000..7cdf268819 --- /dev/null +++ b/docs/guides/singlestore/concepts/autoscaler.md @@ -0,0 +1,152 @@ +--- +title: SingleStoreAutoscaler CRD +menu: + docs_{{ .version }}: + identifier: sdb-autoscaler-concepts + name: SingleStoreAutoscaler + parent: sdb-concepts-singlestore + weight: 26 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStoreAutoscaler + +## What is SingleStoreAutoscaler + +`SingleStoreAutoscaler` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration for autoscaling [SingleStore](https://www.singlestore.com/) compute resources and storage of database components in a Kubernetes native way. + +## SingleStoreAutoscaler CRD Specifications + +Like any official Kubernetes resource, a `SingleStoreAutoscaler` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here, some sample `SingleStoreAutoscaler` CROs for autoscaling different components of database is given below: + +**Sample `SingleStoreAutoscaler` for cluster database:** + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-as-cluster + namespace: demo +spec: + databaseRef: + name: sdb-sample + storage: + leaf: + trigger: "On" + usageThreshold: 30 + scalingThreshold: 50 + expansionMode: "Offline" + upperBound: "100Gi" + aggregator: + trigger: "On" + usageThreshold: 40 + scalingThreshold: 50 + expansionMode: "Offline" + upperBound: "100Gi" + compute: + aggregator: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 900m + memory: 3000Mi + maxAllowed: + cpu: 2000m + memory: 6Gi + controlledResources: ["cpu", "memory"] + resourceDiffPercentage: 10 + leaf: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 900m + memory: 3000Mi + maxAllowed: + cpu: 2000m + memory: 6Gi + controlledResources: ["cpu", "memory"] + resourceDiffPercentage: 10 +``` + +**Sample `SingleStoreAutoscaler` for standalone database:** + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: SinglestoreAutoscaler +metadata: + name: sdb-as-standalone + namespace: demo +spec: + databaseRef: + name: sdb-standalone + storage: + node: + trigger: "On" + usageThreshold: 40 + scalingThreshold: 50 + expansionMode: "Offline" + upperBound: "100Gi" + compute: + node: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 900m + memory: 3000Mi + maxAllowed: + cpu: 2000m + memory: 6Gi + controlledResources: ["cpu", "memory"] + resourceDiffPercentage: 10 +``` + +Here, we are going to describe the various sections of a `SingleStoreAutoscaler` crd. + +A `SingleStoreAutoscaler` object has the following fields in the `spec` section. + +### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) object for which the autoscaling will be performed. This field consists of the following sub-field: + +- **spec.databaseRef.name :** specifies the name of the [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) object. + +### spec.opsRequestOptions +These are the options to pass in the internally created opsRequest CRO. `opsRequestOptions` has three fields. They have been described in details [here](/docs/guides/singlestore/concepts/opsrequest.md#specreadinesscriteria). + +### spec.compute + +`spec.compute` specifies the autoscaling configuration for the compute resources i.e. cpu and memory of the database components. This field consists of the following sub-field: + +- `spec.compute.standalone` indicates the desired compute autoscaling configuration for a standalone SingleStore database. +- `spec.compute.aggregator` indicates the desired compute autoscaling configuration for aggregator node of cluster mode. +- `spec.compute.leaf` indicates the desired compute autoscaling configuration for the leaf node of cluster mode. + +All of them has the following sub-fields: + +- `trigger` indicates if compute autoscaling is enabled for this component of the database. If "On" then compute autoscaling is enabled. If "Off" then compute autoscaling is disabled. +- `minAllowed` specifies the minimal amount of resources that will be recommended, default is no minimum. +- `maxAllowed` specifies the maximum amount of resources that will be recommended, default is no maximum. +- `controlledResources` specifies which type of compute resources (cpu and memory) are allowed for autoscaling. Allowed values are "cpu" and "memory". +- `containerControlledValues` specifies which resource values should be controlled. Allowed values are "RequestsAndLimits" and "RequestsOnly". +- `resourceDiffPercentage` specifies the minimum resource difference between recommended value and the current value in percentage. If the difference percentage is greater than this value than autoscaling will be triggered. +- `podLifeTimeThreshold` specifies the minimum pod lifetime of at least one of the pods before triggering autoscaling. + +### spec.storage + +`spec.compute` specifies the autoscaling configuration for the storage resources of the database components. This field consists of the following sub-field: + +- `spec.compute.standalone` indicates the desired storage autoscaling configuration for a standalone SingleStore database. +- `spec.compute.leaf` indicates the desired storage autoscaling configuration for leaf node of cluster mode. +- `spec.compute.aggregator` indicates the desired storage autoscaling configuration for aggregator node of cluster mode. + +All of them has the following sub-fields: + +- `trigger` indicates if storage autoscaling is enabled for this component of the database. If "On" then storage autoscaling is enabled. If "Off" then storage autoscaling is disabled. +- `usageThreshold` indicates usage percentage threshold, if the current storage usage exceeds then storage autoscaling will be triggered. +- `scalingThreshold` indicates the percentage of the current storage that will be scaled. +- `expansionMode` indicates the volume expansion mode. diff --git a/docs/guides/singlestore/concepts/catalog.md b/docs/guides/singlestore/concepts/catalog.md new file mode 100644 index 0000000000..b9b143ff4e --- /dev/null +++ b/docs/guides/singlestore/concepts/catalog.md @@ -0,0 +1,105 @@ +--- +title: SingleStoreVersion CRD +menu: + docs_{{ .version }}: + identifier: sdb-catalog-concepts + name: SingleStoreVersion + parent: sdb-concepts-singlestore + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStoreVersion + +## What is SingleStoreVersion + +`SingleStoreVersion` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration to specify the docker images to be used for [SingleStore](https://www.singlestore.com/) database deployed with KubeDB in a Kubernetes native way. + +When you install KubeDB, a `SingleStoreVersion` custom resource will be created automatically for every supported SingleStore versions. You have to specify the name of `SingleStoreVersion` crd in `spec.version` field of [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) crd. Then, KubeDB will use the docker images specified in the `SingleStoreVersion` crd to create your expected database. + +Using a separate crd for specifying respective docker images, and pod security policy names allow us to modify the images, and policies independent of KubeDB operator.This will also allow the users to use a custom image for the database. + +## SingleStoreVersion Spec + +As with all other Kubernetes objects, a SingleStoreVersion needs `apiVersion`, `kind`, and `metadata` fields. It also needs a `.spec` section. + +```yaml +apiVersion: catalog.kubedb.com/v1alpha1 +kind: SinglestoreVersion +metadata: + name: 8.7.10 +spec: + coordinator: + image: ghcr.io/kubedb/singlestore-coordinator:v0.3.0 + db: + image: ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 + initContainer: + image: ghcr.io/kubedb/singlestore-init:8.7.10-v1 + securityContext: + runAsGroup: 998 + runAsUser: 999 + standalone: + image: singlestore/cluster-in-a-box:alma-8.7.10-95e2357384-4.1.0-1.17.14 + updateConstraints: + allowlist: + - '> 8.7.10, <= 8.7.10' + version: 8.7.10 +``` + +### metadata.name + +`metadata.name` is a required field that specifies the name of the `SingleStoreVersion` crd. You have to specify this name in `spec.version` field of [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) crd. + +We follow this convention for naming SingleStoreVersion crd: + +- Name format: `{Original SingleStore image verion}-{modification tag}` + +We modify original SingleStore docker image to support SingleStore clustering and re-tag the image with v1, v2 etc. modification tag. An image with higher modification tag will have more features than the images with lower modification tag. Hence, it is recommended to use SingleStoreVersion crd with highest modification tag to enjoy the latest features. + +### spec.version + +`spec.version` is a required field that specifies the original version of SingleStore database that has been used to build the docker image specified in `spec.db.image` field. + +### spec.deprecated + +`spec.deprecated` is an optional field that specifies whether the docker images specified here is supported by the current KubeDB operator. + +The default value of this field is `false`. If `spec.deprecated` is set to `true`, KubeDB operator will skip processing this CRD object and will add a event to the CRD object specifying that the DB version is deprecated. + +### spec.db.image + +`spec.db.image` is a required field that specifies the docker image which will be used to create Petset by KubeDB operator to create expected SingleStore database. + +### spec.coordinator.image + +`spec.coordinator.image` is a required field that specifies the docker image which will be used to create Petset by KubeDB operator to create expected SingleStore database. + +### spec.initContainer.image + +`spec.initContainer.image` is a required field that specifies the image for init container. + +### spec.updateConstraints +updateConstraints specifies the constraints that need to be considered during version update. Here `allowList` contains the versions those are allowed for updating from the current version. +An empty list of AllowList indicates all the versions are accepted except the denyList. +On the other hand, `DenyList` contains all the rejected versions for the update request. An empty list indicates no version is rejected. + +### spec.podSecurityPolicies.databasePolicyName + +`spec.podSecurityPolicies.databasePolicyName` is a required field that specifies the name of the pod security policy required to get the database server pod(s) running. + +```bash +helm upgrade -i kubedb oci://ghcr.io/appscode-charts/kubedb \ + --namespace kubedb --create-namespace \ + --set additionalPodSecurityPolicies[0]=custom-db-policy \ + --set additionalPodSecurityPolicies[1]=custom-snapshotter-policy \ + --set-file global.license=/path/to/the/license.txt \ + --wait --burst-limit=10000 --debug +``` + +## Next Steps + +- Learn about SingleStore crd [here](/docs/guides/singlestore/concepts/singlestore.md). +- Deploy your first SingleStore database with KubeDB by following the guide [here](/docs/guides/singlestore/quickstart/quickstart.md). \ No newline at end of file diff --git a/docs/guides/singlestore/concepts/opsrequest.md b/docs/guides/singlestore/concepts/opsrequest.md new file mode 100644 index 0000000000..2a356704ea --- /dev/null +++ b/docs/guides/singlestore/concepts/opsrequest.md @@ -0,0 +1,475 @@ +--- +title: SingleStoreOpsRequests CRD +menu: + docs_{{ .version }}: + identifier: sdb-opsrequest-concepts + name: SingleStoreOpsRequest + parent: sdb-concepts-singlestore + weight: 25 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStoreOpsRequest + +## What is SingleStoreOpsRequest + +`SingleStoreOpsRequest` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration for [SingleStore](https://www.singlestore.com/) administrative operations like database version updating, horizontal scaling, vertical scaling etc. in a Kubernetes native way. + +## SingleStoreOpsRequest CRD Specifications + +Like any official Kubernetes resource, a `SingleStoreOpsRequest` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here, some sample `SingleStoreOpsRequest` CRs for different administrative operations is given below: + +**Sample `SingleStoreOpsRequest` for updating database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-version-upd + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: sdb + updateVersion: + targetVersion: 8.7.10 + timeout: 5m + apply: IfReady +``` + +**Sample `SingleStoreOpsRequest` Objects for Horizontal Scaling of different component of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-hscale + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: sdb + horizontalScaling: + aggregator: 2 + leaf: 3 +``` + +**Sample `SingleStoreOpsRequest` Objects for Vertical Scaling of different component of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-scale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: sdb-sample + verticalScaling: + leaf: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" + coordinator: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" + node: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-scale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: sdb-standalone + verticalScaling: + node: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" +``` + +**Sample `SingleStoreOpsRequest` Objects for Reconfiguring different database components:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: sdb-sample + configuration: + aggregator: + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 + leaf: + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: sdb-standalone + configuration: + node: + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: sdb-sample + configuration: + aggregator: + configSecret: + name: sdb-new-custom-config + leaf: + configSecret: + name: sdb-new-custom-config +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: sdb-standalone + configuration: + node: + configSecret: + name: sdb-new-custom-config +``` + +**Sample `SingleStoreOpsRequest` Objects for Volume Expansion of different database components:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-volume-ops + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: sdb-sample + volumeExpansion: + mode: "Offline" + aggregator: 10Gi + leaf: 20Gi +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-volume-ops + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: sdb-standalone + volumeExpansion: + mode: "Online" + node: 20Gi +``` + +**Sample `SingleStoreOpsRequest` Objects for Reconfiguring TLS of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-tls-reconfigure + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sdb-sample + tls: + issuerRef: + name: sdb-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + subject: + organizations: + - singlestore + organizationalUnits: + - client +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-tls-reconfigure + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sdb-sample + tls: + rotateCertificates: true +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-tls-reconfigure + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sdb-sample + tls: + remove: true +``` + +Here, we are going to describe the various sections of a `SingleStoreOpsRequest` crd. + +A `SingleStoreOpsRequest` object has the following fields in the `spec` section. + +### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) object for which the administrative operations will be performed. This field consists of the following sub-field: + +- **spec.databaseRef.name :** specifies the name of the [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) object. + +### spec.type + +`spec.type` specifies the kind of operation that will be applied to the database. Currently, the following types of operations are allowed in `SingleStoreOpsRequest`. + +- `Upgrade` / `UpdateVersion` +- `HorizontalScaling` +- `VerticalScaling` +- `VolumeExpansion` +- `Reconfigure` +- `ReconfigureTLS` +- `Restart` + +> You can perform only one type of operation on a single `SingleStoreOpsRequest` CR. For example, if you want to update your database and scale up its replica then you have to create two separate `SingleStoreOpsRequest`. At first, you have to create a `SingleStoreOpsRequest` for updating. Once it is completed, then you can create another `SingleStoreOpsRequest` for scaling. + +> Note: There is an exception to the above statement. It is possible to specify both `spec.configuration` & `spec.verticalScaling` in a OpsRequest of type `VerticalScaling`. + +### spec.updateVersion + +If you want to update you SingleStore version, you have to specify the `spec.updateVersion` section that specifies the desired version information. This field consists of the following sub-field: + +- `spec.updateVersion.targetVersion` refers to a [SingleStoreVersion](/docs/guides/singlestore/concepts/catalog.md) CR that contains the SingleStore version information where you want to update. + +Have a look on the [`updateConstraints`](/docs/guides/singlestore/concepts/catalog.md#specupdateconstraints) of the singlestoreVersion spec to know which versions are supported for updating from the current version. +```yaml +kubectl get sdbversion -o=jsonpath='{.spec.updateConstraints}' | jq +``` + +> You can only update between SingleStore versions. KubeDB does not support downgrade for SingleStore. + +### spec.horizontalScaling + +If you want to scale-up or scale-down your SingleStore cluster or different components of it, you have to specify `spec.horizontalScaling` section. This field consists of the following sub-field: + +- `spec.horizontalScaling.aggregator.replicas` indicates the desired number of aggregator nodes for cluster mode after scaling. +- `spec.horizontalScaling.leaf.replicas` indicates the desired number of leaf nodes for cluster mode after scaling. + +### spec.verticalScaling + +`spec.verticalScaling` is a required field specifying the information of `SingleStore` resources like `cpu`, `memory` etc that will be scaled. This field consists of the following sub-fields: + +- `spec.verticalScaling.node` indicates the desired resources for standalone SingleStore database after scaling. +- `spec.verticalScaling.aggregator` indicates the desired resources for aggregator node of SingleStore cluster after scaling. +- `spec.verticalScaling.leaf` indicates the desired resources for leaf nodes of SingleStore cluster after scaling. +- `spec.verticalScaling.coordinator` indicates the desired resources for the coordinator container. + +All of them has the below structure: + +```yaml +requests: + memory: "2000Mi" + cpu: "0.7" +limits: + memory: "3000Mi" + cpu: "0.9" +``` + +Here, when you specify the resource request, the scheduler uses this information to decide which node to place the container of the Pod on and when you specify a resource limit for the container, the `kubelet` enforces those limits so that the running container is not allowed to use more of that resource than the limit you set. You can found more details from [here](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/). + +### spec.volumeExpansion + +> To use the volume expansion feature the storage class must support volume expansion + +If you want to expand the volume of your SingleStore cluster or different components of it, you have to specify `spec.volumeExpansion` section. This field consists of the following sub-field: + +- `spec.mode` specifies the volume expansion mode. Supported values are `Online` & `Offline`. The default is `Online`. +- `spec.volumeExpansion.node` indicates the desired size for the persistent volume of a standalone SingleStore database. +- `spec.volumeExpansion.aggregator` indicates the desired size for the persistent volume of aggregator node of cluster. +- `spec.volumeExpansion.leaf` indicates the desired size for the persistent volume of leaf node of cluster. + +All of them refer to [Quantity](https://v1-22.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#quantity-resource-core) types of Kubernetes. + +Example usage of this field is given below: + +```yaml +spec: + volumeExpansion: + aggregator: "20Gi" +``` + +This will expand the volume size of all the shard nodes to 20 GB. + +### spec.configuration + +If you want to reconfigure your Running SingleStore cluster or different components of it with new custom configuration, you have to specify `spec.configuration` section. This field consists of the following sub-field: + +- `spec.configuration.standalone` indicates the desired new custom configuration for a standalone SingleStore database. +- `spec.configuration.aggregator` indicates the desired new custom configuration for aggregator node of cluster mode. +- `spec.configuration.leaf` indicates the desired new custom configuration for leaf node of cluster mode. + +All of them has the following sub-fields: + +- `configSecret` points to a secret in the same namespace of a SingleStore resource, which contains the new custom configurations. If there are any configSecret set before in the database, this secret will replace it. +- `applyConfig` contains the new custom config as a string which will be merged with the previous configuration. + +- `applyConfig` is a map where key supports values, namely `sdb-apply.cnf`. And value represents the corresponding configurations. +KubeDB provisioner operator applies these two directly while reconciling. + +```yaml + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 +``` + +- `removeCustomConfig` is a boolean field. Specify this field to true if you want to remove all the custom configuration from the deployed singlestore server. + +### spec.tls + +If you want to reconfigure the TLS configuration of your database i.e. add TLS, remove TLS, update issuer/cluster issuer or Certificates and rotate the certificates, you have to specify `spec.tls` section. This field consists of the following sub-field: + +- `spec.tls.issuerRef` specifies the issuer name, kind and api group. +- `spec.tls.certificates` specifies the certificates. You can learn more about this field from [here](/docs/guides/singlestore/concepts/singlestore.md#spectls). +- `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.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. + + +### SingleStoreOpsRequest `Status` + +`.status` describes the current state and progress of a `SingleStoreOpsRequest` operation. It has the following fields: + +### status.phase + +`status.phase` indicates the overall phase of the operation for this `SingleStoreOpsRequest`. It can have the following three values: + +| Phase | Meaning | +|-------------|----------------------------------------------------------------------------------------| +| Successful | KubeDB has successfully performed the operation requested in the SingleStoreOpsRequest | +| Progressing | KubeDB has started the execution of the applied SingleStoreOpsRequest | +| Failed | KubeDB has failed the operation requested in the SingleStoreOpsRequest | +| Denied | KubeDB has denied the operation requested in the SingleStoreOpsRequest | +| Skipped | KubeDB has skipped the operation requested in the SingleStoreOpsRequest | + +Important: Ops-manager Operator can skip an opsRequest, only if its execution has not been started yet & there is a newer opsRequest applied in the cluster. `spec.type` has to be same as the skipped one, in this case. + +### status.observedGeneration + +`status.observedGeneration` shows the most recent generation observed by the `SingleStoreOpsRequest` controller. + +### status.conditions + +`status.conditions` is an array that specifies the conditions of different steps of `SingleStoreOpsRequest` processing. Each condition entry has the following fields: + +- `types` specifies the type of the condition. SingleStoreOpsRequest has the following types of conditions: + +| Type | Meaning | +|-----------------------------|----------------------------------------------------------------------------| +| `Progressing` | Specifies that the operation is now in the progressing state | +| `Successful` | Specifies such a state that the operation on the database was successful. | +| `HaltDatabase` | Specifies such a state that the database is halted by the operator | +| `ResumeDatabase` | Specifies such a state that the database is resumed by the operator | +| `Failed` | Specifies such a state that the operation on the database failed. | +| `StartingBalancer` | Specifies such a state that the balancer has successfully started | +| `StoppingBalancer` | Specifies such a state that the balancer has successfully stopped | +| `UpdatePetSetResources` | Specifies such a state that the PetSet resources has been updated | +| `UpdateAggregatorResources` | Specifies such a state that the Aggregator resources has been updated | +| `UpdateLeafResources` | Specifies such a state that the Leaf resources has been updated | +| `UpdateNodeResources` | Specifies such a state that the node has been updated | +| `ScaleDownAggregator` | Specifies such a state that the scale down operation of aggregator | +| `ScaleUpAggregator` | Specifies such a state that the scale up operation of aggregator | +| `ScaleUpLeaf` | Specifies such a state that the scale up operation of leaf | +| `ScaleDownleaf` | Specifies such a state that the scale down operation of leaf | +| `VolumeExpansion` | Specifies such a state that the volume expansion operation of the database | +| `ReconfigureAggregator` | Specifies such a state that the reconfiguration of aggregator nodes | +| `ReconfigureLeaf` | Specifies such a state that the reconfiguration of leaf nodes | +| `ReconfigureNode` | Specifies such a state that the reconfiguration of standalone nodes | + +- The `status` field is a string, with possible values `True`, `False`, and `Unknown`. + - `status` will be `True` if the current transition succeeded. + - `status` will be `False` if the current transition failed. + - `status` will be `Unknown` if the current transition was denied. +- The `message` field is a human-readable message indicating details about the condition. +- The `reason` field is a unique, one-word, CamelCase reason for the condition's last transition. +- The `lastTransitionTime` field provides a timestamp for when the operation last transitioned from one state to another. +- The `observedGeneration` shows the most recent condition transition generation observed by the controller. \ No newline at end of file diff --git a/docs/guides/singlestore/concepts/singlestore.md b/docs/guides/singlestore/concepts/singlestore.md new file mode 100644 index 0000000000..3d1b2fb66a --- /dev/null +++ b/docs/guides/singlestore/concepts/singlestore.md @@ -0,0 +1,322 @@ +--- +title: SingleStore CRD +menu: + docs_{{ .version }}: + identifier: sdb-singlestore-concepts + name: SingleStore + parent: sdb-concepts-singlestore + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- +# SingleStore + +## What is SingleStore + +`SingleStore` is a Kubernetes `Custom Resource Definitions` (CRD). It provides declarative configuration for [SingleStore](https://www.singlestore.com/) in a Kubernetes native way. You only need to describe the desired database configuration in a SingleStore object, and the KubeDB operator will create Kubernetes objects in the desired state for you. + +## SingleStore Spec + +As with all other Kubernetes objects, a SingleStore needs `apiVersion`, `kind`, and `metadata` fields. It also needs a `.spec` section. Below is an example SingleStore object. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "4Gi" + cpu: "1000m" + requests: + memory: "2Gi" + cpu: "500m" + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 3 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "5Gi" + cpu: "1100m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 40Gi + storageType: Durable + licenseSecret: + name: license-secret + authSecret: + name: given-secret + init: + script: + configMap: + name: sdb-init-script + monitor: + agent: prometheus.io/operator + prometheus: + exporter: + port: 9104 + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut + tls: + issuerRef: + apiGroup: cert-manager.io + kind: Issuer + name: sdb-issuer + certificates: + - alias: server + subject: + organizations: + - kubedb:server + dnsNames: + - localhost + ipAddresses: + - "127.0.0.1" + serviceTemplates: + - alias: primary + metadata: + annotations: + passMe: ToService + spec: + type: NodePort + ports: + - name: http + port: 9200 +``` + +### spec.version + +`spec.version` is a required field specifying the name of the [SinglestoreVersion](/docs/guides/singlestore/concepts/catalog.md) crd where the docker images are specified. Currently, when you install KubeDB, it creates the following `SinglestoreVersion` resources, + +- `8.1.32` +- `8.5.7`, `8.5.30` +- `8.7.10` + +### spec.topology + +`spec.topology` is an optional field that enables you to specify the clustering mode. + +- `aggregator` or `leaf` are optional field that configure cluster mode that contains the following fields: + - `replicas` the number of nodes of `aggregator` and `leaf` in cluster mode. + - `configSecret` is an optional field that points to a Secret used to hold custom SingleStore configuration. + - `podTemplate` providing a template for database. KubeDB operator will pass the information provided in `podTemplate` to the PetSet created for the SingleStore database. KubeDB accepts the following fields to set in `podTemplate:` + - metadata: + - annotations (pod's annotation) + - controller: + - annotations (petset's annotation) + - spec: + - initContainers + - imagePullSecrets + - resources + - containers + - nodeSelector + - serviceAccountName + - securityContext + - tolerations + - imagePullSecrets + - podPlacementPolicy + - volumes + - If you set `spec.storageType` to `Durable`, then `storage` is a required field that specifies the StorageClass of PVCs dynamically allocated to store data for the database. This storage spec will be passed to the PetSet created by KubeDB operator to run database pods. You can specify any StorageClass available in your cluster with appropriate resource requests. + - `storage.storageClassName` is the name of the StorageClass used to provision PVCs. PVCs don’t necessarily have to request a class. A PVC with its storageClassName set equal to "" is always interpreted to be requesting a PV with no class, so it can only be bound to PVs with no class (no annotation or one set equal to ""). A PVC with no storageClassName is not quite the same and is treated differently by the cluster depending on whether the DefaultStorageClass admission plugin is turned on. + - `storage.accessModes` uses the same conventions as Kubernetes PVCs when requesting storage with specific access modes. + - `storage.resources` can be used to request specific quantities of storage. This follows the same resource model used by PVCs. + To learn how to configure `storage`, please visit the links below: + - https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims + +### spec.storageType + +`spec.storageType` is an optional field that specifies the type of storage to use for database. It can be either `Durable` or `Ephemeral`. The default value of this field is `Durable`. If `Ephemeral` is used then KubeDB will create Kafka cluster using [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) volume. + +### spec.licenseSecret + +`spec.licenseSecret` is a mandatory fields points to a secret used to pass SingleStore license. + +### spec.authSecret + +`spec.authSecret` is an optional field that points to a Secret used to hold credentials for `singlestore` root user. If not set, the KubeDB operator creates a new Secret `{singlestore-object-name}-cred` for storing the password for `singlestore` root user for each SingleStore object. If you want to use an existing secret please specify that when creating the SingleStore object using `spec.authSecret.name`. + +This secret contains a `user` key and a `password` key which contains the `username` and `password` respectively for `singlestore` root user. Here, the value of `user` key is fixed to be `root`. + +Secrets provided by users are not managed by KubeDB, and therefore, won't be modified or garbage collected by the KubeDB operator (version 0.13.0 and higher). + +Example: + +```bash +$ kubectl create secret generic sdb-cred -n demo \ +--from-literal=user=root \ +--from-literal=password=6q8u_2jMOW-OOZXk +secret "sdb-cred" created +``` + +```yaml +apiVersion: v1 +data: + password: NnE4dV8yak1PVy1PT1pYaw== + user: cm9vdA== +kind: Secret +metadata: + name: sdb-cred + namespace: demo +type: Opaque +``` + +#### Initialize via Script + +To initialize a SingleStore database using a script (shell script, sql script, etc.), set the `spec.init.script` section when creating a SingleStore object. It will execute files alphabetically with extensions `.sh` , `.sql` and `.sql.gz` that is found in the repository. The scripts inside child folders will be skipped. script must have the following information: + +- [VolumeSource](https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes): Where your script is loaded from. + +Below is an example showing how a script from a configMap can be used to initialize a SingleStore database. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb + namespace: demo +spec: + version: 8.7.10 + init: + script: + configMap: + name: sdb-init-script + licenseSecret: + name: license-secret +``` + +In the above example, KubeDB operator will launch a Job to execute all js script of `sdb-init-script` in alphabetical order once PetSet pods are running. For more details tutorial on how to initialize from script, please visit [here](/docs/guides/mysql/initialization/index.md). + +### spec.monitor + +SingleStore managed by KubeDB can be monitored with builtin-Prometheus and Prometheus operator. To learn more, + +- [Monitor SingleStore with builtin Prometheus](/docs/guides/singlestore/monitoring/builtin-prometheus/index.md) +- [Monitor SingleStore with Prometheus operator](/docs/guides/singlestore/monitoring/prometheus-operator/index.md) + +### spec.tls + +`spec.tls` specifies the TLS/SSL configurations for the SingleStore. + +The following fields are configurable in the `spec.tls` section: + +- `issuerRef` is a reference to the `Issuer` or `ClusterIssuer` CR of [cert-manager](https://cert-manager.io/docs/concepts/issuer/) that will be used by `KubeDB` to generate necessary certificates. + + - `apiGroup` is the group name of the resource being referenced. The value for `Issuer` or `ClusterIssuer` is "cert-manager.io" (cert-manager v0.12.0 and later). + - `kind` is the type of resource being referenced. KubeDB supports both `Issuer` and `ClusterIssuer` as values for this field. + - `name` is the name of the resource (`Issuer` or `ClusterIssuer`) being referenced. + +- `certificates` (optional) are a list of certificates used to configure the server and/or client certificate. It has the following fields: + + - `alias` represents the identifier of the certificate. It has the following possible value: + - `server` is used for server certificate identification. + - `client` is used for client certificate identification. + - `metrics-exporter` is used for metrics exporter certificate identification. + - `secretName` (optional) specifies the k8s secret name that holds the certificates. + >This field is optional. If the user does not specify this field, the default secret name will be created in the following format: `--cert`. + - `subject` (optional) specifies an `X.509` distinguished name. It has the following possible field, + - `organizations` (optional) are the list of different organization names to be used on the Certificate. + - `organizationalUnits` (optional) are the list of different organization unit name to be used on the Certificate. + - `countries` (optional) are the list of country names to be used on the Certificate. + - `localities` (optional) are the list of locality names to be used on the Certificate. + - `provinces` (optional) are the list of province names to be used on the Certificate. + - `streetAddresses` (optional) are the list of a street address to be used on the Certificate. + - `postalCodes` (optional) are the list of postal code to be used on the Certificate. + - `serialNumber` (optional) is a serial number to be used on the Certificate. + You can found more details from [Here](https://golang.org/pkg/crypto/x509/pkix/#Name) + + - `duration` (optional) is the period during which the certificate is valid. + - `renewBefore` (optional) is a specifiable time before expiration duration. + - `dnsNames` (optional) is a list of subject alt names to be used in the Certificate. + - `ipAddresses` (optional) is a list of IP addresses to be used in the Certificate. + - `uriSANs` (optional) is a list of URI Subject Alternative Names to be set in the Certificate. + - `emailSANs` (optional) is a list of email Subject Alternative Names to be set in the Certificate. + +### spec.serviceTemplates + +You can also provide template for the services created by KubeDB operator for Kafka cluster through `spec.serviceTemplates`. This will allow you to set the type and other properties of the services. + +KubeDB allows following fields to set in `spec.serviceTemplates`: +- `alias` represents the identifier of the service. It has the following possible value: + - `stats` is used for the exporter service identification. +- metadata: + - labels + - annotations +- spec: + - type + - ports + - clusterIP + - externalIPs + - loadBalancerIP + - loadBalancerSourceRanges + - externalTrafficPolicy + - healthCheckNodePort + - sessionAffinityConfig + +See [here](https://github.com/kmodules/offshoot-api/blob/kubernetes-1.21.1/api/v1/types.go#L237) to understand these fields in detail. + +### spec.deletionPolicy + +`deletionPolicy` gives flexibility whether to `nullify`(reject) the delete operation of `singlestore` crd or which resources KubeDB should keep or delete when you delete `singlestore` crd. KubeDB provides following four deletion policies: + +- DoNotTerminate +- WipeOut +- Halt +- Delete + +When `deletionPolicy` is `DoNotTerminate`, KubeDB takes advantage of `ValidationWebhook` feature in Kubernetes 1.9.0 or later clusters to implement `DoNotTerminate` feature. If admission webhook is enabled, `DoNotTerminate` prevents users from deleting the database as long as the `spec.deletionPolicy` is set to `DoNotTerminate`. + +Following table show what KubeDB does when you delete MySQL crd for different termination policies, + +| Behavior | DoNotTerminate | Halt | Delete | WipeOut | +|---------------------------| :------------: | :------: | :------: | :------: | +| 1. Block Delete operation | ✓ | ✗ | ✗ | ✗ | +| 2. Delete PetSet | ✗ | ✓ | ✓ | ✓ | +| 3. Delete Services | ✗ | ✓ | ✓ | ✓ | +| 4. Delete PVCs | ✗ | ✗ | ✓ | ✓ | +| 5. Delete Secrets | ✗ | ✗ | ✗ | ✓ | +| 6. Delete Snapshots | ✗ | ✗ | ✗ | ✓ | + +If you don't specify `spec.deletionPolicy` KubeDB uses `Delete` termination policy by default. + +## 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 SingleStore database [here](/docs/guides/singlestore/README.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/singlestore/configuration/_index.md b/docs/guides/singlestore/configuration/_index.md new file mode 100755 index 0000000000..6580eb5067 --- /dev/null +++ b/docs/guides/singlestore/configuration/_index.md @@ -0,0 +1,10 @@ +--- +title: Run SingleStore with Custom Configuration +menu: + docs_{{ .version }}: + identifier: guides-sdb-configuration + name: Custom Configuration + parent: guides-singlestore + weight: 30 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/configuration/config-file/index.md b/docs/guides/singlestore/configuration/config-file/index.md new file mode 100644 index 0000000000..6106d9ef4c --- /dev/null +++ b/docs/guides/singlestore/configuration/config-file/index.md @@ -0,0 +1,247 @@ +--- +title: Run SingleStore with Custom Configuration +menu: + docs_{{ .version }}: + identifier: guides-sdb-configuration-using-config-file + name: Config File + parent: guides-sdb-configuration + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Using Custom Configuration File + +KubeDB supports providing custom configuration for SingleStore. This tutorial will show you how to use KubeDB to run a SingleStore database with custom configuration. + +## 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/). + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + + ```bash + $ kubectl create ns demo + namespace/demo created + + $ kubectl get ns demo + NAME STATUS AGE + demo Active 5s + ``` + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/configuration/config-file/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/configuration/config-file/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Overview + +SingleStore allows to configure database via configuration file. The default configuration for SingleStore can be found in `/var/lib/memsql/instance/memsql.cnf` file. When SingleStore starts, it will look for custom configuration file in `/etc/memsql/conf.d` directory. If configuration file exist, SingleStore instance will use combined startup setting from both `/var/lib/memsql/instance/memsql.cnf` and `*.cnf` files in `/etc/memsql/conf.d` directory. This custom configuration will overwrite the existing default one. To know more about configuring SingleStore see [here](https://docs.singlestore.com/db/v8.7/reference/configuration-reference/cluster-config-files/singlestore-server-config-files/). + +At first, you have to create a config file with `.cnf` extension with your desired configuration. Then you have to put this file into a [volume](https://kubernetes.io/docs/concepts/storage/volumes/). You need to specify this volume in the `spec.configSecret` section when creating the SingleStore CRD for `Standalone` mode. Additionally, you can modify your `aggregator` and `leaf` nodes separately by providing separate configSecrets, or use the same one in the `spec.topology.aggregator.configSecret` and `spec.topology.leaf.configSecret` sections when creating the SingleStore CRD for `Cluster` mode. KubeDB will mount this volume into `/etc/memsql/conf.d` directory of the database pod. + +In this tutorial, we will configure [max_connections](https://docs.singlestore.com/db/v8.7/reference/configuration-reference/engine-variables/list-of-engine-variables/#in-depth-variable-definitions) and [read_buffer_size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_read_buffer_size) via a custom config file. We will use configMap as volume source. + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Custom Configuration + +At first, let's create `sdb-config.cnf` file setting `max_connections` and `read_buffer_size` parameters. + +```bash +cat < sdb-config.cnf +[server] +max_connections = 250 +read_buffer_size = 1048576 +EOF + +$ cat sdb-config.cnf +[server] +max_connections = 250 +read_buffer_size = 122880 +``` + +Now, create a secret with this configuration file. + +```bash +$ kubectl create secret generic -n demo sdb-configuration --from-file=./sdb-config.cnf +configmap/sdb-configuration created +``` + +Verify the secret has the configuration file. + +```yaml +$ kubectl get secret -n demo sdb-configuration -o yaml +apiVersion: v1 +data: + sdb-config.cnf: W3NlcnZlcl0KbWF4X2Nvbm5lY3Rpb25zID0gMjUwCnJlYWRfYnVmZmVyX3NpemUgPSAxMjI4ODAK +kind: Secret +metadata: + creationTimestamp: "2024-10-02T12:54:35Z" + name: sdb-configuration + namespace: demo + resourceVersion: "99627" + uid: c2621d8e-ebca-4300-af05-0180512ce031 +type: Opaque + + +``` + +Now, create SingleStore crd specifying `spec.topology.aggregator.configSecret` and `spec.topology.leaf.configSecret` field. + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/config-file/yamls/sdb-custom.yaml +singlestore.kubedb.com/custom-sdb created +``` + +Below is the YAML for the SingleStore crd we just created. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: custom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Now, wait a few minutes. KubeDB operator will create necessary PVC, petset, services, secret etc. + +Check that the petset's pod is running + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +custom-sdb-aggregator-0 2/2 Running 0 94s +custom-sdb-aggregator-1 2/2 Running 0 88s +custom-sdb-leaf-0 2/2 Running 0 91s +custom-sdb-leaf-1 2/2 Running 0 86s + +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +custom-sdb kubedb.com/v1alpha2 8.7.10 Ready 4m29s + +``` + +We can see the database is in ready phase so it can accept conncetion. + +Now, we will check if the database has started with the custom configuration we have provided. + +> Read the comment written for the following commands. They contain the instructions and explanations of the commands. + +```bash +# Connceting to the database +$ kubectl exec -it -n demo custom-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@custom-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 208 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# value of `max_conncetions` is same as provided +singlestore> show variables like 'max_connections'; ++-----------------+-------+ +| Variable_name | Value | ++-----------------+-------+ +| max_connections | 250 | ++-----------------+-------+ +1 row in set (0.00 sec) + +# value of `read_buffer_size` is same as provided +singlestore> show variables like 'read_buffer_size'; ++------------------+--------+ +| Variable_name | Value | ++------------------+--------+ +| read_buffer_size | 122880 | ++------------------+--------+ +1 row in set (0.00 sec) + +singlestore> exit +Bye + +``` +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl patch -n demo my/custom-sdb -p '{"spec":{"deletionPolicy":"WipeOut"}}' --type="merge" +kubectl delete -n demo my/custom-sdb +kubectl delete ns demo +``` + +If you would like to uninstall KubeDB operator, please follow the steps [here](/docs/setup/README.md). + +## Next Steps +- [Quickstart SingleStore](/docs/guides/singlestore/quickstart/quickstart.md) with KubeDB Operator. +- Detail concepts of [singlestore object](/docs/guides/singlestore/concepts/singlestore.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/singlestore/configuration/config-file/yamls/sdb-config.cnf b/docs/guides/singlestore/configuration/config-file/yamls/sdb-config.cnf new file mode 100644 index 0000000000..f2adc327aa --- /dev/null +++ b/docs/guides/singlestore/configuration/config-file/yamls/sdb-config.cnf @@ -0,0 +1,3 @@ +[server] +max_connections = 250 +read_buffer_size = 122880 diff --git a/docs/guides/singlestore/configuration/config-file/yamls/sdb-custom.yaml b/docs/guides/singlestore/configuration/config-file/yamls/sdb-custom.yaml new file mode 100644 index 0000000000..dee95b8ba4 --- /dev/null +++ b/docs/guides/singlestore/configuration/config-file/yamls/sdb-custom.yaml @@ -0,0 +1,57 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: custom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + diff --git a/docs/guides/singlestore/configuration/podtemplating/index.md b/docs/guides/singlestore/configuration/podtemplating/index.md new file mode 100644 index 0000000000..66fd5c8111 --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/index.md @@ -0,0 +1,712 @@ +--- +title: Run SingleStore with Custom PodTemplate +menu: + docs_{{ .version }}: + identifier: guides-sdb-configuration-using-podtemplate + name: Customize PodTemplate + parent: guides-sdb-configuration + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Run SingleStore with Custom PodTemplate + +KubeDB supports providing custom configuration for SingleStore via [PodTemplate](/docs/guides/singlestore/concepts/singlestore.md#spec.topology). This tutorial will show you how to use KubeDB to run a SingleStore database with custom configuration using PodTemplate. + +## 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/). + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + + ```bash + $ kubectl create ns demo + namespace/demo created + ``` + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/configuration/podtemplating/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Overview + +KubeDB allows providing a template for `leaf` and `aggregator` pod through `spec.topology.aggregator.podTemplate` and `spec.topology.leaf.podTemplate`. KubeDB operator will pass the information provided in `spec.topology.aggregator.podTemplate` and `spec.topology.leaf.podTemplate` to the `aggregator` and `leaf` PetSet created for SingleStore database. + +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: + - volumes + - initContainers + - containers + - imagePullSecrets + - nodeSelector + - affinity + - serviceAccountName + - schedulerName + - tolerations + - priorityClassName + - priority + - securityContext + - livenessProbe + - readinessProbe + - lifecycle + +Read about the fields in details in [PodTemplate concept](/docs/guides/singlestore/concepts/singlestore.md#spectopology), + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## CRD Configuration + +Below is the YAML for the SingleStore created in this example. Here, [`spec.topology.aggregator/leaf.podTemplate.spec.args`](/docs/guides/mysql/concepts/database/index.md#specpodtemplatespecargs) provides extra arguments. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-misc-config + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + args: + - --character-set-server=utf8mb4 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + args: + - --character-set-server=utf8mb4 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-misc-config.yaml +singlestore.kubedb.com/sdb-misc-config created +``` + +Now, wait a few minutes. KubeDB operator will create necessary PVC, petset, services, secret etc. If everything goes well, we will see that a pod with the name `sdb-misc-config-aggregator-0` has been created. + +Check that the petset's pod is running + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +sdb-misc-config-aggregator-0 2/2 Running 0 4m51s +sdb-misc-config-leaf-0 2/2 Running 0 4m48s +sdb-misc-config-leaf-1 2/2 Running 0 4m30s +``` + +Now, we will check if the database has started with the custom configuration we have provided. + +```bash +$ kubectl exec -it -n demo sdb-misc-config-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-misc-config-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 311 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> SHOW VARIABLES LIKE 'char%'; ++--------------------------+------------------------------------------------------+ +| Variable_name | Value | ++--------------------------+------------------------------------------------------+ +| character_set_client | utf8mb4 | +| character_set_connection | utf8mb4 | +| character_set_database | utf8mb4 | +| character_set_filesystem | binary | +| character_set_results | utf8mb4 | +| character_set_server | utf8mb4 | +| character_set_system | utf8 | +| character_sets_dir | /opt/memsql-server-8.7.10-95e2357384/share/charsets/ | ++--------------------------+------------------------------------------------------+ +8 rows in set (0.00 sec) + +singlestore> exit +Bye + +``` + +Here we can see the character_set_server value is utf8mb4. + +## Custom Sidecar Containers + +Here in this example we will add an extra sidecar container with our SingleStore cluster. This below example configuration allows you to run a SingleStore instance alongside a simple Nginx sidecar container, which can be used for HTTP requests, logging, or as a reverse proxy. Adjust the configuration as needed to fit your application's architecture. + +Firstly, we are going to create a sample configmap for the nginx configuration. Here is the yaml of ConfigMap + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-config-map + namespace: demo +data: + default.conf: | + server { + listen 80; + location / { + proxy_pass http://localhost:9000; + } + } +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/nginx-config-map.yaml +configmap/nginx-config-map created +``` + +Now we will deploy our singlestore with custom sidecar container. Here is the yaml of singlestore, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-custom-sidecar + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + - name: sidecar + image: nginx:alpine + ports: + - containerPort: 80 + volumeMounts: + - name: nginx-config + mountPath: /etc/nginx/conf.d + volumes: + - name: nginx-config + configMap: + name: nginx-config-map + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Here, + +- Primary Container: The main singlestore container runs the SingleStore database, configured with specific resource limits and requests. + +- Sidecar Container: The sidecar container runs Nginx, a lightweight web server. It's configured to listen on port 80 and is intended to proxy requests to the SingleStore database. + +- Volume Mounts: The sidecar container mounts a volume for Nginx configuration from a ConfigMap, which allows you to customize Nginx's behavior. + +- Volumes: A volume is defined to link the ConfigMap nginx-config-map to the Nginx configuration directory. + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-custom-sidecar.yaml +singlestore.kubedb.com/sdb-custom-sidecar created +``` + +Now, wait a few minutes. KubeDB operator will create necessary petset, services, secret etc. If everything goes well, we will see the pods has been created. + +Check that the petset's pod is running + +```bash +$ kubectl get pods -n demo +NAME READY STATUS RESTARTS AGE +sdb-custom-sidecar-aggregator-0 3/3 Running 0 3m17s +sdb-custom-sidecar-leaf-0 2/2 Running 0 3m14s +sdb-custom-sidecar-leaf-1 2/2 Running 0 2m59s +``` + +Now check the logs of sidecar container, + +```bash +$ kubectl logs -f -n demo sdb-custom-sidecar-aggregator-0 -c sidecar +/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?) +/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh +/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh +/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh +/docker-entrypoint.sh: Configuration complete; ready for start up +2024/10/29 07:43:11 [notice] 1#1: using the "epoll" event method +2024/10/29 07:43:11 [notice] 1#1: nginx/1.27.2 +2024/10/29 07:43:11 [notice] 1#1: built by gcc 13.2.1 20240309 (Alpine 13.2.1_git20240309) +2024/10/29 07:43:11 [notice] 1#1: OS: Linux 6.8.0-47-generic +2024/10/29 07:43:11 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 +2024/10/29 07:43:11 [notice] 1#1: start worker processes +2024/10/29 07:43:11 [notice] 1#1: start worker process 21 +2024/10/29 07:43:11 [notice] 1#1: start worker process 22 +2024/10/29 07:43:11 [notice] 1#1: start worker process 23 +2024/10/29 07:43:11 [notice] 1#1: start worker process 24 +2024/10/29 07:43:11 [notice] 1#1: start worker process 25 +2024/10/29 07:43:11 [notice] 1#1: start worker process 26 +2024/10/29 07:43:11 [notice] 1#1: start worker process 27 +2024/10/29 07:43:11 [notice] 1#1: start worker process 28 +2024/10/29 07:43:11 [notice] 1#1: start worker process 29 +2024/10/29 07:43:11 [notice] 1#1: start worker process 30 +2024/10/29 07:43:11 [notice] 1#1: start worker process 31 +2024/10/29 07:43:11 [notice] 1#1: start worker process 32 +``` +So, we have successfully deploy sidecar container in KubeDB manage SingleStore. + +## Using Node Selector + +Here in this example we will use [node selector](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/) to schedule our singlestore pod to a specific node. Applying nodeSelector to the Pod involves several steps. We first need to assign a label to some node that will be later used by the `nodeSelector` . Let’s find what nodes exist in your cluster. To get the name of these nodes, you can run: + +```bash +$ kubectl get nodes --show-labels +NAME STATUS ROLES AGE VERSION LABELS +lke212553-307295-339173d10000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-339173d10000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=618158120a299c6fd37f00d01d355ca18794c467,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5541798e0000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5541798e0000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=75cfe3dbbb0380f1727efc53f5192897485e95d5,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5b53c5520000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5b53c5520000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=792bac078d7ce0e548163b9423416d7d8c88b08f,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +``` +As you see, we have three nodes in the cluster: lke212553-307295-339173d10000, lke212553-307295-5541798e0000, and lke212553-307295-5b53c5520000. + +Next, select a node to which you want to add a label. For example, let’s say we want to add a new label with the key `disktype` and value ssd to the `lke212553-307295-5541798e0000` node, which is a node with the SSD storage. To do so, run: +```bash +$ kubectl label nodes lke212553-307295-5541798e0000 disktype=ssd +node/lke212553-307295-5541798e0000 labeled +``` +As you noticed, the command above follows the format `kubectl label nodes =` . +Finally, let’s verify that the new label was added by running: +```bash + $ kubectl get nodes --show-labels +NAME STATUS ROLES AGE VERSION LABELS +lke212553-307295-339173d10000 Ready 41m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-339173d10000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=618158120a299c6fd37f00d01d355ca18794c467,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5541798e0000 Ready 41m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,disktype=ssd,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5541798e0000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=75cfe3dbbb0380f1727efc53f5192897485e95d5,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5b53c5520000 Ready 41m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5b53c5520000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=792bac078d7ce0e548163b9423416d7d8c88b08f,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +``` +As you see, the lke212553-307295-5541798e0000 now has a new label disktype=ssd. To see all labels attached to the node, you can also run: +```bash +$ kubectl describe node "lke212553-307295-5541798e0000" +Name: lke212553-307295-5541798e0000 +Roles: +Labels: beta.kubernetes.io/arch=amd64 + beta.kubernetes.io/instance-type=g6-dedicated-4 + beta.kubernetes.io/os=linux + disktype=ssd + failure-domain.beta.kubernetes.io/region=ap-south + kubernetes.io/arch=amd64 + kubernetes.io/hostname=lke212553-307295-5541798e0000 + kubernetes.io/os=linux + lke.linode.com/pool-id=307295 + node.k8s.linode.com/host-uuid=75cfe3dbbb0380f1727efc53f5192897485e95d5 + node.kubernetes.io/instance-type=g6-dedicated-4 + topology.kubernetes.io/region=ap-south + topology.linode.com/region=ap-south +``` +Along with the `disktype=ssd` label we’ve just added, you can see other labels such as `beta.kubernetes.io/arch` or `kubernetes.io/hostname`. These are all default labels attached to Kubernetes nodes. + +Now let's create a singlestore with this new label as nodeSelector. Below is the yaml we are going to apply: +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-node-selector + namespace: demo +spec: + version: "8.7.10" + podTemplate: + spec: + nodeSelector: + disktype: ssd + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable +``` +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-node-selector.yaml +singlestore.kubedb.com/sdb-node-selector created +``` +Now, wait a few minutes. KubeDB operator will create necessary petset, services, secret etc. If everything goes well, we will see that a pod with the name `sdb-node-selector-0` has been created. + +Check that the petset's pod is running + +```bash +$ kubectl get pods -n demo +NAME READY STATUS RESTARTS AGE +sdb-node-selector-0 1/1 Running 0 60s +``` +As we see the pod is running, you can verify that by running `kubectl get pods -n demo sdb-node-selector-0 -o wide` and looking at the “NODE” to which the Pod was assigned. +```bash +$ kubectl get pods -n demo sdb-node-selector-0 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +sdb-node-selector-0 1/1 Running 0 3m19s 10.2.1.7 lke212553-307295-5541798e0000 +``` +We can successfully verify that our pod was scheduled to our desired node. + +## Using Taints and Tolerations + +Here in this example we will use [Taints and Tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) to schedule our singlestore pod to a specific node and also prevent from scheduling to nodes. Applying taints and tolerations to the Pod involves several steps. Let’s find what nodes exist in your cluster. To get the name of these nodes, you can run: + +```bash +$ kubectl get nodes --show-labels +NAME STATUS ROLES AGE VERSION LABELS +lke212553-307295-339173d10000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-339173d10000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=618158120a299c6fd37f00d01d355ca18794c467,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5541798e0000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5541798e0000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=75cfe3dbbb0380f1727efc53f5192897485e95d5,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +lke212553-307295-5b53c5520000 Ready 36m v1.30.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=g6-dedicated-4,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=ap-south,kubernetes.io/arch=amd64,kubernetes.io/hostname=lke212553-307295-5b53c5520000,kubernetes.io/os=linux,lke.linode.com/pool-id=307295,node.k8s.linode.com/host-uuid=792bac078d7ce0e548163b9423416d7d8c88b08f,node.kubernetes.io/instance-type=g6-dedicated-4,topology.kubernetes.io/region=ap-south,topology.linode.com/region=ap-south +``` +As you see, we have three nodes in the cluster: lke212553-307295-339173d10000, lke212553-307295-5541798e0000, and lke212553-307295-5b53c5520000. + +Next, we are going to taint these nodes. +```bash +$ kubectl taint nodes lke212553-307295-339173d10000 key1=node1:NoSchedule +node/lke212553-307295-339173d10000 tainted + +$ kubectl taint nodes lke212553-307295-5541798e0000 key1=node2:NoSchedule +node/lke212553-307295-5541798e0000 tainted + +$ kubectl taint nodes lke212553-307295-5b53c5520000 key1=node3:NoSchedule +node/lke212553-307295-5b53c5520000 tainted +``` +Let's see our tainted nodes here, +```bash +$ kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints != null) | .metadata.name, .spec.taints' +lke212553-307295-339173d10000 +[ + { + "effect": "NoSchedule", + "key": "key1", + "value": "node1" + } +] +lke212553-307295-5541798e0000 +[ + { + "effect": "NoSchedule", + "key": "key1", + "value": "node2" + } +] +lke212553-307295-5b53c5520000 +[ + { + "effect": "NoSchedule", + "key": "key1", + "value": "node3" + } +] +``` +We can see that our taints were successfully assigned. Now let's try to create a singlestore without proper tolerations. Here is the yaml of singlestore we are going to createc +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-without-tolerations + namespace: demo +spec: + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable + version: 8.7.10 +``` +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-without-tolerations.yaml +singlestore.kubedb.com/sdb-without-tolerations created +``` +Now, wait a few minutes. KubeDB operator will create necessary petset, services, secret etc. If everything goes well, we will see that a pod with the name `sdb-without-tolerations-0` has been created and running. + +Check that the petset's pod is running or not, +```bash +$ kubectl get pods -n demo +NAME READY STATUS RESTARTS AGE +sdb-without-tolerations-0 0/1 Pending 0 3m35s +``` +Here we can see that the pod is not running. So let's describe the pod, +```bash +$ kubectl describe pods -n demo sdb-without-tolerations-0 +Name: sdb-without-tolerations-0 +Namespace: demo +Priority: 0 +Service Account: sdb-without-tolerations +Node: ashraful/192.168.0.227 +Start Time: Tue, 29 Oct 2024 15:44:22 +0600 +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=sdb-without-tolerations + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com + apps.kubernetes.io/pod-index=0 + controller-revision-hash=sdb-without-tolerations-6449dc959b + kubedb.com/petset=standalone + statefulset.kubernetes.io/pod-name=sdb-without-tolerations-0 +Annotations: +Status: Running +IP: 10.42.0.122 +IPs: + IP: 10.42.0.122 +Controlled By: PetSet/sdb-without-tolerations +Init Containers: + singlestore-init: + Container ID: containerd://382a8cca4103e609c0a763f65db11e89ca38fe4b982dd6f03c18eb33c083998c + Image: ghcr.io/kubedb/singlestore-init:8.7.10-v1@sha256:7f8a60b45c9a402c5a3de56a266e06a70db1feeff1c28a506e485e60afc7f5fa + Image ID: ghcr.io/kubedb/singlestore-init@sha256:7f8a60b45c9a402c5a3de56a266e06a70db1feeff1c28a506e485e60afc7f5fa + Port: + Host Port: + SeccompProfile: RuntimeDefault + State: Terminated + Reason: Completed + Exit Code: 0 + Started: Tue, 29 Oct 2024 15:44:31 +0600 + Finished: Tue, 29 Oct 2024 15:44:31 +0600 + Ready: True + Restart Count: 0 + Limits: + memory: 512Mi + Requests: + cpu: 200m + memory: 512Mi + Environment: + Mounts: + /scripts from init-scripts (rw) + /var/lib/memsql from data (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-htm2z (ro) +Containers: + singlestore: + Container ID: containerd://b52ae6c34300ea23b60ce91fbbc6a01a1fd71bb7a3de6fea97d9a726ca280e55 + Image: singlestore/cluster-in-a-box:alma-8.7.10-95e2357384-4.1.0-1.17.14@sha256:6b1b66b57e11814815a43114ab28db407428662af4c7d1c666c14a3f53c5289f + Image ID: docker.io/singlestore/cluster-in-a-box@sha256:6b1b66b57e11814815a43114ab28db407428662af4c7d1c666c14a3f53c5289f + Ports: 3306/TCP, 8081/TCP + Host Ports: 0/TCP, 0/TCP + SeccompProfile: RuntimeDefault + Args: + /scripts/standalone-run.sh + State: Running + Started: Tue, 29 Oct 2024 15:44:32 +0600 + Ready: True + Restart Count: 0 + Limits: + memory: 2Gi + Requests: + cpu: 500m + memory: 2Gi + Environment: + ROOT_USERNAME: Optional: false + ROOT_PASSWORD: Optional: false + SINGLESTORE_LICENSE: Optional: false + LICENSE_KEY: Optional: false + HOST_IP: (v1:status.hostIP) + Mounts: + /scripts from init-scripts (rw) + /var/lib/memsql from data (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-htm2z (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready True + ContainersReady True + PodScheduled True +Volumes: + data: + Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) + ClaimName: data-sdb-without-tolerations-0 + ReadOnly: false + init-scripts: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + kube-api-access-htm2z: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + ConfigMapOptional: + DownwardAPI: true +QoS Class: Burstable +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Topology Spread Constraints: kubernetes.io/hostname:ScheduleAnyway when max skew 1 is exceeded for selector app.kubernetes.io/component=database,app.kubernetes.io/instance=sdb-without-tolerations,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=singlestores.kubedb.com,kubedb.com/petset=standalone + topology.kubernetes.io/zone:ScheduleAnyway when max skew 1 is exceeded for selector app.kubernetes.io/component=database,app.kubernetes.io/instance=sdb-without-tolerations,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=singlestores.kubedb.com,kubedb.com/petset=standalone +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Warning FailedScheduling 5m20s default-scheduler 0/3 nodes are available: 1 node(s) had untolerated taint {key1: node1}, 1 node(s) had untolerated taint {key1: node2}, 1 node(s) had untolerated taint {key1: node3}. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling. + Warning FailedScheduling 11s default-scheduler 0/3 nodes are available: 1 node(s) had untolerated taint {key1: node1}, 1 node(s) had untolerated taint {key1: node2}, 1 node(s) had untolerated taint {key1: node3}. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling. + Normal NotTriggerScaleUp 13s (x31 over 5m15s) cluster-autoscaler pod didn't trigger scale-up: +``` +Here we can see that the pod has no tolerations for the tainted nodes and because of that the pod is not able to scheduled. + +So, let's add proper tolerations and create another singlestore. Here is the yaml we are going to apply, +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-with-tolerations + namespace: demo +spec: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable + version: 8.7.10 +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-with-tolerations.yaml +singlestore.kubedb.com/sdb-with-tolerations created +``` +Now, wait a few minutes. KubeDB operator will create necessary petset, services, secret etc. If everything goes well, we will see that a pod with the name `sdb-with-tolerations-0` has been created. + +Check that the petset's pod is running + +```bash +$ kubectl get pods -n demo +NAME READY STATUS RESTARTS AGE +sdb-with-tolerations-0 1/1 Running 0 2m +``` +As we see the pod is running, you can verify that by running `kubectl get pods -n demo sdb-with-tolerations-0 -o wide` and looking at the “NODE” to which the Pod was assigned. +```bash +$ kubectl get pods -n demo sdb-with-tolerations-0 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +sdb-with-tolerations-0 1/1 Running 0 3m49s 10.2.0.8 lke212553-307295-339173d10000 +``` +We can successfully verify that our pod was scheduled to the node which it has tolerations. + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete singlestore -n demo sdb-misc-config + +kubectl delete ns demo +``` + +If you would like to uninstall KubeDB operator, please follow the steps [here](/docs/setup/README.md). + +## Next Steps + +- [Quickstart SingleStore](/docs/guides/singlestore/quickstart/quickstart.md) with KubeDB Operator. +- Initialize [SingleStore with Script](/docs/guides/singlestore/initialization). +- Detail concepts of [SingleStore object](/docs/guides/singlestore/concepts/singlestore.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/nginx-config-map.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/nginx-config-map.yaml new file mode 100644 index 0000000000..aa854d0815 --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/nginx-config-map.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-config-map + namespace: demo +data: + default.conf: | + server { + listen 80; + location / { + proxy_pass http://localhost:9000; + } + } \ No newline at end of file diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-custom-sidecar.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-custom-sidecar.yaml new file mode 100644 index 0000000000..ea3ee78e0e --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-custom-sidecar.yaml @@ -0,0 +1,63 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-custom-sidecar + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + - name: sidecar + image: nginx:alpine + ports: + - containerPort: 80 + volumeMounts: + - name: nginx-config + mountPath: /etc/nginx/conf.d + volumes: + - name: nginx-config + configMap: + name: nginx-config-map + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-misc-config.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-misc-config.yaml new file mode 100644 index 0000000000..afbe5678ca --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-misc-config.yaml @@ -0,0 +1,57 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-misc-config + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + args: + - --character-set-server=utf8mb4 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + args: + - --character-set-server=utf8mb4 + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-node-selector.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-node-selector.yaml new file mode 100644 index 0000000000..27c460006e --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-node-selector.yaml @@ -0,0 +1,22 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-node-selector + namespace: demo +spec: + version: "8.7.10" + podTemplate: + spec: + nodeSelector: + disktype: ssd + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable \ No newline at end of file diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-with-tolerations.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-with-tolerations.yaml new file mode 100644 index 0000000000..2e5fac4866 --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-with-tolerations.yaml @@ -0,0 +1,25 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-with-tolerations + namespace: demo +spec: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable + version: 8.7.10 \ No newline at end of file diff --git a/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-without-tolerations.yaml b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-without-tolerations.yaml new file mode 100644 index 0000000000..3e55318404 --- /dev/null +++ b/docs/guides/singlestore/configuration/podtemplating/yamls/sdb-without-tolerations.yaml @@ -0,0 +1,18 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-without-tolerations + namespace: demo +spec: + deletionPolicy: WipeOut + licenseSecret: + name: license-secret + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageType: Durable + version: 8.7.10 \ No newline at end of file diff --git a/docs/guides/singlestore/initialization/_index.md b/docs/guides/singlestore/initialization/_index.md new file mode 100755 index 0000000000..6d2bb64fa7 --- /dev/null +++ b/docs/guides/singlestore/initialization/_index.md @@ -0,0 +1,10 @@ +--- +title: SingleStore Initialization +menu: + docs_{{ .version }}: + identifier: guides-sdb-initialization + name: Initialization + parent: guides-singlestore + weight: 41 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/initialization/using-script/example/demo-1.yaml b/docs/guides/singlestore/initialization/using-script/example/demo-1.yaml new file mode 100644 index 0000000000..cce1b506ae --- /dev/null +++ b/docs/guides/singlestore/initialization/using-script/example/demo-1.yaml @@ -0,0 +1,56 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: "8.7.10" + init: + script: + configMap: + name: sdb-init-script + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/initialization/using-script/index.md b/docs/guides/singlestore/initialization/using-script/index.md new file mode 100644 index 0000000000..b5bef8142b --- /dev/null +++ b/docs/guides/singlestore/initialization/using-script/index.md @@ -0,0 +1,406 @@ +--- +title: Initialize SingleStore using Script +menu: + docs_{{ .version }}: + identifier: guides-sdb-initialization-usingscript + name: Using Script + parent: guides-sdb-initialization + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Initialize SingleStore using Script + +This tutorial will show you how to use KubeDB to initialize a SingleStore database with \*.sql, \*.sh and/or \*.sql.gz script. +In this tutorial we will use .sql script stored in GitHub repository [kubedb/singlestore-init-scripts](https://github.com/kubedb/singlestore-init-scripts). + +> Note: The yaml files that are used in this tutorial are stored [here](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/initialization/using-script/example) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs) + +## 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/). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare Initialization Scripts + +SingleStore supports initialization with `.sh`, `.sql` and `.sql.gz` files. In this tutorial, we will use `init.sql` script from [singlestore-init-scripts](https://github.com/kubedb/singlestore-init-scripts) git repository to create a TABLE `kubedb_write_check` in `kubedb_test` database. + +We will use a ConfigMap as script source. You can use any Kubernetes supported [volume](https://kubernetes.io/docs/concepts/storage/volumes) as script source. + +At first, we will create a ConfigMap from `init.sql` file. Then, we will provide this ConfigMap as script source in `init.script` of SingleStore crd spec. + +Let's create a ConfigMap with initialization script, + +```bash +$ kubectl create configmap -n demo sdb-init-script \ +--from-literal=init.sql="$(curl -fsSL https://github.com/kubedb/singlestore-init-scripts/raw/master/init.sql)" +configmap/sdb-init-script created +``` + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Create a SingleStore database with Init-Script + +Below is the `SingleStore` object created in this tutorial. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: "8.7.10" + init: + script: + configMap: + name: sdb-init-script + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/singlestore/Initialization/demo-1.yaml +singlestore.kubedb.com/singlestore-init-script created +``` + +Here, + +- `spec.init.script` specifies a script source used to initialize the database before database server starts. The scripts will be executed alphabatically. In this tutorial, a sample .sql script from the git repository `https://github.com/kubedb/singlestore-init-scripts.git` is used to create a test database. You can use other [volume sources](https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes) instead of `ConfigMap`. The \*.sql, \*sql.gz and/or \*.sh sripts that are stored inside the root folder will be executed alphabatically. The scripts inside child folders will be skipped. + +KubeDB operator watches for `SingleStore` objects using Kubernetes api. When a `SingleStore` object is created, KubeDB operator will create a new PetSet and a Service with the matching `SingleStore` object name. KubeDB operator will also create a governing service for PetSets with the name `kubedb`, if one is not already present. No SingleStore specific RBAC roles are required for [RBAC enabled clusters](/docs/setup/README.md#using-yaml). + +```yaml +$ kubectl get sdb -n demo sdb-sample -oyaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"Singlestore","metadata":{"annotations":{},"name":"sdb-sample","namespace":"demo"},"spec":{"deletionPolicy":"WipeOut","init":{"script":{"configMap":{"name":"sdb-init-script"}}},"licenseSecret":{"name":"license-secret"},"storageType":"Durable","topology":{"aggregator":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"600m","memory":"2Gi"},"requests":{"cpu":"600m","memory":"2Gi"}}}]}},"replicas":2,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"standard"}},"leaf":{"podTemplate":{"spec":{"containers":[{"name":"singlestore","resources":{"limits":{"cpu":"600m","memory":"2Gi"},"requests":{"cpu":"600m","memory":"2Gi"}}}]}},"replicas":2,"storage":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"10Gi"}},"storageClassName":"standard"}}},"version":"8.7.10"}} + creationTimestamp: "2024-10-03T07:00:56Z" + finalizers: + - kubedb.com + generation: 3 + name: sdb-sample + namespace: demo + resourceVersion: "124012" + uid: ccfe9d0e-6f13-4187-b652-4e157a21568e +spec: + authSecret: + name: sdb-sample-root-cred + deletionPolicy: WipeOut + healthChecker: + failureThreshold: 1 + periodSeconds: 10 + timeoutSeconds: 10 + init: + script: + configMap: + name: sdb-init-script + licenseSecret: + name: license-secret + storageType: Durable + topology: + aggregator: + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + cpu: 600m + memory: 2Gi + requests: + cpu: 600m + memory: 2Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + - name: singlestore-coordinator + resources: + limits: + memory: 256Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + initContainers: + - name: singlestore-init + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 512Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + podPlacementPolicy: + name: default + securityContext: + fsGroup: 999 + replicas: 2 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: standard + leaf: + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + cpu: 600m + memory: 2Gi + requests: + cpu: 600m + memory: 2Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + - name: singlestore-coordinator + resources: + limits: + memory: 256Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + initContainers: + - name: singlestore-init + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 512Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 998 + runAsNonRoot: true + runAsUser: 999 + seccompProfile: + type: RuntimeDefault + podPlacementPolicy: + name: default + securityContext: + fsGroup: 999 + replicas: 2 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageClassName: standard + version: 8.7.10 +status: + conditions: + - lastTransitionTime: "2024-10-03T07:01:02Z" + message: 'The KubeDB operator has started the provisioning of Singlestore: demo/sdb-sample' + observedGeneration: 3 + reason: DatabaseProvisioningStartedSuccessfully + status: "True" + type: ProvisioningStarted + - lastTransitionTime: "2024-10-03T07:11:23Z" + message: All leaf replicas are ready for Singlestore demo/sdb-sample + observedGeneration: 3 + reason: AllReplicasReady + status: "True" + type: ReplicaReady + - lastTransitionTime: "2024-10-03T07:02:13Z" + message: database demo/sdb-sample is accepting connection + observedGeneration: 3 + reason: AcceptingConnection + status: "True" + type: AcceptingConnection + - lastTransitionTime: "2024-10-03T07:02:13Z" + message: database demo/sdb-sample is ready + observedGeneration: 3 + reason: AllReplicasReady + status: "True" + type: Ready + - lastTransitionTime: "2024-10-03T07:02:14Z" + message: 'The Singlestore: demo/sdb-sample is successfully provisioned.' + observedGeneration: 3 + reason: DatabaseSuccessfullyProvisioned + status: "True" + type: Provisioned + phase: Ready +``` + +KubeDB operator sets the `status.phase` to `Ready` once the database is successfully created. + +Now, we will connect to this database and check the data inserted by the initlization script. + +```bash +# Connecting to the database +$ kubectl exec -it -n demo sdb-sample-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-sample-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 144 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show databases; ++--------------------+ +| Database | ++--------------------+ +| cluster | +| information_schema | +| kubedb_test | +| memsql | +| singlestore_health | ++--------------------+ +5 rows in set (0.00 sec) + +singlestore> use kubedb_test; +Reading table information for completion of table and column names +You can turn off this feature to get a quicker startup with -A + +Database changed + +# Showing the inserted `kubedb_write_check` +singlestore> select * from kubedb_write_check; ++----+-------+ +| id | name | ++----+-------+ +| 3 | name3 | +| 1 | name1 | +| 2 | name2 | ++----+-------+ +3 rows in set (0.02 sec) + +singlestore> exit +Bye + + +``` + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo sdb-sample +singlestore.kubedb.com "sdb-sample" deleted +$ kubectl delete ns demo +namespace "demo" deleted +``` diff --git a/docs/guides/singlestore/monitoring/_index.md b/docs/guides/singlestore/monitoring/_index.md new file mode 100644 index 0000000000..1053b439d3 --- /dev/null +++ b/docs/guides/singlestore/monitoring/_index.md @@ -0,0 +1,10 @@ +--- +title: SingleStore Monitoring +menu: + docs_{{ .version }}: + identifier: guides-sdb-monitoring + name: Monitoring + parent: guides-singlestore + weight: 50 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/monitoring/builtin-prometheus/images/sdb-builtin-prom-target.png b/docs/guides/singlestore/monitoring/builtin-prometheus/images/sdb-builtin-prom-target.png new file mode 100644 index 0000000000000000000000000000000000000000..d574dd37aa47e6665997a091d0787894cb50e6be GIT binary patch literal 76954 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%0DjwsejZ0FdU~t&LN8B6Q3MW! z>dbAbT3#b>s&&^1J`G=L(!;Z5|EPzJJ)+giJmJbtUWsi|-!rS!IXH|GsjiGE7vB=z zuRzfkbW*_vLeiZZ*Ntg^D%i+k+FO`^fgeCrjSE-#fvKYy+hB}e9l?j|;x27hkGpX7 z5)Z^3P{*45#cq)M zV(ucVZBd`Lg*vO3Tmf;ol(~4NO)|LONlL$O3HL5k*}wucV2eBqOtnr7#`Lr@i5Iht zRrwwlM7kQk z4eqboO&7X_aMXskpQVGavXq(WX)ZRoF{wHwBPvtY;~TNq71&exc2V~eFl!yV)o^Hg zD9+NNdka$bH}riPe#xOfDC7mb?h&(AS6H@EmH~C6M@#3Avo4$JYeW%>LnYQXii~_r zCUQtU+ajhM3a^ip40EgufX{uua>G+MPKE*P9OWEMy7KjS|C&_#1$1*Me*4(z3ek{q zITT7UfyWj&h>4H!oOtGvpnjeBeQEqvJ5M;f)ngp%LzEV+5yC`zD91&AzJhVu6*3>6 zX-IMJt)3cw$4Z#QjEh=v0k>;Vtg+xcr*`3}ps}jRH z9g?bt!Ze~VJ~!oRxN-*6=zMYaHQw|V!nZnbYGPu?&3?N5g4BLG?azxicEsmPEk3@Y25Mje z2e;6BtMZOloRM)y@P@#ivXpAb6B&$=BsS2!^%>9VZW{It&BNvZ+Jdt(#Y~=6fxzSK%BDt*_Llb zlu*R}yf`bx&nIvWkk^&S74;Eqvp~%ky-aL>#WeWshN|Yi_`199W@nQAHQuncdaDXB z`>tA*E%F;SgD(64O34=%RRN(A=ETY0n#mmt8!_eQB1KSW+U6_fRq(n>{Ds)Fe9uik z%FmTSt!FmS6JqJQangYlUzp<;4C4}GF^xxEB~#@Px$tE|!tkvKv$0RrTeLM{$EPs~ zo|=kroTN+74>#-%D!3=d(7Re5M=aq$r5i_=Yl4PkKo7@7yo5X!dQ8A1F5tWvq`qq* zFW`^8>g?sj2I{-`5BU_XPSbX_;uGD#a2HqE9o(4UANvq%G8S3t}$z-1sY;1@7oaHqz#SB27 zep%DnZ=EQO|0^K;plp@O>)d`FifO>xmuz+ zQt&*w(^E4X(wl+1sO#4cH1%dcy)aqlfI&YYd+-CYHl+SMsY%n%6>?9GsYI%kNra)B zZI_nL6rYAV0h!CD{Y(@lbSn08rY+Rn`Pl4%sWWj*oz4{%_|9SJ&PlMnU3v^#a9~kH?c2NZzp}QrdO(3f!sED)?aTZyP-Tn^!7;`3OgXoTumI!7%HJo z4h6sTc%qdOq_J#HSvcDM_5Ia49v7WI*cp1aLgDic`jQ;|JO`};(|^;QL&@YFw~uF}t-&egcbiO;CitgrF=ydRa+3ik2GvwX2?);11&^2?`b)~V@*{3P?U z=Kp4w4~VAn^C(HWQkzX`P|LR~3q~Hc|J2Ak_i>%ew+b!G1x8wyv6$06P8r0d(3|TRGi}G literal 0 HcmV?d00001 diff --git a/docs/guides/singlestore/monitoring/builtin-prometheus/index.md b/docs/guides/singlestore/monitoring/builtin-prometheus/index.md new file mode 100644 index 0000000000..da5a7440fa --- /dev/null +++ b/docs/guides/singlestore/monitoring/builtin-prometheus/index.md @@ -0,0 +1,402 @@ +--- +title: Monitor SingleStore using Builtin Prometheus Discovery +menu: + docs_{{ .version }}: + identifier: guides-sdb-monitoring-builtin-prometheus + name: Builtin Prometheus + parent: guides-sdb-monitoring + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring SingleStore with builtin Prometheus + +This tutorial will show you how to monitor SingleStore database using builtin [Prometheus](https://github.com/prometheus/prometheus) scraper. + +## 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 operator in your cluster following the steps [here](/docs/setup/README.md). + +- If you are not familiar with how to configure Prometheus to scrape metrics from various Kubernetes resources, please read the tutorial from [here](https://github.com/appscode/third-party-tools/tree/master/monitoring/prometheus/builtin). + +- To learn how Prometheus monitoring works with KubeDB in general, please visit [here](/docs/guides/singlestore/monitoring/overview/index.md). + +- To keep Prometheus resources isolated, we are going to use a separate namespace called `monitoring` to deploy respective monitoring resources. We are going to deploy database in `demo` namespace. + + ```bash + $ kubectl create ns monitoring + namespace/monitoring created + + $ kubectl create ns demo + namespace/demo created + ``` + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/monitoring/builtin-prometheus/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/monitoring/builtin-prometheus/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Deploy SingleStore with Monitoring Enabled + +At first, let's deploy an SingleStore database with monitoring enabled. Below is the SingleStore object that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: builtin-prom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + monitor: + agent: prometheus.io/builtin +``` + +Here, + +- `spec.monitor.agent: prometheus.io/builtin` specifies that we are going to monitor this server using builtin Prometheus scraper. + +Let's create the SingleStore crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/builtin-prom-singlestore.yaml +singlestore.kubedb.com/builtin-prom-sdb created +``` + +Now, wait for the database to go into `Running` state. + +```bash +$ watch -n 3 kubectl get singlestore -n demo builtin-prom-sdb + +NAME TYPE VERSION STATUS AGE +builtin-prom-sdb kubedb.com/v1alpha2 8.7.10 Ready 9m5s + +``` + +KubeDB will create a separate stats service with name `{SingleStore crd name}-stats` for monitoring purpose. + +```bash +$ kubectl get svc -n demo --selector="app.kubernetes.io/instance=builtin-prom-sdb" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +builtin-prom-sdb ClusterIP 10.128.102.243 3306/TCP,8081/TCP 14m +builtin-prom-sdb-pods ClusterIP None 3306/TCP 14m +builtin-prom-sdb-stats ClusterIP 10.128.218.225 9104/TCP 14m + +``` + +Here, `builtin-prom-sdb-stats` service has been created for monitoring purpose. Let's describe the service. + +```bash +$ kubectl describe svc -n demo builtin-prom-sdb-stats +Name: builtin-prom-sdb-stats +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=builtin-prom-sdb + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com + kubedb.com/role=stats +Annotations: monitoring.appscode.com/agent: prometheus.io/builtin + prometheus.io/path: /metrics + prometheus.io/port: 9104 + prometheus.io/scrape: true +Selector: app.kubernetes.io/instance=builtin-prom-sdb,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=singlestores.kubedb.com +Type: ClusterIP +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.128.218.225 +IPs: 10.128.218.225 +Port: metrics 9104/TCP +TargetPort: metrics/TCP +Endpoints: 10.2.1.142:9104,10.2.1.143:9104 +Session Affinity: None +Events: +``` + +You can see that the service contains following annotations. + +```bash +prometheus.io/path: /metrics +prometheus.io/port: 56790 +prometheus.io/scrape: true +``` + +The Prometheus server will discover the service endpoint using these specifications and will scrape metrics from the exporter. + +## Configure Prometheus Server + +Now, we have to configure a Prometheus scraping job to scrape the metrics using this service. We are going to configure scraping job similar to this [kubernetes-service-endpoints](https://github.com/appscode/third-party-tools/tree/master/monitoring/prometheus/builtin#kubernetes-service-endpoints) job that scrapes metrics from endpoints of a service. + +Let's configure a Prometheus scraping job to collect metrics from this service. + +```yaml +- job_name: 'kubedb-databases' + honor_labels: true + scheme: http + kubernetes_sd_configs: + - role: endpoints + # by default Prometheus server select all Kubernetes services as possible target. + # relabel_config is used to filter only desired endpoints + relabel_configs: + # keep only those services that has "prometheus.io/scrape","prometheus.io/path" and "prometheus.io/port" annotations + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_port] + separator: ; + regex: true;(.*) + action: keep + # currently KubeDB supported databases uses only "http" scheme to export metrics. so, drop any service that uses "https" scheme. + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: drop + regex: https + # only keep the stats services created by KubeDB for monitoring purpose which has "-stats" suffix + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*-stats) + action: keep + # service created by KubeDB will have "app.kubernetes.io/name" and "app.kubernetes.io/instance" annotations. keep only those services that have these annotations. + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name] + separator: ; + regex: (.*) + action: keep + # read the metric path from "prometheus.io/path: " annotation + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + # read the port from "prometheus.io/port: " annotation and update scraping address accordingly + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + # add service namespace as label to the scraped metrics + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + # add service name as a label to the scraped metrics + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace + # add stats service's labels to the scraped metrics + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) +``` + +### Configure Existing Prometheus Server + +If you already have a Prometheus server running, you have to add above scraping job in the `ConfigMap` used to configure the Prometheus server. Then, you have to restart it for the updated configuration to take effect. + +>If you don't use a persistent volume for Prometheus storage, you will lose your previously scraped data on restart. + +### Deploy New Prometheus Server + +If you don't have any existing Prometheus server running, you have to deploy one. In this section, we are going to deploy a Prometheus server in `monitoring` namespace to collect metrics using this stats service. + +**Create ConfigMap:** + +At first, create a ConfigMap with the scraping configuration. Bellow, the YAML of ConfigMap that we are going to create in this tutorial. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-config + labels: + app: prometheus-demo + namespace: monitoring +data: + prometheus.yml: |- + global: + scrape_interval: 5s + evaluation_interval: 5s + scrape_configs: + - job_name: 'kubedb-databases' + honor_labels: true + scheme: http + kubernetes_sd_configs: + - role: endpoints + # by default Prometheus server select all Kubernetes services as possible target. + # relabel_config is used to filter only desired endpoints + relabel_configs: + # keep only those services that has "prometheus.io/scrape","prometheus.io/path" and "prometheus.io/port" anootations + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_port] + separator: ; + regex: true;(.*) + action: keep + # currently KubeDB supported databases uses only "http" scheme to export metrics. so, drop any service that uses "https" scheme. + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: drop + regex: https + # only keep the stats services created by KubeDB for monitoring purpose which has "-stats" suffix + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*-stats) + action: keep + # service created by KubeDB will have "app.kubernetes.io/name" and "app.kubernetes.io/instance" annotations. keep only those services that have these annotations. + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name] + separator: ; + regex: (.*) + action: keep + # read the metric path from "prometheus.io/path: " annotation + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + # read the port from "prometheus.io/port: " annotation and update scraping address accordingly + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + # add service namespace as label to the scraped metrics + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + # add service name as a label to the scraped metrics + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace + # add stats service's labels to the scraped metrics + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) +``` + +Let's create above `ConfigMap`, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/prom-config.yaml +configmap/prometheus-config created +``` + +**Create RBAC:** + +If you are using an RBAC enabled cluster, you have to give necessary RBAC permissions for Prometheus. Let's create necessary RBAC stuffs for Prometheus, + +```bash +$ kubectl apply -f https://github.com/appscode/third-party-tools/raw/master/monitoring/prometheus/builtin/artifacts/rbac.yaml +clusterrole.rbac.authorization.k8s.io/prometheus created +serviceaccount/prometheus created +clusterrolebinding.rbac.authorization.k8s.io/prometheus created +``` + +>YAML for the RBAC resources created above can be found [here](https://github.com/appscode/third-party-tools/blob/master/monitoring/prometheus/builtin/artifacts/rbac.yaml). + +**Deploy Prometheus:** + +Now, we are ready to deploy Prometheus server. We are going to use following [deployment](https://github.com/appscode/third-party-tools/blob/master/monitoring/prometheus/builtin/artifacts/deployment.yaml) to deploy Prometheus server. + +Let's deploy the Prometheus server. + +```bash +$ kubectl apply -f https://github.com/appscode/third-party-tools/raw/master/monitoring/prometheus/builtin/artifacts/deployment.yaml +deployment.apps/prometheus created +``` + +### Verify Monitoring Metrics + +Prometheus server is listening to port `9090`. We are going to use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to access Prometheus dashboard. + +At first, let's check if the Prometheus pod is in `Running` state. + +```bash +$ kubectl get pod -n monitoring -l=app=prometheus +NAME READY STATUS RESTARTS AGE +prometheus-8568c86d86-95zhn 1/1 Running 0 77s +``` + +Now, run following command on a separate terminal to forward 9090 port of `prometheus-8568c86d86-95zhn` pod, + +```bash +$ kubectl port-forward -n monitoring prometheus-8568c86d86-95zhn 9090 +Forwarding from 127.0.0.1:9090 -> 9090 +Forwarding from [::1]:9090 -> 9090 +``` + +Now, we can access the dashboard at `localhost:9090`. Open [http://localhost:9090](http://localhost:9090) in your browser. You should see the endpoint of `builtin-prom-sdb-stats` service as one of the targets. + +

    +  Prometheus Target +

    + +Check the labels marked with red rectangle. These labels confirm that the metrics are coming from `SingleStore` database `builtin-prom-sdb` through stats service `builtin-prom-sdb-stats`. + +Now, you can view the collected metrics and create a graph from homepage of this Prometheus dashboard. You can also use this Prometheus server as data source for [Grafana](https://grafana.com/) and create beautiful dashboard with collected metrics. + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run following commands + +```bash +kubectl delete -n demo my/builtin-prom-sdb + +kubectl delete -n monitoring deployment.apps/prometheus + +kubectl delete -n monitoring clusterrole.rbac.authorization.k8s.io/prometheus +kubectl delete -n monitoring serviceaccount/prometheus +kubectl delete -n monitoring clusterrolebinding.rbac.authorization.k8s.io/prometheus + +kubectl delete ns demo +kubectl delete ns monitoring +``` + +## Next Steps + +- Monitor your SingleStore database with KubeDB using [`out-of-the-box` Prometheus operator](/docs/guides/singlestore/monitoring/prometheus-operator/index.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/builtin-prom-singlestore.yaml b/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/builtin-prom-singlestore.yaml new file mode 100644 index 0000000000..2891cd6fa6 --- /dev/null +++ b/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/builtin-prom-singlestore.yaml @@ -0,0 +1,54 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: builtin-prom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + monitor: + agent: prometheus.io/builtin diff --git a/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/prom-config.yaml b/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/prom-config.yaml new file mode 100644 index 0000000000..45aee6317a --- /dev/null +++ b/docs/guides/singlestore/monitoring/builtin-prometheus/yamls/prom-config.yaml @@ -0,0 +1,68 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-config + labels: + app: prometheus-demo + namespace: monitoring +data: + prometheus.yml: |- + global: + scrape_interval: 5s + evaluation_interval: 5s + scrape_configs: + - job_name: 'kubedb-databases' + honor_labels: true + scheme: http + kubernetes_sd_configs: + - role: endpoints + # by default Prometheus server select all Kubernetes services as possible target. + # relabel_config is used to filter only desired endpoints + relabel_configs: + # keep only those services that has "prometheus.io/scrape","prometheus.io/path" and "prometheus.io/port" anootations + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_port] + separator: ; + regex: true;(.*) + action: keep + # currently KubeDB supported databases uses only "http" scheme to export metrics. so, drop any service that uses "https" scheme. + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: drop + regex: https + # only keep the stats services created by KubeDB for monitoring purpose which has "-stats" suffix + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*-stats) + action: keep + # service created by KubeDB will have "app.kubernetes.io/name" and "app.kubernetes.io/instance" annotations. keep only those services that have these annotations. + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name] + separator: ; + regex: (.*) + action: keep + # read the metric path from "prometheus.io/path: " annotation + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + # read the port from "prometheus.io/port: " annotation and update scraping address accordingly + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + # add service namespace as label to the scraped metrics + - source_labels: [__meta_kubernetes_namespace] + separator: ; + regex: (.*) + target_label: namespace + replacement: $1 + action: replace + # add service name as a label to the scraped metrics + - source_labels: [__meta_kubernetes_service_name] + separator: ; + regex: (.*) + target_label: service + replacement: $1 + action: replace + # add stats service's labels to the scraped metrics + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) diff --git a/docs/guides/singlestore/monitoring/overview/images/database-monitoring-overview.svg b/docs/guides/singlestore/monitoring/overview/images/database-monitoring-overview.svg new file mode 100644 index 0000000000..395eefb334 --- /dev/null +++ b/docs/guides/singlestore/monitoring/overview/images/database-monitoring-overview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/guides/singlestore/monitoring/overview/index.md b/docs/guides/singlestore/monitoring/overview/index.md new file mode 100644 index 0000000000..7cb18f352e --- /dev/null +++ b/docs/guides/singlestore/monitoring/overview/index.md @@ -0,0 +1,122 @@ +--- +title: SingleStore Monitoring Overview +description: SingleStore Monitoring Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-monitoring-overview + name: Overview + parent: guides-sdb-monitoring + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring SingleStore with KubeDB + +KubeDB has native support for monitoring via [Prometheus](https://prometheus.io/). You can use builtin [Prometheus](https://github.com/prometheus/prometheus) scraper or [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) to monitor KubeDB managed databases. This tutorial will show you how database monitoring works with KubeDB and how to configure Database crd to enable monitoring. + +## Overview + +KubeDB uses Prometheus [exporter](https://prometheus.io/docs/instrumenting/exporters/#databases) images to export metrics for the respective databases. However, with SingleStore, you can obtain metrics without using an exporter image by configuring monitoring using the `memsql-admin` binary. We have integrated this configuration into our operator, supporting both TLS and non-TLS setups. To enable monitoring, you simply need to specify it in your SingleStore YAML file. The following diagram illustrates the logical flow of database monitoring with KubeDB. + +

    +  Database Monitoring Flow +

    + +When a user creates a database crd with `spec.monitor` section configured, KubeDB operator provisions the respective database and injects an exporter image as sidecar to the database pod. It also creates a dedicated stats service with name `{database-crd-name}-stats` for monitoring. Prometheus server can scrape metrics using this stats service. + +## Configure Monitoring + +In order to enable monitoring for a database, you have to configure `spec.monitor` section. KubeDB provides following options to configure `spec.monitor` section: + +| Field | Type | Uses | +| -------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `spec.monitor.agent` | `Required` | Type of the monitoring agent that will be used to monitor this database. It can be `prometheus.io/builtin` or `prometheus.io/operator`. | +| `spec.monitor.prometheus.exporter.port` | `Optional` | Port number where the exporter side car will serve metrics. | +| `spec.monitor.prometheus.exporter.args` | `Optional` | Arguments to pass to the exporter sidecar. | +| `spec.monitor.prometheus.exporter.env` | `Optional` | List of environment variables to set in the exporter sidecar container. | +| `spec.monitor.prometheus.exporter.resources` | `Optional` | Resources required by exporter sidecar container. | +| `spec.monitor.prometheus.exporter.securityContext` | `Optional` | Security options the exporter should run with. | +| `spec.monitor.prometheus.serviceMonitor.labels` | `Optional` | Labels for `ServiceMonitor` crd. | +| `spec.monitor.prometheus.serviceMonitor.interval` | `Optional` | Interval at which metrics should be scraped. | + +## Sample Configuration + +A sample YAML for MySQL crd with `spec.monitor` section configured to enable monitoring with [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) is shown below. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: prom-operator-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s +``` + +Assume that above Redis is configured to use basic authentication. So, exporter image also need to provide password to collect metrics. We have provided it through `spec.monitor.args` field. + +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 `release: prometheus` label. + +## Next Steps + +- Learn how to monitor Elasticsearch database with KubeDB using [builtin-Prometheus](/docs/guides/elasticsearch/monitoring/using-builtin-prometheus.md) and using [Prometheus operator](/docs/guides/elasticsearch/monitoring/using-prometheus-operator.md). +- Learn how to monitor PostgreSQL database with KubeDB using [builtin-Prometheus](/docs/guides/postgres/monitoring/using-builtin-prometheus.md) and using [Prometheus operator](/docs/guides/postgres/monitoring/using-prometheus-operator.md). +- Learn how to monitor MySQL database with KubeDB using [builtin-Prometheus](/docs/guides/mysql/monitoring/builtin-prometheus/index.md) and using [Prometheus operator](/docs/guides/mysql/monitoring/prometheus-operator/index.md). +- Learn how to monitor MongoDB database with KubeDB using [builtin-Prometheus](/docs/guides/mongodb/monitoring/using-builtin-prometheus.md) and using [Prometheus operator](/docs/guides/mongodb/monitoring/using-prometheus-operator.md). +- Learn how to monitor Redis server with KubeDB using [builtin-Prometheus](/docs/guides/redis/monitoring/using-builtin-prometheus.md) and using [Prometheus operator](/docs/guides/redis/monitoring/using-prometheus-operator.md). +- Learn how to monitor Memcached server with KubeDB using [builtin-Prometheus](/docs/guides/memcached/monitoring/using-builtin-prometheus.md) and using [Prometheus operator](/docs/guides/memcached/monitoring/using-prometheus-operator.md). diff --git a/docs/guides/singlestore/monitoring/prometheus-operator/images/prom-operator-sdb-target.png b/docs/guides/singlestore/monitoring/prometheus-operator/images/prom-operator-sdb-target.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c6416ec9d3225f28d90af98d442e9c01a18080 GIT binary patch literal 62157 zcmc$GRa9Kd)-LYQ5VUa#1cJMJ0wfS5!QCaeyK8U=!QGw4-3cziohE4{xHQl>m+W)T z-sd0Z-k1Aw=gS&vb=6u`vu1r$>KpwbL3lfAi%yOEO_oQ0jetr@GciIbU`owKFA%L!ul zpH8fQ8c92u8M#>5+fl1p*_y$rx|&gQa8fIoxKML(aPd%catU#932_KeD}SJ7=HNRJ zdUpT^M-BJxjijna=Ha@puBt}%$z7abBqeZP@c?2r_Be$BtM)Yj>6 zLos0xyBNSx6#4SyYwXrb-wCIXrKMTH7PX&YVBA0-Y1P$)sgI0Y?%9d z2oe87*6au@3IDSZ-W~(8_S-lADQ)ip)&ED61iO#9YX8~dO<~4=y{33WR1faCTf(HS z9YP9fdd-E)yXp_h>>#aNB?qOHf4bWd{Pn@DWYkF(o-QRnOYa~Ar4aW^h9PR(J zWwk~Pvqtq=v5E9^?=8iqW>TD-y}gfXvyDEz4oxiY;thYryFq)B-+0a%u`c;}*0*LnMr(rZyMae_^ynG<-ugz0|(Js4o*Q_HOmCn7_L2F3P;Xv3#|LN|x zc~)a(aN@EX*PmDw?~PM8G!rwN?y?i68_XsxNz;~PcRk%CCmNIK|m229SZ7u>P>~) zt`J80l9AiC+^nf5N|4kS`+DioW=f14mygK&C@j-y___x$T@D#Nx2H zE>V;5aUrAX3$tq0Lzsd6O(wC0hzIY|?H=$ywt$_6yZ-(rt{ep>=8%+Az_bLv9ydW_ zWI0h5k~@IlJ2T6g0Oj*9Hsa6;^Whr<<#Se|!_NVR*Uiln+2@N5HSTQ`^zjFW&t@8E zH^)1S4m4v$j9EOiW)wu#r0I>mO+JJoYnf069m>*-bi^JnAqo<=fi^H@fa?@rnoMdSU$T>35W-(HN7Dc!g=bTFvP~y4HCiMmX zHzIn!R|^aOs=;hm2`o8;TJ9J-VYSy6cplr+cOAQU zAb=*!Ms|>T8E~^>w&b|xVTB#M_Ntc>DH`!WyjQ-Y#}^}#)X=EgZBzqUn2j`N*&psE zE(1m(JZB~)NheUAd#e)BVkBF3_hK-p6N`MvNROiOx9RV?vDx#J{aJ%FI;|7j-p&}` zbI5s*@573g{@-Y0r?rmLkW3yh{+`iQN{>54lV-!vYC+OudZ{;Qe8ztLywpWcn{n3zdOv9KUItYz(j!N^sw{#z)<{9Hl?9(c` z6U5XzL0p8@63GQO#x^)3X_}`JTzn*+zSxh$f=ETX(Lz+5B<2rr`jNJ2bpi*?phA?& zpUPtErQFD`qNmNSrfXE zTxBC3^R29mzO!A`)>t*uh&6b}WSZREk-Xe(Jr@|-9|LXr%{qL>w`8t)@zj^^2ihf+ zJKsV4y)VY!pJ*Vdju;XhYHI{C6&E1wr9`EVbI<(Na_sC;HBcFx5-4T}2u%v_svWru6V=YmN*zAK1%fn@4GJQ=1JRe;Qw7r+N}zDh1|kY{T;U*4T07zMHM)H)AQw2}rey&gwdF zmlGIB-xXn*@z9&WB7D_L0q$+J4qKC!0n*7_Pk`5Lq9rJt;Ma`IsGlsf};=-!uOKa=Sm2qzG3`JpP+W#%*8Z|nB3;9(X zRh4GBpf31GvG9C|@{xGXT4)n=WnM2Jh->LgaEm2K^~sPzg4^_=_czZ~G8;WkQx=EN zFci=m$<+0|0szeFG;}$36CmCJ%H2>9=w5hFVbiNAJCTzs^`$dHj-awMOn}#<4^7)4 zl~RlXDBjs9-T`#P!sJ)#k`KrQpTvzo;QLBnYNJv-OWO%O#Mwt+!^2hxl*q@m4svj z=lR^7U)F4@`}6~aCdHo4+g_Pe?^3hQ8aJs)eMSKUDiOpHKgkV=yZvo3kC{9l}=9l)Dp*2P$GNoNMe*U?@c&mUECu*p|*mnxvQ}YN341=ljw83o~Yb3)DZ=MU0xxWbxJ&VmaIC7l_d9A{q z&Mf(waz0sR&%SEsAg)+maDJ#+oKW_iM5|7ollCO$B6c~*MoxNMzP1m7t*8TDjhl!S zc7p{;;iSh?QubpY^T!d>LQ6*K$4K1=80vCaSY=fy_92NvU@knr#gK*VdYmw`IFzO0 z*;H|&9wE??>!!@!=hY(qm)N0|Q!#i=gcCdc|F+KOYjbP0yDOi>!mFLq%<$ZMvz8>B zZSILl*jPMdF)yom9xDP_^8C#b^wV&TF_P38vEhiD0F@#4yn*z2fBYStW&&EA-xRS= zxqyw!53g+szUIYegkEwytLM85sziqv-p$H*8he=_dALixE2yQ~(-}8Z6xY0>69B<2 z43I*1<|)GIivpXCDD2!Q`N^PlLH2$N6=jq7Fo z>tkdAe{u3_)Rqe{HH-!<1jTW8;6RbS`V@Z{Ly8r0SYmW%${nwa8r31Wu))EM=VT!{ zsOfwx!C&}PVQ(kt?@CP5w-!za=x5rsF=0rF~RwV{+PN<8?7LuSV}mADDW&+qJ*Sh#{K7al=27+aGe4Gs|K zE%&La-`IK6vW7qLrVGi|lc?@3>M-xYw{}YXTgD#C-7)2Lvg8lJha(``1p!%P{|jWT z{yxLYIBJ-q93P@ptn{gBZYz+i=K(IM8zV(OlrV2_^%zt61=h0FpyMc&HJkr5+KSu0 z(7vOds0c3h_7mKtyl-GlTfynaBJgcZksgYWA2ChmoJdKYj1Hs!f?SO)vSr8`odhn6 zd??{gD+5~cM4+frIvrV!NzOWPuPDjFco6Ryh@%|RpW)tP6PG8mUZxZd!Sq=i%=d?h zx;S;c(7(#A_X8OxJ63YZ009gxg^xj;AH`r+bkss)J`Q=u0v#?O$O%G{j}3~JcYkC_ zjMD=9B}M;!f%0bIthMq;_f1gc2>#EWdKu5ei2(o0UFA76Ba;}sv5jJ)t6V$>1JPtV zaJ_@{2(aJ~9hNav2hWy96@G2d?JaEpJ>GN6pp#iufmuL%BdI~|G#&;e7g zcnP@NI86X#>j+L+Cd25@oU(RdqNYgwm2mw=!y56L7?*1C{?iI?f4|z29QJK68*=ze zVEPUIGTtA*qt<|`FAu3=^ClWnD#%nBPKX(gPfD*;KVnP#D!Uv5YD|iO78GAJ`MS3Q&siM0J=oPXr@!}zv zxH|HFPcmS~gTQj|h_u(Qb3?Zw6FRRp)egjc8d|Mj7P>$i!LT0nvf0`zkZfPP;Zwj*kK|bS}Uks!EY)8 zA=^$R#Wv~=y$~uD$I&XGHn9}G+h<2pA3sCR{bbRX@bz>@(BPD@RZUMZ9j)SFH$Vh6 zO?KRb7$d_E1Kk{#@lrB1*=!tD>-9NM|UG3MD#^eQ|=!>S?N&tf+Hbtq-aL5eVvHyDxLMw)sj3|Zxrj)^^L zt@X=VaP3McIsPhB{_#ZixMrLrem{LAZInA}1#sO@)d(d+nB`$PG>TAFNTWkb;UA3C5Si1dgmy99xL-A6fPMg^#sh*^**iZs^GJVj zN6IE7l4-sdu*y8qRn0_luV^S;$m^n>Q1cH<9NWn(G7p&YolHUD{n?wm`_hJB;P?XB zJMf_V)0J|!_$|p$3niW2!92wFY&A}X`-e8byR&x_)iCeLvS9;6P0F<&&C_1=Dj+Wq z)`-ka;;$B;@G;%F$E;KUbtG8FkMc=kOf9p9Zy!P8P}3luFdz`*P?)fhRue<8@UAMz zQ^jwn-#;n)$x_&wsvBZmyk10^ecNfjs_$$eso;K43*M!Xo{*TB=co3ABbX<%J(AtzJIW5&qJNv2&pc3+Yn_kRbK$ z^ThT3m8*!qYvLsx<3=L-w;{$Y*+yoN1>f2ali% zj;%EYdPp^dS&NbyTtA408*+n;rk(k9K_#-?7fR)&r<7HvjljODrPp&rR<_V=u!;&N zbst2%ffpWl)fl>A8_Wf}{sx&bTS2oX1YL@|Nh8eldUuTRH|s96Kk)6&&F!6W><+s$ zUP`V2v7*Lp|z>bz8o@4&>~HCQ5%m_U!^*6Z~*(T<lI5vAJ)v;T;4$lF!6@Av6 zw8Uj^8=<)vZz2*vY76JiN>`g`_oiXzQ$KUejweToRn3P$@Xd4Cl~R8wFj;b;VHxD5 zI%bCO?W7z|a)Ed1`lGl(y<*Vvvo&a3UL8FZS^MG+TMxsDU9aLAvvz{~AT-Q1vEwy8 zpKIf<-1|o!?KlMVSZ;F+l;?g#g~*11%oD$P2W|Syr?A{Fj*a_z;vT!cdM9p61DU`3 z!d_*5p3RV$O+H!IJ;zlgAVFj6{*{wGX-={;caIF?(IY+OH5qyo#X#|vU&z`#W>?E_ zVkSFd9Woh#7Y*`1`J(Qo+Dgf+Kp=5`MF}X$l%4|nK zP42n_Gt?G~7EXVYcidaI$iaxQc1U5@MWvN@7$m=8M%;6rvX4j@UT!}e{Y9%$)De&) zNPVCQSB*{BM93JQy%3Qeos(~K@ZAp#H;bB_tF&th6!o~fAKK>(lSagsv`>f+FHxWf zN7k6cF+D2LV9rabb;1{$Ax${uA=k)bim0gvrycITlB{vi2^Z1Jmd6V9p(fyd=a|ko ztfoM(2^}RXDCxr>nw7P`=Cw3ksFReq9OrDdcKhj%zRSbQ%Fv7fDRQqy=# zj^iYp21a%Tg#=twLGwTT;GLCLb8A*w0#ZcqAx^A%syC$Ue{R1ZOw zH1SZZLL8fRT?_5Ft?HA)E|;<+FW%dI6YwPE{_i&m_o8on^=0RX0CBV>^`y{2hV0LYXwwi-&mJGq9Wmt=W0A6WcXtA3=c%Ys2 zd#Q*ENdT4HoFx7}PuOaj-Il1hBPSpar8AIN(v-`9S0k8S%3m0Jbl<+fVQ@ODf;|7# zcaI>dg96rR^j*rssuWM56!m>9{6>Hxohe~}NkGDe0DXB@D+a2Rk3ZuXpf9a}3^As! z9&8^Q@Ewi%Zfe`(5$%uz(Te8hpx7Eg)eemUTECpxL0G1A{9#IZ>sBs%sJ+h{VuVgV z_@HYC@ah5w2sMoq%RD8*s+hxet%X*(;}NcC^}*M z=-E{57_Zml3icnoWn*quFs|6%)Exu&E2g%?b7}F6I|8G;hRe7NVByzn#h;H7106QI zQ6Ec>?;96Qo?llJ9=g-jZfzJY7&I?Lk{=XsV4LDco^vN-!j=hdO?hz~Vn5f=eYNk= zylVFf>bt>>!xm$GCuX;#fj#E&$pcE+?0>|;)=}7K_Kuat}uzoMF-jY1L_gs zU){j>)(Dkgr3c5QX}J0hrY#6Kta2Qs)Y;+Ab*lMY_R%$-hvZLGP&x_v_-{&VVu9A^xuO75?MwgW7 zS;`O+Waxm@=~B4*0Vnxq&Z~7$l^&)Q3Mi2ubdx}V~AJ_62Q_T%;l$)!Mx95PSy3A#7h)pRwgXUl4M*jn& zLwjCw<&-ncWbkYUj%aCSeZdAd&J^z;Rq=Bh4gb?2YhqvVbZJv|F&ty z;oG@8tb62ee@Q@oR%C_!B_yfZWeF#2E>HO*;_)YrBSg)scusd~^CJ6)5hDjB#+R_* zHI!1u(30EUx`a&uv>FPo-79ibXGGVq{&`Pr?gydDRf_cpJh;?$Vkb5!SNfN{QY*m$ z_;v3mHf?Z4U=F+Rg~xT;0VocO(hE7%`Rs);!G#_mD$dDIy;L;YScM^yu7swZaf@)8 zM6;nWnVh?26lmy=OnRvOYaGssYg0x);WeR%n^T~z0yy}Z_zdL|A$%mvA;|?wx(AC} zp;GyPr7q=1bkj6x?|zxyAdUhScv$1NOoUDHmw?;Be0gBO?C9?JauA_hAA5#7b*yhskg>Z`V49eRUZv#6lHI=M}2#xiKki;GGB zbP*z29J1c_@d;dR)WqX3igp@q<@i|xL>6s;D?Uv=eBD(LBG^lKH7@a^rt##N?mC%z z9Jh>ja%RZvhG*TwE&|STu5%T0<=P&7V?=ig1Q?pC-E?`oUYJoC2pzY*9%kXKhB)ut zidNh@Lp-qKr!EwaBmbK^tdKQqZ%m^aFzs`p#aLUoY@Ac3M+OOKTb)nN z6;290KfdM%HKII2XaiW%!{9CBAKo}0K;4zz2tp73tYZDFHb(rguPhv`WHC!he8HvI}D|3sr zBG;{WcYo#6ft|UiV6@ivMg=x3<-sSmq3nbBD)=a(oXDz68~L^8DysKn7n45<({T z9E>Q6><5*q$=+4&#cxatRlmg@2s3_D$|k)aJIFY@U7G9pU?y!?cMYAZ*;CrN;Ofnc5{yjI$X-tS_^5p4q z-X_od%>|HYiS@F<4g`70f!EF-B2bNr+y~k&Z&$bHFU64F-NgjBOv~bG;Vjg|1Z2-= z;?IlImy2RmhDTrNy1+#SQQx5&p1@ce*ZutN{D53fgj_nT##ESN<4JW3jGCfEJCs4U zLaA5P&nL*rU`Y_K`O8dk9Qnt_?K?abzukO9EAb!-bF%f?#p~TE($8Yl@D%#NAE|=Y zf@R9DlMI48#WNlH=31UY_?PYDGKMtmk*uD?Hm;6FLZOxeT`7%8t>X?--`lXgJ>X2j+;V$CQ58q+$jyi z^``H_f3j>mre2ops0@}h9S(;wvqpJ0#l8x4(I!K$81SgMYL_mhSZ-PM_} zPPuevapo?ei3SQq3`JB&)3#9WpmYQ_J@@g6y%9ch?E6TOMZNKuMrGf7%ryhOyx%jO zEO#4b8*6UBpC z!tSYVSw%>ip0Lzq$@Vm=Hq59()^hqH;h^KLgF-Jpc4nmHnw_-`??=dh3yu1&cpcMNbqL0jMMu>-oWPkrV(2_hz6sy>^gy zYGoCzBaBB6EatAE$&f1s%$QER2V? zzj&Zs751&=RZV`+ypny>#6i+j0)$sQIip7FL+M+4!|2(xjYxW=7o1ouZI?ei*^2dQ z4OblJN@UwRB5(K(q+qYfiJv&(*(7}{9X)YfDi5nPr&|r=CzB*Yr1nm5T(5;eg|q7o z@A~xw7!YIX0uvb4D~^$lqBCuZg3rIHH)n-6uLc=@{{*_Ffxr`6Q$+xgmobf8O@}Uv zDr{5C8ToVK>*Dr}^*%2WMn+D3;@@c}zj=!!`|&t`vjBQTHJ0wovW&|9u!t7>)NEA9 z>oby=Ki0$le9WsL7aX2nQ?2~b6?h6N*ni)?%6bg}VxWYbkBp*?<}`pHPj^8r{GW%M~_R9N@;@gBmLHIdj(+;-G8cd5JXkP*pu5Xtoa}3=>N> zvHgShLo{?WmqNQ1|L}@hzcK!JO-t*2CfiGhBugwAuQO^^@-3 zn=WGQ_%AL|>xeN!Zy&t!Lk_4QuS6btBOo$C69~RR-fb`c`A)%KOZoRbE$z&Qe{rq;u66yN*kJ!nDl2o> zAg-(~Yfsz$o0s+1Xj^Sv1b<-Q;!(QQkJ3EbjC@&j*{rY9F9vR(V%H3MpjpIx^AZE$MG<_?}x%o$yN3W zJqymr1kXBaJz{bN{f!1$JDOt4Zxzuf2cx4!uBa+|91WRI3S)Z^=6qU`V;V*E8U7*z_e0A>5WNc$x4wdf)~JiQ2wrGaul>!6ah<+`*{>E7 z+9S^BoUYX7CW?N zK2Jxk`F~8yT$TJxdf}6ETlAuZqS<27o=7r@tdB8ylpk=>Y57)4-_xs%vv1zmM42&D zR9oRH3MaEy$8*;)sx>#<_oNG@lT{OhE5`6b!x2S^b!wM|2qgw&a(64BCL1;4=O`E~ zvt4T$V$YqOuXb|n~5Bh<->G0)GQG#0gnWR#JY4Z(UR zY&+Z~Gvv=8F3;e5fpCOs?f1~d^V=wBS~^E|S(JM1cIobZzM7{w z=})|}Eh7K%q3`V@S^Nk=dP&4YkPCy8&RNfrVL9pheGg2F?gm^ki`|56&qHw9)N$V> z3n>ndAR}xQ1umvP71my5GpawfFkuhXWOU$(;}y>Op*nJ>B@@qk^<88X!yS6osa{rLXm;Fu%zk24ib!@|<{vL)6no!u~=Z4o{&7oM5@zmlh zx*T+0!=~){#rz|JX&h+sNFfv|_=V5S)=kCl2mG`wV-<4Hk;3~9z@pVF&0nde;WJ#Q z^r(6)q}7~%tkKC@cX0P->DAy5sOrXc_-Wim1%%;v zR~PEG3sD_vPnv7a-rqVARj$c=h~kBvb=nAhw~*Bf2)&-ONaM6aYAS}PdhUL*{j63x zyQ&HGMy2d=HWekqAt?(j=&}$0$vF^4dQjO)K0@~n-{a+Ae|4q1r+9a2xeVqXyl5tk z`G+&y+ONqVGBriTz7v|ID7Fg9Tqe_IX4B~> zJWIh&{gxw{<}b|#4+NbJMstH({OBj&mrb`2RY6fr5qzy;_`eJYb0*>+wS7;O8{SQJCbgVSqsEU+ zcb>)*z2!g4P7?3NR4IXGkUmaSwQObM67i|F%PzA&KERH?vs$;+sfZawinC= z{%^0dHA$G>mJKQU7eP9KOzA(M>aRxsUwvlr0iZz$nra!f=3w6h~v(_NU;HKgiI zkYJKr_ucuS!g`|Kmg!1G<&C0$+*Eqo&GxLBDXX5sLJ5DD?z8$Zh4f^utf6T_Mj~$B z1XqsuX+rjb&-IEbA{UiL!QfVLa9Bk~hJ)J9+33C6;lZ)!yTY+d8#!LTiVyc@+pbk* z=Dy`;?e_YVi+2?@7mZ(@J(}^owb^1T!}Bh*cG%<{jEkh5=}L`Re}H%Y(01!REj_=Z zCIb6f_9pHN?F{8#e(QlNXR7O))2Qv9%chvH_nN9XyKfxpkew8&PRYu`&B6ZH_GPzp zGwYKa(a_3*e>vg3ccjx^o#~ODW`jOl?o_){N-57sWGAMebLxPDi* z9${mPh{RV^jjCY10|S$*d)Rg5t6yeLtLJlzAG@4c+3!uov~v8~zwM?!QN4S%gDs-@ zyTPj0NrKkR=ld;9Ihw~!>n#&&FOv&h+)jKbBVpKPEg%jdSNiVv89j1Q;pKW29>U+Kt}9d&wjXqTn=5_cm-pvd*06Z-xNO2YO*fPT|7_dv3&gp zUKLRWwoZUQ5mYwO0&09%kPj-^R!N7E)|W&Ni7|woiEB-U5f!+JsBT+uxQ}`qnhbI~ z>Z6dwHIdHGstz9DM-xz_2}3=7H&pY71`L(nZ-0xy(H0?I+$!{uM!_srdg-M=a5eBM z^-h~|`_fN`Wz=vVqQv2Pb`s4){{e@KDvoyM5y_sAC^0R$@A^06p`#LL^GND*dO)#M zc9i}o8{mhkyxV(%tM51KiU6i(a0N7vnXQ>f6-2~QhE?StuSTG=$oppta+h$^-HM6C zC|@4qD@+KX1eE;d%|H6&dGLv2rV9vr*)AG6%=xd_%x!`6fOX99zC&aZq2*l5FwWSm zDJ`+3EAeoqGaENEV?qE^g zvoG^KEtgmR&Fc8c@fHi+-FH=n!SA?M{IiX021;dVa77Q`sH#?nRydZBxQw3P%49@3 zj0L+L<5R>X940$1GMe{(_zOf|FY|9QrtKaVF52zAK0U@6bY)}9=TLi%doUDlf0EvX z`B-fD&|MzRh+I|aecpf$k-_d~S>=xe6Q>TKIUKh}zlyo;b`Nwe`iGkjKIiED=8#d+ z8h`Sj3zdYEZK~gns2#5+Hd#?*R%yum{Rdixa~sg<>UDGp60TIa_^XZGjIpj-2sU0r zT~^puDxkKvTME424?N8_@T22mdnrW|UJ=!NzIhUFJV>*Rqvbl|Z6c`I4o&*9G&F#l z#gnth58ebv_7btcQ1)RLGWw!6@1kg&RIxA@cA%r`uP^WiH+fOvp)m7 z=rKyHB{He52dTE`3ZYH!%s#8q*=r(la+&)9^Z`ni!Ukiq8umucHjb<%LkByZ$xq_! zTP%j?6evSbPx^Jl5Ag5TTrv;0Ym9)DvNk+PDQb0`zG4>318su+aKv{TsbfKa3H>fV zA_vNXi+-#fN|8zN?INh09O~Vi>R1?Y3b*Ar(l2}?`@CS^ah&dp=iEWYW9^L$ig2k=UGj3A|F}uqho1>&karRC+Zy&I`g+y-8+jqC zu__P*7QVi4EHh<}mPl@o&z@oywH%fq6swCvWkP=f^s(o-Def&1S$~+OfcJ{Wr1uYy z5mud6&!=}g_cx{#X92892{5lxq4*)@9Lj#^Pp_Sr-?h@T?n1kK`ks8jdY6V|d_mJh z#A-w2hhFYX$29F)DKGYQt~R|z+<)}tqDs|1Bb{19GV&|Et(_8lFd#D{1v+;wHEG<- zCqi&wh1$NMH*PW6Xya>w5Qu{4fs<-G_+s?;0D1@?dC7$#=Q2Ch5PsV?gMq!2l!yqQ zRS}=7<0%ijBTmo~$xSDo$LBa;_rzz`=(S6(+TKPR4@XY>Z=Rr-2uK2ngP*p{&5jz2 zgZ5IV7~#rI=aLL4OZJzI4UT(zQ zi(}aFR{;XaLqR3njIO{3p|hY6xwHm{0a}n=edY^%{NPYRp2TpL3K#kpzF` zCgq-2E%DNeUXw-B3t-ZarMMbeRpClmI$|*TWO9XVTx)3Ma;`P)rGIm6^4TwCsLrzc z{l)h40&ENp4+t<^vYBYS1(Nx7WlE~t6vng-BF>rni+bo%ic}rgW%wxp?lyd}y>vi^ zG(HM1Q=MCyten>m>uv6Q|F|o{wH~}GMLrhNI8mYE?e3QC!_T7c^EeaV9`M&5A2pBY zaf9VBKWa$sp$C}Q=-S`Mlk%9+w@10xcY82*r!VPK;sBBdz7g1IO|@a`jC`m!>HXdX zdkQ^g$USfF=qe)$lJ;aVVU8WeAQ#p+U*b3=AA?-Nm{+xGz_(x3>zGdTHb%6k*eRRg zDM!Vt2k=D#4Q%B3XTp#G&(wB1x0=lS=agVL%Vxa31G6d zua|Z90yhPcJG!%7trzQgpY&$@xN_(}$w+*<>n2{sFdMXHP9ru8W*}C3>uK6mo3#9C z5MR`nDJ`^7!yi+9yNWlclJ4UO>tkwMl>1jX!dY{vjG~sUv+sTIL z^mB)wods)-GBpQF>Yu)1yvEcxPpyKwO>YZK_7?qL%9(oA1v)6;wBs)q^tzJKjKuGt5*moL{h# zWYyycoN*R4N`SK7eS!THIvTM0Vv7%hkGG(<#S$fc<4e(awvGR;PW;5Udh!xt z9b^gnU^FN|hO`P=Zu6X?;tUlu8TZTj!8HDkhw8ofZw^Xok>3a`1Bwy-`!2s+)`toQ zNp935$NsXYZ!XBIvehU~jM=m5+??scEBp!nJ*>ZXWih#IWFi z_z5+fi``zln`ANc?cGh$qHUJOwKXv@DW@OLbfpaf)TX(j+R(= zvz))n2*_3W_I=E$Q9nreOUcIaNM<<^$_4bnt5)|Ru<(f$7w^V;%TZA9;2z;P#(Xf} z(wxN$D55yZZ+^NqDmCeM%Wfk8N;UXkX@Oi4HR5AJNOnclKaZqob0i`+XI#+|{iW5x zR)2C}qDst7C?-jpmS6f4Yx{;*jKNNd$}Aj`4rqOSvhKkatK~L41|CKlxPZwAx+Lairvd0+f6E90au7S%RQE5Hzwv=rs$EOL07Qv&4DNL%k&1=LLG}@rvfeQ z`H?e)?i4ey+bqSsYq-J}&;03)1CP9Vr^3+`*kqBDSj{X{^&4T`&vmT6k`icdc~Uj1 zPKHQJrs8B9ONf%3*)ozz8^&U-)B=lv;#G-alg-j#RGbpWt`l<9L`_a%CpaSymIkQu zZk~>;7vGXj%+`r=)%t)Zt_KvkUa<@2_Twac&D84n=o zO7BTo@s(GP4OUCdHcZHtSZ}M$-4VWrFIw`^mBWTHPlAwG@Q&V3oWj=6b^cdH2LHLy zoZsxt#H;5b9P!Fgz}-rkdZk*%bHrIxm38u0VeseRaE{1mI8YX@B0_2c)EHb2lo=S?*G-_3GVA zmQKH+rFCz4>fh)Lf2*|{_vFvT&4I{=RXS>Z2){a?`C-KiuCCGVy@{opW~v3VdWA<=H%~TcNUWz>Y-sm$*F5#~`lgW&k8h2w3*U78CK-w1=QxJE;}ZLZ zD;3dRVN7+>l|9@q2fZIIsbc=vn7;>C%-SYZCww8Q0`k>2qv zn^pg8=N$UP`(Gq?fSq}hwKJmL8vn3q`XprG6z)l{yZ**iV$G)koXv zs>=Gp!O*lyVda7T^}8Q6N?Bl?S4Y^p5>L@4|NdWqq>0-J_Ld$`?gi7@gq+B4zsjog zM1LSuvq_{S`%OO?exCAzsro_ILr}55XPJwnjU-?^&rr4sQoqkL${Sv*2%Aku6(gJZ z$e#nAgXA+c9FO*Ui+{`9EvcB(*UsuTWSw124);f#JNn{Hr3bJ&aDQE7HFD`GOFaVo2ib{JM6n39=Z%Vh1xKEGhm6=SB`iXl^wJcRhI@L0(r%8G(yG#8{Sv|Igi z9k2kpQB8{mu-V0p$Z0)5`40pqV6W;q5cE)#Xm6LrTpW25op+vT9`~TYEq|sHpi;Hb zJikoOw=VdNA8La9{XT)tY8zM>m}bfW3AQ8h@0LMv* z8Sk=f_bYmVVc3VxoS@b|&a7>oj^5d(+F6MvLBzi4k?tcN!5T+xj0H|d3OK!L`@ z5q6vcrPG7MGc>cc27%E=$Pcm#Y!wZTO-{-;TRMuBI#zC6#GU zCpY%pb>8=7hPM3nK68{8n5u)eBCusAz8qczGoPDYoetoW1;f-sv~!G&W4#}g-B;#g zI#=h}+UrQbtOhF* zGi2>2_Py;D3O(h$Ecc|4VtIxBGPk%{*2niN=~MMLP?`6li$_?~Nf3l|0_X*n+Is^s zSVCsYS7(`AmZ-V!*2A2^eAG#jNA`{Mb_vfbI6euJ3bu9lJi~G_C@N1Af-AM=$+}d~ z7@?-3R5v;(T+Pn5yCj}|UCNLJ(IHJK--cjAUKiqc8v- zu@=>3tkcLfvcKGRI&rts;8?{33;Ny{x4WQ zhjfF!plrW&JuTO+Xxpf#=%F+_f+PL@9a=a#Gs1;z5M|b>a=#!%u^1IKUc?n!IKPX zappmooW2jrd02_XM*A3cspsb(s|U+2gC!D&t95+unm<9yE6{yu+t})`Vu#&1xGqFcY2f|mY%-W`_(UaX?ueTnpyB-F9zT1&(q6kqjs;Bjq+^ zfo|E&A#A3r_El+qfNrh`|*7f+9bBa&IcR@pZT{-piga=wo06L zgBIUO`RWLkuKA_p7DeRu*K76S9KbUiACes)^Nt;RWsiD#n6l^oY;8g`L9?6gN*m~& zh~b1k2(^TQR>jvqF}e8%i_pkr>Xk%-sK9t+?KOCfk)6p+vksK z&x7j=Nv!eA1TOHN@ZV+KBPGlC?X;;Gsl4Bypq*WJhf&mba0L&ZS1i4nt~j5T znz?r`Pqc*8xgt#=1ezQyNOXPT5i$bs?m^N*>9eO%wjHRSVW<3LXnnQu2iV_;wH{57 zq>iIDpSHAepDnw*GAY)vfJ@N_y9_DpWVj?_?#O5B1NUDl1fEVf)^zbENRP_{g7<$m zJR?7~)}$-M>uv{a*a)2DwiY;_%dVT!RO^jN8(0os|3NX9T5`zEy3PApik&Al(({%h z{^>0SFu~>1k;~ih`0yS}1!w3s+ZX!nIDBH#{Dr-K{Ji;{V_G=eRLhS0f%oS*vuM%= z>*%8y@3*UK?+LnU_DHH@5bAQ_9p$LA8R5H^H?0t{Muc!u4w6qK3eLO2Oh1Oru)Qd| zfls%RkhV>vdpTMjC_u7@y4q+=I`=p!@2%1~ab*iW?y|sY~`j>rJyFp1O0gJ zhItO}k;3+uX{>4g&R9)n-8-`n;r3Uw{`VpDIfYUq=>NR(_g-!a$Gr!@CWSAV_gS8G zU#BwUe?QS%={FFVxFg>*Z~32=dSAsn>i&}bf3ylqCeALE`{Td6`S(|<6ngppcYS~+z75O4pJ#L##6 z>Ae3Ng)`}4%YOu&3PEBYHJU0hlitWXJhy=yZ&$Ft*8~YETI0zP6yZ z@ZT4;BGtH_S1&T)*Bg@T++H0Jmb+$UTClwrtYL_S-u1>wK)kn$JOKt0@`$rnLInyKVnoDXiRSSnvv}+W%lu&y4oM6NywrXhA7Q z7wFv#H}kB!S_Wytm$HIbpk|`)^~B`Ty)=rM_{;e~!0{_yUoJ+Z*PvId_RtI-r$E9Q znF0neXLMcOEtAPllz29V@C(sl4ly0~_9W-vK0_Ca=w^+;WdjNKcNVTRp2;8T{Y-UUx3KwokRiDJ zb@&U+bC!9O11Eol8ZM~*=}9KUVXn@nH_$d?Xq?#9WJ?q)7@FNqZynh*w>?BZ2U)SR^O2elJCdVkw$&936b)!<}>F7Nkz~|d7L6CwcCyqH39M|`&ru! zxy;#fQ+!`@n?6`PB`YT+yBurJsKFLe{MKic%AWD~e7^En=;oJFE0yvFO}Fl9^pYl{ zhA9kQ`I6Y%-Vm|Pxj0VUXCl_8xlZlz23|+;fm+bR-d;9|=P=}>bIuH%kb6d89Z|?7 zVGYQqa(u`*|048e$?+3qKFb!XS#xbKGQnzCqZRERv3OPnlj~$>-X6SdEt}7$sasXF z_)HNfWc`UqxtQ9zGU_3oep%D2FSeHv=5r6?C_)t&OWAkMB&B*vAKgBWV@vL)qrn-dJxklh3F5)kt5WD9qIp{$(^ehhNzSQ{Fee2HpJ+U~5Xf>#l?S(PWj&@Rn+T4lL$weuom z=1sR6Plk4gg2;R4uSJQ=QvDYbLCf0Z3x^|q+0$L9K$dJn-aMab-EWqt&%;xi9ML?)0;iJ=NhBRg;_N!e%LHGP*Ce!76n*P&4L=<>=~^ zS?brQ2aPps{vrRwj?8}{y};>peEOkmS|D1>B3>7HkBu#h$4K`@c^&uOE;osP;lhUY zSZm4<)n>$HGGDMXTYBOwj6{e&{z}WnUYUiLQEpw<;#>aPGq1h;JG#3%1GP_iPE~Jg zGs%3v(aAmc9S76s6#DIym_S_7er&#qxOaKZCX@Tilo z-*^6D?Qv-!4yEus`1w3f%*6tftn=#X2Qdirh9_bN`n61H=XbJ3#X?BT_4IR(*Q zQZQfwiG$)us~~gU^=cVkWucpSb}ps9ryrFDUW=B8XE){GeP|(A;lZM!{LQg1zU9t( z?|kO^YW=%A#bm!+&G!*JEOfbH9EOy~Vc5UR&V>QT&pWMr9!Dx$S=<~#1dKHk>kK82 zz7SP5$7xzeW67=B68BqQpUnaDMA

    &`0rs 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 literal 0 HcmV?d00001 diff --git a/docs/guides/singlestore/monitoring/prometheus-operator/images/prometheus-operator.png b/docs/guides/singlestore/monitoring/prometheus-operator/images/prometheus-operator.png new file mode 100644 index 0000000000000000000000000000000000000000..a9719d7f15d5b5e343f12eb3fe618b3497fbee6e GIT binary patch literal 186285 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⪻QR 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 Cnfws| literal 0 HcmV?d00001 diff --git a/docs/guides/singlestore/monitoring/prometheus-operator/index.md b/docs/guides/singlestore/monitoring/prometheus-operator/index.md new file mode 100644 index 0000000000..e951d4fbea --- /dev/null +++ b/docs/guides/singlestore/monitoring/prometheus-operator/index.md @@ -0,0 +1,361 @@ +--- +title: Monitor SingleStore using Prometheus Operator +menu: + docs_{{ .version }}: + identifier: guides-sdb-monitoring-prometheus-operator + name: Prometheus Operator + parent: guides-sdb-monitoring + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring SingleStore Using Prometheus operator + +[Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) provides simple and Kubernetes native way to deploy and configure Prometheus server. This tutorial will show you how to use Prometheus operator to monitor SingleStore database deployed with KubeDB. + +The following diagram shows how KubeDB Provisioner operator monitor `SingleStore` using Prometheus Operator. Open the image in a new tab to see the enlarged version. + +

    +  Monitoring process of SingleStore using Prometheus Operator +
    Fig: Monitoring process of SingleStore
    +
    + +## 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/). + +- To learn how Prometheus monitoring works with KubeDB in general, please visit [here](/docs/guides/singlestore/monitoring/overview/index.md). + +- To keep database resources isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. Run the following command to prepare your cluster: + + ```bash + $ kubectl create ns demo + namespace/demo created + ``` + +- We need a [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) instance running. If you don't already have a running instance, deploy one following the docs from [here](https://github.com/appscode/third-party-tools/blob/master/monitoring/prometheus/operator/README.md). + +- If you already don't have a Prometheus server running, deploy one following tutorial from [here](https://github.com/appscode/third-party-tools/blob/master/monitoring/prometheus/operator/README.md#deploy-prometheus-server). + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/monitoring/prometheus-operator/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/monitoring/prometheus-operator/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## 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 SingleStore 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 +default prometheus 1 2m19s +``` + +> If you don't have any Prometheus server running in your cluster, deploy one following the guide specified in **Before You Begin** section. + +Now, let's view the YAML of the available Prometheus server `prometheus` in `default` namespace. + +```yaml +$ kubectl get prometheus -n default prometheus -o yaml +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"monitoring.coreos.com/v1","kind":"Prometheus","metadata":{"annotations":{},"labels":{"prometheus":"prometheus"},"name":"prometheus","namespace":"default"},"spec":{"replicas":1,"resources":{"requests":{"memory":"400Mi"}},"serviceAccountName":"prometheus","serviceMonitorNamespaceSelector":{"matchLabels":{"prometheus":"prometheus"}},"serviceMonitorSelector":{"matchLabels":{"release":"prometheus"}}}} + creationTimestamp: "2020-08-25T04:02:07Z" + generation: 1 + labels: + prometheus: prometheus + ... + manager: kubectl + operation: Update + time: "2020-08-25T04:02:07Z" + name: prometheus + namespace: default + resourceVersion: "2087" + selfLink: /apis/monitoring.coreos.com/v1/namespaces/default/prometheuses/prometheus + uid: 972a50cb-b751-418b-b2bc-e0ecc9232730 +spec: + replicas: 1 + resources: + requests: + memory: 400Mi + serviceAccountName: prometheus + serviceMonitorNamespaceSelector: + matchLabels: + prometheus: prometheus + serviceMonitorSelector: + matchLabels: + release: prometheus +``` + +- `spec.serviceMonitorSelector` field specifies which ServiceMonitors should be included. The Above label `release: prometheus` is used to select `ServiceMonitors` by its selector. So, we are going to use this label in `spec.monitor.prometheus.labels` field of SingleStore crd. +- `spec.serviceMonitorNamespaceSelector` field specifies that the `ServiceMonitors` can be selected outside the Prometheus namespace by Prometheus using namespace selector. The Above label `prometheus: prometheus` is used to select the namespace where the `ServiceMonitor` is created. + +### Add Label to database namespace + +KubeDB creates a `ServiceMonitor` in database namespace `demo`. We need to add label to `demo` namespace. Prometheus will select this namespace by using its `spec.serviceMonitorNamespaceSelector` field. + +Let's add label `prometheus: prometheus` to `demo` namespace, + +```bash +$ kubectl patch namespace demo -p '{"metadata":{"labels": {"prometheus":"prometheus"}}}' +namespace/demo patched +``` + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Deploy SingleStore with Monitoring Enabled + +At first, let's deploy an SingleStore database with monitoring enabled. Below is the SingleStore object that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: prom-operator-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s +``` + +Here, + +- `monitor.agent: prometheus.io/operator` indicates that we are going to monitor this server using Prometheus operator. + +- `monitor.prometheus.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 SingleStore object that we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/monitoring/prometheus-operator/yamls/prom-operator-singlestore.yaml +singlestore.kubedb.com/prom-operator-sdb created +``` + +Now, wait for the database to go into `Running` state. + +```bash +$ watch -n 3 kubectl get singlestore -n demo prom-operator-sdb + +NAME TYPE VERSION STATUS AGE +prom-operator-sdb kubedb.com/v1alpha2 8.7.10 Ready 10m + +``` + +KubeDB will create a separate stats service with name `{SingleStore crd name}-stats` for monitoring purpose. + +```bash +$ kubectl get svc -n demo --selector="app.kubernetes.io/instance=prom-operator-sdb" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +prom-operator-sdb ClusterIP 10.128.249.124 3306/TCP,8081/TCP 12m +prom-operator-sdb-pods ClusterIP None 3306/TCP 12m +prom-operator-sdb-stats ClusterIP 10.128.25.236 9104/TCP 12m + +``` + +Here, `prom-operator-sdb-stats` service has been created for monitoring purpose. + +Let's describe this stats service. + +```yaml +$ kubectl describe svc -n demo prom-operator-sdb-stats +Name: prom-operator-sdb-stats +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=prom-operator-sdb + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com + kubedb.com/role=stats +Annotations: monitoring.appscode.com/agent: prometheus.io/operator +Selector: app.kubernetes.io/instance=prom-operator-sdb,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=singlestores.kubedb.com +Type: ClusterIP +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.128.25.236 +IPs: 10.128.25.236 +Port: metrics 9104/TCP +TargetPort: metrics/TCP +Endpoints: 10.2.1.140:9104,10.2.1.141:9104 +Session Affinity: None +Events: + +``` + +Notice the `Labels` and `Port` fields. `ServiceMonitor` will use these information to target its endpoints. + +KubeDB will also create a `ServiceMonitor` crd in `demo` namespace that select the endpoints of `prom-operator-sdb-stats` service. Verify that the `ServiceMonitor` crd has been created. + +```bash +$ kubectl get servicemonitor -n demo +NAME AGE +prom-operator-sdb-stats 32m + +``` + +Let's verify that the `ServiceMonitor` has the label that we had specified in `spec.monitor` section of SingleStore crd. + +```yaml +$ kubectl get servicemonitor -n demo prom-operator-sdb-stats -oyaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + creationTimestamp: "2024-10-01T05:37:40Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: prom-operator-sdb + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: singlestores.kubedb.com + release: prometheus + name: prom-operator-sdb-stats + namespace: demo + ownerReferences: + - apiVersion: v1 + blockOwnerDeletion: true + controller: true + kind: Service + name: prom-operator-sdb-stats + uid: 33802913-be0f-49ea-ac81-cf0136ed9fbc + resourceVersion: "98648" + uid: f26855f0-5f0e-45a6-8bf2-531d2a370377 +spec: + endpoints: + - honorLabels: true + interval: 10s + path: /metrics + port: metrics + namespaceSelector: + matchNames: + - demo + selector: + matchLabels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: prom-operator-sdb + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: singlestores.kubedb.com + kubedb.com/role: stats +``` + +Notice that the `ServiceMonitor` has label `release: prometheus` that we had specified in SingleStore crd. + +Also notice that the `ServiceMonitor` has selector which match the labels we have seen in the `prom-operator-sdb-stats` service. It also, target the `prom-http` port that we have seen in the stats service. + +## Verify Monitoring Metrics + +At first, let's find out the respective Prometheus pod for `prometheus` Prometheus server. + +```bash +$ kubectl get pod -n default -l=app=prometheus +NAME READY STATUS RESTARTS AGE +prometheus-prometheus-0 3/3 Running 1 121m +``` + +Prometheus server is listening to port `9090` of `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. + +Run following command on a separate terminal to forward the port 9090 of `prometheus-prometheus-0` pod, + +```bash +$ kubectl port-forward -n default prometheus-prometheus-0 9090 +Forwarding from 127.0.0.1:9090 -> 9090 +Forwarding from [::1]:9090 -> 9090 +``` + +Now, we can access the dashboard at `localhost:9090`. Open [http://localhost:9090](http://localhost:9090) in your browser. You should see `prom-http` endpoint of `prom-operator-sdb-stats` service as one of the targets. + +

    +  Prometheus Target +

    + +Check the `endpoint` and `service` labels marked by red rectangle. It verifies that the target is our expected database. Now, you can view the collected metrics and create a graph from homepage of this Prometheus dashboard. You can also use this Prometheus server as data source for [Grafana](https://grafana.com/) and create beautiful dashboard with collected metrics. + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run following commands + +```bash +# cleanup database +kubectl delete -n demo sdb/prom-operator-sdb + +# cleanup Prometheus resources if exist +kubectl delete -f https://raw.githubusercontent.com/appscode/third-party-tools/master/monitoring/prometheus/coreos-operator/artifacts/prometheus.yaml +kubectl delete -f https://raw.githubusercontent.com/appscode/third-party-tools/master/monitoring/prometheus/coreos-operator/artifacts/prometheus-rbac.yaml + +# cleanup Prometheus operator resources if exist +kubectl delete -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/release-0.41/bundle.yaml + +# delete namespace +kubectl delete ns demo +``` + +## Next Steps + +- Monitor your SingleStore database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/singlestore/monitoring/builtin-prometheus/index.md). +- Detail concepts of [SingleStore object](/docs/guides/singlestore/concepts/singlestore.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/singlestore/monitoring/prometheus-operator/yamls/prom-operator-singlestore.yaml b/docs/guides/singlestore/monitoring/prometheus-operator/yamls/prom-operator-singlestore.yaml new file mode 100644 index 0000000000..370ddb2016 --- /dev/null +++ b/docs/guides/singlestore/monitoring/prometheus-operator/yamls/prom-operator-singlestore.yaml @@ -0,0 +1,59 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: prom-operator-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s \ No newline at end of file diff --git a/docs/guides/singlestore/quickstart/quickstart.md b/docs/guides/singlestore/quickstart/quickstart.md index f2a1724e85..9cc52e7183 100644 --- a/docs/guides/singlestore/quickstart/quickstart.md +++ b/docs/guides/singlestore/quickstart/quickstart.md @@ -47,10 +47,12 @@ This tutorial will show you how to use KubeDB to run a SingleStore database. When you have installed KubeDB, it has created `SinglestoreVersion` crd for all supported SingleStore versions. Check it by using the `kubectl get singlestoreversions` command. You can also use `sdbv` shorthand instead of `singlestoreversions`. ```bash -$ kubectl get singlestoreversions + $ kubectl get singlestoreversions.catalog.kubedb.com NAME VERSION DB_IMAGE DEPRECATED AGE -8.1.32 8.1.32 ghcr.io/appscode-images/singlestore-node:alma-8.1.32-e3d3cde6da 72m -8.5.7 8.5.7 ghcr.io/appscode-images/singlestore-node:alma-8.5.7-bf633c1a54 72m +8.1.32 8.1.32 ghcr.io/appscode-images/singlestore-node:alma-8.1.32-e3d3cde6da 2d1h +8.5.30 8.5.30 ghcr.io/appscode-images/singlestore-node:alma-8.5.30-4f46ab16a5 2d1h +8.5.7 8.5.7 ghcr.io/appscode-images/singlestore-node:alma-8.5.7-bf633c1a54 2d1h +8.7.10 8.7.10 ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 2d1h ``` ## Create SingleStore License Secret diff --git a/docs/guides/singlestore/reconfigure-tls/_index.md b/docs/guides/singlestore/reconfigure-tls/_index.md new file mode 100644 index 0000000000..3a49b8c81c --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/_index.md @@ -0,0 +1,10 @@ +--- +title: Reconfigure SingleStore TLS/SSL +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure-tls + name: Reconfigure TLS/SSL + parent: guides-singlestore + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/issuer.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/issuer.yaml new file mode 100644 index 0000000000..8ffb97a846 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: sdb-issuer + namespace: demo +spec: + ca: + secretName: sdb-ca \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/sample-sdb.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sample-sdb.yaml new file mode 100644 index 0000000000..f654417867 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sample-sdb.yaml @@ -0,0 +1,51 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-add-tls.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-add-tls.yaml new file mode 100644 index 0000000000..4f8ad58246 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-add-tls.yaml @@ -0,0 +1,21 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-add-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + issuerRef: + name: sdb-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + subject: + organizations: + - singlestore + organizationalUnits: + - client \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-remove-tls.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-remove-tls.yaml new file mode 100644 index 0000000000..4643dbfe37 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-remove-tls.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-remove-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + remove: true \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-rotate-tls.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-rotate-tls.yaml new file mode 100644 index 0000000000..503b4040d6 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-rotate-tls.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-rotate-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + rotateCertificates: true \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-update-tls.yaml b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-update-tls.yaml new file mode 100644 index 0000000000..549fbd7480 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-update-tls.yaml @@ -0,0 +1,17 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-update-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + certificates: + - alias: server + subject: + organizations: + - kubedb:server + emailAddresses: + - "kubedb@appscode.com" \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure-tls/cluster/index.md b/docs/guides/singlestore/reconfigure-tls/cluster/index.md new file mode 100644 index 0000000000..37cc93eb74 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/cluster/index.md @@ -0,0 +1,657 @@ +--- +title: Reconfigure SingleStore TLS/SSL Encryption +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure-tls-cluster + name: Reconfigure TLS/SSL Encryption + parent: guides-sdb-reconfigure-tls + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfigure SingleStore TLS/SSL (Transport Encryption) + +KubeDB supports reconfigure i.e. add, remove, update and rotation of TLS/SSL certificates for existing SingleStore database via a SingleStoreOpsRequest. This tutorial will show you how to use KubeDB to reconfigure TLS/SSL encryption. + +## 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 [`cert-manger`](https://cert-manager.io/docs/installation/) v1.6.0 or later to your cluster to manage your SSL/TLS certificates. + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + + ```bash + $ kubectl create ns demo + namespace/demo created + ``` + +## Add TLS to a SingleStore Cluster + +Here, We are going to create a SingleStore database without TLS and then reconfigure the database to use TLS. +> **Note:** Steps for reconfiguring TLS of SingleStore `Standalone` is same as SingleStore `Cluster`. + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +### Deploy SingleStore without TLS + +In this section, we are going to deploy a SingleStore Cluster database without TLS. In the next few sections we will reconfigure TLS using `SingleStoreOpsRequest` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + deletionPolicy: WipeOut +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` + +Now, wait until `sample-sdb` has status `Ready`. i.e, + +```bash +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +sample-sdb kubedb.com/v1alpha2 8.7.10 Ready 38m + +``` + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 1188 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show variables like '%ssl%'; ++---------------------------------+------------+ +| Variable_name | Value | ++---------------------------------+------------+ +| default_user_require_ssl | OFF | +| exporter_ssl_ca | | +| exporter_ssl_capath | | +| exporter_ssl_cert | | +| exporter_ssl_key | | +| exporter_ssl_key_passphrase | [redacted] | +| have_openssl | OFF | +| have_ssl | OFF | +| jwks_ssl_ca_certificate | | +| node_replication_ssl_only | OFF | +| openssl_version | 805306480 | +| processlist_rpc_json_max_size | 2048 | +| ssl_ca | | +| ssl_capath | | +| ssl_cert | | +| ssl_cipher | | +| ssl_fips_mode | OFF | +| ssl_key | | +| ssl_key_passphrase | [redacted] | +| ssl_last_reload_attempt_time | | +| ssl_last_successful_reload_time | | ++---------------------------------+------------+ +21 rows in set (0.00 sec) +``` + +We can verify from the above output that TLS is disabled for this database. + +### Create Issuer/ClusterIssuer + +Now, we are going to create an example `Issuer` that will be used throughout the duration of this tutorial. Alternatively, you can follow this [cert-manager tutorial](https://cert-manager.io/docs/configuration/ca/) to create your own `Issuer`. By following the below steps, we are going to create our desired issuer, + +- Start off by generating our ca-certificates using openssl, + +```bash +$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key -out ./ca.crt -subj "/CN=memsql/O=kubedb" +Generating a RSA private key +...........................................................................+++++ +........................................................................................................+++++ +writing new private key to './ca.key' +``` + +- create a secret using the certificate files we have just generated, + +```bash +kubectl create secret tls sdb-ca \ + --cert=ca.crt \ + --key=ca.key \ + --namespace=demo +secret/sdb-ca created +``` + +Now, we are going to create an `Issuer` using the `sdb-ca` secret that hols the ca-certificate we have just created. Below is the YAML of the `Issuer` cr that we are going to create, + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: sdb-issuer + namespace: demo +spec: + ca: + secretName: sdb-ca +``` + +Let’s create the `Issuer` cr we have shown above, + +```bash +kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/issuer.yaml +issuer.cert-manager.io/sdb-issuer created +``` + +### Create SingleStoreOpsRequest + +In order to add TLS to the database, we have to create a `SingleStoreOpsRequest` CRO with our created issuer. Below is the YAML of the `SingleStoreOpsRequest` CRO that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-add-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + issuerRef: + name: sdb-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + subject: + organizations: + - singlestore + organizationalUnits: + - client +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our database. +- `spec.tls.issuerRef` specifies the issuer name, kind and api group. +- `spec.tls.certificates` specifies the certificates. You can learn more about this field from [here](/docs/guides/singlestore/concepts/singlestore.md#spectls). + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-add-tls.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-add-tls created + +``` + +#### Verify TLS Enabled Successfully + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CRO, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +singlestoreopsrequest.ops.kubedb.com/sdbops-add-tls ReconfigureTLS Successful 2m45s + +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. + +Now, we are going to connect to the database for verifying the `SingleStore` server has configured with TLS/SSL encryption. + +Let's exec into the pod to verify TLS/SSL configuration, + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ ls etc/memsql/certs/ +ca.crt client.crt client.key server.crt server.key +[memsql@sample-sdb-aggregator-0 /]$ +[memsql@sample-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 90 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show variables like '%ssl%'; ++---------------------------------+------------------------------+ +| Variable_name | Value | ++---------------------------------+------------------------------+ +| default_user_require_ssl | OFF | +| exporter_ssl_ca | | +| exporter_ssl_capath | | +| exporter_ssl_cert | | +| exporter_ssl_key | | +| exporter_ssl_key_passphrase | [redacted] | +| have_openssl | ON | +| have_ssl | ON | +| jwks_ssl_ca_certificate | | +| node_replication_ssl_only | OFF | +| openssl_version | 805306480 | +| processlist_rpc_json_max_size | 2048 | +| ssl_ca | /etc/memsql/certs/ca.crt | +| ssl_capath | | +| ssl_cert | /etc/memsql/certs/server.crt | +| ssl_cipher | | +| ssl_fips_mode | OFF | +| ssl_key | /etc/memsql/certs/server.key | +| ssl_key_passphrase | [redacted] | +| ssl_last_reload_attempt_time | | +| ssl_last_successful_reload_time | | ++---------------------------------+------------------------------+ +21 rows in set (0.00 sec) +``` + +We can see from the above output that, `have_ssl` is set to `ture`. So, database TLS is enabled successfully to this database. + +## Rotate Certificate + +Now we are going to rotate the certificate of this database. First let's check the current expiration date of the certificate. + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ openssl x509 -in /etc/memsql/certs/server.crt -inform PEM -enddate -nameopt RFC2253 -noout +notAfter=Jan 6 06:56:55 2025 GMT + +``` + +So, the certificate will expire on this time `Jan 6 06:56:55 2025 GMT`. + +### Create SingleStoreOpsRequest + +Now we are going to increase it using a SingleStoreOpsRequest. Below is the yaml of the ops request that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-rotate-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + rotateCertificates: true +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our database. +- `spec.tls.rotateCertificates` specifies that we want to rotate the certificate of this database. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-rotate-tls.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-rotate-tls created +``` + +#### Verify Certificate Rotated Successfully + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CRO, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-rotate-tls ReconfigureTLS Successful 4m14s + +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. Now, let's check the expiration date of the certificate. + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ openssl x509 -in /etc/memsql/certs/server.crt -inform PEM -enddate -nameopt RFC2253 -noout +notAfter=Jan 6 07:15:47 2025 GMT + +``` + +As we can see from the above output, the certificate has been rotated successfully. + +## Update Certificate + +Now, we are going to update the server certificate. + +- Let's describe the server certificate `sample-sdb-server-cert` +```bash + $ kubectl describe certificate -n demo sample-sdb-server-cert +Name: sample-sdb-server-cert +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=sample-sdb + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=singlestores.kubedb.com +Annotations: +API Version: cert-manager.io/v1 +Kind: Certificate +Metadata: + Creation Timestamp: 2024-10-08T06:56:55Z + Generation: 1 + Owner References: + API Version: kubedb.com/v1alpha2 + Block Owner Deletion: true + Controller: true + Kind: Singlestore + Name: sample-sdb + UID: 5e42538e-c631-4583-9f47-328742e6d938 + Resource Version: 4965452 + UID: 65c6936b-1bd0-413d-a96d-edf0cff17897 +Spec: + Common Name: sample-sdb + Dns Names: + *.sample-sdb-pods.demo.svc + *.sample-sdb-pods.demo.svc.cluster.local + *.sample-sdb.demo.svc + localhost + sample-sdb + sample-sdb.demo.svc + Ip Addresses: + 127.0.0.1 + Issuer Ref: + Group: cert-manager.io + Kind: Issuer + Name: sdb-issuer + Secret Name: sample-sdb-server-cert + Usages: + digital signature + key encipherment + server auth + client auth +Status: + Conditions: + Last Transition Time: 2024-10-08T06:56:56Z + Message: Certificate is up to date and has not expired + Observed Generation: 1 + Reason: Ready + Status: True + Type: Ready + Not After: 2025-01-06T07:15:47Z + Not Before: 2024-10-08T07:15:47Z + Renewal Time: 2024-12-07T07:15:47Z + Revision: 23 +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Generated 23m cert-manager-certificates-key-manager Stored new private key in temporary Secret resource "sample-sdb-server-cert-48d82" + Normal Requested 23m cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-msv5z" + Normal Issuing 23m cert-manager-certificates-trigger Issuing certificate as Secret does not exist + Normal Requested 7m39s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-qpmbp" + Normal Requested 7m38s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-2cldn" + Normal Requested 7m34s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-qtm4z" + Normal Requested 7m33s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-5tflq" + Normal Requested 7m29s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-qzd6h" + Normal Requested 7m28s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-q6bd7" + Normal Requested 7m12s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-jd2cx" + Normal Requested 7m11s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-74dr5" + Normal Requested 7m7s cert-manager-certificates-request-manager Created new CertificateRequest resource "sample-sdb-server-cert-4k2wf" + Normal Reused 5m7s (x22 over 7m39s) cert-manager-certificates-key-manager Reusing private key stored in existing Secret resource "sample-sdb-server-cert" + Normal Issuing 5m7s (x23 over 23m) cert-manager-certificates-issuing The certificate has been successfully issued + Normal Requested 5m7s (x13 over 7m6s) cert-manager-certificates-request-manager (combined from similar events): Created new CertificateRequest resource "sample-sdb-server-cert-qn8g9" + +``` + +We want to add `subject` and `emailAddresses` in the spec of server sertificate. + +### Create SingleStoreOpsRequest + +Below is the YAML of the `SingleStoreOpsRequest` CRO that we are going to create ton update the server certificate, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-update-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + certificates: + - alias: server + subject: + organizations: + - kubedb:server + emailAddresses: + - "kubedb@appscode.com" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our database. +- `spec.tls.issuerRef` specifies the issuer name, kind and api group. +- `spec.tls.certificates` specifies the changes that we want in certificate objects. +- `spec.tls.certificates[].alias` specifies the certificate type which is one of these: `server`, `client`. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-update-tls.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-update-tls created + +``` + +#### Verify certificate is updated successfully + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CRO, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-update-tls ReconfigureTLS Successful 3m24s + + +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. + +Now, Let's exec into a database node and find out the ca subject to see if it matches the one we have provided. + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ openssl x509 -in /etc/memsql/certs/server.crt -inform PEM -subject -email -nameopt RFC2253 -noout +subject=CN=sample-sdb,O=kubedb:server +kubedb@appscode.com +``` + +We can see from the above output that, the subject name and email address match with the new ca certificate that we have created. So, the issuer is changed successfully. + +## Remove TLS from the Database + +Now, we are going to remove TLS from this database using a SingleStoreOpsRequest. + +### Create SingleStoreOpsRequest + +Below is the YAML of the `SingleStoreOpsRequest` CRO that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-remove-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: sample-sdb + tls: + remove: true +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our database. +- `spec.tls.remove` specifies that we want to remove tls from this database. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-tls/cluster/examples/sdbops-remove-tls.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-remove-tls created +``` + +#### Verify TLS Removed Successfully + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CRO, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-remove-tls ReconfigureTLS Successful 27m +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. If we describe the `SingleStoreOpsRequest` we will get an overview of the steps that were followed. + +Now, Let's exec into the database and find out that TLS is disabled or not. + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ ls etc/memsql/ +memsql_exporter.cnf memsqlctl.hcl +[memsql@sample-sdb-aggregator-0 /]$ +[memsql@sample-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 840 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show variables like '%ssl%'; ++---------------------------------+------------+ +| Variable_name | Value | ++---------------------------------+------------+ +| default_user_require_ssl | OFF | +| exporter_ssl_ca | | +| exporter_ssl_capath | | +| exporter_ssl_cert | | +| exporter_ssl_key | | +| exporter_ssl_key_passphrase | [redacted] | +| have_openssl | OFF | +| have_ssl | OFF | +| jwks_ssl_ca_certificate | | +| node_replication_ssl_only | OFF | +| openssl_version | 805306480 | +| processlist_rpc_json_max_size | 2048 | +| ssl_ca | | +| ssl_capath | | +| ssl_cert | | +| ssl_cipher | | +| ssl_fips_mode | OFF | +| ssl_key | | +| ssl_key_passphrase | [redacted] | +| ssl_last_reload_attempt_time | | +| ssl_last_successful_reload_time | | ++---------------------------------+------------+ +21 rows in set (0.00 sec) + +singlestore> exit +Bye +``` + +So, we can see from the above that, output that tls is disabled successfully. + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo --all +$ kubectl delete issuer -n demo --all +$ kubectl delete singlestoreopsrequest -n demo --all +$ kubectl delete ns demo +``` diff --git a/docs/guides/singlestore/reconfigure-tls/overview/images/reconfigure-tls.svg b/docs/guides/singlestore/reconfigure-tls/overview/images/reconfigure-tls.svg new file mode 100644 index 0000000000..cdb554c409 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/overview/images/reconfigure-tls.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/reconfigure-tls/overview/index.md b/docs/guides/singlestore/reconfigure-tls/overview/index.md new file mode 100644 index 0000000000..39f958d519 --- /dev/null +++ b/docs/guides/singlestore/reconfigure-tls/overview/index.md @@ -0,0 +1,54 @@ +--- +title: Reconfiguring TLS of SingleStore Database +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure-tls-overview + name: Overview + parent: guides-sdb-reconfigure-tls + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfiguring TLS of SingleStore Database + +This guide will give an overview on how KubeDB Ops Manager reconfigures TLS configuration i.e. add TLS, remove TLS, update issuer/cluster issuer or Certificates and rotate the certificates of a `SingleStore` database. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Reconfiguring SingleStore TLS Configuration Process Works + +The following diagram shows how KubeDB Ops Manager reconfigures TLS of a `SingleStore` database. Open the image in a new tab to see the enlarged version. + +
    +  Reconfiguring TLS process of SingleStore +
    Fig: Reconfiguring TLS process of SingleStore
    +
    + +The Reconfiguring SingleStore TLS process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource Object (CRO). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CRO. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to reconfigure the TLS configuration of the `SingleStore` database the user creates a `SingleStoreOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +6. When it finds a `SingleStoreOpsRequest` CR, it pauses the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` Community operator doesn't perform any operations on the `SingleStore` 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. + +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 `SingleStoreOpsRequest` CR. + +9. After the successful reconfiguring of the `SingleStore` TLS, the `KubeDB` Enterprise operator resumes the `SingleStore` object so that the `KubeDB` Community 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 SingleStore database using `SingleStoreOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure/_index.md b/docs/guides/singlestore/reconfigure/_index.md new file mode 100644 index 0000000000..831d6b443b --- /dev/null +++ b/docs/guides/singlestore/reconfigure/_index.md @@ -0,0 +1,10 @@ +--- +title: Reconfigure SingleStore Configuration +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure + name: Reconfigure + parent: guides-singlestore + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/reconfigure/overview/images/sdb-reconfigure.svg b/docs/guides/singlestore/reconfigure/overview/images/sdb-reconfigure.svg new file mode 100644 index 0000000000..232221941c --- /dev/null +++ b/docs/guides/singlestore/reconfigure/overview/images/sdb-reconfigure.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/reconfigure/overview/index.md b/docs/guides/singlestore/reconfigure/overview/index.md new file mode 100644 index 0000000000..88796eb9f2 --- /dev/null +++ b/docs/guides/singlestore/reconfigure/overview/index.md @@ -0,0 +1,54 @@ +--- +title: Reconfiguring SingleStore +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure-overview + name: Overview + parent: guides-sdb-reconfigure + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +### Reconfiguring SingleStore + +This guide will give an overview on how KubeDB Ops Manager reconfigures `SingleStore`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Reconfiguring SingleStore Process Works + +The following diagram shows how KubeDB Ops Manager reconfigures `SingleStore` database components. Open the image in a new tab to see the enlarged version. + +
    +  Reconfiguring process of SingleStore +
    Fig: Reconfiguring process of SingleStore
    +
    + +The Reconfiguring SingleStore process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to reconfigure the `SingleStore` standalone or cluster the user creates a `SingleStoreOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +6. When it finds a `SingleStoreOpsRequest` CR, it halts the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` provisioner operator doesn't perform any operations on the `SingleStore` object during the reconfiguring process. + +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 `SingleStoreOpsRequest` CR. + +8. Then the `KubeDB` Ops-manager operator will restart the related PetSet Pods so that they restart with the new configuration defined in the `SingleStoreOpsRequest` CR. + +9. After the successful reconfiguring of the `SingleStore`, the `KubeDB` Ops-manager operator resumes the `SingleStore` 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 SingleStore database components using `SingleStoreOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md b/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md new file mode 100644 index 0000000000..dd1b01c344 --- /dev/null +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md @@ -0,0 +1,477 @@ +--- +title: Reconfigure SingleStore Configuration +menu: + docs_{{ .version }}: + identifier: guides-sdb-reconfigure-reconfigure-steps + name: Reconfigure OpsRequest + parent: guides-sdb-reconfigure + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfigure SingleStore Cluster Database + +This guide will show you how to use `KubeDB` Ops-manager operator to reconfigure a SingleStore Cluster. + +## 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` 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: +- [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) +- [SingleStore Cluster](/docs/guides/singlestore/clustering) +- [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) +- [Reconfigure Overview](/docs/guides/singlestore/reconfigure/overview) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +Now, we are going to deploy a `SingleStore` Cluster using a supported version by `KubeDB` operator. Then we are going to apply `SingleStoreOpsRequest` to reconfigure its configuration. + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Deploy SingleStore + +At first, we will create `sdb-config.cnf` file containing required configuration settings. + +```ini +$ cat sdb-config.cnf +[server] +max_connections = 250 +read_buffer_size = 122880 + +``` + +Here, `max_connections` is set to `250`, whereas the default value is `100000`. Likewise, `read_buffer_size` has the deafult value `131072`. + +Now, we will create a secret with this configuration file. + +```bash +$ kubectl create secret generic -n demo sdb-configuration --from-file=./sdb-config.cnf +secret/sdb-configuration created +``` + +In this section, we are going to create a SingleStore object specifying `spec.topology.aggreagtor.configSecret` field to apply this custom configuration. Below is the YAML of the `SingleStore` CR that we are going to create, + + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: custom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/custom-sdb.yaml +singlestore.kubedb.com/custom-sdb created + + +Now, wait until `custom-sdb` has status `Ready`. i.e, + +```bash +$ kubectl get pod -n demo +NAME READY STATUS RESTARTS AGE +custom-sdb-aggregator-0 2/2 Running 0 94s +custom-sdb-aggregator-1 2/2 Running 0 88s +custom-sdb-leaf-0 2/2 Running 0 91s +custom-sdb-leaf-1 2/2 Running 0 86s + +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +custom-sdb kubedb.com/v1alpha2 8.7.10 Ready 4m29s +``` + +We can see the database is in ready phase so it can accept conncetion. + +Now, we will check if the database has started with the custom configuration we have provided. + +> Read the comment written for the following commands. They contain the instructions and explanations of the commands. + +```bash +# Connceting to the database +$ kubectl exec -it -n demo custom-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@custom-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 208 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +# value of `max_conncetions` is same as provided +singlestore> show variables like 'max_connections'; ++-----------------+-------+ +| Variable_name | Value | ++-----------------+-------+ +| max_connections | 250 | ++-----------------+-------+ +1 row in set (0.00 sec) + +# value of `read_buffer_size` is same as provided +singlestore> show variables like 'read_buffer_size'; ++------------------+--------+ +| Variable_name | Value | ++------------------+--------+ +| read_buffer_size | 122880 | ++------------------+--------+ +1 row in set (0.00 sec) + +singlestore> exit +Bye + +``` + +As we can see from the configuration of ready singlestore, the value of `max_connections` has been set to `250` and `read_buffer_size` has been set to `122880`. + +### Reconfigure using new config secret + +Now we will reconfigure this database to set `max_connections` to `350` and `read_buffer_size` to `132880`. + +Now, we will create new file `new-sdb-config.cnf` containing required configuration settings. + +#### Create SingleStoreOpsRequest + +Now, we will use this secret to replace the previous secret using a `SingleStoreOpsRequest` CR. The `SingleStoreOpsRequest` yaml is given below, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: custom-sdb + configuration: + aggregator: + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are reconfiguring `custom-sdb` database. +- `spec.type` specifies that we are performing `Configuration` on our database. +- `spec.configuration.aggregator.applyConfig` is a map where key supports 1 values, namely `sdb-apply.cnf` for aggregator nodes. You can also specifies `spec.configuration.leaf.applyConfig` which is a map where key supports 1 values, namely `sdb-apply.cnf` for leaf nodes. + +Let's create the `SinglestoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-reconfigure-config created +``` + +#### Verify the new configuration is working + +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `SingleStore` object. + +Let's wait for `SinglestoreOpsRequest` to be `Successful`. Run the following command to watch `SinglestoreOpsRequest` CR, + +```bash +$ kubectl get singlestoreopsrequest --all-namespaces +NAMESPACE NAME TYPE STATUS AGE +demo sdbops-reconfigure-config Configuration Successful 10m + +``` + +We can see from the above output that the `SinglestoreOpsRequest` has succeeded. If we describe the `SinglestoreOpsRequest` we will get an overview of the steps that were followed to reconfigure the database. + +```bash +$ kubectl describe singlestoreopsrequest -n demo sdbops-reconfigure-config +Name: sdbops-reconfigure-config +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: SinglestoreOpsRequest +Metadata: + Creation Timestamp: 2024-10-04T10:18:22Z + Generation: 1 + Resource Version: 2114236 + UID: 56b37f6d-d8be-49c7-a588-9740863edd2a +Spec: + Apply: IfReady + Configuration: + Aggregator: + Apply Config: + sdb-apply.cnf: max_connections = 550 + Database Ref: + Name: custom-sdb + Type: Configuration +Status: + Conditions: + Last Transition Time: 2024-10-04T10:18:22Z + Message: Singlestore ops-request has started to expand volume of singlestore nodes. + Observed Generation: 1 + Reason: Configuration + Status: True + Type: Configuration + Last Transition Time: 2024-10-04T10:18:28Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-04T10:18:28Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-04T10:19:53Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-04T10:18:33Z + Message: get pod; ConditionStatus:True; PodName:custom-sdb-aggregator-0 + Observed Generation: 1 + Status: True + Type: GetPod--custom-sdb-aggregator-0 + Last Transition Time: 2024-10-04T10:18:33Z + Message: evict pod; ConditionStatus:True; PodName:custom-sdb-aggregator-0 + Observed Generation: 1 + Status: True + Type: EvictPod--custom-sdb-aggregator-0 + Last Transition Time: 2024-10-04T10:19:08Z + Message: check pod ready; ConditionStatus:True; PodName:custom-sdb-aggregator-0 + Observed Generation: 1 + Status: True + Type: CheckPodReady--custom-sdb-aggregator-0 + Last Transition Time: 2024-10-04T10:19:13Z + Message: get pod; ConditionStatus:True; PodName:custom-sdb-aggregator-1 + Observed Generation: 1 + Status: True + Type: GetPod--custom-sdb-aggregator-1 + Last Transition Time: 2024-10-04T10:19:13Z + Message: evict pod; ConditionStatus:True; PodName:custom-sdb-aggregator-1 + Observed Generation: 1 + Status: True + Type: EvictPod--custom-sdb-aggregator-1 + Last Transition Time: 2024-10-04T10:19:48Z + Message: check pod ready; ConditionStatus:True; PodName:custom-sdb-aggregator-1 + Observed Generation: 1 + Status: True + Type: CheckPodReady--custom-sdb-aggregator-1 + Last Transition Time: 2024-10-04T10:19:53Z + Message: Successfully completed the reconfiguring for Singlestore + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + +``` + +Now let's connect to a singlestore instance and run a memsql internal command to check the new configuration we have provided. + +```bash +$ kubectl exec -it -n demo custom-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@custom-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 626 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show variables like 'max_connections'; ++-----------------+-------+ +| Variable_name | Value | ++-----------------+-------+ +| max_connections | 550 | ++-----------------+-------+ +1 row in set (0.00 sec) + +singlestore> exit +Bye + + +``` + +As we can see from the configuration has changed, the value of `max_connections` has been changed from `250` to `550`. So the reconfiguration of the database is successful. + +### Remove Custom Configuration + +We can also remove exisiting custom config using `SinglestoreOpsRequest`. Provide `true` to field `spec.configuration.aggregator.removeCustomConfig` and make an Ops Request to remove existing custom configuration. + +#### Create SingleStoreOpsRequest + +Lets create an `SinglestoreOpsRequest` having `spec.configuration.aggregator.removeCustomConfig` is equal `true`, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-remove + namespace: demo +spec: + type: Configuration + databaseRef: + name: custom-sdb + configuration: + aggregator: + removeCustomConfig: true +``` + +Here, + +- `spec.databaseRef.name` specifies that we are reconfiguring `custom-sdb` database. +- `spec.type` specifies that we are performing `Reconfigure` on our database. +- `spec.configuration.aggregator.removeCustomConfig` is a bool field that should be `true` when you want to remove existing custom configuration. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/reconfigure/yamls/reconfigure-steps/reconfigure-remove.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-reconfigure-remove created +``` + +#### Verify the new configuration is working + +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `SingleStore` object. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-reconfigure-remove Configuration Successful 5m31s +``` + +Now let's connect to a singlestore instance and run a singlestore internal command to check the new configuration we have provided. + +```bash +$ kubectl exec -it -n demo custom-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@custom-sdb-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 166 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> +singlestore> +singlestore> show variables like 'max_connections'; ++-----------------+-------+ +| Variable_name | Value | ++-----------------+-------+ +| max_connections | 100000| ++-----------------+-------+ +1 row in set (0.00 sec) + +singlestore> exit +Bye + + +``` + +As we can see from the configuration has changed to its default value. So removal of existing custom configuration using `SingleStoreOpsRequest` is successful. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete singlestore -n demo custom-sdb +$ kubectl delete singlestoreopsrequest -n demo sdbops-reconfigure-config sdbops-reconfigure-remove +$ kubectl delete ns demo +``` diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/custom-sdb.yaml b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/custom-sdb.yaml new file mode 100644 index 0000000000..8438852626 --- /dev/null +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/custom-sdb.yaml @@ -0,0 +1,56 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: custom-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + configSecret: + name: sdb-configuration + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml new file mode 100644 index 0000000000..b557e898e9 --- /dev/null +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml @@ -0,0 +1,12 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: custom-sdb + configuration: + aggregator: + removeCustomConfig: true \ No newline at end of file diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml new file mode 100644 index 0000000000..65b617765d --- /dev/null +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml @@ -0,0 +1,14 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-reconfigure-config + namespace: demo +spec: + type: Configuration + databaseRef: + name: custom-sdb + configuration: + aggregator: + applyConfig: + sdb-apply.cnf: |- + max_connections = 550 \ No newline at end of file diff --git a/docs/guides/singlestore/restart/_index.md b/docs/guides/singlestore/restart/_index.md new file mode 100644 index 0000000000..100ea6b049 --- /dev/null +++ b/docs/guides/singlestore/restart/_index.md @@ -0,0 +1,10 @@ +--- +title: Restart SingleStore +menu: + docs_{{ .version }}: + identifier: sdb-restart + name: Restart + parent: guides-singlestore + weight: 49 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/restart/restart.md b/docs/guides/singlestore/restart/restart.md new file mode 100644 index 0000000000..5fa613bd30 --- /dev/null +++ b/docs/guides/singlestore/restart/restart.md @@ -0,0 +1,266 @@ +--- +title: Restart SingleStore +menu: + docs_{{ .version }}: + identifier: sdb-restart-details + name: Restart SingleStore + parent: sdb-restart + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Restart SingleStore + +KubeDB supports restarting the SingleStore database via a SingleStoreOpsRequest. Restarting is useful if some pods are got stuck in some phase, or they are not working correctly. This tutorial will show you how to use that. + +## 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/). + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + +```bash + $ kubectl create ns demo + namespace/demo created + ``` + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/restart/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/restart/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +## Deploy SingleStore + +In this section, we are going to deploy a SingleStore database using KubeDB. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/restart/yamls/sdb-sample.yaml +singlestore.kubedb.com/sdb-sample created +``` +**Wait for the database to be ready:** + +Now, wait for `SingleStore` going on `Ready` state + +```bash +kubectl get singlestore -n demo +NAME TYPE VERSION STATUS AGE +sdb-sample kubedb.com/v1alpha2 8.7.10 Ready 2m + +``` + +## Apply Restart opsRequest + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: restart + namespace: demo +spec: + type: Restart + databaseRef: + name: sdb-sample + timeout: 10m + apply: Always +``` + +- `spec.type` specifies the Type of the ops Request +- `spec.databaseRef` holds the name of the SingleStore database. The db should be available in the same namespace as the opsRequest +- The meaning of `spec.timeout` & `spec.apply` fields will be found [here](/docs/guides/rabbitmq/concepts/opsrequest.md#spectimeout) + +> Note: The method of restarting the standalone & clustered singlestore is exactly same as above. All you need, is to specify the corresponding SingleStore name in `spec.databaseRef.name` section. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/restart/yamls/restart-ops.yaml +singlestoreopsrequest.ops.kubedb.com/restart created +``` + +Now the Ops-manager operator will restart the pods sequentially by their cardinal suffix. + +```shell +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +restart Restart Successful 10m + +$ kubectl get singlestoreopsrequest -n demo restart -oyaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"ops.kubedb.com/v1alpha1","kind":"SinglestoreOpsRequest","metadata":{"annotations":{},"name":"restart","namespace":"demo"},"spec":{"apply":"Always","databaseRef":{"name":"sdb-sample"},"timeout":"10m","type":"Restart"}} + creationTimestamp: "2024-10-28T05:31:00Z" + generation: 1 + name: restart + namespace: demo + resourceVersion: "3549386" + uid: b2512e44-89eb-4f1b-ae0d-232caee94f01 +spec: + apply: Always + databaseRef: + name: sdb-sample + timeout: 10m + type: Restart +status: + conditions: + - lastTransitionTime: "2024-10-28T05:31:00Z" + message: Singlestore ops-request has started to restart singlestore nodes + observedGeneration: 1 + reason: Restart + status: "True" + type: Restart + - lastTransitionTime: "2024-10-28T05:31:03Z" + message: Successfully paused database + observedGeneration: 1 + reason: DatabasePauseSucceeded + status: "True" + type: DatabasePauseSucceeded + - lastTransitionTime: "2024-10-28T05:33:33Z" + message: Successfully restarted Singlestore nodes + observedGeneration: 1 + reason: RestartNodes + status: "True" + type: RestartNodes + - lastTransitionTime: "2024-10-28T05:31:08Z" + message: get pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + observedGeneration: 1 + status: "True" + type: GetPod--sdb-sample-aggregator-0 + - lastTransitionTime: "2024-10-28T05:31:08Z" + message: evict pod; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + observedGeneration: 1 + status: "True" + type: EvictPod--sdb-sample-aggregator-0 + - lastTransitionTime: "2024-10-28T05:31:48Z" + message: check pod ready; ConditionStatus:True; PodName:sdb-sample-aggregator-0 + observedGeneration: 1 + status: "True" + type: CheckPodReady--sdb-sample-aggregator-0 + - lastTransitionTime: "2024-10-28T05:31:53Z" + message: get pod; ConditionStatus:True; PodName:sdb-sample-leaf-0 + observedGeneration: 1 + status: "True" + type: GetPod--sdb-sample-leaf-0 + - lastTransitionTime: "2024-10-28T05:31:53Z" + message: evict pod; ConditionStatus:True; PodName:sdb-sample-leaf-0 + observedGeneration: 1 + status: "True" + type: EvictPod--sdb-sample-leaf-0 + - lastTransitionTime: "2024-10-28T05:32:38Z" + message: check pod ready; ConditionStatus:True; PodName:sdb-sample-leaf-0 + observedGeneration: 1 + status: "True" + type: CheckPodReady--sdb-sample-leaf-0 + - lastTransitionTime: "2024-10-28T05:32:43Z" + message: get pod; ConditionStatus:True; PodName:sdb-sample-leaf-1 + observedGeneration: 1 + status: "True" + type: GetPod--sdb-sample-leaf-1 + - lastTransitionTime: "2024-10-28T05:32:43Z" + message: evict pod; ConditionStatus:True; PodName:sdb-sample-leaf-1 + observedGeneration: 1 + status: "True" + type: EvictPod--sdb-sample-leaf-1 + - lastTransitionTime: "2024-10-28T05:33:28Z" + message: check pod ready; ConditionStatus:True; PodName:sdb-sample-leaf-1 + observedGeneration: 1 + status: "True" + type: CheckPodReady--sdb-sample-leaf-1 + - lastTransitionTime: "2024-10-28T05:33:33Z" + message: Controller has successfully restart the Singlestore replicas + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete singlestoreopsrequest -n demo restart +kubectl delete singlestore -n demo sdb-sample +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [SingleStore object](/docs/guides/singlestore/concepts/singlestore.md). +- Monitor your SingleStore database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/singlestore/monitoring/prometheus-operator/index.md). +- Monitor your SingleStore database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/singlestore/monitoring/builtin-prometheus/index.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/singlestore/restart/yamls/restart-ops.yaml b/docs/guides/singlestore/restart/yamls/restart-ops.yaml new file mode 100644 index 0000000000..4271b8adb0 --- /dev/null +++ b/docs/guides/singlestore/restart/yamls/restart-ops.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: restart + namespace: demo +spec: + type: Restart + databaseRef: + name: sdb-sample + timeout: 10m + apply: Always \ No newline at end of file diff --git a/docs/guides/singlestore/restart/yamls/sdb-sample.yaml b/docs/guides/singlestore/restart/yamls/sdb-sample.yaml new file mode 100644 index 0000000000..67a26cdcf0 --- /dev/null +++ b/docs/guides/singlestore/restart/yamls/sdb-sample.yaml @@ -0,0 +1,51 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-sample + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/_index.md b/docs/guides/singlestore/scaling/_index.md new file mode 100644 index 0000000000..809575b24b --- /dev/null +++ b/docs/guides/singlestore/scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Scaling SingleStore +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling + name: Scaling + parent: guides-singlestore + weight: 43 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/_index.md b/docs/guides/singlestore/scaling/horizontal-scaling/_index.md new file mode 100644 index 0000000000..7c75aacefb --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Horizontal Scaling +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-horizontal + name: Horizontal Scaling + parent: guides-sdb-scaling + weight: 10 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sample-sdb.yaml b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sample-sdb.yaml new file mode 100644 index 0000000000..437685dccf --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sample-sdb.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-downscale.yaml b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-downscale.yaml new file mode 100644 index 0000000000..4ca154c9d2 --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-downscale.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-scale-horizontal-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: sample-sdb + horizontalScaling: + leaf: 2 \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-upscale.yaml b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-upscale.yaml new file mode 100644 index 0000000000..26c0b50178 --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-upscale.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-scale-horizontal-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: sample-sdb + horizontalScaling: + leaf: 3 \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/cluster/index.md b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/index.md new file mode 100644 index 0000000000..7b289a738e --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/cluster/index.md @@ -0,0 +1,326 @@ +--- +title: Horizontal Scaling SingleStore +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-horizontal-cluster + name: Horizontal Scaling OpsRequest + parent: guides-sdb-scaling-horizontal + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Horizontal Scale SingleStore + +This guide will show you how to use `KubeDB` Enterprise operator to scale the cluster of a SingleStore 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). + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStore Cluster](/docs/guides/singlestore/clustering/) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Horizontal Scaling Overview](/docs/guides/singlestore/scaling/horizontal-scaling/overview/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Apply Horizontal Scaling on Cluster + +Here, we are going to deploy a `SingleStore` cluster using a supported version by `KubeDB` operator. Then we are going to apply horizontal scaling on it. + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +### Deploy SingleStore Cluster + +In this section, we are going to deploy a SingleStore cluster. Then, in the next section we will scale the database using `SingleStoreOpsRequest` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` + +Now, wait until `sample-sdb` has status `Ready`. i.e, + +```bash +$ kubectl get singlestore -n demo +NAME TYPE VERSION STATUS AGE +sample-sdb kubedb.com/v1alpha2 8.7.10 Ready 86s +``` + +Let's check the number of `aggreagtor replicas` and `leaf replicas` this database has from the SingleStore object, number of pods the `aggregator-petset` and `leaf-petset` have, + +```bash +$ kubectl get sdb -n demo sample-sdb -o json | jq '.spec.topology.aggregator.replicas' +1 +$ kubectl get sdb -n demo sample-sdb -o json | jq '.spec.topology.leaf.replicas' +2 + +$ kubectl get petset -n demo sample-sdb-aggregator -o=jsonpath='{.spec.replicas}{"\n"}' +1 +kubectl get petset -n demo sample-sdb-leaf -o=jsonpath='{.spec.replicas}{"\n"}' +2 + + +``` + +We can see from both command that the database has 1 `aggregator replicas` and 2 `leaf replicas` in the cluster. + +Also, we can verify the replicas of the from an internal memsqlctl command by execing into a replica. + +Now let's connect to a singlestore instance and run a memsqlctl internal command to check the number of replicas, + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ memsqlctl show-cluster ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Role | Host | Port | Availability Group | Pair Host | Pair Port | State | Opened Connections | Average Roundtrip Latency ms | NodeId | Master Aggregator | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Leaf | sample-sdb-leaf-0.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 2 | | 2 | | +| Leaf | sample-sdb-leaf-1.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 3 | | 3 | | +| Aggregator (Leader) | sample-sdb-aggregator-0.sample-sdb-pods.demo.svc | 3306 | | null | null | online | 1 | null | 1 | 1 | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ + + +``` + +We can see from the above output that the cluster has 1 aggregator node and 2 leaf nodes. + +We are now ready to apply the `SingleStoreOpsRequest` CR to scale this database. + +## Scale Up Replicas + +Here, we are going to scale up the replicas of the `leaf nodes` to meet the desired number of replicas after scaling. + +#### Create SingleStoreOpsRequest + +In order to scale up the replicas of the `leaf nodes` of the database, we have to create a `SingleStoreOpsRequest` CR with our desired replicas. Below is the YAML of the `SingleStoreOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-scale-horizontal-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: sample-sdb + horizontalScaling: + leaf: 3 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing horizontal scaling operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `HorizontalScaling` on our database. +- `spec.horizontalScaling.leaf` specifies the desired leaf replicas after scaling. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-upscale.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-scale-horizontal-up created +``` + +#### Verify Cluster replicas scaled up successfully + +If everything goes well, `KubeDB` Enterprise operator will update the replicas of `SingleStore` object and related `PetSets` and `Pods`. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash + $ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-scale-horizontal-up HorizontalScaling Successful 74s +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. Now, we are going to verify the number of `leaf replicas` this database has from the SingleStore object, number of pods the `leaf petset` have, + +```bash +$ kubectl get sdb -n demo sample-sdb -o json | jq '.spec.topology.leaf.replicas' +3 +$ kubectl get petset -n demo sample-sdb-leaf -o=jsonpath='{.spec.replicas}{"\n"}' +3 + +``` + +Now let's connect to a singlestore instance and run a memsqlctl internal command to check the number of replicas, + +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sample-sdb-aggregator-0 /]$ memsqlctl show-cluster ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Role | Host | Port | Availability Group | Pair Host | Pair Port | State | Opened Connections | Average Roundtrip Latency ms | NodeId | Master Aggregator | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Leaf | sample-sdb-leaf-0.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 2 | | 2 | | +| Leaf | sample-sdb-leaf-1.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 3 | | 3 | | +| Leaf | sample-sdb-leaf-2.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 2 | | 4 | | +| Aggregator (Leader) | sample-sdb-aggregator-0.sample-sdb-pods.demo.svc | 3306 | | null | null | online | 1 | null | 1 | 1 | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ + +``` + +From all the above outputs we can see that the `leaf replicas` of the cluster is `3`. That means we have successfully scaled up the `leaf replicas` of the SingleStore Cluster. + +### Scale Down Replicas + +Here, we are going to scale down the `leaf replicas` of the cluster to meet the desired number of replicas after scaling. + +#### Create SingleStoreOpsRequest + +In order to scale down the cluster of the database, we have to create a `SingleStoreOpsRequest` CR with our desired replicas. Below is the YAML of the `SingleStoreOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-scale-horizontal-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: sample-sdb + horizontalScaling: + leaf: 2 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing horizontal scaling down operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `HorizontalScaling` on our database. +- `spec.horizontalScaling.leaf` specifies the desired `leaf replicas` after scaling. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/scaling/horizontal-scaling/cluster/example/sdbops-downscale.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-scale-horizontal-down created +``` + +#### Verify Cluster replicas scaled down successfully + +If everything goes well, `KubeDB` Enterprise operator will update the replicas of `SingleStore` object and related `PetSets` and `Pods`. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-scale-horizontal-down HorizontalScaling Successful 63s +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. Now, we are going to verify the number of `leaf replicas` this database has from the SingleStore object, number of pods the `leaf petset` have, + +```bash +$ kubectl get sdb -n demo sample-sdb -o json | jq '.spec.topology.leaf.replicas' +2 +$ kubectl get petset -n demo sample-sdb-leaf -o=jsonpath='{.spec.replicas}{"\n"}' +2 + +``` + +Now let's connect to a singlestore instance and run a memsqlctl internal command to check the number of replicas, +```bash +$ kubectl exec -it -n demo sample-sdb-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +bash: mesqlctl: command not found +[memsql@sample-sdb-aggregator-0 /]$ memsqlctl show-cluster ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Role | Host | Port | Availability Group | Pair Host | Pair Port | State | Opened Connections | Average Roundtrip Latency ms | NodeId | Master Aggregator | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ +| Leaf | sample-sdb-leaf-0.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 2 | | 2 | | +| Leaf | sample-sdb-leaf-1.sample-sdb-pods.demo.svc | 3306 | 1 | null | null | online | 3 | | 3 | | +| Aggregator (Leader) | sample-sdb-aggregator-0.sample-sdb-pods.demo.svc | 3306 | | null | null | online | 1 | null | 1 | 1 | ++---------------------+--------------------------------------------------+------+--------------------+-----------+-----------+--------+--------------------+------------------------------+--------+-------------------+ + +``` + +From all the above outputs we can see that the `leaf replicas` of the cluster is `2`. That means we have successfully scaled down the `leaf replicas` of the SingleStore database. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo sample-sdb +$ kubectl delete singlestoreopsrequest -n demo sdbops-scale-horizontal-up sdbops-scale-horizontal-down +``` \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/overview/images/horizontal-scaling.svg b/docs/guides/singlestore/scaling/horizontal-scaling/overview/images/horizontal-scaling.svg new file mode 100644 index 0000000000..6d09610348 --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/overview/images/horizontal-scaling.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/scaling/horizontal-scaling/overview/index.md b/docs/guides/singlestore/scaling/horizontal-scaling/overview/index.md new file mode 100644 index 0000000000..ade92b2c09 --- /dev/null +++ b/docs/guides/singlestore/scaling/horizontal-scaling/overview/index.md @@ -0,0 +1,54 @@ +--- +title: SingleStore Horizontal Scaling Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-horizontal-overview + name: Overview + parent: guides-sdb-scaling-horizontal + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Horizontal Scaling + +This guide will give an overview on how KubeDB Ops Manager scales up or down `SingleStore Cluster`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Horizontal Scaling Process Works + +The following diagram shows how KubeDB Ops Manager scales up or down `SingleStore` database components. Open the image in a new tab to see the enlarged version. + +
    +  Horizontal scaling process of SingleStore +
    Fig: Horizontal scaling process of SingleStore
    +
    + +The Horizontal scaling process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to scale the `SingleStore` database the user creates a `SingleStoreOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +6. When it finds a `SingleStoreOpsRequest` CR, it pauses the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `SingleStore` object during the horizontal scaling process. + +7. Then the `KubeDB` Ops-manager operator will scale the related PetSet Pods to reach the expected number of replicas defined in the `SingleStoreOpsRequest` CR. + +8. After the successfully scaling the replicas of the PetSet Pods, the `KubeDB` Ops-manager operator updates the number of replicas in the `SingleStore` object to reflect the updated state. + +9. After the successful scaling of the `SingleStore` replicas, the `KubeDB` Ops-manager operator resumes the `SingleStore` 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 SingleStore database using `SingleStoreOpsRequest` CRD. diff --git a/docs/guides/singlestore/scaling/vertical-scaling/_index.md b/docs/guides/singlestore/scaling/vertical-scaling/_index.md new file mode 100644 index 0000000000..7d88aa0a8d --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Vertical Scaling +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-vertical + name: Vertical Scaling + parent: guides-sdb-scaling + weight: 20 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sample-sdb.yaml b/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sample-sdb.yaml new file mode 100644 index 0000000000..437685dccf --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sample-sdb.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sdbops-vscale.yaml b/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sdbops-vscale.yaml new file mode 100644 index 0000000000..661a44385e --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sdbops-vscale.yaml @@ -0,0 +1,18 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-vscale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: sample-sdb + verticalScaling: + aggregator: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/vertical-scaling/cluster/index.md b/docs/guides/singlestore/scaling/vertical-scaling/cluster/index.md new file mode 100644 index 0000000000..dab35d70ea --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/cluster/index.md @@ -0,0 +1,226 @@ +--- +title: Vertical Scaling SingleStore Cluster +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-vertical-cluster + name: Vertical Scaling OpsRequest + parent: guides-sdb-scaling-vertical + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Vertical Scale SingleStore Cluster + +This guide will show you how to use `KubeDB` Enterprise operator to update the resources of a SingleStore cluster 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). + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [Clustering](/docs/guides/singlestore/clustering/singlestore-clustering/) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Vertical Scaling Overview](/docs/guides/singlestore/scaling/vertical-scaling/overview/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Apply Vertical Scaling on Cluster + +Here, we are going to deploy a `SingleStore` cluster using a supported version by `KubeDB` operator. Then we are going to apply vertical scaling on it. + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +### Deploy SingleStore Cluster + +In this section, we are going to deploy a SingleStore cluster database. Then, in the next section we will update the resources of the database using `SingleStoreOpsRequest` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` + +Now, wait until `sample-sdb` has status `Ready`. i.e, + +```bash +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +sample-sdb kubedb.com/v1alpha2 8.7.10 Ready 101s +``` + +Let's check the Pod containers resources, + +```bash +$ kubectl get pod -n demo sample-sdb-aggregator-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "600m", + "memory": "2Gi" + }, + "requests": { + "cpu": "600m", + "memory": "2Gi" + } +} + +``` + +We are now ready to apply the `SingleStoreOpsRequest` CR to update the resources of this database. + +### Vertical Scaling + +Here, we are going to update the resources of the database to meet the desired resources after scaling. + +#### Create SingleStoreOpsRequest + +In order to update the resources of the database, we have to create a `SingleStoreOpsRequest` CR with our desired resources. Below is the YAML of the `SingleStoreOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdbops-vscale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: sample-sdb + verticalScaling: + aggregator: + resources: + requests: + memory: "2500Mi" + cpu: "0.7" + limits: + memory: "2500Mi" + cpu: "0.7" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing vertical scaling operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `VerticalScaling` on our database. +- `spec.VerticalScaling.aggregator` specifies the desired `aggregator` nodes resources after scaling. As well you can scale resources for leaf node, standalone node and coordinator container. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/scaling/vertical-scaling/cluster/example/sdbops-vscale.yaml +singlestoreopsrequest.ops.kubedb.com/sdbops-vscale created +``` + +#### Verify SingleStore Cluster resources updated successfully + +If everything goes well, `KubeDB` Enterprise operator will update the resources of `SingleStore` object and related `PetSets` and `Pods`. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdbops-vscale VerticalScaling Successful 7m30s +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. Now, we are going to verify from one of the Pod yaml whether the resources of the database has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo sample-sdb-aggregator-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "700m", + "memory": "2500Mi" + }, + "requests": { + "cpu": "700m", + "memory": "2500Mi" + } +} + +``` + +The above output verifies that we have successfully scaled up the resources of the SingleStore database. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo sample-sdb +$ kubectl delete singlestoreopsrequest -n demo sdbops-vscale +``` \ No newline at end of file diff --git a/docs/guides/singlestore/scaling/vertical-scaling/overview/images/vertical-sacling.svg b/docs/guides/singlestore/scaling/vertical-scaling/overview/images/vertical-sacling.svg new file mode 100644 index 0000000000..8f0e835339 --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/overview/images/vertical-sacling.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/scaling/vertical-scaling/overview/index.md b/docs/guides/singlestore/scaling/vertical-scaling/overview/index.md new file mode 100644 index 0000000000..ae12482b8c --- /dev/null +++ b/docs/guides/singlestore/scaling/vertical-scaling/overview/index.md @@ -0,0 +1,52 @@ +--- +title: SingleStore Vertical Scaling Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-scaling-vertical-overview + name: Overview + parent: guides-sdb-scaling-vertical + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Vertical Scaling + +This guide will give an overview on how KubeDB Ops Manager vertically scales up `SingleStore`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +The following diagram shows how KubeDB Ops Manager scales up or down `SingleStore` database components. Open the image in a new tab to see the enlarged version. + +
    +  Vertical scaling process of SingleStore +
    Fig: Vertical scaling process of SingleStore
    +
    + +The vertical scaling process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to update the resources(for example `CPU`, `Memory` etc.) of the `SingleStore` database the user creates a `SingleStoreOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +6. When it finds a `SingleStoreOpsRequest` CR, it halts the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `SingleStore` object during the vertical scaling process. + +7. Then the `KubeDB` Ops-manager operator will update resources of the PetSet Pods to reach desired state. + +8. After the successful update of the resources of the PetSet's replica, the `KubeDB` Ops-manager operator updates the `SingleStore` object to reflect the updated state. + +9. After the successful update of the `SingleStore` resources, the `KubeDB` Ops-manager operator resumes the `SingleStore` 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 SingleStore database using `SingleStoreOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/singlestore/tls/_index.md b/docs/guides/singlestore/tls/_index.md new file mode 100644 index 0000000000..9503da0132 --- /dev/null +++ b/docs/guides/singlestore/tls/_index.md @@ -0,0 +1,10 @@ +--- +title: TLS/SSL Encryption +menu: + docs_{{ .version }}: + identifier: guides-sdb-tls + name: TLS/SSL Encryption + parent: guides-singlestore + weight: 45 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/tls/configure/examples/issuer.yaml b/docs/guides/singlestore/tls/configure/examples/issuer.yaml new file mode 100644 index 0000000000..8ffb97a846 --- /dev/null +++ b/docs/guides/singlestore/tls/configure/examples/issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: sdb-issuer + namespace: demo +spec: + ca: + secretName: sdb-ca \ No newline at end of file diff --git a/docs/guides/singlestore/tls/configure/examples/tls-cluster.yaml b/docs/guides/singlestore/tls/configure/examples/tls-cluster.yaml new file mode 100644 index 0000000000..49a24c692e --- /dev/null +++ b/docs/guides/singlestore/tls/configure/examples/tls-cluster.yaml @@ -0,0 +1,66 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-tls + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + deletionPolicy: WipeOut + tls: + issuerRef: + apiGroup: cert-manager.io + kind: Issuer + name: sdb-issuer + certificates: + - alias: server + subject: + organizations: + - kubedb:server + dnsNames: + - localhost + ipAddresses: + - "127.0.0.1" + diff --git a/docs/guides/singlestore/tls/configure/index.md b/docs/guides/singlestore/tls/configure/index.md new file mode 100644 index 0000000000..a1a555cd8c --- /dev/null +++ b/docs/guides/singlestore/tls/configure/index.md @@ -0,0 +1,334 @@ +--- +title: TLS/SSL (Transport Encryption) +menu: + docs_{{ .version }}: + identifier: guides-sdb-tls-configure + name: SingleStore TLS/SSL Configuration + parent: guides-sdb-tls + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Configure TLS/SSL in SingleStore + +`KubeDB` supports providing TLS/SSL encryption (via, `tls` mode) for `SingleStore`. This tutorial will show you how to use `KubeDB` to deploy a `SingleStore` database with TLS/SSL configuration. + +## 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 [`cert-manger`](https://cert-manager.io/docs/installation/) v1.0.0 or later to your cluster to manage your SSL/TLS certificates. + +- Install `KubeDB` in your cluster following the steps [here](/docs/setup/README.md). + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + + ```bash + $ kubectl create ns demo + namespace/demo created + ``` + +> Note: YAML files used in this tutorial are stored in [docs/guides/singlestore/tls/configure/examples](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/singlestore/tls/configure/examples) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +### Deploy SingleStore database with TLS/SSL configuration + +As pre-requisite, at first, we are going to create an Issuer/ClusterIssuer. This Issuer/ClusterIssuer is used to create certificates. Then we are going to deploy a SingleStore standalone and cluster that will be configured with these certificates by `KubeDB` operator. + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +### Create Issuer/ClusterIssuer + +Now, we are going to create an example `Issuer` that will be used throughout the duration of this tutorial. Alternatively, you can follow this [cert-manager tutorial](https://cert-manager.io/docs/configuration/ca/) to create your own `Issuer`. By following the below steps, we are going to create our desired issuer, + +- Start off by generating our ca-certificates using openssl, + +```bash +$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key -out ./ca.crt -subj "/CN=memsql/O=kubedb" +Generating a RSA private key +...........................................................................+++++ +........................................................................................................+++++ +writing new private key to './ca.key' +``` + +- create a secret using the certificate files we have just generated, + +```bash +kubectl create secret tls sdb-ca \ + --cert=ca.crt \ + --key=ca.key \ + --namespace=demo +secret/sdb-ca created +``` + +Now, we are going to create an `Issuer` using the `sdb-ca` secret that hols the ca-certificate we have just created. Below is the YAML of the `Issuer` cr that we are going to create, + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: sdb-issuer + namespace: demo +spec: + ca: + secretName: sdb-ca +``` + +Let’s create the `Issuer` cr we have shown above, + +```bash +kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/tls/configure/examples/issuer.yaml +issuer.cert-manager.io/sdb-issuer created +``` + +### Deploy SingleStore Cluster with TLS/SSL configuration + +Here, our issuer `sdb-issuer` is ready to deploy a `SingleStore` cluster with TLS/SSL configuration. Below is the YAML for SingleStore Cluster that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sdb-tls + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "700m" + requests: + memory: "2Gi" + cpu: "700m" + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + deletionPolicy: WipeOut + tls: + issuerRef: + apiGroup: cert-manager.io + kind: Issuer + name: sdb-issuer + certificates: + - alias: server + subject: + organizations: + - kubedb:server + dnsNames: + - localhost + ipAddresses: + - "127.0.0.1" +``` + +Here, + +- `spec.tls.issuerRef` refers to the `sdb-issuer` issuer. + +- `spec.tls.certificates` gives you a lot of options to configure so that the certificate will be renewed and kept up to date. +You can found more details from [here](/docs/guides/singlestore/concepts/singlestore.md#spectls) + +Let’s create the `SingleStore` cr we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/tls/configure/examples/tls-cluster.yaml +singlestore.kubedb.com/sdb-tls created +``` + +**Wait for the database to be ready:** + +Now, wait for `SingleStore` going on `Running` state and also wait for `PetSet` and its pod to be created and going to `Running` state, + +```bash +$ kubectl get sdb,petset -n demo +NAME TYPE VERSION STATUS AGE +singlestore.kubedb.com/sdb-tls kubedb.com/v1alpha2 8.7.10 Ready 3m57s + +NAME AGE +petset.apps.k8s.appscode.com/sdb-tls-aggregator 3m53s +petset.apps.k8s.appscode.com/sdb-tls-leaf 3m50s +``` + +**Verify tls-secrets created successfully:** + +If everything goes well, you can see that our tls-secrets will be created which contains server, client, exporter certificate. Server tls-secret will be used for server configuration and client tls-secret will be used for a secure connection. + +All tls-secret are created by `KubeDB` Ops Manager. Default tls-secret name formed as _{singlestore-object-name}-{cert-alias}-cert_. + +Let's check the tls-secrets have created, + +```bash +$ kubectl get secret -n demo | grep sdb-tls +sdb-tls-client-cert kubernetes.io/tls 3 5m41s +sdb-tls-root-cred kubernetes.io/basic-auth 2 5m41s +sdb-tls-server-cert kubernetes.io/tls +``` + +**Verify SingleStore configured with TLS/SSL:** + +Now, we are going to connect to the database for verifying the `SingleStore` server has configured with TLS/SSL encryption. + +Let's exec into the pod to verify TLS/SSL configuration, + +```bash +$ kubectl exec -it -n demo sdb-tls-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) + +[memsql@sdb-tls-aggregator-0 /]$ ls etc/memsql/certs +ca.crt client.crt client.key server.crt server.key + +[memsql@sdb-tls-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 237 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> show variables like '%ssl%'; ++---------------------------------+------------------------------+ +| Variable_name | Value | ++---------------------------------+------------------------------+ +| default_user_require_ssl | OFF | +| exporter_ssl_ca | | +| exporter_ssl_capath | | +| exporter_ssl_cert | | +| exporter_ssl_key | | +| exporter_ssl_key_passphrase | [redacted] | +| have_openssl | ON | +| have_ssl | ON | +| jwks_ssl_ca_certificate | | +| node_replication_ssl_only | OFF | +| openssl_version | 805306480 | +| processlist_rpc_json_max_size | 2048 | +| ssl_ca | /etc/memsql/certs/ca.crt | +| ssl_capath | | +| ssl_cert | /etc/memsql/certs/server.crt | +| ssl_cipher | | +| ssl_fips_mode | OFF | +| ssl_key | /etc/memsql/certs/server.key | +| ssl_key_passphrase | [redacted] | +| ssl_last_reload_attempt_time | | +| ssl_last_successful_reload_time | | ++---------------------------------+------------------------------+ +21 rows in set (0.00 sec) +singlestore> exit +Bye + +``` + +The above output shows that the `SingleStore` server is configured to TLS/SSL. You can also see that the `.crt` and `.key` files are stored in `/etc/mysql/certs/` directory for client and server respectively. + +**Verify secure connection for SSL required user:** + +Now, you can create an SSL required user that will be used to connect to the database with a secure connection. + +Let's connect to the database server with a secure connection, + +```bash +$ kubectl exec -it -n demo sdb-tls-aggregator-0 -- bash +Defaulted container "singlestore" out of: singlestore, singlestore-coordinator, singlestore-init (init) +[memsql@sdb-tls-aggregator-0 /]$ memsql -uroot -p$ROOT_PASSWORD +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 316 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> CREATE USER 'new_user'@'localhost' IDENTIFIED BY '1234' REQUIRE SSL; +Query OK, 0 rows affected (0.05 sec) + +singlestore> FLUSH PRIVILEGES; +Query OK, 0 rows affected (0.00 sec) + +singlestore> exit +Bye + +# accessing the database server newly created user with certificates +[memsql@sdb-tls-aggregator-0 /]$ memsql -unew_user -p1234 --ssl-ca=/etc/memsql/certs/ca.crt --ssl-cert=/etc/memsql/certs/server.crt --ssl-key=/etc/memsql/certs/server.key +singlestore-client: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 462 +Server version: 5.7.32 SingleStoreDB source distribution (compatible; MySQL Enterprise & MySQL Commercial) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +singlestore> exit; +Bye + +``` + +From the above output, you can see that only using client certificate we can access the database securely, otherwise, it shows "Access denied". Our client certificate is stored in `/etc/memsql/certs/` directory. + +## Cleaning up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb demo sdb-tls +singlestore.kubedb.com "sdb-tls" deleted +$ kubectl delete ns demo +namespace "demo" deleted +``` \ No newline at end of file diff --git a/docs/guides/singlestore/tls/overview/images/sdb-tls.svg b/docs/guides/singlestore/tls/overview/images/sdb-tls.svg new file mode 100644 index 0000000000..18c72067a9 --- /dev/null +++ b/docs/guides/singlestore/tls/overview/images/sdb-tls.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/tls/overview/index.md b/docs/guides/singlestore/tls/overview/index.md new file mode 100644 index 0000000000..0da1189929 --- /dev/null +++ b/docs/guides/singlestore/tls/overview/index.md @@ -0,0 +1,69 @@ +--- +title: SingleStore TLS/SSL Encryption Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-tls-overview + name: Overview + parent: guides-sdb-tls + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore TLS/SSL Encryption + +**Prerequisite :** To configure TLS/SSL in `SingleStore`, `KubeDB` uses `cert-manager` to issue certificates. So first you have to make sure that the cluster has `cert-manager` installed. To install `cert-manager` in your cluster following steps [here](https://cert-manager.io/docs/installation/kubernetes/). + +To issue a certificate, the following cr of `cert-manager` is used: + +- `Issuer/ClusterIssuer`: Issuers and ClusterIssuers represent certificate authorities (CAs) that are able to generate signed certificates by honoring certificate signing requests. All cert-manager certificates require a referenced issuer that is in a ready condition to attempt to honor the request. You can learn more details [here](https://cert-manager.io/docs/concepts/issuer/). + +- `Certificate`: `cert-manager` has the concept of Certificates that define the desired x509 certificate which will be renewed and kept up to date. You can learn more details [here](https://cert-manager.io/docs/concepts/certificate/). + +**SingleStore CRD Specification:** + +KubeDB uses the following cr fields to enable SSL/TLS encryption in `SingleStore`. + +- `spec:` + - `tls:` + - `issuerRef` + - `certificates` + +Read about the fields in details from [singlestore concept](/docs/guides/singlestore/concepts/singlestore.md#spectls), + +`KubeDB` uses the `issuer` or `clusterIssuer` referenced in the `tls.issuerRef` field, and the certificate specs provided in `tls.certificate` to generate certificate secrets using `Issuer/ClusterIssuers` specification. These certificates secrets including `ca.crt`, `tls.crt` and `tls.key` etc. are used to configure `SingleStore` server, studio, exporter etc. respectively. + +## How TLS/SSL configures in SingleStore + +The following figure shows how `KubeDB` enterprise is used to configure TLS/SSL in SingleStore. Open the image in a new tab to see the enlarged version. + +
    + Stash Backup Flow +
    Fig: Deploy SingleStore with TLS/SSL
    +
    + +Deploying SingleStore with TLS/SSL configuration process consists of the following steps: + +1. At first, a user creates an `Issuer/ClusterIssuer` cr. + +2. Then the user creates a `SingleStore` cr. + +3. `KubeDB` Provisioner operator watches for the `SingleStore` cr. + +4. When it finds one, it creates `Secret`, `Service`, etc. for the `SingleStore` database. + +5. `KubeDB` Ops Manager watches for `SingleStore`(5c), `Issuer/ClusterIssuer`(5b), `Secret` and `Service`(5a). + +6. When it finds all the resources(`SingleStore`, `Issuer/ClusterIssuer`, `Secret`, `Service`), it creates `Certificates` by using `tls.issuerRef` and `tls.certificates` field specification from `SingleStore` cr. + +7. `cert-manager` watches for certificates. + +8. When it finds one, it creates certificate secrets `tls-secrets`(server, client, secrets, etc.) that hold the actual self-signed certificate. + +9. `KubeDB` Provisioner operator watches for the Certificate secrets `tls-secrets`. + +10. When it finds all the tls-secret, it creates a `PetSet` so that SingleStore server is configured with TLS/SSL. + +In the next doc, we are going to show a step by step guide on how to configure a `SingleStore` database with TLS/SSL. diff --git a/docs/guides/singlestore/update-version/_index.md b/docs/guides/singlestore/update-version/_index.md new file mode 100644 index 0000000000..cfa345ebab --- /dev/null +++ b/docs/guides/singlestore/update-version/_index.md @@ -0,0 +1,10 @@ +--- +title: Updating +menu: + docs_{{ .version }}: + identifier: guides-sdb-updating + name: UpdateVersion + parent: guides-singlestore + weight: 42 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/singlestore/update-version/overview/images/sdb-version-update.svg b/docs/guides/singlestore/update-version/overview/images/sdb-version-update.svg new file mode 100644 index 0000000000..26d68cac6b --- /dev/null +++ b/docs/guides/singlestore/update-version/overview/images/sdb-version-update.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/update-version/overview/index.md b/docs/guides/singlestore/update-version/overview/index.md new file mode 100644 index 0000000000..80c06027a0 --- /dev/null +++ b/docs/guides/singlestore/update-version/overview/index.md @@ -0,0 +1,54 @@ +--- +title: Updating SingleStore Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-updating-overview + name: Overview + parent: guides-sdb-updating + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# updating SingleStore version Overview + +This guide will give you an overview on how KubeDB Ops Manager update the version of `SingleStore` database. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How update version Process Works + +The following diagram shows how KubeDB Ops Manager used to update the version of `SingleStore`. Open the image in a new tab to see the enlarged version. + +
    +  updating Process of SingleStore +
    Fig: updating Process of SingleStore
    +
    + +The updating process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to update the version of the `SingleStore` database the user creates a `SingleStoreOpsRequest` CR with the desired version. + +5. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +6. When it finds a `SingleStoreOpsRequest` CR, it halts the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `SingleStore` object during the updating process. + +7. By looking at the target version from `SingleStoreOpsRequest` CR, `KubeDB` Ops-manager operator updates the images of all the `PetSets`. 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 `PetSets` and their `Pods` images, the `KubeDB` Ops-manager operator updates the image of the `SingleStore` object to reflect the updated state of the database. + +9. After successfully updating of `SingleStore` object, the `KubeDB` Ops-manager operator resumes the `SingleStore` 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 updating of a SingleStore database using update operation. \ No newline at end of file diff --git a/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sample-sdb.yaml b/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sample-sdb.yaml new file mode 100644 index 0000000000..5efd9bf8dc --- /dev/null +++ b/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sample-sdb.yaml @@ -0,0 +1,52 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.5.30" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sdbops-update.yaml b/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sdbops-update.yaml new file mode 100644 index 0000000000..0f4ab34f3a --- /dev/null +++ b/docs/guides/singlestore/update-version/sdb update-version opsrequest/examples/sdbops-update.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-update-patch + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: sample-sdb + updateVersion: + targetVersion: "8.7.10" \ No newline at end of file diff --git a/docs/guides/singlestore/update-version/sdb update-version opsrequest/index.md b/docs/guides/singlestore/update-version/sdb update-version opsrequest/index.md new file mode 100644 index 0000000000..4593512230 --- /dev/null +++ b/docs/guides/singlestore/update-version/sdb update-version opsrequest/index.md @@ -0,0 +1,207 @@ +--- +title: Updating SingleStore Cluster +menu: + docs_{{ .version }}: + identifier: guides-sdb-updating-cluster + name: Update Version OpsRequest + parent: guides-sdb-updating + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# update version of SingleStore Cluster + +This guide will show you how to use `KubeDB` Ops-manager operator to update the version of `SingleStore` Cluster. + +## 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 Ops-manager operator in your cluster following the steps [here](/docs/setup/README.md). + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [Cluster](/docs/guides/singlestore/clustering/overview/) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Updating Overview](/docs/guides/singlestore/update-version/overview/) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Prepare SingleStore Cluster + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +Now, we are going to deploy a `SingleStore` cluster database with version `8.5.30`. + +### Deploy SingleStore cluster + +In this section, we are going to deploy a SingleStore Cluster. Then, in the next section we will update the version of the database using `SingleStoreOpsRequest` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.5.30" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/update-version/cluster/examples/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` + +Now, wait until `sample-sdb` created has status `Ready`. i.e, + +```bash +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +sample-sdb kubedb.com/v1alpha2 8.5.30 Ready 4m37s +``` + +We are now ready to apply the `SingleStoreOpsRequest` CR to update this database. + +### update SingleStore Version + +Here, we are going to update `SingleStore` cluster from `8.5.30` to `8.7.10`. + +#### Create SingleStoreOpsRequest: + +In order to update the database cluster, we have to create a `SingleStoreOpsRequest` CR with your desired version that is supported by `KubeDB`. Below is the YAML of the `SingleStoreOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-update-patch + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: sample-sdb + updateVersion: + targetVersion: "8.7.10" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing operation on `sample-sdb` SingleStore database. +- `spec.type` specifies that we are going to perform `UpdateVersion` on our database. +- `spec.updateVersion.targetVersion` specifies the expected version of the database `8.7.10`. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/update-version/cluster/examples/sdbops-update.yaml +singlestoreopsrequest.ops.kubedb.com/sdb-update-patch created +``` + +#### Verify SingleStore version updated successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the image of `SingleStore` object and related `PetSets` and `Pods`. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash +$ kubectl get sdbops -n demo +NAME TYPE STATUS AGE +sdb-update-patch UpdateVersion Successful 3m46s +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. + +Now, we are going to verify whether the `SingleStore` and the related `PetSets` and their `Pods` have the new version image. Let's check, + +```bash +$ kubectl get sdb -n demo sample-sdb -o=jsonpath='{.spec.version}{"\n"}' +8.7.10 + +$ kubectl get petset -n demo sample-sdb-aggregator -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 + +$ kubectl get petset -n demo sample-sdb-leaf -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 + +$ kubectl get pods -n demo sample-sdb-aggregator-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 + +$ kubectl get pods -n demo sample-sdb-leaf-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/singlestore-node:alma-8.7.10-95e2357384 +``` + +You can see from above, our `SingleStore` cluster database has been updated with the new version. So, the update process is successfully completed. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo sample-sdb +$ kubectl delete singlestoreopsrequest -n demo sdb-update-patch +``` \ No newline at end of file diff --git a/docs/guides/singlestore/volume-expansion/_index.md b/docs/guides/singlestore/volume-expansion/_index.md new file mode 100644 index 0000000000..a171ea223c --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/_index.md @@ -0,0 +1,10 @@ +--- +title: Volume Expansion +menu: + docs_{{ .version }}: + identifier: guides-sdb-volume-expansion + name: Volume Expansion + parent: guides-singlestore + weight: 44 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/singlestore/volume-expansion/overview/images/volume-expansion.svg b/docs/guides/singlestore/volume-expansion/overview/images/volume-expansion.svg new file mode 100644 index 0000000000..553336d631 --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/overview/images/volume-expansion.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/singlestore/volume-expansion/overview/index.md b/docs/guides/singlestore/volume-expansion/overview/index.md new file mode 100644 index 0000000000..56abd1e431 --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/overview/index.md @@ -0,0 +1,56 @@ +--- +title: SingleStore Volume Expansion Overview +menu: + docs_{{ .version }}: + identifier: guides-sdb-volume-expansion-overview + name: Overview + parent: guides-sdb-volume-expansion + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Volume Expansion + +This guide will give an overview on how KubeDB Ops Manager expand the volume of `SingleStore`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + +## How Volume Expansion Process Works + +The following diagram shows how KubeDB Ops Manager expand the volumes of `SingleStore` database components. Open the image in a new tab to see the enlarged version. + +
    +  Volume Expansion process of SingleStore +
    Fig: Volume Expansion process of SingleStore
    +
    + +The Volume Expansion process consists of the following steps: + +1. At first, a user creates a `SingleStore` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `SingleStore` CR. + +3. When the operator finds a `SingleStore` CR, it creates required `PetSet` and related necessary stuff like secrets, services, etc. + +4. The petSet creates Persistent Volumes according to the Volume Claim Template provided in the petset configuration. This Persistent Volume will be expanded by the `KubeDB` Ops-manager operator. + +5. Then, in order to expand the volume of the `SingleStore` database the user creates a `SingleStoreOpsRequest` CR with desired information. + +6. `KubeDB` Ops-manager operator watches the `SingleStoreOpsRequest` CR. + +7. When it finds a `SingleStoreOpsRequest` CR, it pauses the `SingleStore` object which is referred from the `SingleStoreOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `SingleStore` object during the volume expansion process. + +8. Then the `KubeDB` Ops-manager operator will expand the persistent volume to reach the expected size defined in the `SingleStoreOpsRequest` CR. + +9. After the successfully expansion of the volume of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the new volume size in the `SingleStore` object to reflect the updated state. + +10. After the successful Volume Expansion of the `SingleStore`, the `KubeDB` Ops-manager operator resumes the `SingleStore` 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 SingleStore database using `SingleStoreOpsRequest` CRD. diff --git a/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sample-sdb.yaml b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sample-sdb.yaml new file mode 100644 index 0000000000..df3fdd1cde --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sample-sdb.yaml @@ -0,0 +1,53 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut + diff --git a/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sdb-offline-volume-expansion.yaml b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sdb-offline-volume-expansion.yaml new file mode 100644 index 0000000000..39b1598a8d --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/example/sdb-offline-volume-expansion.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-offline-vol-expansion + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: sample-sdb + volumeExpansion: + mode: "Offline" + aggregator: 2Gi + leaf: 11Gi \ No newline at end of file diff --git a/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/index.md b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/index.md new file mode 100644 index 0000000000..a0edd23f02 --- /dev/null +++ b/docs/guides/singlestore/volume-expansion/sdb volume-expansion opsrequest/index.md @@ -0,0 +1,480 @@ +--- +title: SingleStore Volume Expansion +menu: + docs_{{ .version }}: + identifier: guides-sdb-volume-expansion-volume-expansion + name: SingleStore Volume Expansion + parent: guides-sdb-volume-expansion + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# SingleStore Volume Expansion + +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a SingleStore. + +## 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. + +- You must have a `StorageClass` that supports volume expansion. + +- 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: + - [SingleStore](/docs/guides/singlestore/concepts/singlestore.md) + - [SingleStoreOpsRequest](/docs/guides/singlestore/concepts/opsrequest.md) + - [Volume Expansion Overview](/docs/guides/singlestore/volume-expansion/overview) + +To keep everything isolated, we are going to use a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Expand Volume of SingleStore + +Here, we are going to deploy a `SingleStore` cluster using a supported version by `KubeDB` operator. Then we are going to apply `SingleStoreOpsRequest` to expand its volume. The process of expanding SingleStore `standalone` is same as SingleStore cluster. + +### Create SingleStore License Secret + +We need SingleStore License to create SingleStore Database. So, Ensure that you have acquired a license and then simply pass the license by secret. + +```bash +$ kubectl create secret generic -n demo license-secret \ + --from-literal=username=license \ + --from-literal=password='your-license-set-here' +secret/license-secret created +``` + +### Prepare SingleStore Database + +At first verify that your cluster has a storage class, that supports volume expansion. Let's check, + +```bash +$ kubectl get storageClass +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 6d2h +longhorn (default) driver.longhorn.io Delete Immediate true 3d21h +longhorn-static driver.longhorn.io Delete Immediate true 42m +``` + +Here, we will use `longhorn` storageClass for this tuitorial. + +Now, we are going to deploy a `SingleStore` database of 3 replicas with version `8.7.10`. + +### Deploy SingleStore + +In this section, we are going to deploy a SingleStore Cluster with 1GB volume for `aggregator` nodes and 10GB volume for `leaf` nodes. Then, in the next section we will expand its volume to 2GB using `SingleStoreOpsRequest` CRD. Below is the YAML of the `SingleStore` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Singlestore +metadata: + name: sample-sdb + namespace: demo +spec: + version: "8.7.10" + topology: + aggregator: + replicas: 1 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + leaf: + replicas: 2 + podTemplate: + spec: + containers: + - name: singlestore + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + licenseSecret: + name: license-secret + storageType: Durable + deletionPolicy: WipeOut +``` + +Let's create the `SingleStore` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/volume-expansion/volume-expansion/example/sample-sdb.yaml +singlestore.kubedb.com/sample-sdb created +``` + +Now, wait until `sample-sdb` has status `Ready`. i.e, + +```bash +$ kubectl get sdb -n demo +NAME TYPE VERSION STATUS AGE +sample-sdb kubedb.com/v1alpha2 8.7.10 Ready 4m25s + +``` + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo sample-sdb-aggregator -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" + +$ kubectl get petset -n demo sample-sdb-leaf -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"10Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-41cb892c-99fc-4211-a8c2-4e6f8a16c661 10Gi RWO Delete Bound demo/data-sample-sdb-leaf-0 longhorn 90s +pvc-6e241724-6577-408e-b8de-9569d7d785c4 10Gi RWO Delete Bound demo/data-sample-sdb-leaf-1 longhorn 75s +pvc-95ecc525-540b-4496-bf14-bfac901d73c4 1Gi RWO Delete Bound demo/data-sample-sdb-aggregator-0 longhorn 94s + + +``` + +You can see the `aggregator` petset has 1GB storage, and the capacity of all the `aggregator` persistent volumes are also 1GB. + +You can see the `leaf` petset has 10GB storage, and the capacity of all the `leaf` persistent volumes are also 10GB. + +We are now ready to apply the `SingleStoreOpsRequest` CR to expand the volume of this database. + +### Volume Expansion + +Here, we are going to expand the volume of the SingleStore cluster. + +#### Create SingleStoreOpsRequest + +In order to expand the volume of the database, we have to create a `SingleStoreOpsRequest` CR with our desired volume size. Below is the YAML of the `SingleStoreOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: SinglestoreOpsRequest +metadata: + name: sdb-offline-vol-expansion + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: sample-sdb + volumeExpansion: + mode: "Offline" + aggregator: 2Gi + leaf: 11Gi +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing volume expansion operation on `sample-sdb` database. +- `spec.type` specifies that we are performing `VolumeExpansion` on our database. +- `spec.volumeExpansion.aggregator` and `spec.volumeExpansion.leaf` specifies the desired volume size for `aggregator` and `leaf` nodes. +- `spec.volumeExpansion.mode` specifies the desired volume expansion mode (`Online` or `Offline`). Storageclass `longhorn` supports `Offline` volume expansion. + +> **Note:** If the Storageclass you are using doesn't support `Online` Volume Expansion, Try offline volume expansion by using `spec.volumeExpansion.mode:"Offline"`. + +Let's create the `SingleStoreOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/singlestore/volume-expansion/volume-expansion/example/sdb-offline-volume-expansion.yaml +singlestoreopsrequest.ops.kubedb.com/sdb-offline-vol-expansion created +``` + +#### Verify SingleStore volume expanded successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `SingleStore` object and related `PetSets` and `Persistent Volumes`. + +Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following command to watch `SingleStoreOpsRequest` CR, + +```bash +$ kubectl get singlestoreopsrequest -n demo +NAME TYPE STATUS AGE +sdb-offline-vol-expansion VolumeExpansion Successful 13m +``` + +We can see from the above output that the `SingleStoreOpsRequest` has succeeded. If we describe the `SingleStoreOpsRequest` we will get an overview of the steps that were followed to expand the volume of the database. + +```bash +$ kubectl describe sdbops -n demo sdb-offline-vol-expansion +Name: sdb-offline-vol-expansion +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: SinglestoreOpsRequest +Metadata: + Creation Timestamp: 2024-10-15T08:49:11Z + Generation: 1 + Resource Version: 12476 + UID: a0e2f1c3-a6b7-4993-a012-2823c3a2675b +Spec: + Apply: IfReady + Database Ref: + Name: sample-sdb + Type: VolumeExpansion + Volume Expansion: + Aggregator: 2Gi + Leaf: 11Gi + Mode: Offline +Status: + Conditions: + Last Transition Time: 2024-10-15T08:49:11Z + Message: Singlestore ops-request has started to expand volume of singlestore nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-10-15T08:49:17Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-15T08:49:42Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-10-15T08:49:22Z + Message: get pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetSet + Last Transition Time: 2024-10-15T08:49:22Z + Message: delete pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: DeletePetSet + Last Transition Time: 2024-10-15T08:51:07Z + Message: successfully updated Aggregator node PVC sizes + Observed Generation: 1 + Reason: UpdateAggregatorNodePVCs + Status: True + Type: UpdateAggregatorNodePVCs + Last Transition Time: 2024-10-15T08:53:32Z + Message: get pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPod + Last Transition Time: 2024-10-15T08:49:47Z + Message: is ops req patch; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsOpsReqPatch + Last Transition Time: 2024-10-15T08:49:47Z + Message: delete pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: DeletePod + Last Transition Time: 2024-10-15T08:50:22Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-10-15T08:50:22Z + Message: is pvc patch; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPvcPatch + Last Transition Time: 2024-10-15T08:53:52Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-10-15T08:50:42Z + Message: create pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CreatePod + Last Transition Time: 2024-10-15T08:50:47Z + Message: is running single store; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: IsRunningSingleStore + Last Transition Time: 2024-10-15T08:54:32Z + Message: successfully updated Leaf node PVC sizes + Observed Generation: 1 + Reason: UpdateLeafNodePVCs + Status: True + Type: UpdateLeafNodePVCs + Last Transition Time: 2024-10-15T08:54:43Z + Message: successfully reconciled the Singlestore resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-15T08:54:48Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-10-15T08:54:48Z + Message: Successfully completed volumeExpansion for Singlestore + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 14m KubeDB Ops-manager Operator Start processing for SinglestoreOpsRequest: demo/sdb-offline-vol-expansion + Normal Starting 14m KubeDB Ops-manager Operator Pausing Singlestore database: demo/sample-sdb + Normal Successful 14m KubeDB Ops-manager Operator Successfully paused Singlestore database: demo/sample-sdb for SinglestoreOpsRequest: sdb-offline-vol-expansion + Warning get pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning delete pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator delete pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning delete pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator delete pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 14m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal OrphanPetSetPods 13m KubeDB Ops-manager Operator successfully deleted the petSets with orphan propagation policy + Warning get pod; ConditionStatus:True 13m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 13m KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning delete pod; ConditionStatus:True 13m KubeDB Ops-manager Operator delete pod; ConditionStatus:True + Warning get pod; ConditionStatus:False 13m KubeDB Ops-manager Operator get pod; ConditionStatus:False + Warning get pod; ConditionStatus:True 13m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 13m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patch; ConditionStatus:True 13m KubeDB Ops-manager Operator is pvc patch; ConditionStatus:True + Warning compare storage; ConditionStatus:False 13m KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 13m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 13m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 13m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 13m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 13m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 13m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 12m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 12m KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create pod; ConditionStatus:True 12m KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 12m KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is running single store; ConditionStatus:False 12m KubeDB Ops-manager Operator is running single store; ConditionStatus:False + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateAggregatorNodePVCs 12m KubeDB Ops-manager Operator successfully updated Aggregator node PVC sizes + Warning get pod; ConditionStatus:True 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 12m KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning delete pod; ConditionStatus:True 12m KubeDB Ops-manager Operator delete pod; ConditionStatus:True + Warning get pod; ConditionStatus:False 12m KubeDB Ops-manager Operator get pod; ConditionStatus:False + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patch; ConditionStatus:True 11m KubeDB Ops-manager Operator is pvc patch; ConditionStatus:True + Warning compare storage; ConditionStatus:False 11m KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 11m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 11m KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create pod; ConditionStatus:True 11m KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 11m KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is running single store; ConditionStatus:False 11m KubeDB Ops-manager Operator is running single store; ConditionStatus:False + Warning get pod; ConditionStatus:True 11m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 10m KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning delete pod; ConditionStatus:True 10m KubeDB Ops-manager Operator delete pod; ConditionStatus:True + Warning get pod; ConditionStatus:False 10m KubeDB Ops-manager Operator get pod; ConditionStatus:False + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 10m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patch; ConditionStatus:True 10m KubeDB Ops-manager Operator is pvc patch; ConditionStatus:True + Warning compare storage; ConditionStatus:False 10m KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 10m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 10m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m55s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m55s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m50s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m50s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m45s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m45s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 9m45s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create pod; ConditionStatus:True 9m45s KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning is ops req patch; ConditionStatus:True 9m45s KubeDB Ops-manager Operator is ops req patch; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m40s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m35s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m30s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m25s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m20s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m15s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m10s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateLeafNodePVCs 9m5s KubeDB Ops-manager Operator successfully updated Leaf node PVC sizes + Normal UpdatePetSets 8m54s KubeDB Ops-manager Operator successfully reconciled the Singlestore resources + Warning get pet set; ConditionStatus:True 8m49s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 8m49s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal ReadyPetSets 8m49s KubeDB Ops-manager Operator PetSet is recreated + Normal Starting 8m49s KubeDB Ops-manager Operator Resuming Singlestore database: demo/sample-sdb + Normal Successful 8m49s KubeDB Ops-manager Operator Successfully resumed Singlestore database: demo/sample-sdb for SinglestoreOpsRequest: sdb-offline-vol-expansion + + +``` + +Now, we are going to verify from the `Petset`, and the `Persistent Volumes` whether the volume of the database has expanded to meet the desired state, Let's check, + +```bash +$ kubectl get petset -n demo sample-sdb-aggregator -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"2Gi" +$ kubectl get petset -n demo sample-sdb-leaf -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"11Gi" + + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-0a4b35e6-988e-4088-ae41-852ad82c5800 2Gi RWO Delete Bound demo/data-sample-sdb-aggregator-0 longhorn 22m +pvc-f6df5743-2bb1-4705-a2f7-be6cf7cdd7f1 11Gi RWO Delete Bound demo/data-sample-sdb-leaf-0 longhorn 22m +pvc-f8fee59d-74dc-46ac-9973-ff1701a6837b 11Gi RWO Delete Bound demo/data-sample-sdb-leaf-1 longhorn 19m +``` + +The above output verifies that we have successfully expanded the volume of the SingleStore database. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete sdb -n demo sample-sdb +$ kubectl delete singlestoreopsrequest -n demo sdb-offline-volume-expansion +``` diff --git a/docs/images/singlestore/compute-process.svg b/docs/images/singlestore/compute-process.svg new file mode 100644 index 0000000000..a0f7d8300a --- /dev/null +++ b/docs/images/singlestore/compute-process.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/singlestore/storage-autoscaling.svg b/docs/images/singlestore/storage-autoscaling.svg new file mode 100644 index 0000000000..f1bfe7205a --- /dev/null +++ b/docs/images/singlestore/storage-autoscaling.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • 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 FRg(2295 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