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 01/12] 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 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

    &`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 z;7>!(npROoaOb@Azny8D{v-PQQDIu>Hh3mbC1H&-^W|t$*#eb>SsJ$okwK?@Y8u_`Im$^!cH!7!Ybk4aV`GClQJazbk%N@8|f@N#KID9Y8Ob z`D1zEdr*Cx|61_j@@Ul|Jo*2~D7*~0U>!xG*I|B)$~M`oGjc(qGbD&pQGnok0<#O& zcJH^SmZ`ikA@=>_gE#sQ7LTe3b6&oXGT!@=H{rp#x2ql)1U8Sr$BPfbl7PefkK0lO z!j?AC`K3qAWkHRH;@*pnYhZn&)!AiF{1fYN0p8iFtJ;0-Sv+pTlm7HgBSCg;LGkBg zgD$^oFt3{=H9yKm{^J9k`Phpro6!yLPjYSu1p6HS&!CzOw^@4~lpO}gvH7pt)0~|# z^^-h}U+l&8{UCF0;*HFV(r|xQxM>{hN<$HP&V|u#JmY@P+CRJuZz-z-D;pfW&DYI}!NS}iN!|`o^ zhA9DVx!zOtPs!M&Pi+~bmi?FK>EFN$cn^y|mjCQxtyTx0aEjx_8=6B%boRY|QI%W? znxXXFt-&yy864;MbgM8#vNv3ANA+k&^)4O$l?lkltmCK{`n}s4#+2BDRj51CEX1*@ zlNLJ?n4?_!%b@>ny`1s|TwjO##}ONbv~q(UUIOvg7iO%C2DsD3@pOf%_~#&rp1XI^ z91NK`5Zq{X1_XUEnB5>rYL}+CqivjeLXy?pT(<3lV#ftp0`-#fza~lco6)#p%&1u% zzbXI!vxweZhJ!++iU19d;AmMNoeke7O;o`Q$Jr($kV;4vq9;-E9EH2}#_6LEx`(6VQ;(&E@1I}z(S@n+3e@7GDN8PRd?E+tKWO43TL#!m(?jXX1=K?n(a{X5YZBjD-_h1js-h^$eeKNOZ_8_CmH?lK6##Yd z$J}jmQ?INCPpc0F-n0xpt!gDbjb_@sww=&d+vuxK9$Mr-)@hY`Sm2tWTqISb%HBRB ze&2xvKI59N4>KlO{Dd#u&7 z4wA;V_{AqPN^XUjtEKij*-mg@+{6UrpoqtT5ZKN}e(E6C2kXBWEE#DzMsS6UtkF%6 zHjY@DjdZ7-E59<{PO@IbK$}s^7y3SHQj+ExSf~ z3{^13tRLzx8Crv)3aOLj_Y8X(Aoq%vn#emy=n`CUzC5ERb^Dv{$sMV~iC2U-UtqU? z^xU-&#cWWSPl_Q|G8WgSCjQox1bsDj>;jSP$h)3WE=|jv#>~ITZ>~~~Q+Qr{ao_fO zWoGAN>s&4qnsYnT!>u&D@fBEjAopZC?pUacNGxVw>t>s*cV!;2BqqJ~593G_N_4zB zeW}$s`z-@))(m3YDC@G#Qf1`Mx7*Kq?%d4iyx;SMru|E{;@ZM!7I#|Q);4e4Kl%1D zpIAOIfSKzT^}os#I0M~f!29A{AMj&U>>vB}+D*NGHRy6Wce-D9Bl6lMk&jZwFuwPf zGXhtl64_>S*LV=6%dSQMpd@H99%la$GgbYn;DXo}eOqRk6^Y5`lMzE!r7?7X$Of0Z zUtJEyaSVAJNl|vQY?OYVywFfjgI?LP@Zt8u--!E`b#Iq7QeD!{SrcCDjAC5biXcJ~ z!c$8dvr+X)Ef>zL*}iY$V9|%4^DMk7LQUM4p40Da_fVQyp-j|1C0(;FDqBDAQn5KO zCBuvBr;x=cG8;lSzQT?1=ar= zrvNteOAPLRot>8`Y>L?^ihWNY13*D=r_n$V@tUcFafO8FKcBkzlf^J$Epxm7Uajtboq?SnG& zXX9SMFSq%!x|YSzk!T%6AtmMYEz5r*CF-%(glyK2`rEniU5nF?2`WF}DKMI(Wyp+= z9qz2O5<>0PMqE14QoEJJ@qRF0Jx1h?I@_B6pm4vjFcL&m3qBoNwM*onOs~y8Vc|}% z{Y7>6ZcX$A^-()`*w?YzS z3?41n^D8bvA|o;9N~o?qQQxtM`*klQd)Hd=n#pk~5%ztqobop@-!kcY(0YjLNe3Ag zAvml_!3EpbNMjPj>TillRxbDN?uvYmW;BAP-TS7~cjUmMToqP_X3?Vn$UCJsQ-YR6 ze#uSvg}kV#2p&4yCO6P#0y?*UWs-Av72M~;`AUw}vkbJAx?gDXs1PVqf^k%x_lag{ zmJ|h@QZijMYzstsSC5%hyVi}XRW(~8^{tAXkt>@-i!)1hya*RU$=pA1Wo>yT5jRk@ zWxci|(xtjdJ3jW?(f4eL;e%ha-KGm_#om`@img6y-6c)z_D#RFeb2D_;GOYN zbv&pqHsO65+`BOjji5?NGo;A!3(BuCJSi9dWe{X}s`r2>YFmS%qf2+cmS^^Q0)OIr z*g?jR2yARLZhxFRG%)xQo5u4gS3XJHxSu5JgV_u(bL7MqRu|C!!B_&I|_x(_fHppKmkHiGcWf9HN8q%g$ zM?PH~H_zhFzigLbWkOwxW1YFj5=jQiC*Y@crTjLOi2SD?9z_WmYwNo{hQx09h(c+e zWseg5$9iJJ=`)f(s@O#yYDWJ2>w5EUu60?l~F#PFblVVdcr?(<;yNGITWKtiEUPR@k%Qya;K+zzVkU}Dv*u( z`t|pBW}|-n?|nDi6qyX(;M2VJ*KY$+4Unk$cBFp78+sF*h}~m)M<6TcUQs`=t<-Q;eDHs@ z0CS0s(p;jZJp%g(1dce!#P-E?i$|g=LuM)Q)2p9Vi%R-Y6j50~(k9QZvNsfDA$U30mN8@Xd3I>v%mXq(yN^~_HK-R}Su;l%KPJ3;9@>0+a8&ANu#NY0UR`Ic@Dmn&g{@2+z1gk*_)0tcJ0AeBqJNP37sDBwTujc+j<3JYcT;Ajby+%X*}5R8GMcu~ z@`J%Jwe_wK_uDFZ`ZrR^dOK#?sa-2g;_v-7j}+QKeli6j6=)FlWtwhgqj!Y-XL;EI zeN4TqEcVUk9OWH+fjc`?dit!wC{;D~RPVcV;0u^Lhhk|cWgkt9&u8Xwdbc^*|AvK3 zMJE-Kqr*=D|JX;$zQxZ`L1JQ3-x~`P%?+X8!dF-4x`(`3ZsbO#*fjCnzicYqFPp^< z4*sOzQs*}wJhr7?G^cysM9Z|^liHu8M+^=Nqu}I>?09=p`ez;W*U!6!b}0TbrVl*!;}2nR7D7f zgDEnzVQ|c|bblNh>GS3|>-Wih$dE+$rJ(`&@N>#|d&>m*wzOQb;J&5W`uc4oy-Vi6yiE#fj93)Nd@vF6ZpzZ7Ri z6(cx3U1KU@BPuG7zCKY4$j`skJtZI@h#1=G*>8b2BSQ5V*dExu)T?2&+v-jJ*;ul1 zaev_obN?dX+ch;&Hj=ktU2C(|`)O+{Cz+2IC)VV<-981A+b!0$E1kN<+g<$3r;SzhU|IrazZ;tih02#rjsg6l5WFUY!9U|O*A?e^e@3#7rPARG0lg*e$w z6mVribC-tr1p}H~C2Pamxolb9PO`!YxrH6K$4A&JlsKYmU-c2miNtC{&o0s~XL9a_ zH~f)JYrG8Snq*d5SK_f&&djuZi%o|JqP$X%PO0UZl0d998ZoDf;IAw6cpexoFaEwv zZC;=6R9oH06cV(aKF^7@O#+U6B)-Zki~fdnRqmfHRhkwdS-Z0>0l_XLyzM5!5YrLR zaC=8cE3~E7?jT5l<})U{!^aWJgSt(;2`$H0g=x?dHmasJIPCY$I~C+Ooy!y*MK-Z1>r6E@}L#Y)O3TX!GM zpJ49Yp^uIy^cq_3Pim}T4J0KwR_06{V%T9s^^ryOdEj~skOMhLg&7NTs4Ncb7^y zB}b(xes~vj{vh~1Fi9j(aB?2!Z+4fgRys+G$GPKRu|x-UF1~bQC_9;eq(o@s-!CXr zQ#3a>GXEf~sR=X6h{en|9JJsuwRAXeNC<+Y)Uz=VPb?~ppo%f#mH)7^JlokBs(F5x zhxLb#E~Bb#nh?ApzL<5 zB8C7l03sbl`BOvV-eQ@BD3-z`B!Z}5UI(~YRfk{bp?{DB7}|cu_rOXKkM(Kquov98 z`*>-Oe(8v=z{P1*79#nBdCZ@}F)d>oXX`r|f1Q8Q52?3j^7*%Q^3oD(7|Y>?b)osG z-BO0;^msM#mk%msY`1adzgI`%Ih3JblGmT0X&Gt*4@590LhBk7FUQ%2xjWmf$RDaI z-wK-k-i&9fn^C#kld&m5z0S1-dv=JiXU3&YYf(kz&F@g6(g0e?(DS(pUSBZ+XlikZb zmK+}5b;lsmo4%I8GlKgDm1@h?u(&9Z1`;7Sv-Sq>Khp73rsQ9b+5faXA*fuJ`8yHn zSlnsi4T9R!T4PkK|D)SbK0nY!s7g%lMDGQHLUd!|GsB`E>!UEAPPrVG^RL+9Fj zpPH(|L#{fw5w&kF98ArSgC~8in!*cOhlnV*QArT+X@BtX7Su?MlI7$4_d2Ys(xXWq zB_$+yY7G0B0bttNM#25Px>kjb90;?kSn$sMK08sdK$IBYv~H7Tcy^X*Z#+V@;7U;& za#qfBdJ<=v8*}cgw7lF($h+K|`S#2SfF?k?Xv|R^DuOiCmH^JT3wiUz(SEgkds8MvIo6#7h79XyE9W=P)Y|l1*|VGaNQMkTyTK~j_O)|c{tMk!K2hK_=D{bgnD8IgHs~->G-YPC_y1K(y4Fz@;H-`y=ui|IPjkjnqz6MZq~7T? zyYOnDE&h5?CwC@TdO0t1w|C|=vmE-$?SL<8g;ZY*bFxx}J91GT%^DCNRj%Jh<@ZvR zJ`z)vXt_fWi9hev;oVwMpmWWp@DdrYwNDq985wT3MpJ)h7Zr87l2^GmE}hzGjeXd}^EUJ1KHgD=8~&0cXvjB$J_Z;Veo_*xzp|E;Y+!m!I*8xpsEW;k=}5&xOXW;^0SgP(x2(&*0pObqkq zxagYXXscSJlp8tzS15>;r%(1q#?QVgbZwr0{B&w`e1GnZJ9*ZDKlk3+?v5*SycvJ^ z$drn}S`20{b)o9%V%H$jZC?duZ%+0q@R6|rhot)q|?%w7Z(yI(4i$=^HbK%EvlfxJGy80F4Y?H_vHOa)M%}j1gU?==2Ww0Uwyfl5eF? z*#QnO=J6a>oZKKyF_{jp*rtW^6naa1Zu5T+hbNKTQ>^-8hCvD`eJS>HD13E|DU7Q=>3DVcc})kK-Ot; z@gN`2x|tr1I0Z9)1G!rOF?4?R&Nw*0Lk_eqBmg-rOcFhs*5O(n7SA0`8nZ~H#Cdn2 zi;->&Kvd6Nd*a&ws6IV4b*g+==*Td9y#8f48ca?{=fmJ(g7{CSL^GB%=%4P{!d5Q1 zr|}#P9HT@O+iiw_axHITOEHdQ`$#BH2jQRODyLBLAjm+!c{ip~SJh`4#-R2$di&=)Qx6Q-sCJ1x z6t|_zXOLsZday010Uaj)*tY5FtYtBJT^4EGj!jy(FSp{4(+IQ#Xldk(-K??>RVmM; zGp;U}TeVbAS^zG;%k!w8Ugy{@RgQSA|16gmnlBRWh>NVnECfM_D*)^%>39}qzNnjB zdRMzdC{_{8DI*pi7WA z@#p}`t_Is(uw{80(@u(Bi2v*O+TsE16~Gz-^e%_n{0Ok>t7XYOr^&!q@4PdvbFEe9 zb@f1YZSyIlA_o|7c>mDB4IH5Emvge^qJMO*zu+LkA_TY!=2)YbMk$?(e#HJwN;CX} z5$_8P4O|;vDDX5uwZ%-TX4lNfG8RrQAMMT-Icn0Q0R$yUDi)AG^(_&0QsEheh1SmQ zMe4(kFPn^KK+bRG;vXB^Jer(@x2-xbMiI@0ixrnOHO2Dm2%6wC>#=kKuwGOiPJ3JR zy24EQ5YUYe;Pr9f^_vW^TRj2*TKd7drET$)err1d;4)62K?3AJzqN8)B)kZG3fXx_ z5^{7XV7!Ky7-O}i{XKA@C`?TFdir$-H(4_#2M6#KCE#WJ*Nz2njfZAh0$>s;<{u<| z7YPHAfbJHIXVHnu1SloX5y{#~SuRuqaCu3F7|utcUrUzoUhiHG6!t;SeJdZbnR>G% z)5GW;=;asQ$o+lq*VcmW>TuzkQp6liqNjbF-fE07jLqV?b?_pfWhO(rd*KYn3j@< z?Lssg>$sZKRBjkGzA?;P*ffz|U+g4%t$J<9gc&=^rWD+CLaE-sA7yiXEy=km^`n$k z=W95O?SdFK20y8p^X^H1m!?uLp2V9dH=DURh2K_xi%A5y8Y}MaX5!5Rc8b z4{F}rPz@5DnK5O}-hAp=ZYZI-8%>7F^w=BNMa-fS zU`aW5Z3AE$7?w`8wZ$SV)>EVieRT93gG*Mpzmf^Wd%n~ZlaUO|)!wJz2o%*jM6zC7 zfX55PMhg$RxV8p;|IS6!9LIUEM^EZHJTYx44C)o1o!C#A6pI)A_l+*bnBKDKf=F%E-c2aXn@JA zAgXBa`_U;zg(VZuf-n8IdjZ#EV&xO3ES78A$2LAfLNgYiC952rlV;d^f*qk_-EU$) zyGAj)OuB3La?6$)FcSdVQd}Z*S5iBrdrnpME8Fc>{b%HW?)U^tr|4KpWnk^??cdAK zZGNayw`kn51;nq3un3y=DQ_<|HfYG?8NPNBk$$M;~jH_rd__gJno9%sS}XeH5BK zR+eJ`G4OXrtiz~Y)1Wnyipsr@=k+BE`G#OnJ#LVYk#U%@R$S7YP?Nb%QqW>VQFEiv zHhR7P;H+dg?QoQ4rJR{uUUc{1&c_{6ULUP$V$6N3)3G&n;FcLU&z{y^wRn_9IFHu) z@oI^I%>5aBpZP$WvyE0$OuPGz1Onmno^ONkSf5$$P$8?Q`q!dKK#RYf=>^ex-u)Ks z#z*qlz`sY=mbmsj<@NkoTie(NY%^2FqxCwE@t+x)b1IXTw4LE5ir|~X7#_0yKF?l? zS&~BWbK-G#_4j?{Q+hag@jvJyWMwMxhIXhEC7AEa0&vErV9QcszmOqol#o|_^Zo)+ zmkJu9?hN{wH=VPj>C$2bW}`|Zay+4`))(8%0gsL~@m%z>%*>1-jXy{N7qft3!Um(s z{slQVPi0$m+V~64W8uJN58sWeFC-HsA>Q}!Ft{hk!?JD8aGlSrDD+Mbm-M~Ba`VIW zp*>C%urDjn^}y4vLBYgtw}uS*4{?Dnp_#p&yA$3`#OXKlnKTaie8+uB>sOz<-S{Ps z$=@KwhPVAjq9!kyPO)Bh>%J8H1HHGTHX-PG`b%z2rxXP3dji{@eD_Ac;P>^1wm63B z!<9D3KIPkWm%U-}RF9;#!;?q@=6_2gSQ-Hln>~J2Y)?TK;cH(PT=;i8XY6qVLFtV4 z2)^@zyOx!cGEL%m&Am3>`P9{Fezu%J5V6tm`bm}mivsMJrBd;_BZU$de_dfhu`lAj z5Ozjnf}TnoPiZfbfseWe+fUM(4KjGHU&N&d2fm2o%eaAl=58vMH4}Wdnsb;j9o8Rs zM-vY}p|MH`@>USnHy-@kp*_I(Sthgma>LKWp>AK~RO=oGLj<9ngoz)bSmDN!3SFl1 z6J0p*nOHp`ayzZ8ln%?hdMQkGksi_4I9t%;H!!bebyW?O@IcqNuy_ zRnwi!?4Zf6Ip4m0e{yBT@-9>aMY_d)kU+#F{%pr!@Y=q2MN3oaHfEcB1=#b2(Q zU9(EAo}ke!_w|Q|q?rOC$J6F#Goa&e;k(DZtBNP*WWQp5gy;Fv;@iXi6nIg~T9G>7 zA}ui%?12uc@e;Z3T>UbajD7l>6?7JP389(rJen=3eE;n@cpbWY0Id?K@wY9rowqJ5*d zx!rTwV|HR>QOfDy_nNYpMqImo0CpVhV|#$ER9V97r=i_%;Un(qxFQHOH6ORPKh~+c zgJ2iufs9FSD_E`5GbGlXvT(H{B%A4%oG2IC?1mEmPy=h-Z2f zVe(#tmp%V>_CS>z|B%(n(~zXOMa|P!$OhzXL-}NFQu$x^wrXY-v)#%~-v{TL^oFV$ z*+;--QL(gPD>vby%ENq5Z$pS7LR?PpG4M=bWRKLCZnZ*5ibDU-gvRyt&cWIE^ipzm z39Y1+RV2BXA%|=2J8z3)WEAYCn|aUM(_;g}{GnN;*rFmhMa8iI?{A;sQzUCVQ^z>B zIKCkBc2AN=3L*ChF4!d*!g;HhMUomrmo}$3Hu;k38d7ZS3`JjD*!Lfrf?14e@U^tK zdU`0@+PIpDCynn}@cG6Je-Ku9{c8Jk)^m8aY91;R~^PFB=*k|zk?PpeD; z4)Vxm4>Ql@Al5*XYI3^8v?;7}M%1y&1cJp3y7YpB6tmwp){xMW$W-izW=7>tpg7Ac#^Vgoysqf6r0IX3FEXM)VKYvX}W*X z3~bygK$ituh|@Y|-=JCyMXM4l23!SdcQxKTq_)MOA{CDyIlX@%ZDkqc->D`nBOV@XpWbM6}Y*<0V_2_7JEpF z%*$hyA*!E1h3M@Mgn2Hxke64+>uc?ct&>widHFXYBGdri2oq3K@f0JAtJ~GD1Q}o- z93E1{#-jB17Xv&(*K)k?>NCrj<}X!Z@VI^oYT%|09-I75?tBqZrY=>r8p@0m%vv9m zxjl=4JxkV-rj~Kind;PnQKeCoh*yVCQ-o-Cv*jSL_ZY(&xV@Y>|D!cS>>VyC0EB}r z33QwrrRa_5mDgNBK+Xy?yfRIyZFG;!omxm#@kK+%16IT)P33?s6~SoyZ;czYy_P(c zaoot^LuuUS#2G4_nN$cR#t9->J+CrVF3L%u*qi=~hF_`o(E<6@{98c#9ga?FKtf93 z%}a$S!HVSZ#Jc!**80+*hdX!tmrqVQe5bb#pe*!MF`x^rcaJ&rq`jT$Gzq9B52pQv z>f(cJg2A}K#x#cTuIZm%VfmkJd;$Bc!P~)KLa5>i9ZzZOHh!QjXs?S{ zS!F~<#@}sBv52Uu29}p2yWI(vU^8+qZA@m1@9pE#s*~IEYAMn$NYgJw2LiBW{lmN<}Ugv zT{bJe8GxeH0Y)ZNo-iQEh-_nAEoNrm<2 zXw~C2pR0uRwKZr+(|6dkOb?PZu{ELlMfQqD7tQppw`Z{`?bp~t0!FfOrhf?g?_9VF zmJY5Z%+4_YU9aY^ozqP~YP}MZ#KG9{*t3PJX!udJ(H^s4izQOR|w&B`Mz@??`7h7C_$&9czgZ#iG+}a5m|hG zo<^KB6yxZ|J6DW$=L+XvV2OztZsvHKDH0aYCE!j>^hvC!)8)^FChlG2g9Y1&nYrCO zVIA6tF-3+{jwERO(NiUk@jE&0J>K8FjO@`1Q=h25@$^SbEU!42Gd-5Wa9F(%twg;L zZ?d;rKSXQ?Z@f8AH~=VeFV)(|KCb}US>7AL*swMcD#)T*A|xyIJ%FQRMj-- z*CbZ%S`65kluvyj^%f3V%)@3IoT^(IS;lJ4s8={UoLXv_$SI(FIWTbL+FGpgE-FG_ zkcO$5tF(y7CX3~D`v#C!t;C}tN5r0BiM+lY1HZ#Vob+_HP!Y45#5zk&c3s==Uy$|l z3xuSYd6W0{rWu_)`S^^$Nt7Aq$*J7@JL%~WNy#DBtH1uurGb(|JpSMnzVYg{+S=4A zq5F33)#tv3W-)%zz)|KDd@|9V*#ERHdVTJZ_`=th8-?k4Jo1a-DFj6`8=U|ck@Y`C z?)BbI&#wi`Ds{AT9fHBiNH~@#_gyDZF|0_bZ8<3W9QdoNTreAZ!#;a)|m=2n9tZDo!1fH(eMy>u_m`D;VRA8q#@B8%jXr!cF=+z8qh*Z-jIt0wl2 zLvwZ2(6AwcZqM8?UxaAoWQv;5Og&_@+E#5lkia}JNSbipJawfmTr?(I$f%tG?jJ8VEoP5l&R37?wxv>wQ_bdAhX3Rm2QB)EtTIoO`%L2_YY(@6XjuR;&`*oxG8~i-l zOWbI*7Mz7OLo)jtPQ=|C^3dr0*M=}78O)Uzr(X;nS8(Mr!8ep-6^jXi?4J>Lv>AY% z8~-&X?ql$&k&!khit)O2y~7p2b#(f&S4tqQ78>=b*n*{NLHy68ByaaUzYO8P^pjIn zc3|ZTQ+0I{4Pf7{m`u*)<(kM9^%C-(F!K>-EIc~q*=qp+%lKVydbKQe%yPn8bp|Ui zyGmay1NaV~!F{^wB_yFWQF0yE=AkNm>|*6aMol%^O~!B&7I*bBZw?UnX;`9fw`w3i zIoV`t%I4x>X0CW(Di=GyAoV@Ly^E0gOL>|MK&J=j1<(ULZXmI$CPwP z0wxo%+S{d~7Gvsljkka2ej4U^O3-@VA~@S<4~n!|z$MmH#B`VC?{}JIbGi46BHZ7D2RkThEJDzPe>kRVw5m zV?Wf`hKGFGyQX3l@Yb*NMq{Hky>Un)H&B49nWui=To;sd|CjQi;9H0>1Dn}Gok8d(pQR}D|Tq;+l__yg5V#mu>o&&!^ zI6forY&B7D>92on+@JA}T5%I-bdwJZ;j@Lh+5=BjxKXG>(04|tdfr*Q@TID%!0oeI zQMw`*EzBmEw;&QU|8EH4e;19YW$p!gC zSbZ#4!GsCmT`lXpLM7N3flSQI(x^l!!qfmqi_FL%4Dc0UGs`|kl-6*otX(W-58Vn2 z493k>!p}Nv7A&%NG|BzA?P7-H9PcY7nyWNjd1}87PF6V71W8M3he@^(hu!6Y%brET za%wRa9TxavooJ_6tO*0kj}2;;VdusKpxQIh-y`TIeR}}`IRLf3j8Qs3_uJaEN5)7! zc0&BC8bBzZ`)44%uH&@u?XPGfNSvwy1S@_vU?heYKO6Ed2;v@*2NzEvVkG3w=d`^A zs0^!sb6^J>BkO+6?JU+&bN(ZM&z|?OYd;(1MA~mXvi+v$c22sQ|4EGH?YuzTP)6I@ zNr6+^e(NI(FyE0?@c*)0x$XWqB)%9RyoT!LHQf9VW;T`Wi-7`{^DYFL%#4Dmb6oWU zIF{4`=jRI(%Qgq^RI4+6<3fLvBdWZHuR9Uj{-nY1J%x-QC@BknWT&0RidmZfVIwcPX6*IK;QT z@8@~n?>!fnm%bI&#Bm}88!)+4TH#L4)>7jjx6|Ma^#?4vr+PKI#c0(TuV)F5ua z5%Y0{_D%Oa?{@95%%g^nlx_eXmAGjPM#7TERYQCv zAshu65f1zX8tr7;Y8DE=@6c?#Nf))l`!BX>kz{Og1#A+r4O)%-yh}zdb(8;~5SsdW zW*}LB-ke@M^y_mZkK*~$n7oe1|Gl3ZCDT83lQSs0=fVO%Zb zI}7-mc|x!E-c+s;l`K5k&xqRm3pa`;Hg(!*<6Z z?;Xc{gxhcO?SjLfiT3LaMecgiBG5orLG6W7X9@>zSC(!`lp+*>GhqK^)#FdFIZ?6w=-dY!# zl2kL_$tH2^=48IL=3?4TA8Vq+GvQ65>f|J1Gc~0cj)!LRV1BL~YS0-&Zno#IWF;qL zYu!RvtnKe{b}I!=Q;mq0CQ{!{j(_Fsi>#E==QFtS`QC-tvkk>r{CWVix$)%OcjouH zpl0oL;}{kxC}Q8&Fy473nl<-EC5AW`uDEgksZ5l1L2h02Xc6vrR);Hi~(59`7`cFa5J9~!1* z^KYi)0H7=?QdlBod7zjqOI@I$tG^d_R16jJ=liZUb9lNivPUI@U4Gz=l$=ZfL`N#_ zPF}J2pyXw)>T6o9R%gJanRHm9;f^xHf{6Xl}>y&TpehpmN~@q+hGrh_d^9T&7||#-YSQGp~G-z^NKa^>1~kj z%T^Gy&+#cbq+>htFYo`i4FCN@<9IxS@9OG#W>s};X2c9dmO8wvO8~479?2EVIbL5A zDK#_I=CjH7Yt*^qb!;S}`}$w)WW2)^6gBk7{oyn(C~sF`RGYS2n`Zo7W>paaP)A$AAN?);GG-fPhJN z*MzQzQ%%tKf`w)7es(9{F9}PKFCsn=Q8FqF2TW9B3Au60n4WgD7nq_ac`1Btu*1^? z&SUG^RCZZ)o!i9pbbk`(e2)@NEx_jzKWLag&LJ7Qd$4ftsElZPfZm=Lnn6gJX-ZC z3_Tc>R|yC5@cTFsxr91#i6#npo@6;XY?~Ozx@V?*^-U* z^EbUFwwST-pE5}r7YjCQg@rIchE@6A`pvnAngfIcBZK{L_Jqw{K+plTTz8X>^}Hia zj{S*%AgS|Vf?U#~o5yG*pe`J|MfYz!fvUA)J$yMcHGSBn9Vm(4T))Y6qdCD#9aos~ zn~FE;+^y7_0x^{>cK-3Fqm93Rd(DGoA;;P2 zM2(M%id^aGKZJ{PRG8GLhz{FAiz}7x8npJb$|Zo>k}&eUGP7PgcFQ<6GBN@9T3Yf_ zr*I_cU)2jK?!EJpuKh7RUz9vzmybo{tPE%~4qdHj`T1B+PxlJ?V)PQSy=ivfjOVJ3I|gJEdPIQ#{t-!LiP39GjJ3(?2&2`t?UN@FJp>c+S^WqK0_@ zpd2VaQv5sgM(l z5~$dezy7j$EpWffc+&6D4D8y&3zwIqry0DIP!??@Vq;I9j5C;<&aVe`%YZ;S{tg7zDJ|CY z@~W5;NXmevOe8_$N>NFQM3{_~4fCTQ=@t~pIUAv8!h+9M_YDPn2s$Wbz_FpTv6jmP zyKEJ_o?{@s&3P_#!7nb=-B`5DZm4{SDfGZe)cu52=lJqLXXzOhq zUIAIFfULmI21tw2@%EW$vXy7Pa2rax%elPRF5BXP#UiC&HP&DOc|eUGvr?mNP4;`G z$6ua7UX_g%BWVO+TosnN4EOq+E;`Tvy{o|L{vgc!H$cQ^#C)+f=%V%}5v$KYs5MUi zcC^W3J%7L6iO28p9iK+8>gvG6_A(BQbXH!NrFwqG2z-?kYO@i-+Hoxe96ZjCME)?^ z7E(Ag;n@HxQA$*!br!y5E_lDu(gwTkN)`L|^yQxV82n80@RO;0Iout3^yah^xzA{e zfo)_}{NW{RscZ0UZ7+~(D^Z%rZ`KY+i2=@R@#EL3pB_tDohU$qFj<-9ARTl0<(?y7 z{0YMg{)^mSO<^IzG|z&46X=8%7CI!nALUxJ^P9QH0N5qy%NJ1)qBEgiwpyvCSEh~+ zjy>;4co(58JIqlJXoSOb#+igD{e7$z?pedWY=Djyj^@4CWMVczm8EW#IeA_qQ;y5d zN5tGXsvkM%(az3}IUM);u+7A4@m*F5@=BFO6)|%*_;>5mT*ge=?0m{rah4Au38M=A z62Z{k)YS)Bv1KY5xb<~|oL-UO=YU`n<#v zsG#ctB+Y&Z%oaAJQShC*BAMw6q`|X9X|LTY4~pF<)#Wpf&=Fmr8owQIr}^^{-2Lf@ zOy^>!@wqd-c~$1Tr<>8A$$B!;3-znA!+}cZBCs_&%APuM7W8ePO|e7KH5=%$4e^+F zS)K5I+btu|!M=8VHa{{VKr7DRwbZC?|GajjTK-y%-W^~NZx-rNyeQ{_)H4g>_0 zpm+Jx(gzs`y`vUs%o@r7GY#y|HCeG>q7)pvG(8x$csXl_?Ax)ZOYTF&(1f4ph* z1t`7%G=3X8*8JWuo3zu59pwWKN0daYorbaY7=QRz*cA=A14HH#rkpF8B*xI6012@s zp*q}K-Y7`L>ClNSU((6%A9bG30)P;5&2EpPo|?}Yl=PaC=5jwo@pWDdzUI&(`6pe_ zMpz7e*O!=y9d?5O3^!BNi4Sw1%ZXCF3}+nSb5dG?q)U?dRPoUtoT>CDv} zhQR$p)iDppsRz0hTVaU9i@;kQwtX?*bIPV{)uV075u>x;DrN~8BPI`!RMv6UEgu{o zA8>QC!g(9j)zvU~G9dnQT%PDvb%Q;7;L%V_?CbPm6Q^HP$BR+~f2HSvor<6t7^2y<83LJMsV9$^ zl|5b$aw{$U$kg-fcX=V zE}g6E{utn#c1JGake}^!j*^@26xp1%X$7nkDsTIpoU$3iYI$72y>&Bq6JfP=Y^cDy zo{~Pf@b$8W*(KyV&@7h zz^LV0W8GDSs(d@L40hEAJ7v4=pZG);gs{e3JiXa44AA-m#Z<T>WzZ#Lwi%`Y0KgR2Ulv%3!k_(|L-vQHj(V4CqZlBA5N0vvr zTibwWTtSi9zK$*Lfnl;&Sm#+7KK8n47+E6!f3&ohRkX#x03Y}f2!i@8S5`gHHZTgm zh5?G_fp6^zN$MVB=paM&qJnf%I!_!PY+bDJ3Xv~F2S^bI=3A)-yjS;p5eE*vJ|%-Y&#dfw}6GeUw7pUb_GVeV4~o#ipa2TmMf z7bO8PvAww7kfqyRM~1Z8MySHt2InnTYj&fX(5?$!Q|EZpcU-`VQEuJZfhUq+@Bss! zqEV-#EOlbSLcTM1lLZu01BkB3k>GdM8p}fQn&ce;_r1GssVC^SK#zhy%)9VEzqP-! zUIdckI?LeK^J{COeaO?BAtsi-mq&7Jp>x8dAw6A>6VSf@VP`u)c}-rX&32>D^Ckos znu4r_sxdSf{&zr#uvY}n;`NGPV1)sQW4p~ANTCdQLVfU;lyK8Fhoq5ocoFO(4h~eH z4c3v^@i&(>4mpbxAT;Q>a%ABOR4ZaMNKabB{jh%9uT`;K)ZM82F^$!s4Gz-(5<5^{?O&1@ z4}yd{J=_+^`j6>KmEzlK?lz5^N06j!(OM^TwAj&vKnM8o(1kgCw zxBE-o-O2g+l=mHtRrU5va(_ifD}roZY|LS6b%%ziDdeM@kYrl1OYhh!=A5c3$|?U- z);6J`$Bys=iIAje-lP;vHtydXU7g7N@dB#mnTrzg%JQ1xk*GykAS@T z>ZUr+3|!?cDLHzumPUo7jKj`3zdJ2e!sG7~AaUhIk%ON-QH(GClM%QWXHm2xG@&{6 zYmNl2ueGoDdC>VZNcT3gF;3)|yMw&4!&HC41!h*H`;>P#;7N|-WmjPUI~>eY&P~DR zLcY~+*ylHSlm@{lGS++1>vQzO5+(181+h?x^Z!>w0x*c3DMK|KlpCbOguC)Y!%iF7SUFQ->K#%&MY-Gdu zJs#I$#m-Z9_E|HJCiiv!=#&uv)5nojva-)oz0tV+(r9dD_K_yeRF7>}-R7dTXv&(C z-K$!BcFqSk9q{?6Q)lGSSWh-_$4~4kFR2iFdd2Zj@?GDXS85)0qa7%K8l3-1(GuC* z&oJx4k4gpaA(hUSNYC9*)I$m^pHd#uZr=Ex)%T7BZ6tY2Y?lE7*MEtZ+KD2HFLO3vJoBpm)r z^ci=W#ffC16v0DCez@@fAUFH_^FBOW9xp0?t7cKMvlTr=j@+@S<%2 z#&@UQn2njyM`3pRhwFg-Bbl~bUV*cw;%X`jpjbO1EZBRlG{BP6&L|JiD}Y+Wn{r0O=0`Zk5MP|#S5k20&=7s}K zA79jbB+9$_)|g@Wi4%Xj zRZ&v^>6$q(tDC(%D0xH}e-u|b{dMfs$Y^+Kn+NZ{muElJ zi*H2I0+gg0tg=<5+k?}Bi!bCfrP(^OU43FNvX9x^1t$V66(_N98}ZJYP_UakMbrPd zP5w^kFe_XH!05)fe7rO(QndY1aBX+4l&G*!y|`Gfxa0r{HqD~Gj-#5p@_52Xo6v2o zop zIQk^8z0D19gh_&NudalgJ1)O+$5EhQ4-Jcv`TR6JPz>(vg@xX_t5mkd#LhG8DA229 z7CVsy1MRY&T`WIg(!9w&I4%yQNJZ!ONn3d}mIMCE0wEc5y{{+Y(s7D#L3BX~Pne!! ze-kb#DUoqY6a!M#yJUbs`U?tHvh1<$ztZqh9g;bfZE?3FnFR? z9N`Vs{j@m$n=N)`i{7NLgi%pV3)yX5@nbM&TE`a;b4Dc-jlY9<8xMX6>hG|lU3D4c* zL}eV9Bl&Pus)z5MM@3txzI+HOEq!xNheOiV26zkjtvF`>fF<9*i`rHX{h6ikS5(Iw z9>KLlsSdOL12k#^0NBwl@x;}->CMgoPScMcRZRRkCg;?kWiFb4bSK!FJy@l04!E+C zCk(tq#QCJO`mbin&TTj?OehEHX1wQm+Voa8y^(V9Rm+Ri_e2u1xe>JhhZpDcZ>jU= zE$&Dq;q2#k22(@tH1OmPMpr67e{}ykP^s^HvTy~0t+e!9iSPD#yYuiO?sYB^@^W#( zc}z>e=OgUAH;3mNAX>rlzXKIlN^o*r>9%Z*tE7d zp!TN^a?~$+kZm|(3}1-$5YO05z-@ZRhC(R;J8YEbN5WWA{Gq?7O<|XE_XCGa=?T}cD$3S`|tth82OZ(h~5Qy@_yC#Y(xRYdrAZE zY<;cwbPXTf8{kC&WjiAy0dSDNm+}KNis9*+g;r@gnVI`vv$L32S8QSVHH;E8e{a>; zCc^r==tYj+I|lav4Dlprf{wqQ85&y>4}_5(9C`oPTs3w99;m4~d-N_4dy$_htMuW% zm@_W8kfQ#}BK;q>S6>sDwRZ^IJS>1KsHbg0f$jjjcx7h(Y(906QQGoxRmd5woP8Fll=EibM9-(lPGA1gd4V{x9DVhlSsD$0(u;vCybBPo zCuH;$I?=&>i`VX1qCTRkiu%VrUeffW-W#7`%Jb}W^WmtSkdQ8UMDMOvQ&TgQ*zwrd zrtGij*=D}T0D`|STJ24!X_m>C5!2iA>B|$e9ni}F)AS$*3u7le9%ooMY7$lcl05KK zKjuyBd`)%exU<-*vHT<_lKLC-7IGbz+M3blt-gpBJc}kSorg31kojYYDCVupV zc(Ag5eh09i778B;;b!N!-PccTzK-!hZ|TbB)2F9jfz1c)vnVQyv$JC&Ob>sv5fHMq zY=s#Ve9$gC)Tf)B1Inx{b(YC=KCntI&D`}Z+714`E5IlEZ3%^dxE!zohf10{Oh6m$ zbBG-d_pOzVEYH@_`1slJQ5CPekyp5QylU{Jy$jI&Y*94HD7RWTZ!?`VUHl5R{lg1F2BElYkqkON2B`JF_^91nZ!VaWjSth z)X(1YU7k@@($lNj?2Lviw*8+NTW9K|SKB0x!I&NXj{LdD2>i|f#=^#Sx3HMhkV6pR zlj2Hd1HRwZUhn2<`TK0D-c%|vhds=)c~ssp1sMkXq#GJ7pOXNy)?s@r2~k;Tzsss zi`OYXGE;?UlG*Td^mX0bc&;HOB5lSWfKlq3wT%*=_yK4QgD^+hZLg~Yjem? zX>aW*OXp&jBr0IYro$tRlE}LE&Xer_hh6NHm>vWJNu64>!}I%!K7|CBtw;nGho7Hv zfW=#T60Mm{6cz?#*s8X8shi9SgUx;V}Vdhk%F-2%EjX zKL75x?G4Lk)|qd?BPHd7LRP#CTf!W<0hx7}#7w+kT#j zPe`VyD`cB#;?pK$X_=!k(rWh2hZ(5pc(dPTSUHlYDq~2=m}l*ntM@J^b0kLhI2Jok z`Eme}3JURbdAuV5#>SKzBuLtm#dx_ZQU#;CcO+us2Ad9AOfPNy!TPWpa|?psgy zBKscb!{w@%DNBi>IZ%=$MZpesV6Hb>Qksmg#UDY;dr|?eTBG z&mCebR_Q#z(4R$4O=|F{uB@NUK>uwc-1hWsfii zyinTKDbxTjSF7f%{Xq+`dKnW;1Djjg`Gd!Mv@~s>l(WJ|D>{q_2)lK;__7oQG$ZH;v5RiRq|7y6r?u^pb zR!1QDAn=henUw$13fNDy=MrWzO_Np+AkMBXv)?4Z1|@*~m*bvl_xhPRp|g9nFmtsG zc-jD)zr3WOMi27u*GSR0J5BbRJP)E0PH{_1c&@IeWfo*CGdI_LfdFbPd|$8DCp0;Zdkxrjq-d%Dty~t65o;(6F z4!-01e7--u;rGb05`<2-Nk;5zkY5g|hRfI_|1dEm)}$F&`0F@P z4LZg@@A4HIw_Wkt%J6&~dt5pL1$N(q9Y1>4CTg@&_;9*#eG*pAaC7*@$Ao_sxD!IaBrWZGO@za2 zz#buX)`WvpU9Pj>COyT(F(#HrTiP)dExcXe!05X{R>r^En>M;8IZtS_fLosmou;8e zcjborfEn@P0@9ITx$)6u#2)~JrDpXY5V&jspew)1qP2T4Rj;}77m0M#s-1MC(7hfk zki2lgHv*1xYWeEmh68xRBz4Uc%q^1&sTBK!MK5%hC6Aa;ZiUAMq8}oo2PL?fvp}Q%3bT61b`tY-7+kpFd;c=G7osn4m z4ZiZ{Vc&Ze;KqwH=&&4cUw3Ts>Q$}h)v{(sWVbiqr1Ylk9!FgFKxFaS@x8yid#KdZ z6Ww8bxm@RV9+m?|3BP!_*K7Xg@`b-+MN`Cg?Oy0Lh_)&w7gdb=2(L*xNW(Ypn~KrF zOv8c7aHl9@a-}$N!2Ys`-PTp$kQd_-NG@iA-gQf326a0V&g?W37POg zBjL-(vuDtAL~z~%ZmzQ;^2VRF?p}tCTQG^ktD#?#l?IGNFF4)jnV#pR$-g0g`gC0X zuJ<<-&!F2=A?8uOjhDNlOv3aFyz{VvZ||uIOHV{94f}k!YS)r$?2*$mbac`ktedEP z6eCYcYu56(PpXW4Ip{c*n{e8+YwPz~EKygJxsR(^Kdu?|*AtWmHnX#GcMHFI4Rh8) z_zQA%(Ly$==eco23@raaNtCePJT&Opg-{ibf^TyEDt9kc$*ceiD z@h7MhMR+!8N#^%(w3o|i6uU@`>lx94pFr@|1?s8t?|?4e$h*=#%vSxuU|Vv*!NnWxWW?`Z{!r*C#`y5*!V=qj2KwHR(LRrPNOsHApO9>JoiB zWoD{jQp|0edUD6@EaLa9-@xrpcsP6a6prBw-b3y6uE?e@NeO(0 zX_${+WgkX)+vAga=7M+|FqtvbwSXz_Uu@iiY(#y0`kFDfDXTWxV}62HZ?H-UnW77I z-`ZV6IbaS+5cbWfe}*QgF53li59wZnIxp!dmUWc}t@pxTTY12%`D=#G`dEXPPItnJ zAyY&{=k3guL@U65U6yQQfANsD<)U(<&pWKAQ2|rw^(?V0vzMwppahf+xVjgWfgwm5 z#>y195DW94Pb&v!Ue%DU_Mchch^$LKhKpPQl&AO0*Db{XaJCF7f=tJq!J^XW#N;o17g$k%$2qn)pG>5#G1@DpK>+Yg3toN=fS6DUOSGn%ca)fgS46 zUhZOO-qel0+E8(ft7O9Q02|nTsNPT!$%@h>h}mKSs=K5QZo;>Hh3OfySE8C{GPGu_ zAZ8YQa{RIe9a%9Ly@pYM>x#%5x5%x>kn&`J;bK@2;hw9yV-9bPuQKu+445?At8!U? zg7_}3!L`_PX?I82t_m$`M?F>IR*XziJ8mp#EG}$P48+J7jZPI~@qe@4)O=WQD|Y^(V)|2u9RKpHZ-Lb$V9sBKD_1GCS*2nY6i7 zwubi^-0xl;8*=B=zL>wZMJYXFd^hBR1Yu!p?sXS+dc;~7x6_$8Vyvy-7uHO!=Zx=T zPv+G{BH#&H9H0~6<&2A<`QnHhy2PN>N`VN?RVgEiSt26ojX0xaHQz@WLQ~sh=-OLs zP52&e3ulluAvqXV^u2>GQjkUb-pA_S6-0?Y;crA-#Ugx+W1o5Coulrh^wrR-U(W1p z7h(Sba&=+Z(v5-C>ukQaFyQ9<)|KGtLdWu4ZpRy>4$ipAq?70d;(v-nuNc7$+~uD( z_pcU8v>t{e*jS*^#dcEyp>NE&4dMysa~-Mit`*sRouTd`B`FcAs0*#xU-9u(TB>iw zES<^5ikVF>ZiiSbvZWxVhB>0^mU|spoLLlUNvtX)$L<=nAYZ)bW=G?( zIZf^QcTLJXg6B;X@HO2{nPBzMC*f0y+Z}kCRqoVj&)9bbN^9@>OfsJ3?Pjmq%08@V z{(P1!aaU1Sk;XMTQB~|$pM=vM_csyZg=RM4d8Fc-Y-^>q&jV_x zFY?h4c5i!WxptzykA=Uw4DVb#d@ngbp4;)ljzzRUX%R4ncY{bmVNcTHnS(jAgWqu*AbhGMeD+v z!AJ0Yl3f1Ade6@Es<{RVTeYrWo>IO9smTI?WAaI(!OYhK+1~x4xVMG^J=gQ09AK?w z?XJ9zV~O3Tk;!9R+jQS>3p_k>-h|%o18T?N6o6#lY?jp8FZo&c#uo3NDv(&!uj?OV z1Fi1SowY9Wf;n%y@N36Mcp*S>T_FXV^$Oe#x7?a>ftGi|&q<(&`v4X;DR7_4+Ir3G zsc4v3RfydgE+NjRCk;CbnrU%qv~gr+Fvy%#0lR5MtA^e*YEAHU4n82CKEm^gN)Y&oN|LW^*B?KU=k{JE?nX-v+{p5fVS)IuV| zSZGl{8+kID@K0~en!1YXs>_yyp$>FkR3hXL)L4s;-lwNMNHISa((yd@HHom&^4E8u zb-zqDJ8@mm_^^R3HQo~_33a?bdF#R5Q9{ag>T}Qz!rxqNkNI6sjMxDKCyBvc*P8_! zST?1>%Fh}8U^(6D&sKUg*@a1Y90y{<8^t?#|2k4QuA!^G1+I#`{Ib zJ24}Nu7ZBwhc~%mq4oiam={cc7g^&glRP=g)1Uk02<5WKwcVXTX%-t&*E#PqE>$$x z=cChp{-(M+eQkGtW^ZO*VWu#d=LN~YL=9S}_c&|4!zU>s#;f&l^ryu8G|uj5I`t&T zV5mFRt}ATj?C0NTh1;&lXe!q~s(R$K-_;hlxL<7K&P%tEB{f-=mM-Yc(SPO>*jnzX zy3U%8;+=pCTIx@=G@Xpwz#0!p0d^7FqPH9RCM?(Uk3diS>SQNRi98?zbwc;V?JvHF z?Z_VIr^wFPBOmpPb~~+y2NNHn*h=p%oh zPVbf z=FL$;-c#4@Gbm|jao+%(d+?lN$jdvXQPcj6ik@mT)OAkL{sPsnt6Lv@9`R))aKE)J zeeBk#v2Z+jL4IjSnR%GX=>aK3Z*Jgh(S>hFc z;#A*7vi5T;oG7-;lp^hAvivPi50?*RWPTUfw}^i}KL;;z`J$jb!vwiDD9O#UOzUS| zJ-*v3T-^?;c`)fOzvK3&qKQ4H5jRgL=PM1Aj!x^RTi>=wEJy#vCHiMu;|5n0w)@nq z0=oi&N%1KrhADkY!$mbk6?+rRKly?Pku6xiLoyHvE`PzB5M{UhX}`44UFK@cW6JW( zS@YP0-=8E2@IceEg~#5XF!Fk;jb9#FT5pkED|VuiWEZ5wvcz6uB)o&KV#-C@VYM&VAb8$>8{qpqPy z?83#!JZ3)OUFHpUYS6P?vP~dl^@a^HVezomYwse=y!@?nJZJS=(RH9!ful{$I#zFp zCGgnK>ssL${Fh<%M{9d(>T@8c`<emZ7y+Ff1Tkl~I`ZN}3-Rr%(~U-9!Fr|p(> z(;P-K&EVVN1sF_t&9AD@`oV)l3*S>33;6|~(wz^%!QOH^l8s{Hy|Y68d)9CiduRWNJp8Tu(=je#N8PK2rkN!((Tg-a z)J(@;%#@n6asWnDc(+}JG>(wHabgK>V(NfS+PDY_>gwy>j1bicWsR<`FhAietixP8 zT;>c%-3UkwFg;XtC_~K-hUvuPd0v?J%r`d8yy{`NI{PDJvPI;#QC^jy?Ha#$A)h%c z26ldb{sZhYNRU{cnjumr&wI(iI^hoePZ3h_ZV!P7#}$S`Jz*x#Mu{gTNPfL+n{Ef@jhmnPwo5;$ z?)~?d+jdU~g86#0#G){cqAcp0s>2Az5!4FyGPvkN0_|LGU?j_g~wSIJcp9?YL zJ$3Xj>av#4A_E^1#&{p{teX2~+D{x;3P~!gJD$IQ4UOH7I=at&>7#TZBs!0}*?C&K zvNI#y^O4ffQj?bwkEV{a!A$irty>MU1FqA?+xT}Dk9K(7R}|4_wirKJy7HaQ%oT}j z>P>7p5N$I)*7Qad zwlC_t5FS*S@^3V9=^Ye=M(w|{n`lgRn0RUtKj=hwWs5xJ>dNP|+Nje4!vD3~>SQRo zS4ka2$FN~KQI9>T2I1N&GkFO>*>) z(*2lbW=9KWl!21TYV^IDR!~Gh!268&5OCFxaq}lcb0Z|$i{8cP7oC3r6y^nIf5--e z?3HlV*~&*lBj*z+T#N1U1A-A@cEtVAG*d2E|B_bkb$RcO!;Wh+>e=rojb>Y}M|-1N z$l$pI-`DlgcP@=CxOMv(;o7Pjo~=r-n2J`vlcz*j^I zrU(Np6qW|#_i&M9y^TyB==%wL?wFzOFoo`FjsZU4xqaQcTQZSxdzcE|&-e^&IV9~N zRkbir!L_{^z7PfL`kU6z%8J(gyB~R4LR0&g)P$P%1MXD9jHTUC~~+8}#;T@Kp6R z^V=sNZQeIwOeI#czD9SrGKIbznwM?75T4d`bJZ`%O;mw<_j*_!ey6sd-A6#qH7oO! zz}3WI5){>X_i7^yE{%04#&qLGp+ zW<_8ON5tq);-{*jn9|DK3)lDN$PiLs-s2P&p1lTcHANlsX!uO*6gmgdpHt+Oxgjt-s}e%25G2sv$VgjW z)$vRQ@H3ju>b9!AN<_krw5Qu~$1w%D$z<{|y0oBo&-Bm;P7k(Y{IkwLx zQ(G)L{*Hn#i?PszXGJPap}%;w@|6kbW9laR&7-0Ri*Gtzw9ALbQ@iXV#x(_vKX8nT ztKXPx;t5Qo3?8zJ?I%BG*LreFBX(;|Y#)c!W+nG=AAB?)^^bXaHbOun9a)`lpU!ZH zN4h}WA96pjoWNF<_V@J+E|aC*%iBvxeWbFLopi7v#pyppC~4$kM0O|LS*&#}xJ=*) zSl$fag*>J%bvJNlhBx^^DRUp~*O%UPP7%J7;`o(My;TV+QcPHf)h1dhqf_tN`>ufI~{cLgS(L-MuZ zue2)Z&|}A1a(kZCSCo=N9B;ktJK=Ot?y4<>yPNkso5%!Qk~SWV&oXKtn~8ECn!C$z zYOgm^lMInW3TGEPxH8Ve4AH5VDmM0C$>BtzOLDJu0=K0aD!!+A)EF8!i0k}LoCujT zn|w-yhap+*jVl;MYx_@WO2oT!ALhHoW!%Vue_rz=JLGEL?0qsvGmwHllG(R8@C2~A zvbMc$a0*~Ktrq(BfF8edf6MOV9yA$ChJPvsviA=>t@!@%WZfe748K09JHa%gV*_S% z!9{L?(pi8&$fck%dT_#Xc?O5KxGXJZr6_NQ7S5S*?q}L%GmS`r)ByE_If7Igf z*X3X1>XWIKXFDbQG#K1Gfo1->KS$T+Kk$(9mkIIJfAm|{!{Sn+EfG=@Xp81_Jp-z? z2CUD@rWvk6n~H9qw3p3W)NNxs7#P&$JB`F-AM`y(9lBg6f#>i9oHwr#+pgqP_^IK#l9sTY z1y(jV>FJYcvQ}s_7vE?5@aYusQb5@2u!~NR!-DBFAo7+-(LhILZ zjH*NE6bH@j^XEm{sv2FKTV(S7RP*)~_Z8b;)lX zR+am5xDnZzeLmIW_Gng1?^j5d*g3N~SC7+{S?)AS5HBR3y;?buk&m*e*>-|CGE^`f zv0cI;L0}XSrx~ZXS;~kJU`=B~$5;Lm`=bP0ySv^K*YWN@LnGdOtRGRKuc3{{6Pkd% z;EVl{cbV*ur5k==PPfE;sl z2`6nGS7E%S3r4(~Bnjw=}!T0x_!ML{zwWta-{`Tw)daup8lH=isry)vISWYAj$@ilwcwM=2 z7f3x=;&Z`D2_LybBbC3XIml6X_|Ob86K|oL*Lf>5MtS`^cYLpBt>`=_ekLfkb?Cnj zAMQE2xk<=$^6!Ef>#0o_4Qm{`nBb1@`sh<6QKleCQ?j`#iGOYcYv!v$-Q$A;`U$MIBjRr}NYsCn>b=uV4w|$oG z-Z{&6#Q}--o_dLjqK^6)t;;u&6r4w53j+LK(!VfGy&@Lii6e~OFdd6R5_iiCY1TOJ zW~QLEMN*Xv#dJE=)ntSbUlj~CCk9Qe@@E?4-82za+;0lb6c1rdmxLnMBVag#)n*p_ zr5DDx6jlzys1n-VeTi`G6EB~YQ4e-_*ZYz=)J|Su-YZrse$DHd4KVkLM!jw5BR*vr zu6jWWKv`~kbe3W@?^PW@<2ksm=W%ZG9yVYQE3VvIn@5%=z+1hZKojgE5DI|NKC3Y6 z3k++QU^Tw??SS^p;dM{KA`GxnpV+$u;D#6cOl{=gKD&S1D|h)10$j0H(~Ka^Fax12 z7DN)O49xsCZQ(RQnGML1t9>8xBYbAD;lTE`Ldn!b?Oj|@5ml_AY%kIq!uF5}2JGKd z3S|EdjN+3Yp{CCz%8N-{Mt|^OX!;?QnZy(Ex?&TPZXJ`RCmzW1PY%7A>5=zCS}|n) zx@6HuIP0q6PA~q%B_I%ai9xhoU3LIF0(c$OOELA!k=jW>z#1#8s4lm3H6lb<=rwqR ztFwE32eEXiwuLJOueFcB064(nNS2uI&YpS$1RRuEjkKH0tqWnsvgSYC8Fu!&!Lu)(RS5|aT zbU(3sI@*QP-c_eDj6UYJq*WsCO;HuRX((_i#?vl>gVJziPS=czWW< z<;tAjI00`~hhuAFeU~KyO=AtTVPsKy|a7M-|r_FHD-B&J(R%D41ukHM<-G||2DP?R8Xb=Cj=pUCP0|6~e_>(H@%c@uWseZ8;@LxG8c-a4MT`nLyRFE=A1#_Q>o z-WDNrXi{qmEs^7ZpEkbq15tVJzIFOZcgG%mMMg%x3e^jdCOM-rQ1jocZbMN0rI7wS zHJjd7P`Z9gvYs67CrI_Gqbhms_Vh!vdaC zxZCqw!oEBZLaALKlba^(WyDh(UsB(AXnUzKX-#y__g0I~nM4km#L1pSu5MPw&YYX( zKOGUxyv_(MwwH?;(e-XE-NzvK3-|!JB>wZ$*3>y)`SJ^ymK}j$^&sCZXPfXPT|l#7 z5U&}}{&O(f&6}ZJ%YN1jwsAa^XwbrfDJR{H;lx(cYMzOO4HprlB*AR*FS!icn#gmkC0bPp)f z4brI~ASvD5(kKitG)Q+h-yQY$|7L-%#ngNEp0m&1``r6p3}U$IQbWJ3U~R+2kai`? zagUejo1h2JQ))sqZ{I#*q}R?UC(4tY|21IJK8_UOjQhxU zA8za0`y8_td++*o|NhD0j_n;%V1NRxhM=rOB#I2(vAP2txy9DQncY}&i`?n4o zy9^j`!fY+e3^pM6S+L{E$ZCQTGMG8ZyvW#~X|Ue(?Zo@qd}5Uh7u%AjqoP0!fiKk^ z>{LDcLq)w_Pl!IL8+~Jxksy8$VDw!g=Bi6_RFY?FWGizmO_lz(FZ^hIEIdY|8XDBmqc^XqTI1c49kQIl27|5U%RAqE3a&qkq_E!)C!xo*x|0)y zn~2tB-1HmT@Ars9YFfR18b5O6GN1~}4Qa^Lza|v273H}pZ2xcwax0Gm;UL^Qgw!5K@8 zwX;l^cXD!b!^c(lhlpAi{exfgQ}u+q!G07@K8-cEC!&G6>C&DEmk*4dG7!4VNgh&J z-5aa(*XNC5_(xUIi`6;NN2zJ(>JLYTY-kVnr3bl6v4(A0*a9po&2RRJ>MA61bvT#8 zeT<^(Iy@~|Hxx-dFrZ<+>&=y6pib8RhD;3%8Sn)Zz<=R)XFb%#hBwc=1Y~ew9A-^v zWxNoN`*<*0(?hb9i7PD{YAkgEX1d?568!gRF7^dzQCDI~iTVmt7bPzlW`!Q56og$V zo>ZK#{VTmw8AxV6m{yM^BdyqVx$ZVc4=oX0YJb;&^Q{Rx2W@OKx;4!_(6f`$bE-ce zKmU*{EZeI6vlPkBn`gJxhQjeP&9)qM377#V3jjat84XuUhlNxQIYoyAL`RhUW?Dw* zlW0G_HCaFK{snK}{2kmvS z?}gzfis$!ymz)j**`UI~+JW-M*Y9~LtN+;>LY#pSZC=JY^=L5wRr7An%xg|;?kLKm z=^0+`2|ly;P7bI(@KwC4hq*_2Nowc(CQzqD+Ee*&0BV6@B$_sx?%88vTPv!Fjo}aO zN5)9x1VdAZ%Fc{Rih}%q!&W0{@UJnrF-(Jz~EV{lg#yzUT+0LZ*p-g|`vz>VP ztKSH_9^-bGt&8)>o*h5DH%>I87o4}l8xlUwR6vB@7ZV?;8D$VD9%y$OJfOB6F&o{* z5vZ>-$LE@xeYLWr^zL!2MOLiFjp=0=?FL9JJq(n-7@0{I1)sOF_w7q2ChK^^D~?lS zZVmk`=fozn8!Cc1)n~ftlCtH7-d@&z{D+}}zJ{BA$7p>VS02t20*&1_lE?bW_SPhU z)hptGX{Qb~O+A?&aHr=|r;DMlr`8C=j*AJ-ZXZ*qNMj~m33_4DYy)TR>|?JbO3Ts? z=`Qyp+-Rmgz*7!;`yi;6ezTv(GI+K0Zx6rStiD;D&zy(Jgn3rpK{Fr|2&9XYG7@s- zlI0IBnVh^ZVqTz*7C*7dUHC{J+r*h9jjnMK`DW~%r~u67cnj!c3qhhv37meGOwU*H^{op$X;tRm1>=hDy)Yc?xm$?G<-rU|TE zD+TyE6}nh-6_b1`^L6Ex1u3$8X(zO|ki3d!(& zfKAK!_<+&?JTY#%ou-^C`el$dxqw$~gUQU*tu zD6+0{-l)b$O-ilBI{Qbt-1`sO=cvGsoimSKHBr0unTIq8NCHd7wW5+`9zhv8yWdib zwDLpQ6DZUV3MMXI-6z3gC_gHa2@_E5@2XzKqi|bTstAmt8Z_S=9AWmcN0OcEH(3Z} zx3=aEhVf44hix&$NS|k7dPs7tZp-%v=ga2UMAMeselXF;)cacivWw1+J9a%C_di|p z&Eom&&c}N0QNjZY)|hnki#n%$_@S<>NLH`ABNnOPdFMx(4TI==9+pg2@Zj6EvBVFy zMM8l{0VH7;4xr=e_fl`4Bz7#MzK%2!9$M=srWXqbciG(;b_@yX`O4ugxN_;_D7xF$ zkvGNR^x>7BRI73fJ?q!`d-uX$881zl(0I1ROhX=W+LJSCE1&O2{?JHBQ%EhD&GWS3 z=F*4%=uZe`bn(ZV&6B9`yV4Ico=TD6XI_xgstu;g(pJc($Y5h&4GLCQZ$a|-6h@L3IBX#9_`s8`K#E7`~kK6D*3+>vfhEI4Y{)Qd7qqi zxS#%Xe?i)Ek9<;X`tC)Tb~ahU3A&JkwQ=GPl@oUGf~d$!NX)}4;MjuSbBLlOKPy) zvZIX&DT=FtCFx$>Ge(iOPrQ61zbLCC$?E;coIqK?DKh%`Q;8+8>KNvEhxnm9_hk0- z()5-fetKa-DU%_`D%Vd+ujd~-nAChQ_&a^;s&dzM-MbmL;Tsg?ttv}PBW|s4{8#HK z_GYkKeA)Dn%OL?@(Il&_*e}9cyauG@t^@q^Uo15$Qnh(5m(;wfo)@@K&l5mpMRS{} z><)<7jIuuH_JWgRYTsfDewJR%iBk8wvWLtDRb>#W? zp25Mz_ORsWK?XaKrIc23)-Rb8NH3Nfdug$(E!tlgt+G;A^)AIttad)St@B&1K9r%_ z^po+Vkig$YV_u*YiIEO{@(%yI(-nXGPGO_ot1V`qNxf9b+iaTD>8EdNk-0aFe(6E5Jyyfb?0Eu84+hD21O>o$|SC)n)woWveQhqPG>m;77+aIhoWHo<`9Mg~mS^B$5qx#xP#LDFT7Y3Oo6}Z{~mrLvvZ3 zua5J&jaK*Kih9pAc?2abg}ofvjS2FmNil+T?rdewC;X`yQbX@(#Jp8EryOZZtKltg zByA(oeymj46O`YK&?<}M`=%?=Hpldi3+o?7?mj!a7+R;ru23p<6tJ^)<(|k5TZ}<( z5$#RrOx?-s`#YJqwQq}6+#rHxu8j(D-0x32ceev{chPEqA zU!gS^V^{rZoHi!CT4mv`_Ry=cj1UIs6}Pf}waQk_-i-}IY7)~=8S?qewK0xqk8WlM z93CD0U~j!gy<{P+gfa(H1BD(QG^I)lACE9-y?)7YvNvtT{I?cBJ%@9>)|r_E{y48n zJT|^Q=_o;cKd`d*qth~7@Lyi40}SI;w}Qwsk;mHyq3;ElDf?OiHz^-Rd!V~_<}!O< z-hH}EfE%sQuB$5)-r}omN3*FOdGUO$5=-7}rb@oQp^>appq%(H7OX(io^5jIV_w|M zhx(yPaxnL!7NduV{4iKJ;=qhdmpEySAcG*sPF8p`$x_PD@=`~yaUG%yJ=M@rx3PXe zy%Q&&&A=UQWs|j9zT-dT(jW2RcYku45}8wA7w6%m$(Kv#`O3e?9Hc{Q_lA0Y=N`2M zOivCL*0x)<+On0!YD$v^R`>3IyNDmyu^dW*0b8%duxz-|c ze6wJ<4BLupOXh!CG&UD?sPy{jvdxSUc6hs8htXcit<{Gh?rf0J`Aw!=zV(s_WpbwG zZ616PMU;%%h<9_1HFvM^{Ybx$4^shU$j3$DEk>c--Gld-^x-8%2Uw(WT`OQlwMloV zI{Qr>gDOQkPmT+3%fzJSq!Fc9I9jF@G-Qo8C(d3Tog>e-*Y>}Xqc6W_9o@_9PG9FI z`Rs4%I;=PFbngo`9lJ|U#S#7F$@=cKOGG>_l5mJ0q(cCx{m{ApuPQUuJ~Le0eLB}l zv=TT*>NdAh$n!}-Qo?m?Zml(<$T97^mXE!&8)L0Ew`~92h$XW&8 zg0@vriv%5JHD*}%0>t`3K=WO_=tCt?2+Yg0I8HbGVcVVVgJcVMH-&63){VUCVOM*x|Z-@ib`@S-dzqqn>N0*>*PZGB*f;Uv?3Ua)+zmhBoQf9AW-raiF zfzKpr-;DQU$Xg@%KM54o{a{C>sU&3kRp=y6a~@ryT{5cKrs=F(bOBgYwvG>6(yQY7 z;;Q7+n*2XURZ}2ro`ac}@p9fvP<@!}<*$jiG?x+_j@$GrbF*#zRcPf&$1l)p16y4# z$w&3Wgm1}fL{j)`B9C54`)R9%x<>y^;)TSL4~&WfU(80)wEsJ8{Ekz_xih!w)e7xmMzxCQ z!%{X|`oriwu1#`%vnZ!aV&&OqnQf*|yi{p=BkAy5Js+BC6F!0n28SVU3qJoh@fdq| zcBbx0_PG;foxWfegT5aT-YVOz>KS`QUE)L<(0rSO{w$$A9JYPD9|W|(D|PQt|N1Gv zh26+o3DtdGd=L4@z-C^<7iFs=+;9K_IfFmKUx<8|EuPM<#Awl%i-{4+;Gfu|E#qOv zNV2;ebE$wTYu@d+NfFz7)?gon@K0j9*gEv021eB#ElQYJE)59x6-`uD%5cxm1bKzY zoU1l!OoU^*0GM?keJ;(u-nVMHIiy!B(&=1LY&JMNEWJn3Z#I7P6~FrD**`CZwO_ls z$DbJ5*vi%dYk#;NgMaWU*Jx*K6U@lZxG{7O5XLhgV1E5_j>yX(yHR$|&#VsSEX(bV zE&KZaBt24=0-rg8!E90a0O!5U3+~>b+;Yp`k5*{KUn?uW2AmxyK`c0LMseW@!qHzwUoJkG z&$}csreL4{0_Wz-bwq7MP#>=KA|vwncl1Tm{V^lv#*>SD47j(cja6DFtxg9R2O7t1 zaxqjX?J-+kyb#LZtTimX%O0dS7iBz#X#33K8OIZW?R2>6{a&l;vW?$wtUaD2z3ZFg zF(p&htSP!{9o?^)B6`3w@P;jrYrR#&nm^C_^Y4EtAzjaPZm3ZxV&^|iN7$@qunwK9 z)>^g%tWJ;uC@TP6#5Xr?GkOXX_W56c!#5?@?hD(k+x&jC4c{;xM{8W#iP)eO-L=4` zDC_|1zg$Ml)PyH87mxdX%X!kLa1wolB(|_t6B3C z3D#9g>q&qo26tb3uS5$;ky9NCz=@B(R%0c2(F0na5w-%R*jEd3qk5WBQ)@1ixqlN` z8UwSOpnt|&pANoGgq(GWWx(y0P#vVh?fqLi*W~Q-r_JzVg@VsFa4`c!)gF6{;qI3BbUizy`GG=$dXdyeYVYAg5H)=VZ zly2YdXSL2w%aZ~&-%PGUF-q0%imiU%s00G0^7NU*9nlW@j>OmlL)-Iesc$$L!xQYB7e^I2iM2x;xUbu8cHvAj}8HdkP^5_v;#e z@lTtt%pce9)bV1uZTjos_0-g7-8lp2q6|&juFr%$dU>?wSiHYS&k1>oEc-AvUEZd4 zyR0){09946g>W#NkF?rz$Boz8nWEB$=$tc?*__mvaxgQm$>z|}G1$X|BdISY_()0Z zAFEb>AghRZ`?z6yT6XMvfI+PVwq7LiuAvZciMlqOD|cn!F@|mU?@~&ns7Fn|>6SZL z9v7ut1IRzYIbzVYoCAd-q2u>E$Bm#vxfZMX^A(o|Zkyoz5R>3HrxtUtX?=5`DN~=e z8?(ihGl4WAiRWr3`?<*PgE~=+H}Ut653ApD73|nGUpgx>w+Gb=k>@==9kBkvTH$TV z>zL7#x%M$UFEBo;mN!iRf|rA)_N8F89 zxZ+@>5~a~EUvI^>ULY5YezThqfMynbe!(5kD3GxCIa(a*LthXtpFL6zhXg&uz!xIt z*ZI}Bh(&FyL@J{l^WBcEWncRK#?(LZvEBL0^S*66rrXrAo8(Yyq8L@{uTwN)s3_5F z>oiuDC%@$BJ2}`D@pGQ}BBWD`hT>Q6D7rUYe7i@yLd{`}I{LzBl;$a6w>py5K5f73 zsn>nF$k%Ib@)l^cqnh2ALN5aBpdU)l%*$owLy#95q+_$;r>hu_=6XD- zpALYRW z9$>%EyNzdN*X=UdUaF$QYuw7()~C}@Yq40(Qwwf9pXyJ)cPAL1`t_7%Sv;DXi;*@` zB|R4^cQ=+LEq&l@j3s9>7%H2{&#QohXeEG01(V9|0ts$}Zn@*-tEx-x;IIpftkG4a< z+UYlpjr}4Q_^`RRFm;>Zq@>cUtJ`D6Nk&YcHDU~!hR$x5mP}4$Y8$-E1y%h-1zaeN zm_f!j7yK(rnFp^qY7ZA>pasN;y*MtUBjKLhDtmpjz%RZNNcVB=5|4z0GAR7jtE$zq z^&-_Rs%1`yCznN*P*WXIVA`h++VRL~@vVyvuI;bLcq@BvP3SRPS;3+o zYPNAwv0|6*jmW(4u8U-33deD9=NgntvYL$D`t~05z3*Z~F zjyEd6b-4uJ3}g6)w~We-^5QSm@J1YMIXx01vr_`Z_K$;rPIJ*2Zms)pCUdORPat%O zW@d&O8c$K@kF$o%}sK!M-tOB3(Qvy#Fz2H?1FWEX!L)@ zpt?}jszE;t^0C|gVf)gZW)Wg&>o5y>R`+AfTPX2OtHH*~=I5%O??-J8?LXa^8||;X z8QoZ`ubn8$v3?$_c&nu`JJ11vrk;Ayl28XZg9SEVA?qtTGxu5DaY{9 zVA-{`kV$E?rYN~C#rRlWQ__XWbvg34$UmMw`*yEoWLyR9KX-%nFub{CYg4o$9<;8Z zq=eeUJ9f~}(_c+}LJ_?3EOmPy~V~BYe+B-#S(K$tAbBS|tCQNc!>~N@GQ+ue? zky-|aEqCqS$GMEb6;pd|eYTnK$7C%QKd|4tz|gMDZ7G$VIC8+;Ri@9?|ARTK^yd5#JJ#sA!Zpc?P+5T&v4~+cZyipk(2>v#t z7Ll?1X6H<7t&S3hD0&P=&w#apq|M#SMvpf;TF`}DyG)1_|Ck2tBHyMeJg+vTmn`Z> zg?nFV^BdL6cLube6G-Eny|P5`SGQPz1?(d>kK^}H+%9jJierfO(r+%lXz`QH*mXHw z8yh^0e`LXQVTsr_ydSMVazr_3stZzltXxE;kKxbHLY*Wh zTR3Giw0ikWLg;`|1XucOdqn&MTu=DFla!O(71|@a;!O{U+#|ofzZ)#C&gx>HppxQRqjYd%X*MMEw-~+60P|f=|xZDy0uo42HBmA zr;nF{W%@k|?o0V)t@?Z#I56!?I-e4ZpQchUe|q+B+M`{Juv^vy?m7=H&9mk%vYySWVWaA0$4rAOa* zOz37mc3<+QP<}sd;rW;MK|wk-e<%Bh+7&FVUR%h7y=v2UDZlKdo1m|{Z(#gLLuvl; z%_Q@48U02b|4P3iwY`xT@s{DX-{Hnxz4Ekdh^^6YFVCeg-R=(lN4Di$EFylX zQY)oiKj7Kn+bjP~IxcRlFYtaq0<9Z+FsxM?*kRgev%`aY+(`Cu(B`&hu2e?(YFbU` zZceo|gdy*8iro)r)Sg!aJcuNUI_`cx3Z){tGC*_GY?_pvMh@oJVg%;#-^a31?w>Ut z**F_%nblm=Cbx!oln{+oR%27LqQq^Od`lR{5G8}{;(g+Ew#QElv6DQ##dn^rW~s+) zj$ix@h3L@ux!u+IR=+KHHMmZu;^N`?-sN?o9DQ4RdvHjI(bd_$*Am%WivjzQODzqJ z@E->y`AH`B{wp@A)h)s)J9V}w`Z3+1~(lGE;Ek&&|t*JO2jTO@tCa^B1;EH5$}j;cw9B9cN%(_c#N4{q$_iv zfpO9s;`$e&Sb3?u_K-GVCAoQdc{2;P?B;{13j=&}%Ne&<3^08kVb?itz63oF3nDd- zoAax~p>z1$O;>IP^vC+o+;4@2**Q7%2C1zE2K$ShjjulkIY~;}5j{rKX>-`aqr28# zGcp%HQ#@h}!kPt2L5N#G{CRjMn`D^L?0 z@iaGegf(mb3}Vm`5&;3h)!gkhRrC3P-Pv-i;vnO^&1-FKSxrrn+p}(n+hQ=o(`V1n zNiFr(yhNx31O%A1DuTA*)hep09SQnS8SpxN@8dTuuso%#py1&3?J|k%H11f$@}%YG zBTkaLU9hw}-bRuo*9&pX1I@ulHY9Q>3oE6!ub#9TwyyqQxU42&_8AMu;i|eU*SwZR zTe;{ypB*q!Fd`h}{61Uxfv4HwXv6vM;Ytq)I&a{E0cC(dn#WFB?-&{yhLQ4wP>TgT zBqR(Nd7E8Vmwa&G5J4d%X>V^|K)nOzR-?@1!Rf3gTlKU9hFQ75S`Eg)H#mvpE1(D6{mrP8oRDjFVNNOVYY3nvCnOEiC(@9NeN zg#TTe7Nnz*pP%n`bG|xR>u5fFouK3J;AgI)`N`I#&0qr-28MBqFOrVO`qwZjNIGyr zLO~cL>DId_>FLe#51Mf9r|o*JetF=gm?j9WM&Iy=dykU;-Q&-nKNDjHn8CXvsUpYn z=UOEO8U78n*ho7|!_o4Gu1wceJ=dk=#>Vb2Zx>P~v)oFN?0%UQ;lrM(O~18!YRiR> zMe^70u%U$Rn9VMse41eC7}Aj}yy^Z6Lk_I~+^pxC(%RbEe7&iusdYTJE2rI8({$`R z35dhHuqizE=3AfdwIIu-@<&fk>xf*eJqeS1;yP`Q_A^I*GhcS?kk@uPXlT`{YTzw5 z*p7ssqnI%mg!|+^7M4vFgqHSWR8&+tvx@j&^eiVH0DS>P9xRX0NcURzo1fl~*KGXe zzZhkaoZ?H|JJ@L9-Z zi@3J7R#i=n7f$);QCoG>G0RTLo-L$9ew&Y|hB}#~A7gok_c(eU{Vy547+<(aA$wH*I2FK4)>yLa8zj`8*rGxi2JIdqBw&tF* zE>(rPl0Wdd2AxUzLlhZ?;IavSP>+UYb?c`h#I!qt0ts$xWF)PiU^d_KUe}{3D(azJ zPH4er3s8Als$^MfKlb$W=;cX@*Zu4~E=d7{(Swq2S8aQuq^zt^%NSEbm!iQnH}17N z%N+BFi}5M)X1}TRxh&~PmrRp=#~eYVbJsmi7nA54YtDKfi`{*uhkqz_v|}~&+T#l9 zQ*Lv8d1}7U=8wpOM%6dF-}3Vp*G95F#m5`56BBcq+;0!SYBykax<~|N1_>S}X&eaS z1ACKyyaLz+u7H=zP8yC$C6e0ehvvF2prxXw)&-y{udtAolQRbQiDc?eVWE`dWKvM8 z+7PcM#>6D!4Ffo*!_Ct2b@wloba;QC@QAm6Z(EmeF@4bZRF|?)WsBQtR428)?W2=J zn(gGO5sZ83Y?XM_z3dDm&+ zy=S0?m*vsm{eR#9Y16^M_1L-dId_Hu`d}eF1WI8{bZdp6XJz}DpjJl zH`lDB^zQ$y1+eEQ7d@qT?iR&2=N0QZ>z=Fmnr!Q8xABzn_G%S!zQWhsi@=xPXf^EDuXpn;NG@9wt@XQ2eF%n9RD>m1Rah97 zCIqg9=ecWt{yV`DZd1)+zbGz8kJs7RInb3Z;7C8e59%DaxFZjl=f*F_D%+VKnEH2R zM*$Sc3sgg-qU1nqiXVJ{De2|sdxMQH?jUs-Sy+TOCkl$|LJZpjc;ITfy7GW{0-odr zMxzKdn`LZ#yv*koDss8S1;$9Y>3ZAFHUGvjE+L^CfTsW$t9q)X)62f1OK_O_^GgwurkxF_^7B4nSx=k(wUA}$$wy^7SE3`RYl=bDy7nRjh5K6O+ zDTJ<`%jc*dDpe#(f@40y*NNTHxws?`RT!3B~j>-YpkS8uO89 zo!x7O<(ZV}+dDc*(xWJ}m@u5Pk!f<*#(md7P%ZGW1Av$L!#1%dpugkPt1gKFyr*Hm zf{&KyH?vw0345Kr>k2#fxXuLFt>?MTqX+6k`S{GcoA}Kp-Z8b!`SJ%iIICrStnJpe z*RCr7{`sK#nwq`wEZQ2)Q128jEg+i!SNiqqSB2&!kOEV+ZQ6$1q`_ff+4{{;x5imt z-uc&jco%W%dWI9<4W|Js{P^+XJz+I~(}2%59Q9DgDe;dJ#uTu=t=jDMFe zEBlR=soiH$+_(kwPKeS2qF~%kPrHKdhasb#I7oP_hz+OQ9GSW7IG=vYgz*Z6SB$&F z3-mUaQ)+s8KTK;0Nsa4};-Q#tzm^nX)xV~?wngV%T}n?6k{9@Ef=g#8D=FbRVU2_0 zRdGoSGKGeTseq~P?tFyM&SO^A;+dsz$tT!>e&B|ufChhPHMq0!;a3i<-1F2{4|;Cu zC89sPgh}~45pG)_j!38X$GaAv;^OxAyQ#{(FHaN(3~UCXsKsh-Z!Up$wRD#Id29u_ z+7qj?o*cDov8vQUphuQeq#0nRVDw%qD}U(wZ3M5fnW;i8YBiY8NwGER3L^nuK@7;Z zgaiseOJl(MkgO;!uc4sYb=BA}X*Heoy_MbAT&CKhp=>hD|8^%o|?WSmw34LC;IUP`T1u+CeCH9hKGeM*Uw$E&YcgslD2Q7 zj*N^Tga8<)a@!d}bPSC8ibf|;fn;92GMcKeKw6~~aG-UmPg_m*i~yvG55DSBf4-I# z`5~Y|BqOr0urL!Q_-_8i;?h!ZWF$@^lCZG~MWnbgR;&*Q!?Dg~7WrExVV)&1R zfBd%_;5Vv`KU@oArs*w6xaUX1VnBiI6dEIfPvm?#)_0pQ)ZcTrF~QDzQ`<(*69~My z%h^*Ph7FH5#;$-BA(%TQw209CfLb8I(QqjH0cGytf$88qEaN30A?a=N#~=~*;0Bd_ zHzuhV(2@Q$p#+c!MPnRbc$sx-qUNqv_)_`pzu0?%D70%lCIpd-;nq)P*U(C&?}hvQ zdQ_I}HyY#&36Eax?VCx-&f~Es@cICqsmQF^$CbLEGq0U z;2yT~4Zaa;TZ7Ps4I|N`fc;oRH32xsAF(#NePsuZs2)i+BROa27l0SL&fg)Bkg%MY z6BiryTyoQ1B5myKz6%rIke?lZm@XW$deJjIXr5~enH)E}^!87hPD}LfL#wJ~nmBNJ zPUs87>85MB-7euM{@!1ydBiB0g&WKGZctPIe&>`{Zq@sdw}>#D*gkQgIHbBglN#16 z1hmuS$0x>Z>}tE31=O8}!$C@nb|xk!cTixF@1742zov9w#w|wlq0b7j=;M?{-&YKe$Q{@#oKE%C~2D>h_g???K0)7 za1_)(KF)-3I^ssoP)S|IgcrKEjC=jH2r^qRqE!;gEZ%TdUWZTp4CJXG@U+fEbnAp!&Th;WB&INuXY_c|isW#Jj@*KI8Jq zL6I6P@LV5Tb1D!>F5wyMhA&$*n&%Xil$6SC0&%FY6RB<3iEC~yHfvXstpruGM&2&R zYuheNS(R)LFNqJvP4V=(XN@jd=r~pzo~W(eX#_h(vTFmrS7%I0$CV`KbH%Ar2z>es^D1e)&Sv6-hN$Y#c@@oJ=Ph?^G86xMoaR8pU_-v%Lj#Z)@;|0&06% z&y%gz-BUDcML9V{ncNnXRFTYz1``<_9W5#^FCR!Xhub>EtqD#} z5>zgk`$0nA*jFpu&c^{Rk>pC3D;_L< zvq$C*7jK6*sqIoQs0@7G;W8R~)KmWB&q42z(Tpm!kf*LeCHVN{IM%aH1(e@<*In!h z=l~DQ>FEpWNCTEU5PeXERSsgzZS<@mi8pTue*gXr&=M40aq(4c3ulQL3JbiM^nGBi z0bYP&P4(Q39VoJ`;o9U7z>a)wZ_=O*(o$f@gGd25^pcYu8%(!L9B^Cb{DeZV7)i$% zWA!4l`jx0%*5Q-2@D4(i>hy@y(5$00f`7Z6vV}2Gk%5AvW@av&JYj3TiUGx5Nn0CU zvl-4n zre8|}U@6eEGw6BGxhTZXeMxFC3eJ>Ep^ zQR9CrmpsM1b`3yimbD<-UG8q*LB!r~h60(e^=->P$RnPeg-~Z)))U`-x5;>|=hIwg z*AGZC6mr3Z@m=oS>j6grtiw`mtxePv3a^!Z5|^Fn$#t;h>*kUixOh50EED=z>zNJU zrN-U-KndhVsH>>71GVf~Z0alk?3M3^?H>l2Z}-}9gq-_XQu1Y=Aa0{zsfP=UJb0U=+;R^1V3KY2`IADx|u~z_D%58vp2llSBE;^MOsqz>q6tw*PXbF^S*asO1FsLpS@8K2C2NCxOQXlvky~(A^zdP}V@{5Hz?9 zq=HI|ii!qK1*)s6f@wgVwslpHf9jwHmYfW|t-~(qoj$hV1Yw{BD*Z>SEi~?3dTM9< ze1e)Z-F=lH;)PY zuECs^-`Gg6kV@>tYX^+66h1p!^&nkc-2wgE3-yD80}m5IJ3j<<1gUNYx3shb`*+NM zF4@-7uAv^@S)UT30VLec=Mw%gfOq$))|)p7O58gzU~^h&J5>?f48nEhO}=yiVk%zi zYK7b`%iOs*-c4704GiFW#sI9zREdr(dF>wmZ!X5VA}IPIp+{MnR*UgKU%{Gh;=alz zl-VzJxl|6au&|geb%itQH6*fVSKUi%B?HBHy4I0I$i+HAM@-wu$OznPhwQG|VLXT- z#Cy9bJqrgkGo&KO7lIkmAA@;OVM!m7aB|`X_7oDF>De=lMh_k)_2TS`aGYK$L8qYK zeF=wvPaL0*cY@Y|05GvVTTVbW?*R@Q9TzvY!n^@=T$xcPIzrohPHLvnm9R)Ydhmu4 z=gu{1B749_IT~31QyzBxlARdqmztU~ICJ~?mRZ(siswVw-|k%5%8QWcyYj;St!Wum z0)?HQ9GlW@9%;N-m+axPn!36pm@{7Mi5B2bwgEBS3*w)I!$^Dya~`w^LqbCZ0GLtv zT-m4CL|vZl4pF#Hw|-(&x%&aOV*olvhl4_s)pk@F-Y1&n-XK8$kt}!HH`;O$g6Vm( z0JpLGEjKW4+AepShrq8Q0)b(Z$re9zcxGWa&z?PV1B49pSN^mC!GJG;bN>pOSBMjL z-JNx`t)7VmxCh)ih77NR2UOliO68eVAXPvn?gPf^xLpb3)hhsH8yvUSUMm`Znu34* zC?XI_4l|z1I9o8HX1yOq@{kD$k{+@;BT==l3jx*q0?;Wq-LZhY-)z8S17eLg;<2nV z?R7W+oW)3>Z0#32f-{Z5A)d|q;UInmog;wpiAQh4<$`tT9=s+19IN0=mrch z0l-jOZa`n6>qT`5Q06oo9MJ?!YI`L<*GvXJz`F7G_Xlq4$xCNlCT8Zajt=pgqg;p* zes+5bfD>4;?$%Ug!D=X;0ET?hCq3Bro6mQ_p0;)QE+{pzm>AF~);cd=BwM|m!5nA@ zPaq!AgKMx7D&R^2czOqH7?<;XP!Jp_p=X9Ua!I3ENOpc}Yi~h_Q*i)O*HL8rY=5cV zn`I%VxZ&Ux^mw14^XWevchy1e`y!}3YDvxPtq0UZJq-Js{PSyb&JuSBz* z8Kv%_+fKIL1@#aBL%GXAj1|7w#4zvUm9=!YJdhRw2;afwmFPx3P zz7N2rc;(?C$T#DJhp^d(je#$eB^ge`!xJa8QO0>)x5l?l%880ISOe%TCiD{ z#`Z|lAwDAIW&;~J&m`_zY-Ath2k?!^n>|4_-o4HQ86jDK_r;Ln@4WQ_O znF|Fy&Pb5E73ahSV?V-)ZeN&Kvmj*95&E$T-hi008$4rU^}!o8y?8 znifUiJa|AYD3}Z=HHXD0?U$^q{mW}%4f|CPkbCV^H&NgTB@K<9bYagw?k`wPAhvYq z1k8Yga62#L$nKwh1bv+f)FnsxU78J_lRH7dY#cJ+Ho(OCTnBi~sB##^)$&TGxaeQ0 z735SIFwFeySqNyRfMpO9z-?ts2pxjlrXo57W9s@y!_7WEz?flvArE&cl8hu^6d@ohZFU#Y*f%QYJ`jX z_3Kwqx*n2{1P_=QgHk+U&D(G0Xq>X%(<5!$e0|cjiAD?%wZ$EjkS+kPDK=z?STN7! zB>;Ha5sX)RGG)cc#I)3o16j_B6!}t9lL$zWF=rAnV7(k19CC^5?*Z2cLl`uVluw&{ zq^0j8T!&26d^p3vuBOnC+JVsOR>aDYa!VXhSh`(z&27=sM zR;+Jj3hWMaaQP4O0PK0hkMe*Zk0!*VcD6bNh2+G6ZWZUhN(nwoSPBGKa#vEr^${o7 zV%*eeP>A7fg@54EGgB?#w%&{4`yU8^PuasA{#%1DA>aW9loQqUyf4 z0SP4ql#m!{knSEtkdP7(1!;!v?rua{xR2iOjAm5 z;0K`kVBjRvconXQlpt#Vf&IhpT?aY?;Ge9=+}WI{Yd(9u0>V<~8-tx+tXOUgTs(DC zi*sY~A?z7ha`VPrrR;4Z#vgivAc_q+m)}lTTR4np>XGuH+*ZwrQA0h?Y#eCJHSlOG zc|Mrx0e6UL(8K)&*Q)66<_6t9wUgs3TTd)aTc3FP#YGd{foQ#gv{BmI1Z^(!6MX#W zHQN*Su6JxN)O0U@6&CI70S;dF13(^w>NjhHzakcN3k-nU{uJfrw#|Ry0cH8SIpJ|L zk)m~|L+|nOb^7Tb#wZDV!BGBUqqx3+Ax^(X%1(2hcYKt#;O!vzA(3&pWkC4hFD8~0 zE39cBZ9C9y2m_BN^GF|~Kc7MVsI1}ETrZ5&cP=s8H69);4E|pZd{j5qdDOww5?m;DAex*>QCCK9Q z0?P%v{hl#$8tY8xN8c75H8Gt;D00B$10wwGv2nNM)-j$fR`7<}@ZZOERIZ>rF0^_r z)`2=xL9>B&Vd_n<<`+4|EWG|w+IgdUcj(L~i2G(6w6T?oFX5uJLHjk9%!>^pMV^1T7gjjM*5Dr;(!5JDx=B65?xN1ZBB8yBZ43D~Cnn96H-MNvzQJ6vF%r+<*V~v9YL|LdWu%Sjpf_p4>1-w&pE3oCt7R~vB#XRLAWC`iX};( zhwHQ=_jAgplWFopDhoa4Yzw}j*y|4DE)nACh^ZGiAq2e3c)MNk(AYPYc)DVFru;e% zI%?f;QZcn%OZ8GkLe`+<>O!$Z$=^yMP_!s97i?Qki#@nJ_}GE{3=O68Hdo>yFKTM! z;yzFAY450**506Y(WbPHOTV~YElKtzRJ7+KUV^fPwTBTgI>c4$v$`qb>BK#~9!CX$ zu{qPk-L?~JHo@Y9&a)0>4vmsodJZ>d6g!B&D1HSjTDQ zayqCwYlC=7#So=LFOvdv;qnsoZ=!az?LVb<%7=C2uo?y{368x{Sj&*1<^0NfI8~Uk zx&v|cM=2I2D{`!4v7j22XdmAo0ni6g4;gOb>k>7`SFgTgFmRU9w7e?GI zu}|2OZ5`n1AfmZ3^}{sd1GlU@2fu4~cyizwon?x}zAY;>Q;u%CTDO=RK3AF+B>W7Q zY^e8_rVQm9ID)A8fC@2nBI6~5=Ms*R$gbGM#~l#wqcL7TP+lCpj`t%LBHO|Tj)b9M z^}Mh=z7dJ*Io_6=i7kI9E$OjOruT`?&6`C-jJf$t3w;L9l1i{M{AA``talYU|NE6p z9q~8v!ci`fpZH8->t+JnJ|)h(nN5=&BuDvoI3%5X4nLe>4$IVSn$d8H@_vA?l= znJ9~g?%)3yuocL{0-N0LutIX}n|^ZgOV1}u114kn;@%(&(+P5XxmImIi!Suzm}*0+ zWZ^d@13I0~Q}}P*yb*X;5@v)Deu$Tm;{3VES50Zt{`3>-=v_@%wF_uvnBm&h<5q>B zGwEn=fc|WRd~m&54!--k;NtevhHg0FjAUT8ZCV1;D_5AOy&&D zp5D#(W%d))D?@d6MN$6JCY+l`bsE1Og?}jfp~nwhoEgl?jSHjLX=~sOfD)G5UIvK3 zQsu7tY0JQ2RF_A*mY3H=lPt2$*62f3KWOhKXR@vh?~iO`9g>zM*~GLr4wbtBBU?BTKc37gJy zGd8$3?!3}oYgk5)OK%4XH;Wn@%8l$%%;E^^a*S2U!|f5JmIf#9>#8`zlk}Xqg{a7e zszjWx2}9wQSNKomj-w!{mWQ!WJwa=+>3!WdSM7rn29#t<$Lh8e1N08ufl*-$>wXvK zQe=JMa7w{K>78G&1Y&pHbN6``s8Bz(yJn(Ce6fJI~)bQ^+;aY zs6xEF+%AX-N@;ky0KZM^B{N3k`2xQK%XU*rTb{?{QqK_m+>@}?ySgQ=qHXy4&o~j2 zM=`4qJ4u(XiF`{A#xY-_$%g%fJPk0Jy-5*gUQx38Gv5WDfMcZ>VjU+37bFe7gcnq- z3wRkD5Enl;l8;^mIWDI+e%XT)4 zXv8!HttAE12-?brF*uL&Si95WZ60uIoHP@~YTh**)!ANBWH-cil@S#d5N-%RU+g&+ zTT>>`XIS=I+bFMj?LRF4C&b+5Wi>hFLv8$L<>&j`2MR5i;eA6?2-7hyYkOTQ;IUd{ zxv`4xk*}G-Chxe+xGrcD?)q$Ha9F7_fGe$?s#6^DU3`|oCBel4{TF*3)eFBLN_0Ge zE<=+mu$o_Nj+tq#-=HX&_$ORxhic5I+VXe_4bM4DR3;Rq-fhhi>wH0q)-HSs6}6r^{cj6IN%#2w{M-fojE`b+)htnI zA4GKz7<=hVLhx9QXa}r6v|~-nCJ7^#HwD5n&t(-0zDwwcsVr)~$H6n_&)NC4TVF zxWfNuTu~g_+@auOzRl6cC+<6%ywZx9W092xO~yX1KHE90zshkNf!xAXdz{7BPG7U6f@pX5OFxQ` ziz4fFKI4fm7%LgtWX;NMShkneL?JecxiV#=ETFxy6K3A*BDfzXn(VKJoY!icEU^$- zTe~*S3m{y5WjeLz!)(V4TZpVWW>@+M@I7nX?9t^8s{Iy2im|B=KECPv5?L8qBy95} zA27NH8Z{&V-Uj9^Exe^X~*-1*?-e)jj|Y7 zx%T9NYqwh^5-0|6l<{UGYt-nOkCNwR5Iu7RT4|D&?*xkq`!rnp6#Cstu|5i1r?E7x zx*Ln8D2UevWJ@QO+D|;2ELd#M*;M(MSvr%f`jn0CR)ZKUM;;|gVYp$6H;KYiBnP*k zskchwwd5N+ax33kU8qk$Vb{}r+3AJTQXL<-Syi$ECfnd5o>|Q7Y{jwm1QpY5YJ=2s z2o{q|D!8S^0PY%TGe|SI+a+6c(5qdaT8!nToQVq7b`Yz~rp^er=Rt?>EB7I7s zQ9WSLVUBzw&Gf>0j~CvlhN{=;{Q59wmRcLAX8H{WoH7AL<18L)Z2tx8qAgGQ(xAJ( zQT_vhPP#^V>B%yl%vN@D1C})Uvd`>{mwu7~rRBx%StO7>YjDwn6BZ~0*C=pA(yk%I zbiQu(B6h42ZABkLh(UvkIb}E6pp70E-OwMU>0lgPiX!OENg>{d!$zKs%K6i7%^b}!3Mg=_|miA zj~o&8?-wJnRWhAghFvK=%$eliQ=4Z6atvM;%m+;5thCh}wwc8oiS-7}B7W-9x9L2B zJ5zJ4R0k8VrIw>E!8IW-y)y2zNyWhWoGa+sLAQkjoAKZJzU(38{~{^}aumG*i^744!Qcl1seN1B=2Kv+|5wXW6! zb9&y-ea|5-ECNYOBU>ybB-bo@7ZH7J`a*;4xjQZs!fBC3<=SOKkN-i3g^Uj^hD+Zj zbULhjTH38G7*MxOnc~*U{GAD42Dz~^+spp;J4@0YPQ8qzmNJapC6~DL1aY0{DMBMO z!v*e;&o}fIQXW|9b*4|*#DMTEc32>Mt~c#^wKS!{ z4ReCID<>CuF6M+ajy)4Mfz0GiHJf%qpYIgm_l!l=_B{^qF9XxRY`%B2u`rZ=#!T6> ze%^&;D=HRZr%BPSknGFbD&5mEzjk1&yn<0K8fJty*W=;IRC}4+Z@>1KUpUB!LcMsp zdi8@mNwvt9N5KXe*Yt6sWPyT-jxf>D9EiWao{zBFl}R>rv!pX#;fgTqiD4(7*yLMb zXI126?jmXvbCJ@K^_pV`CdOkwx`faDYsMCwn){laWdn+_d^O#Q^%?$~t6^jo$i=Dt zR&D}OR~%8Y1|6Wd2UE7zQJkvD?r2YTS@pJe&1!PgnJ#TXRsHh?NejsjdV>I*xZADY zHJe4g9XCRVsJ#SOB{(jiP{Gr>l~GUWGsVS_CB zH&~9g#)BPUAALH`<$bLxeS%xr2p@O$Ja2q~w94g#5QAIliS6y(E|txAlAZd1qKFYCtf+Yt zshM1@nvbKyqT96&DHGth*o>xnMf+wwx;Z~WJtkUPy16axz8i5?`Ifp{-42{mM(!4s zUFHdYrge8^k(AW`?OsQ!w>=?fRz?d-(RZO6bJV3EP+izkS?K*CFn;>dOazFm?3De^ zsxHZSI67i8DxYj35@S6$qIfa<9%9Iy5rtN?0<<~Jxw+SlxhoJI>x_Gz-@K-?R+{Hz2^{Ax=9-+KIgIN8_DCatQPI= zWw=kTkqd~jEl%sIq4PLIp1hnPzbuy3R=4G!Elt7~>uy=aIQjCL{G)>|USR#xnn{z` z3R;ZK?Q>CT`&|}F4|{wj!a;)iba4CZ{h(p;0mklN{W?r89^6vv$wqiLhvvH~##bU- zm@g)&><9OuT*>KjQGP{oq;wa-8rD{KK`vTcRhLk#_+F3W*_K$giP-6|>;CZD-wDL; zn+Zz*XgYII7q?j0Q;g*eQe5h^FmQ(!;LZW>o#yg8AgpkIgTXe5G(e^{&%@^q1<;&s z0AjwmKBNWY%*b_i+nKICL&S*vG8 z52&I|4hxXZ%h7v^JNGyyY&ePV`Bs)XMxe5e@+U;NlHI;dlJ-Zx>oYM9i-kvgg*uX+ z%;Lor(r87*lm@d9XbReH%=g{tuFtgQZ%LN#FyBOiS}#YaL`-(h6FuvL#t%T9L+`|3}?QJJwKX#jwo2+aD(4VULBLC>7wK!qLc414DRbfFP;n9^mHAlF8$h? zJYIjL>SwWMV0`P2W!>PoM*a1lpZz<-Gw22@e!oV&<`Q#uzfh1_NF3~S$Gs++{8(fO zt>#pSz~@Z5>c)~F<}6jD_%^Iy-cO>i`Zj4|=q^$L_=yjjFVWdT%kqa2>wNp_?Ob%Z z=-r>tl#PMsirgwi;BrrJoN-GP8Jzo*F{HmTBp`}-JCr*_9coI+Z^XD1A1)^`e4Qz) z$^_n^yGjmL1cq2a!WU!Tf*@}!M&Zoc3Lu&H=m;ZdRP22nijpVF~AKb>rU~spV zwqYyJqR0AKu$tBMI`y~zEr!qlkz8xPD}iyBfm)NMVAS?Hvpx87>XFFA*&-fEn3b(C z$fS&WlTSDqREuPLAQl(`ugl53-)<8SyLy6XdZXX`_FLz4Sj3~o4a@wSr>^G*EtjvE zbY6v(=?n(uOBrkz`DCR`lJh;5gATc*e7`rp@P5u&IPewsvDB`MbxWPKw%42`@gQbN zC1TlxHUG}Nk)@;S<+p+n`5JSc1VxG_l%Z=V8bJO~$s1z*#bxPYawJBo6Q1+jHlH41 zMzWA-9L&7o8>|UW+5>M1MxIjmJl{E0RMFLv+L`k(t@&(;M8zLrI9p7~&|_^T`usGr zxzwB#YjTZ8BYe{Inc`{jimaQd0F?Mvc$ME9C%C2E$~`1T2&jHkkKi+4X@3zUKf^D?BK) zR!RC@h(qJ-Qqk@}?di12nL`xxuGxp3Z0aYgSIr5xtQTusL{L|X7M|a2={$FGAVZFx z1=GM{eCt4z;mSG2W6Ekj3Pk4fqoZ8e0WoDw>28Hp8JVjGb~Mj&GBy_y_LL7Au}IpE zqY?lbbZrQROc-5Tz}Oh`q)w}z1B_JnIJ~4)3>puGHZYI^Pc6P1Im9`1d#dd%gC`H zs{MlfEV7c`@pzAlSDzG(VXiu#(~(vg5lO>kKs!m6`iOq$N?`S5`RwwL54XXW`)+5` z6Flgd(UBd-9p+PR*NnCFeYZSHCY>6Xu^HndweK7bi|XB5P#~KC4H}6?$C^A$S^fsL*S*6r z!$0{o@qz?LLv7g8jtYo;WSLyKrEwz@{Y2tlryN* zMNGzXA#B4!NYe$^vm?7pOu^o}?XY6^kh9l)63-R-lXdRbe&aR9Iy8avyfIhCg8UHW zLhg^kfqrMD9(&OZB1QjfRY@j(C zqQ0hFC=jbzq*KvyT)>hax7qa^b-!ufa5crrko+g=kaW9JDi$eoDB0*myWcdZ4B}?P z$_84x4Al^83O|K*5^{TsoO2S%iwXnmu58rz5r@i+%yAd|`8nf!ktwamvH|&gBm(sd zj0=Q@qM{M9HkA3^l!vxlStN#aw@M{UxKP&@JwiJdBVUDfW_au1ov`_QsC9Kn$^oYt7i5SFAH z-E!!mwu-Kf?4${pab9+%Kj^ei=S_ceC&u<{)d^7!$K9{AJP+iDq+A&_(tDD)+Yv{O zoM@MV*@ZnVml{Mpndx)uQ;!T)dOg~;#*%A)y=Jp{_P;s}>JJ3JH5EzU>83{G^_09% zvCvN;x4;5^m2P($w4&`OUQgQZtsxK!&f}ZF#ydz&cry=M#(-R|USTG01eucMI6!J$ zR5c_=yOEy0I9H5qmF5!&WU$~o5i7uTeZbn@Fv}>3RjEh8pRuLpKziRQJ@A=m-*;$= zOSDqx3lFM6YPCOWdGHjO>>Q{sqAjdqQDW`Jtld&D7_p{EKsZTId&$WXF*_u%V#l?j z^||nokQak(V?%<5O|jAYm(LSGk3T@`P!qEl^^ISR8Q^sux5Z2|%*mz;#$D_&ELDV$=c<-id1Q1G z?bv|?P((2ZPp*Gt!^CRxyc9uMUu%dHfWE~PE5+Fb1h1q-I-&WXVwc6UE}=Wl0!VP& z#i3TL%ZFEHlvoLCoZCO_aHQm2%;qk&vm2u|$PQBu+%wXQoLP|1BAWb{gD0o|0-hE-ehg3yk_GC^ml=}!XTlGp0$Yi=^7{IahZ&l9aY@^wacsE zd*SaUv~g*bgotgnf~+Cegj^m>SBs?1a#Qp9Zq*?ZHW&_{Kgd;p%)(a4vZDC1yg*=wskobsC+yR>EN8F3_A#)=jSYHq#=TG5?orX_A1O0-%=}nYGi{!z zOpcAcf|YHClD@mWFvabuq)|^L<~zecqjHfwRr9CA)(B*Sq^ zLMA_6sa_s#Wxdg&ijGg==+L4`pUK3sdZu0b{Nl$@GMTmFU3FpMv4d@GL#tv+PD_&h zitSZ1r^`{_<@VY92j=&W>=)-|9QUU3a7tmR&5`#ABEcaADtAer&jUfOcW<za?VlY0824Xl9~wv=;a zxBUq4X#bP`v%uM~!pl})8$1oSGyfSjD`60t+ohA=QNuZrw2Z{W_#Ef*rhs;3sH4p7 zR~NHR=l?KRpyp====^5?h#Qw&RvrerXjXoi40)g#3t~85hzU$iL4Tt&L^+z_{n)}2 z*V>00!=f6AMdIV52gpU+YW%HZ2dnZ8xgwc&mCm0uAs5}VF^R0t95L`W6cgO_@X+EX z#1NEWRx&hMUnu&|nN;D}LOohi8#W4gYe0IMgwY?W9o2}0+y${g#m ztv`SA9VA0lU9p;o^49yS&KwS@gke6D#nTg|uD5aQ?qZ7pBmdCiv6Z>jk7c=BKV<+sn{_ev+GPX(zZizW<{LU#Prm58{=Xi~MW`^7ObIL(HI26BvPaOJqa zC0ev|GhV(Pzc_hE4lAe7=kz1-Ku4m$bL)En$I&bl@rPW;L{c>0vl`|4DQXp!Mgh^i z{{T2B`&*REn+u$tOSLhI#HU5HmlDGHold*WCU-h6qAh-VX2MH(FR##07?3^HrpB}y zM4OasnKK{G&m^d!JhC?Wbof#9!6Uwx$)I|ld!k|xhojxx?d_cV9*K;tFs?~`4nGz8 zj=w#At=|8))9W$-s`#V*;QLMclg=3xu}pml7!EzXZ3PdhZzO!4#%1RAA797V0wTH zw=N(%o_)E2J$U>ntPQFt5rm!)iz9fAz@SQ1o6hDiUJ8;NYq|O za`1mu$p94t2Atne`;J_vZwsoLmlL@s82LF}E^J3e%Hw-_5@(-n{RiHZDQ(Bk8=HHg zP4ZKopr6l1K6-!qfo1^DZ+9qj*u>n|NNjx;B2Ui%;o4LGROxmn+I~M5kWGn>-4G`0 z6QzbvL6R`*AW#~|l1=g3*%Efg#;dTIT{5S-CwNHy;A?%Es1-)qZOZD?2{GNLGEr5N zFRjHBtBi6l7{zcZI8&xHm1W(Wo?Bu6B1?z;up&OZ&CB#civRKf#VX>H*j|32oMc^B z+SWt#QyhA4*{c7FEn}QturZmuT;wC3CycQ^oZn}ADLLCSp6bmjn0inw;Oyk+Xz{$o z@9b5N18KY~Za+V65ygnQ^K=ljkm5$#_NkLKZL!(Q`7LFe5qzypf-=%8ND*lrTufX% zE59w|q1gdX3o8d+0a=6g26)nW4w?LxY(Hg#`?M9-V^}3OSH?X^w901f!Hrmkr2V=R zY!|8F3*8^B!XkNFje9Ty*{c(qmxk{U#OymP)^Mn7D4;%z-1(a>z>nGJVDH&jZFoJe z9URId@mqqvZ9cRVE5ITxpERjt|CzV!qHO!s7!`s<@d?w7D71L6H~7}myo_B zCM7Pe*>c569#pi$hpRUpx?I^}4Jbi9sUSpN5gawLRn$rzLt9qgN}GCg{(lce#bVbr z%(K2&LUe@M-tV{g8J>26&E)q?d&~CvTn~T8Dh@VNS4IUF^;hCcGSogW1^7`)C*jH1 zj>ENcEO0JU-*V>tLo+!CTNmeX(@f53>2cImY4zKWiexPpoTG`wH1G!U(M8wv@m3qM z0%0=e16NC4@l1vg4Tq@}k@-fIdLQjR|AM@2f6h~SdssKUMaB6~F+Xny(wztwuI-#1 zxL`xvxSCa9c&ci&-h3*vlCyEoV_vFhy%9Y@m#3U>ZGJSi!=KuCz-i>;+D#eH0X3)XefsT5V{I_fS zcx=cx&Q?>wR!z3$I5|){H@fj!vd?cqmY9sVgTr}5`pYFU%0mxV^bxB`47SU>@%H-JHf&CIKJ5BDsma^iZp{bV2gIH}VHP$&j2G9SK6Y#FGlke9#1N5Pm^S zOJ>`@_OPUw|H3g5ol`AQOp>sV%wIoy@5R8V-t-tw)5rJ|H!xy3>M>$02Y&g?!@Kx= zlUq89hwvM&@$4yQ61Lh|-K0pzDSs5t{p@vQG}wj8EF>RPqry_j~ZVnOlVI4b};_?}` zm6{hKkvmu*dC;ushJrBhm~Om&Xms|fG+LQk#>c=lPC1)+JesNC(_F_Ev9roXaeJ*X zE`O5=m3_ZVzgIKdZh5+qa7y;8$#bfADw93Y{Q^672}<*A7yMeT`2k0%Vt@;KC}1gp zKE}QTBEPp}(Bztmy;_K=i%C@_l)<(kZ%5bjTEWZqBx)n3ajcFTtE0&tlnB2ASYojod>u~adj?KV`!Q_*BKK? z5VON*@!eiPRXNs@Z1TeP?CN&C635+8qCda0Q^z=K-MW4@wJ$RI!6^1jL!o;%b8B-Y zOsGq*$zra|0Vaq=x;G=y`rVm2}5Py<6zXFPG6+@#=$~XR_e_muhrHXub;^v zC2bY5ox-791Y5pEJf)>p`29qWW0MaBi+N>=A2m_&Hd&+E zXpB(W0|(~JtwbWL??*7KBI1DV7<+uk>N!pA(7RkWjx!oqW1b#Ad_c;g=$urxb*0DE zhdX3^Ozrw?>k#_>d6mig=;h3w(=)c-8?Z=FayzkcmDb$tP~1s>_l9%^IyU|J1WsW6 z;gj;ogI|;sI16#ow)HNk(#-LJH^YO+i3Fj~##_-PIv)$_v6{U`0>hxkGK*+|=sPJwCQQ z7^J?N(rD)|SL=@MDfmdL%U|gHKpW4=xzLyJPC96?KlKc(> zonWF}B^INu4b!|wUN+|{l#_sFFeg{TtGZ_&@Yo=hKe_D0oBdo4Ze zV)jboeAl!uMh=tTnm(&*WQFI`dVNG4JMnypG{P)q)TXUA;&f6o2cn zf8Z76Ln?IYpP^Z&G_XjPwVcwR{fk}_tlLEllp_JSO!29#XnC(+CE+Ol&u(%rqV2M^F8xD@i!&3vyohVWs$ z@T2qXs9G#8Zb)W}IuLHS?}y|Oy*zx5RVALlCj4!LCy7J#x(bKVw1uw(J~)rBy_m2E zsk5WaAsf0C044?Cvr?x`OIB3W+PQb*1F0uzNSFry_=lgyMnmUUR9L0x?Kx{d2XlSu zrdzh;to?ou+YY%}^sqUbshsA+7zcQT9P8COW7G>SAQWJ=CIBqLNU6BDdwjzq^ z0wtb_n)*W#vRAvc1hSsK;Y6( zdy|MItCJ~hy-bOT=@Oe7FS`Q6sJ&dSeDd!7p3yUeK=}UXRSpms>yP8P!;2^WXOt4*oW}-*kq| z=F-My7@1AWczLn{wqKHT1jF`3wLpzMm;QhiO=3f|#TA57{Y=;PrOO8z>JQWr|Khe7 z<_-Y8-kVi~1CS~?4{-2#oq}ym`j-!T*%!=q_j@E6aq+IVdf2(N9$a?|sq_C@mF|ESG{;N#=1QH5 zL(_EsmO@F+%Kpdt(~1-l;;J_8HOAitfBe&w79apUD;~LS9?Q1~(ETGc_%U(=T^`|p z6|C(!2$$<){1aQ~p`Si7t6KzDPp&`Rmijlakj(!EW&>6_RG}@0@A4KflSgu8wSX1< z;zkI~;=(tJ05JaFV{Zqhd_|mR87urpv;>;#0DP@KqN@08m_G^l!vB%Iy3u}Yr>uWE z74t!yi1{4s1MIGB-g}Sp%z15p8R$4_1MpuiT{Ev^lj|;l2!dr`dSTuuRO<+cFzUA! z+5fKE+6r)DN)hAY<-QBjZ-uzG@dg;Cq3B91#Z{8cJJDbmDmc^wxamLu(*4v1fNu(I z{?ViIIRnz$djUp6(?{@ityC z;0FF&-E_cNSX#=B4ihdlJ9!6=E~LQYX`h_;$en*vP$Q-EHuj3g}6Q1?eKcPT9=-(@*FZAE)u}unW zMffnu{kIz&kocsjT(|=!~))xOOdEIV&Uu`%XzR{RVpLy304FC_vyjJ|**#o^+ z^Zu4)hH5>p#v?<02}nGk;QkL;%~t*IbG-*w=*<6zjVS&-XdVcc=E39rz{LL#O&etj z1|r+FS67=eKF4AU45u7u|@cX zIUq8uqD_Tcz#a`kuK~GadYsru1;$rq^t?eI;icS5Nh&BHcBH@`m z^b;%nq|fu(1052;COhVilaX;0Wki@4K2Q~k!5}d2Uh`zN%pEGOc)lc zik1x)NjTI8-n~#KSY#I~c5)6~6u(Kbm0H9foDM<*ZsfIzqN8NFesO5`<-0rC7jdnv z$vo^41)ju|?1874eyY}K2PV-XRy-2>GC5xxG9`$=5PvY{I#QyKJJWEP8cj;{e?5V0 z!_HjF>@dA2)ZOAwu0pTLaV08{k@-5d90~_^7T7nrh(96@^llIFFRXncpk0%uNN&?l zeTU-$J$GbHRa$Y!81!P(QpC_W0PV(p>ctw9O#{vWpFE!!q4r7q;xLm!NFm-^ANHG@ zT8jjhqq#CUGNd>+sF;>@ci_MG+Q4Q|N?Yr%HX`rWRLuIV6s*90?+(iD9=izWg2&IB(d(^&+-rqAv^wt)2~2?A+1i$KRa`15jV! zmHh}e0Utd!jSjg5--;#k^E0C8#yX^8PHgzkXtu)kxJ0RAxnJ4FP$8ek0TI~7Q=| zTB$$k)E0ZrVe%3A9SxG?oN2xkUk=JIZ}7J%BXCo7`CxYhwb3F$0<>(U6ktt2muA^k z><sD`D`Ka%w%r}NWe3(kHWGz+~A4bsiylZbBqLvlq8r3485+-^{Hsf7`y=lj; z*RGn>A|-J~oQD3H`b8`3utpc!J)a`i0_I=Wp=sH$wItk|ex-S#CA!{u^qwfv%ewbg zN`5MYkaHx`>80?8Vcyd=k;k?GF=+UaOYp=*MtZLlv2A61cj(eNh0^cGN-{g;uVBfE z+tQBFr}Vf^40N91#!^$8HG0gnCGb}*Q3Y=Oa+W_}H(hPsgS#Rqouk#ZIva}3pY?Nx zP-GXg=VJKUJ;rY;F+jPPm7UZ?bG0cYXF2;NFct3%Dj`$cKS68(Yg$t8B)!I!(l5so8W!%wfRTt*v(V8v7ijaQ9gd0#1jQWadqszMXlHG zOm7zxRS%)2IZe^w@ONWlop=#cG%ioik&&$Vz)vMS^#@`a1QwHCpOUFXeg3ZUkU6wX zblVI{+!B$dd^TNwH)*B?~dcjG$NALs~%Z*@4S@_3x6CTHlXex%K( zwh!G#6BtY86^HfS?*BksTbr(%xAIPGH<< z*>teu-+}Stmc*PIjDzK`0am+57K0(jd4;9q|10Ii4^dd{z9`q|qYO~{#sIta`jW%cjrt=g=}&Za2# z-`R2w zWUp_fXBtCaRW+1C?W}f`X8b+Hp+AEM5hVA=D&NOYo!D2chRpOLy9+6u{tRQ?+O8nZ z2VkQ&q|Zh*SPrs2yu=5|=ln72M;+}(k#sZ3eK%%f zOtgug_bBTd3fhYnUiPy0TY>%vzhpK(0LTGX;=|RSB;VRbWo~E_Pv!ZQ9mrfTJ?si( zySCB#+Bl~_N6(G62u&YRf?0#qrl58qj5UGfm5`Tb=yk;+9ai~xU7Od@(vt*g%7ayKOPCTCuZ{@u{#iuG2>Y; zVc?D#zv23<|H#rim#rHIw><99Sgcp-GyO!Z|5MG?(z|c&x&aY^uz+lsu^C6+Bzelq znvnrL51|YM#qRlBDQPn~{%iR_j04Ru!`%mCNhAh2e9vNb*`M=LQSj66GK2Lb6r$xg zs-zPkoHe9etceAQ?^n~(UM3+kIxpF}W$9u+8k)(Mq9c@_4pdK23f)sDBQ0!aPio(} z=03DkVwivYYFdIRyZ&)V;hiN>SGqu&Q6P3DfivlV%pWQ?^=8OF-4h)2Go*mlYo)mq zOtHBtt41-x+v}i_zK#ApA}OTxqX?#B{p!4{DlI3!AKVpSWe?Nv#7;}oXoCIv!sZAh zf+1?maA7|CUh$oiTGtz@X`Oy5lcFEzOz?DPgIsIc@AX$M+B28lk4T64YxuV2(>76m z!?T;s;nn6u-mi-GEq{{uTj@*1`4Wq)84EGCh3<_^=X?*0c>j$-U1ol>HKvKoTR-0o z<;0381%i#$W`Lwr8?u_~dp^jP-V{?H(TpTq+Qh-@Hp|1A5;{|BSWEtdTTNDNf(rI|Rx68xY88q6vIdzy4{bR&i+5{a1+{G7D`Eew|!o*P{ulje? zrnSqHDyG9$XO83#5XfZoQv>$O@88GQV1%4*P0RjyAlE(tCtm}v)>KBBW49jBmrX)@ zKE}zZ1UBTU!VV11o?++!miN~P4@K@fr4LT^)yBR!*FPiCiuXkUm{5;g=u=7l+;mO2 z&?39qZ?$HDN(dvnm<{h*MXs~8Qa`ZkRYbnyvL{wFce_OT8sZnM`a07-4$6`|ex~uH zrq?u9%;nHSbe(s(ggbp3ky~A#)uLXU*e=<>?owMji-BhdaQpsYw7*2?Y)G9_niYW^0HolAnEpSW5%t;M z(}8NUQ3(YnA_ci|5R;Bo3f=^<-?{`upmome9h`_cB7Y^utaa`d72C zIxJvfcEH5e(nzg43CvLwiHCGC?I3%-N!3^6^t*C=k3Hm0l*n+Xl7fRLye3`Kv+pcf zj^_F}aLe#-Eor~MQaG)d4K0O{7k8K9?(S0D-MzR&ae}+MCb+x1yxe===btZGE6Inm@|!bf&)zfp z0F2U;kI3G(>S}pI_e8i7?!vJH$-@bpp8P`oCGUn?|0`!4!&zd&NkQFcHIH&5vl^Fj%e@ENSH4xN4HKHU8Zf{tQ^*|W* z(6e(^D4XQkaX>{?KmUA8^+`sIo1g4Zd)3NErBN@ln|sdwBwMMzwgd^d^v_Rn=B z6WjMEivZJ5x%C#F^n7!UJC+d-@yCldJ|N2PyGF2kHp3BQM%8*sr&qnMzUCQvd4(kel)BbQ$7VyPnWn zm-R>(5rU(hXHV1i!w5K|cKd}d5TR{{H{Knv6$SW!OX;|Sqa@TQyiM5s_)YmB&U{ae z7Df01dEq+;g3=`#Pb@4CRH;dvFPXJ(bRl?U=`0_L{T zKtvUi)o~#6X;)Uk46Zf?PqBL}-WDpRA#J+w*kd#{#O))7QCQegkanjVa^-Mxa@|#H z39X-e&es8Lq1hBG+-mo(n16KGX1$DVTH-rQi62Me|NFPkewzP?Ra3mf$DD%#$f+}B z?Q9K|)xO2_z7bSeTL}?kQqz~eS5$Vp)wz)9l|IX*)^|MIn{VH^-Iji+~&w1@ve)&Er>kC4x;eg|N=L4*^)c0h{A zhJw;(3|2Gu{d^0H)ACH9Gw2iICVrOB4pL9SaGuiFPaq2V!V8}S%=9O3#aSTXR?)73 zpmvJj$nIKS9g}-%&FXX3z53-yIdxcv8{Esc`3;`7oh+N{>w#x#96tWQvZ3iF??u%m3z~M}6d}qaWpt|Q)(#=8u;1mQ%1$cG+S<#l`t=31Bl3#@dA8i_7 zThEa>H$%c-(%vQUx!165lB2fK_d+3%*%fh>fwr%SrS{c!x){|1K0&n{L*?}V$~!N2 z-mJN*pG}hZq%z}WY#VCYdU8_|cTT{t|2 zRwP%|+!CjFAAGsY{D~mO)6BE?s--ldgdL!-ZtCs1c+;By8UB;DVelFKe%%+oi*>aB zFIyJhWYK0CPv3JSVqC&#YO)V=DzqX)V*l|a(d;3{@+Ny;u zx<*B;*Yv{g*0n7>OPYiHgldHBu_IAb1Q2oVDb|`M_n)gP75@OBMbVuOz7VX~5?m;A z-0jS#EaF;Mw(a;>d8!V*{3b}*_`Di@HImPdYn_=s#dGc~<5@Mkr@h1VFv#pN)+rGYxF*2`hkIOcIyX6xw52h1^|-Y6&E|J`|p(3vVvW$A1rF8bOHD~lk#WSeLQQsdyz{--S0BKK{Ku2mymWs@N0_f z;^M)&QX>+WmYW|CewIU2L^2{pTximXsZ1ViJ$jcig0j$ zhJgWte!%@>G_Blc9KE1c;DTf+ef-gnZ}Kl3mS{JlX)ueRcib%vOV7>|oDv3IVERJ*|IY zt+zHBZpgVYwZ5-?CFi1G97SB3oz{twTThbA&5L!XufA3`jMBt};TPWGf5biGCw=JH z%C|*w6)&ObmY0kc`VNom(~|NO%txc~Dxufvwi#S;L8e}JB1YtKiYX|tGAdpYTTkwU z#wYlB61Q==?+*H#Hu3Z~{S{--Y7fdAT2~(S>QSxzm>8g79NA^cN1$nWSUmqG`3C{g zC|3(}-t*O;G9t~j+6^}Q#2p5f$cX&)_;a$;0%+!hjtgHcAQ1Lu4xxC!+t|?abDP+3 z7$8Krw5a(T1r%lz1(moV+w+2~qaWm9yCBu}=jM&o`B&gN{JPJ6c$@#jF@9RoCE1i5 zZeQa>WtX@1S=h`&kf%RAq`#!%q z_T@c*JmmmufR(nxZq5dvpV0LSu1j{cd)?0eT9+X`eca~bLTpgimB&s$|_89$_zpEDR zWt4CiQMWr#ot0)eCBRA>)IgfAcIspl-deT(Ey!@#{f3*RuFQC^Bryxcpq~J(uY6vk zLq3?TVp_xH{MjrctM}TQt6`Db!FHk>E{$pkRq3tcstMAO!1OD6f(D?t!Zw!L#_HSAB(NmMIFk(*M}3yaq+NBobRh0nhe9v+rzG#o?`z}0H1btGM_CzCRItNVpq{$*1-ay zb;r7`0`sovkuj4OW$jM+MDN+IfULXnKD{Jua^kb*9nV= zE}n@qE*&lX`ch4!Y4g*W+g859ur|RU73^iAXwu5`t`*#9@$RrXiJdpTnJZ*eys>NS z?0?vd3g*b$AIu?xvo*!&tLBx*Cl|l|SPV?)s`qWc$ZHJ1XquV|B>!CO{Nfl{&bt-; z)>|u-DLKowSbp688DZD+I@8*0$xf+{jt~_M6(Wj#E;3qI#2uV<>6dj{(-RMuVWlW!_B*df1gSm+ng=0GkwO;Kso{dJZ<2;9f6FuZ7lAjA`KooY;N zg$uKha#&Mdg5Ye=rs{is+nm!`JAIZr%LCu1aGCGB*{1_r^>4Ub?M1(6BM++D_tt>p^t!^$9+Bi$Ajz}Wv*)P1A4~+0 zO%s`bZ)p|=kC{Zr6w;6 zom1_LVOJ{`LkG0|D?u^RLnRqAlnx#kLrd=tF_)ocqbT@j19#KNp+_SZuxw=}x`G$od} z(c8Uxs#${W>4Z4ZNPWO*j;X=kQzNp$fgTIqW7<~x0(%8VqIs1d6Yz%GvUdc<)B)jzrJMo&81&&fN;P zn*7<#!FuJL;;F&RmL|sH6yJ=nEbTc{CuTy{nPW+ zF!j*T#i@;GaGMkY&Lk{+D4O8go-0q?HJN{m29OYXN)maW0V>@f&%9t+3!Uk}b)pxk zKtj$?*QV1(X|I;lC&BB3`FQ5$vea-4p}@nD;e zG330{x^+FK9&-fHKaN$uG5b1WV`zOpk|Mr6)p+5sZ%dkOusQW>3!ME)48C+rTAEm5 zAw3YTi7`N9*D=1nbLoh_-X>PIkH6 zMgD|a9Da?hL~2)$q&>KWosY*(2K~?*lq;-^E*n)4V6tc z$eEH07a;Q~^t0>8@UG)eOS4$y?Y8$b02q0*ERMuR<5ALMkC#1@7r@>ov)zl9rzO_M zk3PQ_;k(e`SffaYqlg*)c_!2F#vK$UxKHa=s7UJ;42WRYOZw690^8fA@;7`Gj+#6*d^2hF*KT#=aWcI4ebFiH`E!7m}>h%)JujyeR=pzBhn< z2fnQdvGCn0F9Kd!Pu3mmOFe&o8oti}-=?ki<#9o~uV9bTD|K69DODSTF@37pL*PEP zJ@=6-<9=ibqpDpLEG2EqJkId+`W|^A-|>?}hkb2WPS&6NH9mMx>K#|EJU}X|pG*05yByAcT|v7H%@O?)Q=Qur zHC|Irbel80jmdfcaqo~&f3Lh1nukxG{`O)r4qLOnq~B9w2k50gX;^W{`}^F8ls6SO z1N8YY8uzUYUMdp{)p%ImvF6pfGvC}bsr)N)PamoAw2yqBTbWb-ERG-BPs#SO0rPc} zX>SgRsoq_dlP|)%aS8WnGm&C&HABb`Mt?|t&R5ECQk|eG_2$X7YZ4+p6P6^b-S30i z6y-$n#Ygon151^-GT3WIeb)eFWi|3{0P`Yk)oFnytZ*1xyF$EmMH{cPA+xDn=Y>9| zr!Q^$?i-U+{UACe2z1Ph4xh_47{sYc2PMRI(U>@WN6SP2fpkB0&mC__!1o@Pi@)nZ zUMmNH*tOMU7u_KNd4SBNGx=u(N^kg8MTXL|5^pW8csyQiR}oQ;ACxW2TBr&=M4Rs9 zVB;!(H1z2AbT-dQYPY9n>FRG+J!op59Crd;-4NMwBldFe@v&B}oIIblt0-S>pP;W@ zQ#XsyjPygqfJ1*DxeFw+#;_NnAYs7w{6FaL&lv;u7q@L}r_fO9od;k$dVJuXdm0g~ z&Rnj1rPi;pHR|tm1)u7#7I2REwuy=dgvQ3(Ypi~?E_`J@Cmxtv^Fehcwi5J8w_+nU zI&R2(D(Ki}_Gx9bg;{6pFJmyj8Pw|& zzrZUv>rb#99N&*Cs)Cnhdk;Ua+=ViWKV}Cv3uS|;OR2xm4bw7F#{@oBe=;5b#dT|_ zmOnY%KP`XC^FQwr{r8;IN&jb)O@;t_83lexxM(=DTR}HXk$ZH%JDn48WoW~wx(VY| zn{A`ZH+g4`D%}$=>*GV}eLQ$hdC+rfu^BE;hn}ERn+$e{S@W&hdu~S*5L#>9Vhaj9 zOVsD$gY0#+Hb@sIeAD_LVmOzF)Z21xEZArsjXBw%2@F31jyY6o=xkQ&Rx=8$_lNpF zxuZhbL?29o(T)D?R~zfh`Y0C!Jm|>$K3mc-5!FJEH%x9{FYKm{aDMv>km&2JgpNKN zol9Oc?v1tV)Te2f;@{l2Q2gwsThtfnfSe^|&5wsrE*3x2FDtoR*{dt+ZNw7$z62N6 z+W~))DOPIiP)$AMeFxqlUMfynb3P<>#!fU{&NLNO;5qJc)~DJ$VmU4BE)_kyd)hX* zA7dX(Z=NHlaeZXx#w=4dB+9&mUW94{X9H{~Ogn+*0_LTUz#e+Gi-W^$j7pEI@hOYv z3^OK=q&Mny626heOTnZ5lS9U;c00>#!O?sOi5})S?TQcUzwK|9dUFt}U3TYs3=`73 z@vT-X`YVTU-YNv^-|r*&>^mNCYHGBn^L%1E-?+Q7awlf?P45MDN8eGn>OQ8BT^SzH z=}UBK;sFbm;%DD{9)#UeKgDB9+QYNTPI7VkAktib@8*qjjvjMJbXR*~=h*r%`>F6ApQ2<8W=+p$=%qP&>MFQKK%OXQ(s8yzi4?s{~)e9G(;{7*H ze`;+U`wo9zyBFJJDS>?pdN%Rli{AQ#Z|VURP@;n6v3kN<@URO0+%Bivhy3{X+SBUC zQ*n)Mbj`YF;K&W+ zJpGbedpj5!Ppk}j`c*?n;X57j?)7s4?&~YHNXy=k+tu)^Sf%&NTu31_-DXG3iIKDUn;aW)C@c0&2^rq&`5d-cZK>}j&UC2ups3?R%Z!d6lFF%P@W6$$ z;WvSl$oT(1v z%GNCYp0E=_Yn*}i;lE_9jwfw-w zfDf7#CqGTh%X@<1Dxv6p&VqMX9pcb+?_ig^zAGnpLcYp{d#mh=Zu;>w5c4Jy-YvO! zZ23bGSf1g<$++Bj@x3a4`b5FTB2>rs{K9l@6V8U*vr8ru zE3OjFHWwiw-+Nu(*VA@Fcz2jv%ZIELvee{^JU8Ku&CfPpQw)Ppq{v^Z*&G)qdiS08 zU_xzg2mIOf>914TQNr4o2GM&D^m?X8cE?aAZx_bv^{JX|+a@XBo}swrq0K2f_`3AE z@x37)`n!fRvd&H)$823sfpVXqwyG>~y&yQ~skqyK-R)U7*18Z`FhJXL&EB_FAPZ3l7QR`y2#RNIW9)$}JfRVRK#m zG247z^yjK{KIVDfXJ5v%@>|Di4>Og(8*4f-M!k_dX-t+2|3d}KM=qc_*7AD%=0ktO zW^&*41kap4ttu=kaNx@g5|%t%QHeOHO3`dIh!C@CQNd=wu)@5eKo`@d!qBG|S9@AZ zESqjxlVcJC{~(FfJ)#$Jx;QZVa?|?vYQn8mGgp_ao1Y(ru>WPLnncYK50R{+fcN=H zOzZiHr+)6#5aGUNF_{;dLs`k8qFgHdayx4%JTA_uyreNCS^ynIuu!6@47sCtdvkN) zC52hnQ5{P}Om4wC90?i=dHkjCC!yAxJgx=&c3D0sXS8x|gcB(Ze6ZwzLp#5yd1Jf( zrXgy3;N?O;Xbz@h@wb8efq?w(L~>1!1X3?Rm;@CT^2OtN?JDOi|0DV<~OW#{%?lhDZDJTq<^ z&fm4^S}#+vu$n>$nlNim%#mzn_aRs+hdol~B_H27KDNZ%%EC|9Yy^4b>SwXjvj2rSVo|Phw>VG8J#$ z7{b?c6(EL@e)FKD-;c6-fL8lmces2o{_2g*cJTLrAKB}wnLq|PIg<1!4TlcKT`=+HK$mdyjYN_+20(fUw&>6hY_VsnG3(#`o5?UfdAAX zJB!k3$aGgSNf?M8DzdA3_ud5rr)3tr> z6GZkU8j6s}FPi_oLip)1gGi73k>WvACZ|5WJj~{FKXWO}Tu6*0+|(F50r*idbRM3d zRqf4osZ4vok{CL^0D*!_4dOz^Yrm{BHJ$2~vrl3pc*<;p0$v#r~*Em1v` zUDNA+`gzhVruQo4X@*_orz?6+naWh;T^5#gC$?J&L(3dU{Z~;m+Ao2|21C*4%?rtd zK01QZLWRM5X864s^kricmTDqhMCAZeS`*oh$ZgCbh+N}!EmouE>^75|Gq9A_Niw4r z_N^Cvp6`1#_gI1jmk0-Tc7w7l60Wtz!d{sjM-J&A2JHo6q+;lg1>eBF|h`s zxh0S=C2D|0*Ns0cPRsGliNA$o$qIkK`Z?lBIb?pepCr!O86U@1??%(sy_$M*5soaV z=zQ@5S^5Ipcx#wqcNR2 z43)UOBWtP|wYZ@oLTgSeyzqqGZ@E}V8u?AZ-01z{pm*@yK zx(`8hhx&If{{njdu$sv>7xu+o5GvEHJQj4IX-IWE8!a z7U_*X@BKTDpHfBZ9@pe;%3(A|uzLh8$!?~M6Hpd6+0W)tFz^)WZbISUi9A1hU<{oV zlyC4#BbmwRn`6gGOc{%fw%lL(j~bX(>-5((;I}S+@wO_+8}3QcZ+fU9V9O1H+9Ck9 z2Kzh>fIRt|*)g0>qs?f)t@QWkvVjU{X+ldcy@VH7{+`{qwV;9Y##;Q zzjlufY5aBd&8*6!u%6M{e>=Bu)%}u%l*Qu{&^W{LhJsWX^=sy5b2ozh2RD@{RPDvh z;)x2Y?Ie72_lYOr%{=$(dQJX_&4$~CFHC7m{)>ATe6mvTtW%RR%@zJ}=tI2I4CwK0 zc!_Efqmfu#L9i|%N-Y3;^PL&1c(U*IO)Mk|j{G#9c@W70JZbZfz^?Ha6mn;4Bx%F; zv=~&LlE35YPrdT)s}eLA#7j@gUVWaBt1Xv~db-qE@mRDJLX}K;MH@k}Z~i~T!dzJs zspQR8E2TuA9!SdcM@{X%SNP-gRJ?4Q)988T%~tPscd4V^IFcfpk(WFW6#II@lXqZ; z!j#m#gZBD85o7&~D~8Xe{-!6o@9ZdZ$2}?c(Bd87UvehI^rB}udOiO{|C+uS?Xzy5 zHBPmZ%^Ro)?Rt7fbJ@hg9cW@l<>YBdg(+vw?-AHwCuh29V0(t+B2qDAYu9UQX4>hR zmn#4V`L^R-=~00QG!WB8r{c{tK^a2XTQZ6)`w52Myw^p|Mw<6# zS=2g+#Fu-Xd@glPBaUa71Nq+SX^3IF<-co78nqVr6kcB!jk@AvkWY)jxY;&eZ^CRAAa#FN9WZ&^Yl%5SBpm99+F-Raffz80 z&Z4I+Zuyf|{%u5A+x+njPwkZ|DmEqL4m4SB_|5b815ze$gYKpcS5mFn4(wR9BV77l z1y#?0lvYosFO>-n=q`Gq`_DKO!ma?=K1?>+LCV|ES#^x8oNgQQL*1&l48;%-p)sKIuyU7T$N1BaqENn z;hY!`DqwIr3ElboW4BQ58I2p1-_gJZf>4lKx^i$@u=geoio<-lEc>$AiG%_eea?2| z@KV3=Ln;q#el;@J>UAD&c<9)O~qfj+py?S3+I-ehcZfflR^a!C?nTksRKv zW>mw@Dwy|)R7q6!oVYp3H8;=_CvA-;NzLA#SEprgPfR|6=M?=4ss|eODAl7L!bNoNcBjIHpBTJ$by9oUlrh*YmS0J z_hnx1H6%-x-TRCsM0QBy@v)A`#;WxguWz!~$L=%Z=a$;#e8t# zDWu(NebQ{z(4!024-30eaWOPLx`<^x=~3=ZnxgCS&`bWf!;=Wq9Cy~ZGyVC1xt4RL~D{V)B=NVkuuHxU}6@H^VIM6IjM}<*r(;ACKO?oz*1^2gd2h%vwSa- z$L8IP1cm1w{QP0+>lvRQjsAe%l5cli75IR{?f07d%|%ZtqkCryFlF|oCz=(wAraQ` zKXB1Q7=h{m71)ji!;!1ITVEAkT$5=}GsI$ND-#+`w>NEIn1e*MzmjgQoJ)1*W_!VH zCZL+j_5E{(7dO7+t^D>WwKzD1_yuJ0fM`tq@Pb9)zwv;i!%&fbbV8M3E&G?BH!)b= zg#cyY5NBI_2$jnV{>Y(gd(-3rW8aM>5a^~>rnKuS_tP=|TniQpduMIzVYV3B;5@n(bI0Yxj z#jbUkf%<0mLD=rgQ(MuFkMq9y*1;+eC2CW#sZIZb8NrsW*_o}q9uV7k>qKvz{N$6`L)Wdwr-z&%)3mGD@v7rq|*_aC! zh|B~QT&i|Rm3?kGOw&CtKAGry-aCDcSzR#8kM4DETS`MSS@PXChVtxs`qTS_z2ELp z>N_LouSabs8|2$xJqoDhfs@?FrA{T5;%JhRLI8^ZZ9#DX7T`vxs2@^zB6~-|?pJSl zjQ3XUSkT7%7Fld4%$0lpu0R6hD( zRej9s$@(H|uGUj0?~IZAUJ6$ki^jf~9W5`=VEqrgcFq-Y*U-XD`J~c6f;x7)1YgPO z-5U@~xy9D8$21qPc#2~>c8aP+lp|1!C&JEhOCDT8CE!sp%fShj+Zv7L-T0w4=%Zcb zvKTKCYL;Bj`1C-ofo`*3gQw~L4F-cvoe{H7TamPC4}usKNy#7|MHCb<^eXaSAw(0k z+8@^c{4DU@Db@}J0n&{nf_YG^oO`((-q*@_BS7phCBy^n=D1r$X`#nyx<;A-q%Cqe z)u*7ili-mpoAzFaBT-o$RJ!E+j8kj}Gu>jx+yidl=(Ws?mto)z2Af0r*E7t$NeaLWs|OUQ zd5RKOxOkv_n?FJhkA5N1$)bFJyEso^?F=1_6M}(0*R-=A7`WvWtE|dfT?Cd3PNBpT zNXhPxpcDCngFj;FJI&M!EC(gFxdz^%Vs)4E=dCx|rO%4tmhQ}L*lrD0YRuf)=50zM zA~r}I8!^JzLNT=DLo6oM6&X7>Us#p&_cbb--EAO{gdC?LJ969+4!k>`two()A`j#MdOHr+G$*Qx9X7aKEUI zg7JSN#Hh+0k>(RDoRR(ubJQdJ!XEnFVS{XpoSvJqQGgDaUNWDaEgh*G6$pE^ zo2qU80c}QZCXYobe>JQP#9|Ta^|OW~f8L=*coYKmA+DtINTL1Mj=JhlzQ?U^2vi=D z*2F~Hdp?as-%W14m|GT2AbT;>en69Z9;qTI1ZVzCJ?aTmmp^AAtJzmq;=QUFvl`A; z-TnX)r<&Av{x8-HG-P(MlZ|e!b#!Ckc4injs}O&5S)+I@p1`%yzM!f_*_r-oBl29=^iU*t>1S<%%B*qH%Gg1$C7(<#7+YW$@<3 z5c!;)Wsgxev#YGo7`rUwq0HgSPt0FaU1JgzhPHO^OP~1=Oj0uE$)9lJj%d__q`|0L z)HxoX_M5}Yb;`NnPCkz76q0LnZbN_(-$uzO<33+CHx8>e^A%{p1w{^j$zBIhyoSD39& zb#8OBC)N%G5BuNlLPyA#Fc%Qty_t>wntfK@<@_?qTYlp28_{vM66x+cWM<r>i^wknkO~$oBt@K3XXGfjTtZhscC%CBYXW?2 z`)W?p9ipAU3d)-8SMu!ycf&ceECBKXwY<`^IEEs8DFe4y@M%4prMO`z^Q4bqt;8-$ z3B=ID^v9nmw?Q12A$vdKCdNoBgacqkmpUxqKTKtdlS^@J9U865w^!J%=nu$Pdyp; zKD0>SE{kCX7*DE9RYX=KeWTfV>~z90rtEP_{aSK93#|GTmXoS%$P7>fo=>#zshc;` zE6)CioHI#OTKO>sM#dSN*@dC&n=yvIywabp+O?aWkbX$4y4B(wV)TT~3tOUWsND>c z93`#y9e5Os@i(O7{r(G#`fEZ^MN(;qW`>Y-NhY0-2_!2C!ady5WvHNI_i^bONjFvu)N2-1K zdF!;j?7660QxxG7=_@q{Oqapgf!W}4Xx+tu`B>KD+T19mNXEWG5uF>8gSfD_jJ&0_UiSCbsb>?$$sEPvJ4| zI$#l}0v8@d2K+$AE!4Zr=vwkI7x`bDLPzz!!NBGI`fgr~KP@BQdwD`pT)c0@ zsL`8Mr4^wbylyJ;4+S|Lu}p>qdv5t9?P0Q=9S5tvrqYPJC*^`bkCQhUk{=N6GdB44 zr&sUt6=V%~rPmWwnX^r77`U?wjz~*t{GF}c*BJqBJpny#e4>q=_H@i**$I;+t24ea zFz_n37s4-oyohb-c)--^{L;9P_!=h0sOdm$%)=KNGd@L$i@!^!({;2ruWc z$g%)4&(Gh*Y5&=#7iqi4sYHGO8J>#Y9t(+%el)aLuh!TZ98zzHr%+JuF_y_^uTp2_ z;if8Zv(Db=G0o+pH=aHz_XpgQbzN)z^YSv>_7u>VrA7;2S@mL#4&Jp`d9x}uOw3x> zHxp3tfoy?vz|aD2*^q|Q2AP;7s@L~x+s;UmQM(AYqLPaBvrZt}5*UsFI@x%*H#0`I z*9{H|jG&hjTz7(3W5>VfK}pp}+-g-tcd0699=tb`#i3;b+`S@|6m&(8Hh>=~hMIAU ziQNd?bfvEqLsoY2-#w3%-^=5GJ7Owo>T@`0y#ZWpBba>LaZ(n1nyMHh^i;U!`JL5h zhp`4nQ;&zJ%&m}9$2%)oo|F+5K3KCRbfe{Ky;v2#oV`XV2o!X)#N#g2j>OorY5bu% zl;gbDdb&epSbpMBuoTDG(8bY!nGYAb;>onAkC9J8{)C2KbF_;dp64$4We(0s(%T(u zg6>DybF1k25G(fyEyvP#V|k;C%~P*TkDDk&Ntv||C>T>9?SD`+z-Vtc(6~vrmQ>o3 z%*@(&3Z7BWr<7KGzt-3T%S7Geawgu_80D(Zt{dY&ZORSjYd+InZAnK~*@Y&{#j5DL zbZGd+Z63)|1`Ae-f|}8QFX5m3@1la3@~@Cn9GThIU&yiAaVya6S80UO`{HN6gCRyn zNIZniPjT`Y(oax-JeV?Y;*O}x9-?1S$iUsb>o|cT%1DTnJ*-|Ve-JMf<`#ShnM9Ks z2_#0=xuRyYteA(oyaAQsB9F?MRyD88`FWG*qj%p&#HTSJ+TvXqhMb0J>w6WDu9$GA z1$PziBXD;{oRSun<6z3*;4}Sw+fqpEPV7peuM?keq$`)J$0S8W!o7KO9?csys1YC^ zP=D-V!k)Vlg^|83U(66KkF*a>DR{4J6~%q+lA!*|C6t_+i*&*{byC$AON-leAag6{ zO3W*Ab#TY6z_NY7oAc@FR6uQfpM679t#E(xYv5v|Nzwk4rO9?>M1qots1EF3s%dvG znLZqUPL)$xoMC%&WQe=Pj2h;nFb&UcyIM)i-kIP=PsT*=FINw9nuk@Yqr-rl3{g%N zjh6Y-`rIULgPc4oU3t$)a!!r%R$Kx9V`*k3R;=ic?F?2RPgM}Y~+`IbNd1;Z1BAYMak)!M@^ z2CHNDwC#7WLD}r72$RS#MYl?>Z+j4ep3cPD4KaocR`yS&aV1(2PrIm{Eua$hFzz$ZZL7Yh{(j>91-1=C6Qfqiw{83WjVBCj#eM#h=mHa2} zwn3QlKCOa6e7K0To`Wctq8NZmNIm=7^V99y-kn73)#9z7J0CCp$Xb$E{0jnwn4FOo zHjDl1s+}NH9G4J@wJ^b(_R@*bm1F+;)7VTwYvS1aC|8y!hWr($G zO$7OC!jRqH(UOmisY~4O{`1PbL*C0~^o~yE!0sU0-w#^`!8$1enL|Ljw%%N+=a@j} z$6JfvuY)d(F})1;8R(idXY1lma|}&gexojD5wL1+WJMcGJ4hDS1jPd0fmytzO#CCh z5v6WzHaQ#~{!<0-G8tbZZyiWkS;ZurXl3$FC2IejXXS=@sfClZS?(~l=d@krc&BT@`kQDP&9{=jZ zdQ~-JS)H2LxZJ&3xX13cKC~PsrvN09^D`$=0oNHL_i<$%Y?830Z>3Khap{8BQXJQB zHh)<%rI*8hDpQtvcj1{Jr2ErwA3XPZrwbTzs*AdF$8%C@VAenLt~!#;m$Dw4pc318 zLNwnS#+R043jPziJu`WD>wU;TZf3%o-e`$fxHFOie2?D~Hx|PF!_0=<%?}>0 zPUZ7}gZn=@0nma3id?g2S8-@<3NOAeR**!zx-;rOH26Yvs5hxB2b$Px1FZ`orcKoy zKM6btQ6;nK7rDMTM4~6bQ}!sU*IONrRzqc}5)QPGmLqQ)#oo6nij7n3T*@r^t_e@< zd1kyL4X0pR0-L@^ z>jx3yqagA^yl-VxDwF=7AXZY@@21pRK&U?s)9KtSHez`bV_9|BON2J(F=Fz=*LQYxb(#NYP zdxtLIzuO6gfK%E03YjgI#rmnwj(5bHlYiqFn*6|D z&mirptG7y4c{2EB+J3ZvQT-Po;$`_|FwB!+Fw_`YfJC9^d#0F<-al#QH!a?9-WG!k~MrolA*3 zCC3n@-j{M(=!C)h562F&fdo|SACobbrF=d2M&}}7?}<`b{Fgf+?`((^r!*AJ$fd*E z$(U&CeI8>AyOqPva7X?hw>&aVUML$ZM$UW+zYC)4jlR(y41=Q|;ptAn(9=I8sxBjv zH=45;RlkLwV*D$dUCyy-P5s_<9#5V~(ybNFdSTZvA<~qv!sX-%=5X4Xu?W2EiP@8( zvN&<9!(bpi^Us-MD%~O#u(~%xw_`H(7sgKK0AAJsnc7-32)M z!pf3)ZHRyE^?BN|#65^Pr#`S+3fNmbzn3n_%suFkfKtg{Hw3wz*6Re2t(rbo0qb$U+3~suj?f#l^aXUykX23I&qC z;uu^WtPKiZ6k6VL8;Wmy32OV!!=6@~|3(bLf60MAm!tTbIYy(mMforTxMwesqP|cj z#L|p*?VaGsu;$AgD0UmYYCJioi|4Xwr$2nz+4|n`*-^L8@p?(%`q~!weBh`PSkMqZ zdz#$e)fIz=RwpVJ)%`(AOkqqA?V|Eglr$S5j#8&eW;i0ZD1Sw^FK`%}`5rm=w}4G1WO4)O-c z?WiXwrFegy<3p?{@;g-k+TYGkKCu0@CJ>(?m(&p5tzP18G7C9LRT9T;!cU4)(XA*S ze8lYKMo>JT&4>FjQn|6Ly}bR7#z7w+CXiWX&uiaeLyX21D#dlZp~aD|YB!mG*xEPG zXHveQ-`{^sfz`zwB!xz2ddsjNDtOCg6Bpuv4~KKwsY^Ef zCD2K{1Ff5?5Op@3hO(>hY4)9?Eqv?1wx2tz_8&48VvHaO6#uC}>(tl--y)_b3*VYs zlsDrX#ejJ`{L9Vee=&WkHCZ!Fu`oM6a4TNU=dMB)d*6x5 zS`H2*jnC5Gw&*M<$ZJ}&#In|awjwiV#iL;YH&H>&Y_rsekdKGdHiGx(uxwXnlG>*| z{qbxy6YF_d%i=p>s_a!LbRd83TutUM(4c?+R;+oCy+q$e|G|oSDDnCg&GD@2Vui(4 zBl3z45@4S;NA#n5DhUG_W<-O-A`QhPpHG2iRBZq2g(6Dt5Y`xEg=&@ifY&f^X3 zkl6J3{?ViQ-h8<4?{ByOJ`1~yy9ZF$quUc%&!dbRye7wE@MTOV`2`rmf0kUYGubb4 zY9;GrGEe2#9a0_lTU12Xi^$>z(d+qxOBDlfIBT{}_0`%SxxJt~=uHz27?XbY<}Uxu zuKZZ}bsH&93gM!!vPtsCXajH$_s-UIc@p87vvGxsY2Lzdu>#{Ww?IZ{8&)&czCopGVP+Avb8S==O)hyC zQ{O70U_Nic{xRH{oOhEpb2f{jlF7g#L!SXhz9M>9ZnYQ)gj@v*tm_V2F%%K+KS!8<0aOSSZ5Pjp|PBCZ?@C{*m03Daeh!Z#b!?k zx+t#F87nwi`Z`<=yMK@{@DQ0iuIB$AU2g#uRrmc5k0PL?f=GvSr+~DAN_Tg6cZa0X z9a7RTNOz-1cMjd%AzkmC!RK4Q|9h8fIWEsVckg|6e0IzoPx7>jO^3dX9vYe`(JcZc zH9+qizZ406erMy3%Npfc@r&6=vCclBTIN)j`-K0GmIhYSmjLNG(Ih>fq_HT~7I-Pc zzZM;zjf>}z;?#p|*G*TZ(;4)A^NGM}>a%}l0Z?r5JnB7>D)njl$nGOvS=^(KEpaa! zZyhZQ&1MMn>JWV6^^msiyJid0mfyiuBWs^7+6*zdf_70JM}A_}4UBK;+&e$P zs!A!Td|bLWexW`QA(s5>^T{YRcS_q`R^D56rJz|ZV5twZK9^buP_&&h_hdOAoV{FADg64x#=yo?&PNZzgEGi|GNd?r2+P`>^Gc!4NI*=l6_%Dp;e(#*<~JtcMQ4x*Eua|0^*dURZ^Fv64{Orl+(95MLQ3bj>XpD9cFe7#uNJi1iLaUM=hT+Zy`|=7TRM|ILC0#(iCFvhpSebo zJMPTUYFFvqPKWRM6BpNR@aOHGPSp+aoo7hyg}MkX^!~P^epckk)vKHx`EtgQ&-B)w zi-SsJNiDO9fCKKS8!ukfuh7$A_z=R%x!4`1=CY&BCPJI*iU1>E(Xfe|3MZTnO;#To zHNxg+*V7H^aCRzY|WV?ii^u{^wPYZkz~(^)p+prZD>_n zpj(F#-_}ljl&ktRvWk$23Hc>*LZqs}33a4s2ao9LO{cDrGg`uarLKoQns{|`sgv5N zaj`g=i5T}3@sIZ#b=yaj4y$pNXn7>`7u9M$c}O(rk67 z+2FNFstw&MK=bzAHg_Oz=cGZmMi=?~o6?$u!xio=UO}^hq@yMonra~Nd%4RMPFnvj zWuNEmyWNDa+JV6&mEHWTt3pbG{KIqNpI?GzYD}_aM^)~Z-YBsv$*U>7A7#f?J^s1i z{bXr{?C^ZH-*vK8HaWvw05At~!DS_T5-axO1)%PhnRZp^l<;l~v+GOb)65PO-gJwa z+>a8#w6!Vy48zI=_*-zx#Hhn~_zjs&y8rglJ3%5;=YYa}?KW}?UXfq;XxntO`FG%` zPpY4yJr0pkfG&i_*JBYF9q2v!h^aI=o--q+M)yu+%6==VcY+v45#}=Y6`@7E z>3!q4tI*grII5PU2U!3PtRax5u4hlx7R}-x`V-j(z5w_wkMH;yrLjK>HF49*F0-- zm#&{lbz+w{Q^;|0f|eH4x_s3`MtjETiocp0yvu_VQlbCC-9_YNtYLoP^fP+xy6+`iOf{qu2ciPz0?)`DB@B_AYG_q z-Ge>=7pHogM*RR6u2;&-jMUWF;xIBk*0J|1dQ7d`>+~OcT-i)-d@(nra4xyiSG$u- zyYQkpto6@U+7`>B`cRV+>FaRPkUySm;R(*9@f-FP=0%rQ5xCk=AMM2JyKrMvW#aCn zhey_NA)X{TU>IM^SV$b@L-0MZ5lFEu$ap4$PbDamk$#Aj(O4uG+FIhEpq;w)TuD*w zrFyi+1)awuH>S#7VzSPsM;>t&HoX%h<>?&W`?5+bxEmXpJf^#F^#mANCD~qjYQ;jF!ml{m*3|PTaT@GwdVHp$C8$wkxOcSKFSXu3zEnd z-r}~%?)k{I8r%Dv8(%1*ZrF3kn&YJ1MzYfcEz57n|L&cu32TQMSx1khNyF3bew7k` zy|;GXc5#d3iqYmoc=YetkUY?=`a%&uPIQZyJv9Oz7*>l zwS7mH{UFuEiZHV#+=A*%m+CNHv8>QdyoCjJM|pOBN+J5%3*xorPkBjw>|83cm@Vg+ zXf@C3_&2pCh4O#(WFd#Hwp64atC|l{gYw`VIV#7qr9aArHasfA zpYHH7n~Gy7$h#BDNE!U!*+`Q>Yj!ppKz)>@1%-0mY34Ol@d#Msv&0kCwnq(L;JtB1 zpIL6CpD$JiUhE_76eTRu+wCU!^+Q8(%CRqR55!C(c?cAzYCur)nKU+*EN^NQkKf)m z?cyzAcMEf*`IhdmYrn6d0k6A6UABM2b@F$i^QRxSS<7OLq8zQb+$kFb3i}M&_w5p> zCK1yk_iRzWQ4?Nu24##}X5P$Fa->Qu+h`E8y*(Aei6k1juY(J?0^82(S>iT}6 z#%uo_F!AdH45ARBqt{co0(0;`n|#ra>{n!o2Y?`CH7}%A`Cf;4bMBy{Ba1lg;{+D+1fGt8`{j4)gBMif zVSzI6le-+nT6qkv>EmV}KasM6E5hFU^DiTBd@J)X_1m(-SF^uBji5681aVa+O!)1u zKz8{GbG^`f2nCqw@*{s%D|QJ_XY!%z12hS|@zmpTcyi*XlSt%gu>)4fxkYt1zIm`dL{rtCQ^KH`G*#Iwy`B+mayhYgvQ-ASdS3Hw^_ff831xM^}}$ zj^ju((OKp93Be*16lBt_mBo@(#%sUXB3@n+HOu8-EV@6Dw9jyIjc|1A#ZZtT8Td}4 zeZVPu=iRjJaX<^U&=J!ip8hz>Q25JL=PUi26U76pml^a63tYypP0~bdT-((cT+FH` z7VyiuNIv4K@Yk(4)x2@zn7Vd5%2o7_E?*E@v@F6;_I<7PI1g1`7l7->n68P2k(u%; zD<8AtGe<>|cEQHHru)KZd1?NSTDM*y?6W$prkM}6HPG*KsFOW^dN&_MNw0GzvS>!c z)yXG#sNGGG*NVW;{i<&-PlslvOtV^thAFRcc6k6>xTdbrGtiZ*HCrZ&i1u>@ZbQOs zgXN^9N=v1TmX=gq`+Ay?f!EbU{O)G%(C$ZQm$l{Tqy%Rvsbyjq@OCFqPc4>#mmau%6dRwiGeZQt^9F_IXs$vS?@SduOIB9Vp~QR=YYM zPsd}-ejn=}17tb=c?X@{cR)DdHnbH%6@8(?CPGatXUydX*rh$cIo

    JTCU^K?kic{*4Ebwl`F_4e8Q)L}Z|{p20yiCWk>5|Z|q8B<X`btR$^W;mjc z*^wZQI?70MMh;O8zTjCC9!)w~9dubt_qwmT&f6ZQ_ zqLC(aT=9(jxAWD>E@dbLl#Rv_*zD%pIL_@`syE%_|25aCkPs z&ql`(hNUkxZTjV5$M%GsQb0P|^u?whcEW)3<;CzrD3nESdB)|~$bZ{Cxhnv|*v@F4 zN1A=!EEM#Jqjp|`?R&>M+8|8^(L@u;)K!v&b?#Jmm_XfpfONAm-d>-FrvRvgT=HV; zxe7~tC8yUDWNu)s>HRwb_c!QAMl~rBkm?DZ70@O5lm6NyhS!2GVRDD zqJOPR;jNEXr^RQ2;G-e6&O{mQRE%qy9iBbzmML6_`$k2uJh@AxKeN$3)kmZQ&F@$Z zbE`f*ic2FbVl?m+j3W13bmm+KXJ2-nFGys#w|j1E?o?a^9sULGzN&PX*C>_8QFPMm z`B}NQH_CrGy3ocsSW&gfq zQw%}84Sg~OU#EiJ_ukp_(KA^yuY8s$@3AkZ86;y!=E|~4FTPs&e(USy2&JQ9tr7`2 zsA9Dk=JF_48olR8eHE%6-K|#lOjCn*IHMV*-m3kNE@N)tA`b<;kb?OF-iR~f#w-(u zE~A98o(s`cx0)|PuS%f=&Y)@(Rv13P0*Tm zikOirqbMF5*XXHOe9OYE9t z+txfmBsoIef?4nKn2@(+waXZ$1G%O9BM@{VS8T+8#v%;J+X`{`lHp@US<)+QR(-z4 zKD+KNffv=c30OJ^o7UjCttU{;(7p6doO-pR+UaZPd?m>?t`+$+*S?>588 zg(XcKsG}lwzN8zH@b_FFQKsWgr8FZ1I@ZM!_h;WwlN1aOObeZHYo7&DMdd|u8=NQTfKY8no| zQDVfXW+P0ljh=3Sp}W{c{9-D@aSm3a0H^+Xo{@J}cZw(>tX(y=JECTl_UEO>4Uf#t z__;(Z>)dCqVl;NNMTc+w57_vUrH}noj@2kHsJWK}vjVv>d& zO)a<$emT4;y#0oSVHTDaiyfbZ)e`~5TX%)X559c%L?oXW?@5Ie&aN-ycerH~e)^TQbVDC*rdYL1&GHQo;!+_R zse{2_nV5$jB=Wr7&LZyB56F8$uxW*O#l3*(JTku@&%`rL#ZM>VPKR4{mZ!1otCFgt zPN)|MFSym_KE83n&HP!qgNZV;r^2A5Y*75O`3ZbbCedzABVZloFJ=t?`rLC~jEp5b za*4@ciCC`FRH@sZSZtiKKQCFQOnVHgKk7g1!}qXToVF# zEZz0RS`xrF*ca3vJ=^o&~O8*QV`OEG_WFV1A5&+N)yS^b*4?9|MlG^u2YO%@rI&Nhe+jB0L1i6+nfiNW6{_%(Dq6L(!! zH0Fbx0_7G3B}a}?24A#q?g`~~m7TMuhtUn6urSzlB z#n2nzj-g|+a(1TfA1yX}-)+oTh|;kdHsrFNMV_ZFeor`ldu!)i0q3OWfMl-K)81G`Flxr2 zk9@lM3GJ8D&o5=ih`!4xo4xkTT06PT%lF0y`+h6n1KtI1HM3q}lELbZw6brCPIDSm z8B?+xdo;PbMvaQmD^o)nauC)u470^}hBm^;m?OVd3Hn4H9hP^iL1Of^@bL~*xnWG- z&y)x_*;uR$S4awf`46al9pRO->0rhCA{W*l zUBy^e=mKZmHDe6I+m)FDs5At7@kp~^FUP?uL?q6xvPKDUBtf$fj?KIBM30c1O{QbT z+Zc!g#wd98#e;MN~IUWzGw8nsoB$vh%V%&wf?!37*$3Io7^%JU>ZI7%alSnZ`L4);c4) zBr8!@$Z1W^Q&emc`l%lV=Haj@F02%DcUI_~t^a@@jt{qxN8YWF?Hc5p8hw(s=hjrL z5kMo~WK`3a=C3D!YSQWKhjid3gD>Wl6CZ@YpKUN(B^lJlIBqploa;RO(xb>y#Z;gejH!6wnh^pK^rsB6>nZqPXGc18t_O?BJfD7 zbVeRD5Eq;`KwPV-JYYcCx4th&5(X>qqzSxUH`T z-4xlBo|1@OS}E@Hf_sehf^UGI3d28R_6|K5Y|7ONf{f7(<0{h67iqa?q%bCEAa~T7 z^&K2^_&w^5+$e)M+U+^Nyq+_qSdHxE>uGZf*+Z-J;txvj!ESY74W%38=Oj?(w<4xk zB=mBPQcuh5)grvbYhdZ|&MP^sech=S(HO$ydO3pYI{bx{FM3vd6<433!gvu*A>5Zm zirS{f6Jj`e(eY!-wUfHy8YTlui85j3L`l2#0Y&a41#j-GSy43Cjc-lm=M+?@X&|4S zm}Dt+rvr<;uPHwVFh>W*i8{3RE>zHqOI|%T;L*^B`aTj3 zlrN4hxP01t`ytN>QH=t%Z;3(cE&R0zT&u&9U9Y8xWz?tfeYM=H&Ysntz*at%0Bv_Q zcI)31ZCT);#`t(7C}H}qSKEKY8lS0YJ_hL^_5MNMUrjB3&14i?%=S!?cbr^wdXvcz zjR`dSg9rR4)jG)GzCss1T_a<$1{I5uI`*~voNKapBiM}8bC8nR#uU-IjagUwF=MqFHWZM}t=)#iz~Gmq^1W~N^wtm*5q2JQvFP~t z+R9;VGh22LGv?b>&#Qc?;%5bGMWx}w`oZavU6uHDFY8vDd-KN4J&rZF3$dY(%6%@V zr9xTr{hep@)%6wCURt$A^0C!g2_HzuV$0xOroqVRSPQN}+_2DtRWf3h7lqgvOFemf z{)POJU=SMcn+)4_Ae~RPvrF>hqx_1hnopsd&Voi5RVW*HXj6BUxw%{$TpxjIqsMeQ z5wCA9Un#RnPV#~8?sOH^H9JwpyfWqY2w6nsZgcHI3Lio52DK^(f)RQF=MzZuJ&($k zlL-V;j=oI-JQ7`1`X<4*HuuE<$G#=_hs96*8%q_=9=Qc`)q#9yNDOm>)Yvx$l8tTI z6Z_4a;3-7Uz59h)kztE{dY>QvlH;=9pmm<-H5|dsiP>F;2dU6qSA5ZIER}1YFmg;4 zH8K4vewwVTs)+`>2b4VCORuYA?cL~AfrZ0XfKZow^ zAy?8oZsmykz|muXqZ9@v>9fm|I8kGVBf<3XH4w-sLxMZ2Sz10in@cLMeO!lQn>$9P zU0yOeJM2zw{c!nP-x^G!pnQQRr+=J4CrIG;{;xvz5boQ0x+AC$hErW}FO*IZU z7y;MMkM+d5`E{g|OntRLt^U2$rUR**5gh%A4trGGLF+j8p#Npm#8TV5`0ltxtOz4d&N(^Qy7Na15p-xKV?a~i{33ek>) z<`2n6Dm`EyWxUz<8q4LoceN~l83BGc+|44ZCDuD{^m)-VOb9>>pEPw# z%Wq2?$2!w_8$JSYGR|bGk}d|EqBWKdj1YRXBNOhDqy%;#x#WE28pOZNiBUm?(Nl`V zXTxGRb$lGV;b1mkSwj;ukbf{5%b0c`PnlX){|40hCPwOPr@|gP$mkH`@D~yghQU*= zGSR2@E-ao^&c8c&Cr$+##vLhHzK+9o1Qh}Y+S7~B6dlVtx-Cf_ck{;3RuSa0MFQx? zrKy+^X@LYc8DKK&jA|cRk;M(*v=%=Z8goVD>_{wwH(-1CBz=y=9u-U*El?K|`?R}# zyF2^Q=@d8wV9P7u^C_wqvk5@$R(v!DpkA4J<|kOrI*%dCVnyF7o&r7zxDp8g&9*d{ z;T+Vg6sc~6`h-);=z5oCYm;VDkd9OD{w#D`P2L46(VkRJ>6+MB>cOqbTJAn2sNOxE zziwGCtHqO02L4r2fMpL!@}HJ=kn(sBqp(%ZzcJBi_hf_azE_)QdOVqRloeCd(`i35 zIz9KP$0MCrctrbWp5O3>zfE0?Bmj0=QU9S&4%kcaNFj!Ns}*@Cu`LAOiI2x&s{g@; z`iuc>Ui@U>d^(UMpzXOaK;wA!gS9*RieIuoI+_8JJIlq@)88A#(3zW}k!(@NQP_(B zn$5OIzPoeywAK6>{q&C}Yu;RZ0@bxI{O)XftPG(1raFiRBPH}BGY3xU8ZUAScTCSE z&23;T81VzjZa!7YIk=@jnWS($Mw2s;ia)uOEJbISE1V{P^Jo3}#pBk>k@Nu#TQr`Z zjJcV?Mg4$l8UozPHfIUoLL~I9Tkz|0mHJhu;`?_A5TX0(tdp*`helcUCOOYoifPw= zzcY|a3c-#Or5qQyFyRza~HlF7d9RXC>v@?{(*!jDo2`9xPCaa0C zzDdvPxu>sz00CTVI6&Yf0CWZrc!V2$jD%S96_Zv5djKa4`!5h1fB=9`Hkg1mq4h8E9sc58KZF8v zV5?s*j-j78GmMmFqJe-f_D^sVeGhZAv)})H0)S&LVtk+zRPp3tPdEVW{0-m_2L#&| z)JN*y2z+XF{3k*|LoybVgNnwBhXqEMFjf}19a2T}mkTIG{|Ui9>@aKc*^#L@`A*If z1OpZzQ2c8cd&RQt6YCjVjfh$r=8jwsTP5Z^++jZSH~a(9@F8eH9Rrj*nQBFZxV$^b?_c^5!~ChU6POXdH~_B#xiRG7hMn5ol*CUNBB z*0jnn-S|ro+yklN|I2mjm=H|d8kx{2st15P*p*BEaNvo+Aqd&Kpg%w)*ndIM2b4Fz zc`wdPAXa97=7LHbxLOqea0C1;0?3|gEcX&-_Yuu7}7Df5sPK_3W2F)SG0Mn(UB zd@Bn-Y+tY=A&4c-{vRA-!#L~{gMv>4*NmBuVk`96a_0Ul_=F47DWSl2Cux4vV&$qY$7@TwDW? zOVwYn0$L1&se?|(455kQgUNvx8hZes3cGxg1!0Wg7X1bOqJZHkHV*09etcNa+7DCQ z)=(f`Wd!Ga`?p53AwJ0L$G22Oim(41UZN~aLzu}FEi8$k;1mjf9-Ij%6#s#Tw}16KdYdy&{U1-oT=sBt z5deYz%e-56-@ycCTJ&FvZiEVBO+p=@C8_PNvZ@9>JOKzLpT_22#Qgq;-M+sn-~@GO zRi^y^>CluOBvC2p&=mjN?VA!@}=JsV^qu`?DrG(>akMI&I&)#@^oB~ohn;zZS!(cIo_Hn+O&$&%9 z1A0ML9^L-SK$eH5KFXY8_iFAi7-S=F=0p@r4tR9V6$cS^bO^1(bnKE%@42&kSV!rLut11nU` z4h7ONB#TkIk!KIJq$%*GMVh`{b#Px(UyCvRS;{VeLg&JptJ2xZxIB;EW;UB3(@c&V zqEO#a_#(#FT@Q&EY0HH?*QF=&Bt%@nEnRwkneI=L)CVj#x_ld9jdk9HM(q-XwPU(| zVh${US8|7)mcbp81+6satm!xBuB$jJn)Wxh-+k|SZJK2_W3QQdtFDM@tja^!VZw#@ z!z@i+3IH8{;nqX2PqYpFxCYj^to(&IGgez7slMHql@ceD@7khABV=e!w^oMOslnux z{|Viz@cq(2uR0gRYo?Il8okhK?cL4g&qDmw`+*IHZ~gi_m3J!D%;{(GL`vg2)C2-@ zg@}+nncAIb$8?7Rj}6@_-sR?9;Efn#X6;#IC8jO~QmD!E6H5s_jOe<9fr{scZkFCu zz>#jN@$D6iq;Z~u?T$(l1cCxmmZ?4= z1HO*;;-2Sn#033)Nu2tO*Mxibw{(*OKF%@&**LWG@E8D;!LI9iQgGjl}nmR_J^w#;mq-R3#&H9 zo2IX~we~EhDYcy-)}3f`_Yg-UXVHE38LX#GdFNhsDxVX;tB$|1+$i!*wxi|hzg0Fj zN<|5#SF;mN3=>!7dld->6j)X5sg+EVCHS`+eQ;bmFFZ?4L{her{k})$=0%x{4U2+>#-Fx2JCH>{&IXm?%85eQB+~s4@uPn;Z2bUbF z^k-d)%)4vtjIOgy!L<;&Ffn7Q+qEP7|exzea6H13r9X8n~bLQ86S91*UjvsqhIqOWy; zV$1PKYV{GPS=EY44ay)#)2-j$F&dGLOHb8aKdIw=``q*kS5+oraFla@tFL8|Zo7P7 z50Sf+VlSevSx}Zl+`UY0kNFi9I+W$setjxvY|QolTW|xSa%(nokAmV>yxg4G6t;}V z1q<7cj@&O24eC1+T1~g5E8*gg=YPO!xoSqsD+l_jWP|szpWsspjeMz6# zQY@30T2G8tg|uXYyO@qzZkU>k4k;u>s0y`8 zUh1P`V_WQQ0P6se^5Nnd#L=7g!Wd#oLC!_)3W@E#oksh3ez_)TF&s|?Uen$;cz{+q zaxj3@YWLviRhGiV6d4zatH~^p-c*^+h--=3!UNt^8ms4ABxe>Mpc5!wfqak8P6dqS|x1@ zoTrO5cw(Ipg5EHQsY=)b#zqN zH@JB?dx%ZzQcu#%f;}g59IWQ3nzbrR{?e;l;@pdhbaW~HAj*>VWR}MG^J^g%`1C?q z5;wm!;1^xia;H*h7cT3;_ZENJ0)a@3G5965zL?$p&pe;{%X!H6K*$*#&NJ}-QlxLE zy2BsCg|)pLSh&D3hT(=%iGNTMP#y{AYV?68D7-nwg2&oK0v`?8vxalh>WLMz@2ob& zTNb1~8gIggGCeoxMW0q^@o*u)Q~cvz1<@Y!CB>S`+5aF>RuLUs?ESTnHF#Bnq+nFR zt4!H22U2HP+nQ6}xvh9M>GV-cy<|KB@ug>x5^BUn<*l2V#DhKO-o`SqN7(Q{egDnkf|@tO0BkCLM8T9@%*cI_%f$$OWqsv7Zv=9DIu&wioP2o%?XV$5kmq_X2he51T!Lgci7I!eh`cPUJ?FiS+JHe%vh3|w> z!z=Q}!>t^;C)k!(izD&`{EEePV%tiGQ>fG4-SttB3G=TtN>Ry3ZiL5t3XFN0!Fz?W z{X9pq11wlP6S*eRXFIimC2zoce<<=&!)UME<;xo?^Dm6d9_X7MDu&igV;FgYYFsje z{-&Ax$GzSVv~eO%3P6h^wTsQ0CMw(xr%TNaR5K>q`0I9UKcej^_g?3wgdmOIF0CbS z#V44Gz8A3^Mwrun6=PlY^7dmh*!#GimJsbS%~fhmc!KUi_nnt?GM-qI9rhpEvyvht z;RZwc8O9aLg<)ipwzB!4_>0SQ6lyo#{En6AvRbu|Q{jUl;FoXZ@~8XR&E8_j&-_fB zCI^tnfzV9V-jt=C_Epmweh=~9Oa=Pbd@`T)7x}f4=Daov>7A_ugt0TJcf-#70&2CB zg~yU@zUmFiPh{1tv7N^saNt z1FFVQ0`e^CM(A_;$Y%!>()1 zshg#zslS4yUC-8WCe^M^(=NO`b}A-vH@wVToIKl?&cm8D?t&Q{bEMVXm2iS=RTtcm zCYG`pO8e?Ssbpy^)hdAi@}?DvaTEDn(2*r9cVQVsb^)~H2|!$xoYo9F!>CU`sd-$4 zQ*5@RCdJXP>(*%McNKBrmFv4`l)s+z)Mze7yZ?+k@6sxAYO{?ykPIXU;X7t*?lJWv zfc2@W?H|06HJ1`J|M!{7&@*TIn{6jj2H#i8v?G_C>577sbYUToa`qw7hf)Bn2emqs z{-F!O@p~qr`#_)nKZTtUAlEeAQhueX{v5gxsPFebWX!*yHIDx+u7tupiBo{P4WizK0at_Wxwqi9k08Sc9YdU$q6FXMfkr zmsKVGlXka0A%ls%cJd+3|5qi#=PRt3;*&f96qkUY5}o~@RR!kHFq&-Sfs%;=w90A< zl*@homaGzWV2`h*`Ja9ojO^CFhl&V(d}^Ee|KyrFN)K5iDlUIejhB2~``laiodmQ4lhgJD}`Btv&=b}jJATzb}QF}ghG!nWyZF0jJ((j^Fqgs72PCw{=G0l zrSZpwbdN!c(?IFHqnA8pyT!$JanQhSu_^?cp%@8d(`2{NA43k5`9FDtb&viZ;W5Lv zd*R7l+-_0}lggQk{De5=pNW=$wWbTNf@Z(%sg@*_*8?uu3I!;jrWo)R_qB(JrScd% z(tvzy-%NW$EL~m8nN+^d`aTw1csB7j+ZKhTVt{;GUmDL=C==g)7n2edOA<>7-}ak` z{MK9}^jRbsZ(^=!b1RGc#@|>8v8h;COL>Oyg(K5peyC<6$j21OgxCau;`BnD{Wg!| zcDX*#!?d%rEMJ>6=&cfswnMmo0+JvG+EwHnX63h>v+xy62TS=c>x8?37wW4-q)_VAx%8oIvpcx5X^M>-*JO#oKlEl;a-` zYMMYk4haLg5fdsuiy0u44N--S>X$pHAhxe_U4%!Dl&P{n&pI|qsot98P%@P#Z>-L~ zd~MBiKl7u1(+c^2MJ_-VR)KRlJqhRAt4vDyj2Mb-0tl6cu5l@>Se{hhZSq#Nwv?xq zhkdo>%g7!D@b@JcE9NwQj2`&((xXsvJw2|_u1;PINHfXuZQd~2r-{#(D5Ev<)5;&6 zw;|ouN)9hj8RVjHX;`@)s52}OhW8HcKczVwt<^YJD6oi%y>JxyT=OfqgCc0Aa2!3Z zm(4*{aMNTGeX7VtiP4xgjm_q+W})=Oa?Mw%Buk2!tjWmxh^`r9gl0_o;B zD^0D}KtK+9i83m;J<<}wjD%o(ljFJ3AMJ8iZ5lkDMY0X=Ndc91m z5mOQ||D%!jx5N|06UYwMuB~~mGNRDDNEU}j;rqElq^chq*%Jb4c{Y%Zgg1=}d4ZDF zJBQ+iWRPo{77kvGtiY9{-ks~SQCj!AL&Ku%ENh6_ZG~){r}Nh_`NGq|z?WNl?8HSq#Nh>RZB+*?bw!4*J*C9K>{oXU%^L5 z<8FG|3Ug#gKV+B68QiWBPb*yzKq{1-+mC&AqC8E~QC;j$>>PS;>go;eG}h+Ks21UU zRQux1<$;dh8qe_?KgrV5xN*4y-neDm6dn8Ez9d=B2fCA~~X-#m;!Ge5{><=V^5yf*vuTm7r~4OOhn zq58SmZF7D-bkfHzB)qyQFY71Ybaf9y)57;$rIYPmApE?a><%#{!;L_%GRmc31L@FD zl{$w<74owcHA^E-zs+OPkhx1}p@(+RDWvcpoS#vtUd=4L+{~0!yEGL!7XUxO9eU5yk%9iFD$1l+r3U{Kf83E|lD9_%RiFE%q*OH>RS1dvp^VsXU6b)kNjF`~f zuvocIZ>?~n^6n?R;WUxiaJ8Xdz>hz)_kU84TV5z{>Zq)LJC>bcjd)%FIrC)cJ~UB3 zEUjkh)ml=V0@ErIB2lZch8W|*f#^G>v?N@o<{GAaAXckrd$aH`{?Fqt?G1aYfSDig zIcJM3E58^WvqtVe2*3xoKawR;_M6ecqPQXW#=M3cc>9ho-qHS+MTnYO14SF%J>L0R zFV-Ec|mP z(chz_m0#DX(QWG@b{kh`DHVtCzEUVXIjL9)@E9BdPa)H5D9!=HS6WF%A!Iu!edJ| zcB9vR7{Q+q<}vFIjl7s zt(DDI$I^?fpD_B z+4SK*dX*TkZXsKu>rE|bE_oYSgz?3T1X|+5p2z}pw0&iTXsMu=Kt}D$s#uJd?pbu? zx8vwM<+k^BjHVNqxVzuif)9^`dd#?P zIOw2Omo6`tO=#zTy=jB1$lHe*YiyU7S`?VVgZAJaa8Tk~pr9bM9dAI-lwkd{D{DY8 zj`rF~CF5NEWvInyy*DcDEE!huvAN^$+gW}r**5#I;H1DFEjQ_)bQ|-Fv6`G&><-;#$7Qz#MA_J6EtW5_RHRcVZDPH}851}j9a)Nbv z|4u0ZkwgMVe)ymWGAax$_9#kUFr{;;SE}8)BjqT3_*~wYr#_v$PbKu%)2MEe4|S!bKpToYF| zP$)JYC9-59WYBZWzxiy(wI^3;>bD)9Bo`&Ub{;zFp_U~Q03R)vdbNm6*17o`-Et@p zLa9S};CRftm;i}<>8Z+|&}huUBLu!JoT+jnJ}>}*CNebHa$_x$*Xz9B2m`RFsvQ_4 zYUKJ<3=Dh45uvz+F?n`xM^nxnay0@YPm&`9^R>Pa#gQ#sV2=pxJ07IGMXGZk4e{CP z=RK>8_b9Vk42doHJyl!pj)4BER^hI1$IRmw&-#FdzF|&J2>$pGuChk-Nwe4`Qb)nt z2IV;PTC7Pd#ls^kH9{cH#_DydSKiAgbdV;5qBEem9pq0qb0AhOUw-*D_+uy)u~*?t zG0)))E+FE=OHSl9?@(t}5EL)#^>poLLZ=$$x}e>iR(hS@D%1T&E?{sZs9tmx81`~h zjWN3*fKFp1#kzL@m6X%#OuOQ#!nTEy=;RGjK-jIdG-@7sDW5(ZrPb;YqcxjwDyXc+ z8z-sHkBoyo@-^m{3vWoRVhhSgiaIv3Soav?1Y|g_g4j^?7f(HeF0%-0@L6}|tj`)h zhbWwRgy6~VD4wV#`!<+i#b(1>#R<5poNA+P?_0m=>LRYo)D;ONZ{t^^xMW3;=KSQo z&8HHC686Ks?+Vp*=NEUqjvq(kSf&UtN(T1A$cJ8PeDOg?ccy0|V~)@OvySm@}r zW0{~8s7JfUdH4A!M~C{-J;{zn>BMh$-*&1Y0~G)A!)wel!z zP&;ZAc}<~m9UOKw^g%}l6Ip?_L@#vk#UvsrAq#-^bk9JE9<b+ESd7!NAo z>#TPh#ERx+JE(0%G{o}SYIJKim8_O{7vBk_#C4cv8V}r%u6eqCUH39fTK76-GQ8$I zG3+f9ud9ph=U_YsF#}T?^a++BNjyOu{eVxHw6pwXAL7{&)cBv7`g{05Ug?&iwlgY) z6El%vqM-QLc=I{VntZc5`%U^m{c&1%j_g)=`KA>uzk)938}RL|*`8~G9HUUM*I>yt zXOIE!;+XIP6LG^WK9mW%-*Jg6@dwQm$Gl23H9#A^mVc{KuH`;8y5;hn=lyMh*lk4O z$dS}(`n|!d;GFnrIuAny13B1seu z`JOVfXo}TGi7Hf#E?7+Oeq8Nw1wh$oDYdx zdP?%yhsvxQt#N{{;_!@d3LFR9_i>T$MZ3U$YB!)@)ato_RUGEsXz? zt6JzzKN_V5oQ$VfWzuL3YYntM**Z}E|Css)?nsyK>&#?gYm!WC+n(6AZQItwb~2gR zwylZTv2Aypx9`3G-&*fl{Q>%^I;YM)d+$@FZ?0nY+C%wV0ZciKrZ)C7b5%74t$W;k zxVn|;YY8UnQPiiRbI)!{-TB#H-6x0&Y4Bo@b3`N36T}Ua4cqPi<3iTw2;hhn;0J-YRjvgHIwzOE*@K#3Y&kdFB{7qP5vJ=$azxB8u{ zaaUlmY!bKC{SClGrsg#)pz@z~fotj|psIf)`S2#NrF@$vki`71mgb_%ocloeytS!( z+tXF@yH{@VVY47;(Z66l-=9Jo|Gg=|T67d{9NvBr9_0K<$UzZE(qc!-9q|4H@FqFW z>vNRb>B~^B7a>`yytP)JgIp*+!#`zt*9=e`(Ye!D2SU zyEyiEPu|<-J%Sb&I3NJOtyabjlc6f}3z)KGv#GOLt?8YMI;fu99$iaCwuIdWQnjf+ z*HCSzkY3G)FW%nbL#*=8c{4okXV1iuxX~<`Qh!#{y%^pfalgrAWVVa*yPH8tlu2z)DB*<1pHv$Vd!Q>PT70h zRz;?;{glq-y#R#zdkMbt9Z_5zwz*-CchhJ2-s1EZ3-A|R zrm-I<9W9N&ogfv-n9W&(6@!RU4KoXhE8LGCU%`sMYhV5xT@#2A-u$1#3eUrE<7sL~ zR&-IpujAusYSHQ(%h$f*3^DDNYzUE^%H>fiY6#;~RD%bTxP$x@jHX3v0C~evED;NRHTm?GR%07V{Nl(*Y>G%== z&T@jj+_;n_<^f}#Gz<45PX zQA~yeg`T3V`l&z$6aoCZ1?f#npIi1R%Qr2jemnNb{EJ*C!0GpS{|bTX4I1MWK+4+% z1Nr+$L7PXuZ0=j`XU7zWK+S~tyno|&Mm=ax!weg^iE}$DP>&aRvRU2s|JmF}J|V|j zO8t`LH(#48KC+BOeuLWg?glCP4s>tpF12JpnQby&*DT-%IyX&Q_u+hE#5vd^+H9=- zTic~ys~W=O7YMzwdB`o$D2;lB0-&hL8zisD+A^q*X|q19evK>7M6{m%J7z)luLhiM z%iNWF+OYJ8-}6OK*XOg88B_c!n=QenWg@BIu%rI-l|edjuIJNX&KgVlpRCY4e&v4M zw<44Ouo<2tg|q`%HfaSx2&8v#bP6<{ay%1=36PtRJ*Q9UanZPXH^};nn^g+{d zwt3V~qJ_XvLd-tw2+fug3Y z+5D~ClY-tjLH$F#Tt)9xEpJ2RJcoOu!zT1piy^1+3^eT1<#h$zc%k%CDlsCkxB{<+ zsrXkkVDv5m<-lNU&*F1hOIgoIK9L|-8?}c)!QmT&Kl{DX=a8PYRa=ltr}D<<69@NJ zt1k8(3&@T^%l3@c@I?}&`7=2GL&Pg9JRT{3vRVUpeGu*6i*F@6?9UB?zv3}v-~p{9 z3-#z^7jHR9$Kqe>zT?qV&%S_0jMo>7hbMvMj(4?D2x)H&SE>)YFtju96(=#J`_)R) z9yLC}9nNT192UZ=F<CoHqI{bwNQc<6CzK)#L?$N{b=I zo)2=mc%OCi^b~^EC=sB$doOqy_+66xTsbnQ%b`0W4O6YD`Y(mIrHRZV-R8OQ&c z_I?_bv(WRLbrj}?58i+v(9cv+IMJAxJ2woXJkb85fKv{v{?$G@t=^8V^#ad8Ujeeh z1W$j%;As`yM2fSPH>fF>f_yw|zpMbv#yYX_>zCl!hhXsWT`!l-C|A=lfLtdjQxSBv zH02ik@jz|uu&;WOPV1^w0RP>^de;h7XU5`fvzq(_J}b{Qsmq`Ux_=S~%iatiDaxG> z@Cz(ZE|Ha-e{kQLH)Qi+DD+5>XWODhBbXd?NorfJfcw19_xe2Z&p_o-f>Zk>`1@SY zk5Y4h{>~Fs-p20R^B&6YX_o^_{h`)U*{WYZ+xfi#PG08U4`n`y2EhriYT>^!Xt#R7 zpxS!%nQ6XjpB`Cpky8pQJ-$!xF#0MIwfSmQh40fUw-ej@Ilb96BC2^5^XdPkK&NnS z+lr~IO1P2D%ll}ioXN~Rde!i_7U6(FkS5d$%}SY3dd3Z*ao~?_q%FiUxq17;Om z1AuANDzB*=<{1+9v?w~*b3Cki*h@vF5ca4OXa=^<4!e{N(^YpU?pYdVQm-SMUx&Wv z%rv2CINZz>SO!&Pf(d%e9q8Z_L}V=X2UO)Q1-&%HmVP3AW~&yxD#Uw`(FDt_BouP0vK z-jdmOAsC#;KFUtXp3v)iPNJu8WBcAC4S70>A$ZJtGfSb9{52Q~g;65<6y=-X@s;1p zbT4(|{+j5b7W2_&9%Ka(N&J<1|Ia z-$CC65IG2q_2lxW$h~R+?^+HAWQwjr;#}rg?P8APTlt7_sm1kG67NQECT`Xm>0uA3 zSpV>}FUrTB-3V;0tBxf1YC_w15vspZX7^O#n*QnK2yc0{;s`cXB~}?%ly67oSkXG) z3tE;$BW21iuJ17t*RcO>C?&2yft6Z#Y{ReQ$-*@x=Cf6BJhuP71mXAG~(sYEx~o&L?OLsEkf3 z`r@R}d~&3o5dZEIWa)GdfB*P1&liu^=jSd!cuT(=#2+u>a91FuHa~sYFW-$IDLnCY zVv^=6OPQWBbYVaKh*P^tDEGf2hf!v@^rQX*gU&#*xkADQ9oc$E%+sSoM)OeYktx<< zYrIMtM&vaqDl;nHR2%6^PHE7#{SzGYU+HNpb|o|{``yY93aHR_$2d$22sVz>E>W2= zNez=J^06w2#dASV?=bHk2_Db^DvAyW6D%w2-~S74yxW zeya0Fbew-H|2~HW;}?<|i-(&(lzf-dk(^h2Yf*}>8!O=64qeG2qxA?+NN6PdA^Pl! zHEREbHW)R};qFI?^A`_h`f_*FPCFckih4$ADIrtTNEBOLTFFuZn!#H~?)ExVyQ~CK zTX-&v4XkMeys`?kS-GfzYaw2K?#r){nMxDGCafgAZ4^|6h>Rgsv}= zQ&%q~b#}+=7KL-Y)qtOSQQ-NuhIs2EN=nDDHJE1cn3B`6L(EfQybM9Y(-lwzQsTIR=kdgzJYr!v3f6Df|FV4~OC=?zQ>j(AJTO>FshX{T`5)CgtJCa)oOO84Xat8#`+l^W)1pU$;ptd3Z`d3z_0l zk2#9EQ0e*@@k`qd%_ObyA01UANYj1B`C5&&R%AO~jV0Y%Bh-PV33z|o@cU>Wg}j>e ze|YJJ$m596*7z@#z!mlNZvVY&bma<4YO7N4vP>^YhU08RKQgy@vF8}EbD85|nwI*U=gW`d`KXZ@gXt8@L z#=RIgQy4ps&b9AvCC5BFS6Ogkd-1edwj^_|!ah>KcnRN|{l&8(B;a~DPp9&3ihbn& zc<)Nt4e@Q8gS2%q{5^au0hF-|v-UhKD+%hzw<9f_30|L}V#{QUBi$pW9zpt5J~%yj zX^)cdK{NA%GJ5}}QOK9#YNV^<@q^Cy{?14BWAeYAkaJgx{U|(c9GuPAOs}|0TN4&| zCx-*L8Z~DtA*bD6>zkMBY~_TUmA`U9ZOG!M_8X6VxInEms7mNT6(7usO#JO%O*s0m zY!O2DaH9S-gV}r$U$9bP?mhU^e>6CN+&F%hMdtCP2HZOX$3%*lg1w@NL_O~Zcx`>Ac97af<#~*(>E!Tk=*!GdN4RMXstKVMu zF!KJ^y8p=a1QqUL)gWxnKuTyry7R=*DGvmr#z>EL53=a9N}7B+goYjT1#_gaOLLT=)591OjPW0PZ^_dC_4_Plx7`0VZ?)B&W*EDr#*_v{Qm z$2L~AY3@7v`lH2UQ}&u)X65{7(hV!^kr^lFwfNiPNJ@$=iyHqs6#OFA)tIl^e;*fd zX-t(yXj>8TaOA$Z!&3S1)r}vGMt&+4BnNuSlh6J|u5RUyrV$H6=~{~9Q4#l2W0pMx z1CZMljhett@+|M%Sz~rcMM<0mjuV2a)#AwKWP~|EVf(H{?zw=$)4^!cXY|&eK0NIY z^)z>zHkx5n#+P!pG`LPfGha*dPigbXDZc$dhV$f; zn}b76=?%*E8&ue+3r?E)Um0d(A967BkT^;v+@3T|tUV*j^LuKd`y`H}w)KnmtsCa0 zZA1$NlkPk}l~8i6iG=XvCzQp`wUyHSk}!n**dt=D)I!S@9(9xdi;AEba~;qHkahDg z#(PxjNio$ogFSn4PQSsd%|T|~#5Pj6EFI|=n!4;2%YLuX&{r#j7YV$ZxS@PI_C7{d zmB0{$PNLHM#wW_JbkN}8Ky$h7XI>CO_5I$@b%X?u&k+%C+Sa;6yPJI%&YqS=HSA{5 z;a4vR-*(`q)9l|^7f&F_an?6ob9mHCc#U*?mpJL_x7wZ%plGPWyw@Fu1z`w=#`1rd z<)tm{&i(eeJ9D#MepvKjJyytgjA4qxQ3+Z_W7KmX+PL)lfOeUM7LECO8lRo6S~LS0 z(^2(_3}7feJ~Q;hVDEX@X(0|%=>=4wXSbUVk_s2&YsbU{PKas$#p{I7zQcYqVQBHh zt`=G9ZV!v$EhN;m>A*HYl!(i2k2!sY!qLuPykg!ZI_r#W2!%KHdb7it$>?VZibt{v zyv`HXs5|extWHVj%U5rb5yvowGQRm> z+65l}7F8-@&&;nnYEJm+a&zAuaU}jLm94E~;*{}Vz&<6L82LC|wR-%q-h~w9LlkP2 zyxwjZqef>5tz@y)25ghgWXYupE_9owT?;?kyjT*u#BU`NCcLwMn?@XI4*6n>dvLIW zgdkNksJIqFH6Ze`Jl*W~qMvm+x7=a$zF6XA0kTf+CzI|BKmol@%sTpg<1X!o>E) z$v1lh9!+@@11^l97dN)*95b7&#B{%zzwJS;gL-RT#?_hlEso0|e=q*I<5{yAYJvQ~ zIjkTbPev;xnTiIJJ$0{%vwi>?pTT>?F3}V{Phm|B^_;Gz4csezUZ%rj*ONIqRi`WPBXhQS@lmj{KTK{HfS^ zX?W_~pi8C^kKRH-XQ-p$&=wsjJquZ9lSg3KrseZpqG43de z=pv+o9>=@NjQ}8&_`7)R4<2v|%UVx{Y2Xij}rFlT!wg7MA zhj&k3;3#HI5wqcsqv;p?HlhyVO69dQzlwtiafoand(Q0@0dry>pwT9q4#(NGCyVR# zuBZEOWYM3HlukU^_B$jisQQHHL%XYzA&xlelmrq5j*7<$aq-sH477WAl-K&}$DTDp zne>f@$NkKMwwvuyLjIP=qNLUX)r)|Z%%@%47Jm`n5 zYZ9G5ai+X{?@UB}e^I*U!_NIbh;mPoh%SO0fWB~xKeX&|yH!TW&xB^|h=@G|hWfYE zqn-uLks*SxOoX^}1#h1adpqUYbAG^@#9#J{nmu&p&`M=i#Wx`KRJPNe(@LG)6tQzs zN~Jieg50X0lZS0~k`fg&jij_Jg?k0W9!{#5yig!D_3!XysLP0ZkQyubmd#9n<&JSW+`Hy3nlM@dFPE>(OC3_#0r9<^!^3>h9$FLoq zvEG9Ghn`pKXAoXhcQLURjGhH|(72o4H+NTnT;?BFzCm^$y87Y7(7NOx)WaCihU6=? zL{2hntFPcyST6dBBAF+|azSond`Us?WRe9V9`48mw5xT5R9J5h$|qIDkp_|!)iAxU zTyO^dxk0+Qyql%;vfiSw!2(?#?Q>5>_B!s!ex;7a3;VE7HMm}7?sq?!i7JG*&wnBK zgE;ZN2faB)TEgRq(Hz=jy%J-8@?srYa%Wcs5bl0|;I!#ysK;=r8EfW9#B=JG{V#ox z2%-*Bersh5g8_vz-Bx@%U(o(Ei*O-|04Ddy*M@h_`1O)eY@S{ZV(JtrT@sb=YD zi~#mYzka8Lg03nnZ1QrW!zawO{9i$uEPTCv0*=|lladku$@Ue?(D5aPT}OulrJ%73 zgxK025fjHGv$cgbTQQ;vDW-Q!a@05PflWGD^BT=VfvnDWo(!kj@L-D@Wr4ydg%@=O zRE`O_oAC)L%+dby&cjey=G=hui3H}@f4K+#MLQ?w0Y;C6kS)g=% zb!Ca$;>I;v6fO=-y1$$Z^IRuIsAMoQMyOX4!i#J=MOUQ8HySd;9!3m_ts~+by4$30 zc_u|;$Hl+D69{egO#bS55R2tg7_p!s6T4Tc|u)Yp7 z^$z){aU{?i==Wp1a;g07YKCzN!9;3XYpBPRbLLK-_*M&9w)|794(C#F1_%65+C9_J zgY3TLOlu=|_tAB~rjh9Zh9wo?TuaOP2gSULj@2&*27K*Zn*H7tx*vj(wmp0{Es9E9 z=#z|};ai@6Yy32vrG>ZaFzNn|73ujcc%q4Ho_Q?RKqO3cTnXHU;-T{&CoNIdSlP<}e^q-pdMgZA<14kYlr zyKZTO@SF$ewAu3OuLlS{i4ghFpbm!b>rnj9DG#~bmk*xGt%XVY2ZOEd)MKs@stIXP zfK}bJ%1!|^0wU??S)ZmS*4f7ZryPLyl2=1y4*Y=A36R9U z;+_xCefcpP*A=_6Lqz)6r{_T*M0hVA^LpL={`R(cGH}*xsFNaS78o%{Vh;TSC(urf zcr40T5wOvfpfY%*^-Ey{t!3d?6=ziPZe`|(kgG`#)*20ms!oa3sTv63{fTL;x6)&N zNilQ!Td6VrlcgCm2*+S^!|veD_puvM_!x5cinF#Wy9aF`-}{9dUeIFk==FTpR}A?j zF!0tBZs-|(LwpZ$M5S*4b?P$Z?7kG%_EgT^zV&!1zuFQY zVF9l79QG|(*yqiU6?Bj(={h#Nb_Vp0H}{ulyUfvr5U zj#y7kkg4LH-6B|sYML4b@OW>-@xJn3oiS!&v2x?~^mRiieA{rKDfxI5d!Ghj>2IuO zTWdS-Au$8~8qh~_+-J>UHZEsJFu~Ok1~aOA+7llaNK@X^PUY9CUn%5*0|L4c#gVy1 zK}?__;mzu(*PXHzKR3AIq;|09O7hYXlP-J0vgw&(j85-;N{8du*f>3s3f9bfvnp(K z7JLeOF?q;O>FvJ89b4L_2Ir!&IOY4Lf>P~@eH2dEi*=0jf#6yGYjQOthd~LkKH+0O zf%2B1@81l;+Wf~L`M1oE!eIXDoerE4nt$LjKL&sbiRbtOWq5m?{kV~)(~sv@nL>dq zVH*{vBqeJnS6WD8+AzIewOj{$brxzGjF{%}*E*y;AB8s?&L6EQN*y>ts-@yUw`B0~ znlPjt4)q97D|z4ina#NYAc7Vu(LrHOJ{u5v1?52NF=uwk3wOv=!UCzE1K5Tf$#9if zWjHRUe4Aim0bZ35UJ=Qo90Dv;ggVyoRPJ8#4ck5CMCYCaD*Y3u0*Jms(o)V>eqdNuW1I zdTPKyKnd-yTSG&&)KWYZslcjOP>UYnX$boF=$iLgZ>+s7s43_fzai^^H&N3`V12?M zDer<;Pz#FZ{vMXuBAF{+vfWk~r5ic4kTb*4RV72{)4$Z&d>2b_G#z5H^Btv^Vw@9Y zKnSx`I5#VFSh?hcgiTSJ8Uak)NUcOn2-^5xp7id~UtL2gx|qcWC+V@$rN(=+k%lq< zE4)#p$%=KPJ?XN)>we|OxhvcY5_z7@OLohXdW7mjy5D@C^0PfTW7L9vvpoZ%LFzu} z%cAxMqS+7nYXH1_!AFx34lGU{RQcL7@G&5X#T+!_fRS0( z?LF1}_pI+`Qm=9=cW}r+2tyr($xp?1I@J!qdDv?>%G23HP3>3u>W5|Qn=<-Hg*<7? zk+%$Tk=QgNR6r%;>2__@TIEhhB(-9Tl^U_4>R%KOe#tXd5s4-^@eb3u z^L2mG(8B^GbS2}{mh_|jdaDOLpkATic54dda#rV@%PDj6F`$xt{qveq1t2T3IQuyZ zx7&9UgHX|htNy?!Bpxf`niGlG!yD?ib5|30?ern{2lMs%Ymv6hvSK2yI>2Hk9_~)r zvGC&C2F){8@xu*Xx-z}aXaWEUI#q#zhI9m9_Du{Ym5nKSt(wBqk=SuwMS`L#T~Eq* zMGQwqVz^dgBW?B{LWghiY*=+CL_stzH~7C65iDEafuw}JCj9QbqUYRTv5;Mw{1pNc z1(`S7>IiB3YFgp_iowSJuVeP(UGUuzcIAt0$2e590^|7yMXA@>ke~ZGSh@ULfH#mm zY@N#N4i-GT^&4tP;QpK;0>_SjqoUKdM!fUD(srKEx9g6QA#Ug=ea^ z6wqBM=?#E-8)3yLy~ac%V#gl&K1O%qqUjAOmp;e%(1f=~v$>kHWoNr7RVz~8jjVk? zC#;f|6XUsS#zrQjgv?U$c`GA&A!e9zTNH=L|7yT zu<+rD${1p7mtEnU_?Qz3hO%uzZ9IPc)Z-~wsk=8|*c3Sg(fkTZo4e1*ys#H|4U+Ez z!WP=&hyI2J>%m#I-rx}uQ^tTwsX2WA%!%EdhUVq z8o-nB!5m6rvc;crlBV+giqWGy#7XRZTv)`LwwzwRdhTKG}D2^L29J4GdC z^K{1O(g0@qOWAWhg?IkAxqU{Ps~WO{X)&4b@=SUj6ZFjE6+B*iA$^+v)Q7-K?9Q%~ zZHQ9NOR!{Czu-FiX!9v8n#i_L6M-cQ(rSQICOP7ou_*e~*>hW0Y)%HPUZUgu;&i?`)_t0Bx@$J5O`n_Ds(q}Ni_5307#fu?y z`9%q!g$5s6j<7gIW&hn}Qd~Xcly6)iwWIv2%Nw%2l**#|CLz7@(P4P6@8V|L?)UxI zDGzIcI}gsgn1poi@A0>CccA_Z>ZnhC%!e6&GOEL|>AM053*cuD-KPwH2eA(=#tdB3 zQ$)KrvdeP0Ra@==6~pK8ufrQ1*%KFZNr?(9aP#-WPQ{zu0TXlOsc>MUDi*}2#Zg|2 z@6Vd`kM4}cMAR-X7WXX0e`2r}8zmD9>kjy(LA9v_R(z(OW2w3A)&q*X<6jWo| zdVBBJj^gXP=G|2u^sSp04=Wg!kTbFtQq$jHI z48rVHjyS*rpTCNx*o$I+T+tn=PTgqzHrXZZLjWgFmKp?Kyw#H}L{M`xb@y}Q)54Xk zIK?^rsZXdX7Fu27ul_Ni{ z)WFugnbYq=P>u>+ZuMq4@Q_XD1}&Nln;w1oJOQbs#ak&tANb;vpB;dh0V`tXK9^y6 zIYRSX9ECr=#lOIpgyxPc6=O=rRHR8%j`8(JViS3dcsP-zkiYF<*7S?~r9+8+y>b*; zM;BgI6AxE!>PZu7EH>LHtK(YsVw|XU=;%Y>uQB|W=0!@D(3hgKd)1 zn7=QdXd6TACDN<~eT8-{?3q3@WAe+Y1Q(Y)J!w@dd*F9Y)Qe7Z*iUyBsEMqVl#ZbN zwf=Z8Z$(I|tCk!KYYGFK6}Yy&A$doSFJBeqvSM}?ait~+91XPbMZ-oSaP+e}U45kf zzJ;2+$ZSFuo5wk-<7W>sNsPa?)dt%+YPwcFB{PqtcZYoeZeW2BY$UJgGT!e9F~# zGP@E#_j+)=2Q2Y#5x6Ba8+g)0OkVQ2U7~`|N=Mc%eryO2izj_JT{M3*|32ThSQzN@ zosk&k31@i2VpX~^gmkXA%%IrD-=pdu9uW$V=I-kRDyiadU@)yZpF zeAvPBZOd-aKi+iuSzRS*QH@A)UQ8M-?!!>fCLAsWxwLpwXfs80(&s{(_}dkt%p#0^ z<;O5v+p8+Y-x^J; z9UoCvXr?>vO*<_KFJ1F z^+udVm9Pc_< zjtejngT3m0L(UxbRWKJx!tzFQzSI@^00saVA+D~-`HZBJWI3Z57AeqS)DqsT5W_5E z*wL$nSV%Hk&qGCO-WEn|cI2KwT@$lAfb_wn&jPcmgwfKdAfvHBL6-$3=L69t>Ih9= zBldOBZcb@S1bA6cnu#Z1dAqkyv6lW}bivM-qOs+lR0!N6rDDWdbWNI-`7Nkerj^uqt*q580@#{>PdO|Mg>lku>`0NPn1-rt!B%pON`Y$uAPv8HG7?Zthv{r z-g-d8@~>GG*?h{i^()rP0c(xr$pQ@;Sc%Ns&`E@36BIN{l7}kZIdgVzA`$W=Km9LE zS(PSJQecvz`Ap$Yb+VYwHd4f<4Z-ml(+SJ-d|p5-rqsZfG9lPpML=hFjcR`69GU>g zMkzkexJqj>)t(j~=N`{pMucx^K>$Sh4w>Dcnv%`wmaY5``wEZ86gh)DyP)#~QH}%8 ztraX*Z@{JW^D@-VX~Mv4Gq@5>#c%mqPDgv>7jV$X;89I;&4}dit;S z$Hqi8ox2>56KQ@olHgbPWS3%G{9_zq0_0cMFa)V)OmK!^buh zba;}Ov21V0WzjkxzA94i$~XHhKz!2*yU_t8UE_-4wJO3+@Qb7ffn zQQzhEov!q-$|AMU#^hJzev`kI#Db5$$S{vB5LR*8JJ8h?MlXQK(4xBRb?ttz?!0h2 z%foJRuUp@}Pg#P4H>mj0zyD^ZI5QCPp&hu~7RAAqe2QOSo|ESo)DnnZO|ixJ+K;-< z4*~jHuuE)`*X+E-&+jCIi)n5G(W(=PC+;Bj!58GU+1LsPs6`%dG780T>jc5FV7tqb zy^u*aFu#C|1$PoL@MX`l+JUCd{Hc-cBOA-?XTw^U`5MY`$G12V9!+@nKw1@bZPO-63mQ6ycmdAl%iiA`YV;MT~ zhM4}~Cd`PmNkUIGZOL^5mmWaD$!SRDyuQJ@CXcbk_u;n?i`DE2EY1WGU)!Kn?TC}B z4(*HzQPNJRv8)?MM5GNKb3Riu1*P;sUsR9AlSPfWJ7$kh~ecD(`S48s>O zs0|xl=e!!tm>i_hS4%D2!auB}>_^01?ka14VmP{2toraWce>?nQfI4fFpd5^mIINB zZr(wd23oi`Rxmmkl$Zy`t;!Mm&Bk6<+?mU?l_fvuXaI?JFUSLYQlvF#XJMqp)Zu8~ zQ3OM7VTbwRgE815><<=^HjiPdbFc?_<0FP3MoELhn(GZp5eM|=XW$`P*wQMiHkc}8 zS}9f1>drzr@!MaSHlNPe5#M^Kb0yasFxVe|=o?Q8x7DL!5tFe6SIT}rFVUi1 za>*evb5dIzOsJ=Zy32Fpr|3kiyfRI=QMurrHd9pC1x+U}p7l4Ag-4epS^*P69pfxw zXW8)mINNi5U)MfY?^LP0`9DK02>gHAJyPR)->Z=ilGdI!z*%09G@k6cqyIQW?J6ET z8o*cAeBU}++p}$gLj5NAbl~tgFwr*ue#IxB>E#`6KKFvu)A{Olek2Z3bf1ut_9)Jt zWc0uURtO7mu8zAk+B3|r%ss{tAO4a1>Hmr4FET$^LZ9|Amkpb@S&tOcZ#W~|h16weCBGW3))IMRs9l;wJ^l-F^f zEG}9azXFZQc&>hML0mksr$PS2W~$>Cym)${v9ZOgATm5YEQ$wSigOBl2H;sMOXl!^ z+j=;R?>V>Q-sz_@KKOwb(>J>~T-dvu56cS!0&hG1W|b(W>AUzhU|L%r<@Hf77_TiW z$Pz}EAX9LtoxQMb3o|jMN^MD;Efea!7_@6L;&Xx=D)de{@cCOcL6dV+xncqLpPS z8U{zqLja+kvhaK4G8BfEvbY)2XzA6lgoX`Qq?K!#L)o8*Btp3&tI|zpl@i2qXksEZ z-4(oI_6P|2YN##yKOH>9DY%rX zxHt2KDz&xNPjlTK;0Vav)St9FT#HLy%&nvuj=j~rY++iV9F9Q< z3C@vMYKz6SlOWIDlofmX$_&1$10k2jHsSWs4e!lnyS`vWsQW$a@shF8eHya&Js4r! zyo1S>Cf}f=s=KE4u7V?@!2w9rdW&dYV$&mWTq;lN7?_Qk9JulI}M4Q@$GF>fjVE`CJKjck} z7|Il0XT>RMyE1BRp!cK^=L7tlU3bxelBRm!jA11Y`el8f`_Wl?#13*n!fJ~D`NNsh z*`hQXYk^8v*Ve&FG8Er9OObZk^gk~EBqw9l{JAi!2M8;$zlgFYUeyo=j^!&Bi zgbDo5<5DpgyPY&y!3iC_@#cMF8p_`LXh_|=QyA0G{m!ER6t7)#8p|f!c!1EQ6&i;6 znWP^l;yZ#B`oKD8r5JNsvGIDE@SGCfYRmnoV*d1~px}MgrbO%lJIqiUS;Vodxx$2u*~S33 z$}(g17-7Y-*c6(iMFDJt?c0hoX*iZHYVjVC1-|x(v;6TdXbAC$glICVeS0ZlvFbvX zuIk6kp%_omuh>I!$?iW!{g_gJ%@Ag@vkY_ikcNcH!J5n!;CMb$zCG0_eK^X%qhokQ00J#fa8Z{s&uD&zOz4cH z5m4mwnvPhx5|*)+iZym+=x0Ygw*i&Sd)`7$Kks`WDZUH{!(go($^_sa5a0^+{;EcR z1>&Gi%xsZ4F#Ef5h%fR@U48~RSMNQI4+-SW_(y2>23<#?|Kjz5tpkx^vJyK*i5!wz z_22hUkhc3?hP7_ZYbd&7&W@VDLAZ3?S5};wyaR6$V-{e=exO3Te0-hPT(nrVS~Q&C zL2|bP-%R3^2iNszpEIRy^uo}37cL}tPQG6-AET_MB0Hq@%!!u2H<>0{LgPNObaoNQ>o%WWT~~MM-w=^ILz{BeZ1ggS$V`@rvz8^xpmSetYcuwm zoC#YKsKa$+`dgnlbcs5M#fVr@TF-Q1bi`w|HcPoT;-aR`^a_ucv#urRlB}mYc#!SA zMI>{^dB0^^T!1^bvi>VvCEc9vfEer=< zJI#uJ4|+oEcldMyI|z*&QA8P*e2Xn-<&?KGk%j$2Bl@f8jgJ1FVX{|ggq3|wMmkbd z$sL7wzKGbT+E`ws(qK1B>`@Wlwde&&NfCG^)JC7lI-guraSKVfWmmn5n5%5(%+2$R0t;P3dr%iB%Q_oH<<|T5~s17#AQV0GiuJnQ07Pz4*PubQD5^09$1`tgnoFVoz&D2dHU$aEmS|0 zUfk{nh#fQ)(ofBtd>F4N`+OR{+%A716kc~|A5Fn?cKn=g`#A}}`CI;aDKlB<#fD4; zOH$i%7(oIsoM_uzd&y6h2nh7_WJP(Qt=yPx>{3NN4Zo}PvH8iN*6%wik*FrzA9l#H zeqizad;NHFtQ%{q?KA0mA(3T6ms?xriXnD`(dhafxrrI|7|W1<+DvTyhL3CG>v3OPVyL0-ybxS42ZpnfCl;XN0$xyy#`@~g`pFswre#Rt7VDIZaEKa zPRE_@5TmmuITL1R=|FdUoN1(KkJ2ksTV-_Y=!F2kR-e6+@f5346&4;EJUnAROZ#1d z&$khL27^Qckc}Z1l4@j!qxB5UiQeOL2Q6NA_Q4SPAEqLCubnCX()pt@yg}c831A2< zlr_jpD2PRg*fqAWhQL;296mwl4;&wKGmBqh^V%(`8hQg}u5><<96VL8tu>$zgnwaU z(b7%9lVnxj;hb&q9Sdj8-j>)iS56klqIXZeza%?I?j3o@-MVU;=bxcX^6R)rTCfoX{SDi8Hv=hPvHxnhhJ+vL?);WL9(d>B7V8 zI9zcuLuQlY_D$WAFy5jn)I5=kg@aQ>4TDl@=bX{e3NzCp6EvPM^A z-oISHBT;;`;b=pIL@S|G{}|h@wkhUu9l5(xaa=IlTdtFmLz%cnA!*YoBEC<=kJ7pp z#Y61yS`2y=K6_oR!qS@8rY+_) zRm^N*3cldO6;l+m`06v4$qyDFU@qLUG6rFRa zz}z~JNB2aIueBHQXbyJ=hjX4*_RBJ+g~uB9v#C2;rd<_ybGG*++mF*cCm7HZU`*MM z#69xG@0Lh)^LhO8$EyjF4r;qSg(h#ruB_Qmy}96c<FJW}z1b)ahYRc!MNcr_)}cyIKXD6Qo_av`h+Ig0jwX4a0Oeax;GM4C zmi>$Yq%K=v!>d#~L#drh@%|NjP8Y}oiX5W$kHrEWJu)F=NtN!=C-fN(sV;{ah!f4* zs<^Vpf7({uNe&+|z!otj%ziFo`3l(uWNaqU%^Cwe9$nroQvEt=Xrrg#@}Miv4qHTw zjOf{`9Z@t0shCr-f;BhG+*hR#i>F z`q{K`&(~1TE`r`=4|q7InaalajLd;Iq+RPzj(v;YRJ;G1Y3%kvZFIA-?~2-a#K#>* z`F}ipb9|g#)NRr$#iI^kGQcqMBp16ghi84kKr=;;-c11Fg@b)5{SJfcM@^wpDrIZ^ha(rFxTN zwEJ#^to0a`L2=>19VsBP^i|yBx|Vyj>qW0NgRZ(;EYE@+V{%vrG8*8Wo}D^OL~?rC zMZ@l<*vgi?Y;mH|q&YI(82g$JWgpv}hZ4&EeWSmYpuN<4EZV{bDh)46!+I*YK8owb z?4qJV5=ol$hqJScm^QBK7G>QY1}jF%1}2j+ok>$|6ToUYz;dVkN84d+!)m054cei4 zN?tl=&c5mBfcWDjiUc@4B90`ni=QTPc6}6K#b?-X5kvkl1x)6v_@`k@+B8Bq&r5gV zyT%hCn-LEqyxN`Rgld%9z5V?i&!XM3#7=fyi0K&u-egqsgz43Bqw zJLar91YbzpgarLv-KIC^XCB^aoA;|~ZA|emG1a>#+Lj5O*-U>Hzv5J{{Q8=whNPh! z529|~Elx=C*UosoD}vU~A1b!A`eqX*3E}ZagG!%ji5Y*VUMF8QuBnSKef3lKD1Q;% z?QNm8-uAC9G?uSCy;pX9RhHAdR2Z<9v-$R9AAWcX4>=8=L%!eSX}8vOu3=-L@PqOD z^cc4RDPLh*_SN)0%von`&YiZb+|aX}VEoI8JVOcKhnjVc-C@s`swtj~i5S7>N+j|h zZg`lV4j*&$862);NOx56Y=vg3DD#hTToSr7Sk#2inGj!B$Rk}{at2{-b&A3ECAy#< zBNg&GKS*R9^d_b|iMZOQ`(Ells?}RT^cnmI8BZRjDE2@}s)s)|&n3GG;GQLS7xU(RXN- z)+4p;HxwF*6!TaxIUJTNl?{m$Vdg~mV`X-?ytx&0^MpR@Rv=FcMkv+&TJ_(CuniOS>ik?@=rH&bggr^4!+|+gO)AK`s`aV zzLTWx$&vsGg?vSK*u|zXmYB%^%ySujM^dWv<8C%%VboiSYGNV_gCva(E#KEG%$05P zHv^4j^^aG;zlixT51NqoN*vlXT;azH#9%6nX1ry^il1a`ziG=mmC0D!hoWpUa5C5v zYaQ(gp@*js@<}TTx|8H@8^lDJ$uMfGwG~Ry!@Q`8)~L7--DHk^u}IN6gobrFQB^7N zsiAqisB~`NmMT5+A55%B1N)0m7HoxD{y?-!OX%NGQD{+NcrJRR^7`oxWydt#T%Tfv zr5*1LIX8yZ6Cwl4!R2v?3h96eg>|DO#YibPcXi^emjuk*S@y11Y_6+>2fb`pU#fNG z$I5c=```g-&S#P2qo*N0eJg5LrjE_gcfZ;llWUIVH)u7#@RfZs&9W(d z!|#i?_WkP*jKSQgIU7D$^(g6gBMPhQuDfcwavI+wiUGD&(WYyW%WMZmT2+F;X)<6j zo{(`^cQFLe)|MvCO_sv67~P^GxuuYcq#pxh2pp?pHkUKfx4LlM!R!90lF~u|I(1W} z3Z}V9(c*vfwMa%q2g>}WH-?5LtdIQ~@^o~9ueF{87-paN;Y@zg>oEPILj*Qip}1I^JunogC;jM%EU*bGYCA4 z(YP+A{e0#p^`YG_U2$Vo(3MmiQX=#Mc2A#yKh2^o^7DoogP?#B;R-1klS%b1YGer0UY((GJT>%rseqSdV0mgza(_14rqxs0(%o_u@^Tj-l$BAPmAAO;ar==)+DK)I zFJ<-0hs(pCRi4&p0hrW9|oRHT=|81e#aHv4xdlmzWX*-djaS_^vm%xiNJsH+Jh+JkBlxx}52}RMs@+VJp4NC|k2bD~s&QPgP%$L5B$9$XZZ?jNrpX1Mg7aZ?Ibu$RCqF{yz?6Fyz5Fw<1_i6BNdml0sU#C(MS}7~` zJ6_Boa)4_=98FHB5*ouhedciYUo}w!&p1kG{KR_-{j!Z4#?&N2Rh?zNv|wA^mZP7L zl+z|VMi^sJPOC{A3x4%Ug*Zd)LRMbyvH-|8c7D=~Hmr}09|2qmmvstcM`#b47%mf z;VEtdxUra~{Bnqm;s9~T&6r2lTIiDwn*)4uyvr2$ z!w@cd@l8h`Tz>)x3z3Ma3x2>wo!E%srC7Q@T z3a3$bd1sc``{Nz^%(uQU5gZ}WwrY?+}brAFrDzRHo0(QM?KqF?0D>4mfrhp9rGt`|4W`G zt-Cc-Hob5hj_>YUpHIQX^5}0R2o;RFn7O1blE#@RCV=v?Ny9StX+NzVkj(`u@F$!x^I-*&IEbjtW0wZujsy zlli9iXz7Ajz@YP=zc4;?wiPs0F&geIB{*^mlT1-@or>_`S5X~jJ9cMY}Ec${wdFxuBl0Jt0ZI z{o!{n{*SPGJKU~$YUJvjq>F^nOy>LrE-unfId#83jnxcxQrAd#se|tn#k-uhdLa)G zJ}!)qUlOMCO$;0!sPy>qhOc3B0tvs4xBX_?P-WVx|yfRFqdHyBL z*BwfZ4VK@tk%>HYr6t{dfLI#aW#iHpnG1Ls*x! z6wupcN@la2UJdqeqR`6`AR?T|aH`e?q#OCQbPRV zd9ukJ9nUCG<~EiN%XMD!zU!8g>7-)u&1#UZ_`8me2VGHu+Vt?GBs4oB3yk)rg+IbP z>#`cDWKZ{vJ(zt*40gtG%w@@X{6+xpNf+i(If196oOEWIZkM$Qgb3twLvpY15A(aJ_nbVp@&$;H|P^%|PZ_Yh|~~oH=}y@w+TRXn6$s z6zRqdf_HR^+xh;1cowc%ks85HAbS*9{A9^YvI32hq2)PY)8&@%ZZxm;nz&@N3g24rl1Y3HxL! zsCdidU=f=qYP54)RC^_R#hN@NFAQ1FubHa%Y#XaTo#4#7XwGjh4Sasop+b# zlWIU@cQY2BUxxZ4HhPDe+;e9~V0FBn=_aXOOKY^jKWv6?W(>f!E!Ud&pL^#U5yLAj zyEaIvlv``ZeQ8YeBSSR?d$vebzDXYQ#k)^4DnduJz_nL0ceYK; zV~p;fOSH+=ABhtw6wDLuRU7TLoEAw-YRnUNib7v33Axbc8BG*Uk0kf<%y^%7EC~vg z(D=o5xBUzwk=k=LIeQf7C=LFy+OBm?7DM&F1E!xG>LPZpoVU)2FLDssbLW=Htl!QY zF=g)h<`-arKngM5UuiQ(36e1xEB`KY@9(lq(lf%>W$)9ySv&=9dzOj=VcX}af?h)t zib{nT83UdPps8qS0qits$2d|2PM`%1iTaRM>Qqd4QAAwSos7sA2Qb6mHxMI1MaNJm zCp!oZw&n)vsN9Gcx0zF+>Zmf*LVID=63O%bwYNDyHMNYzES$=4XJK9r48zc`XveK0n1~rb^Xc2 zmp-!-DE z*-RLmBN-pY;&UQ#TlwR%Xk$8T6{LL^9Yk-W&JK>~Z<%((g#Yq|`q*e%-VjQ58=|+bL_E9dK`u85q0%ymAYBYFCSw z*7x>LePLF7-%%v=eKf`Fvf%l&8)CHDq}B1g>JK_bV2N4+hvP@vJ4(fuq*>u+eP~@E z+UV(*rzLq$GM#wMVaSLt{WF{&ZfD(R!Xdm$Q-AI23qcjyVD85eQKcch7>)RSGF9|> z3lE6IjrJ<`<7ac~^3}Srhm&*Kc5HBgd^!nn+^8;7MS&Gyf!(KohZ za##J@oy;MrAFBRApqvP`w~O)s@t~K9Z4l+N1o~-tD{%Pl&Vcopkh0lCvec$XCu&e% z+n)+m2b1+a=8FuaWU)R>Is{mNuQu)Hr1WpZ8*)!K`jhG->*$34&jonNuc;Ec^QA;5 z3@15rj&R|4Mtk$1KbiJ27RT_g5>9JWTg&qLd9S8MFQc2$mvKk2GgAk&R>h%kWRlQt zZuoh^ZAdMx7iRi)Nvfh_ZB@v+Uu113m5cOg%)-EX7G3Jh*GV7w;z zRd<0FUsbP$ihAs5;{&17GQC{hl=F6PWm+(vKKak4FetMd3n!t0UIqqx={MR46r57C z^123KFGkVqsX9mc7wR-yReMN)PpEmvJ!kiu?qd?RpFOPE&6okRkC$o7lxJwza3pL{ z8H1!ejip;d-(>uC7D2!m?)}S(Ne;v)MP#fiA9@P1MF~mXSJm}vFXsYoe0G!-oASx4 z%_`yv^6~89Q8OXSF}l#U1g@C}outqjkAqgZ=^8wGi=Cia`_l|yG{u8iRR9BL9J8)+ zStR$>k%cqe>P8iqaO>+@{#(VfvdFM!76no&fdUi{olbrLw}lR<;JQ{vSC1)R!!~_v zY9?w*X+7pdh!)HM(=cqJtY^?xrsE~hxY8flMt6%oD!5DR)cZDUp^=O}(>w+U@M>MM z=EltT%O|uGTnPHXK+vTyh2X{@SudOv*adB+rr}p!PM5nVX zXREQOpKJk@4hT7pm}k3YjAIk6i*zQ4G(eVYt8Rn&rarb^I|>?#!_G&xJF$$Gt6E2r z`_{BbOPRj2Xm&CuFPV2U9ZKFo`JpX%;DdX;X;J7)2=kRM&KwHGy4YCDbq+mzscxCv z8Sdq9WfEnm+kV!939Yu27^DQc@#s5G+(=qi$%17^aWHB-cgnyphC(sf!6ZONH#o(r zT#;_7;1^AH*s#xy4^O~Aq=*oK{~y}9473=>4qyoCVQ2zc<<6EeJ>TgW%Z#S0};hQc8=8c}-TU-*Gp|v9P z(c}(JEM08=TmcP#hdJYtBur`;PG_YO|1LZ;$dP$;!ObLe@((}zzrgOX!fvNWFk^!S1}P9>HX!zw_%ZR}#{p28#7i)MlpNt<)J`t!kFyAg=fWMI4{q34f;eUIaN88}G% zyO#6&@Wlk_Gd7x!KP!?KBmgl=a^);+M=_cGV;56`lE>#J=P;&wi-&}~2t6S|Y~s}8 zdDz2kD>ujZWq&E4;BjbNMN`HK^3x%0zb)kMy58a#i45hJqVRcWDPp}_MzS(m%O^4Q zgHRuT{N3R?J=H$ddUQqRwYM+&6(r$L3evz#AAKbiqkJO?SsV%^>!X3+7uIg}z|(i^ z?Ces@to07}plT!>V1-ueuZNS9rH3{f(Zi|8;q?`C{egqm`XBf_eWp2*MF~}E)a2hw zCMZlQRi3}MBy?4UjX#*~n-T7$LCaR0<#>%+badddLgqvxM6>^JXju7t;aPb6Y8#dUOMS_e)UR*Z%|Mp>s_2N6x>uuVAAPp(Xdi(al%l;yk7 zO)CiTqKAzxLAX9oBiZ~V8-7S+7P{7rlT9X%_7|s4WfvCxvZPyC17TZgxz1p^<-kES zJ!S8jH_E`AUBy^ z>&t^(pK}}hS*D%{k9zGCp{}W(QCi=*i2G;ndu)y-KOzcXs9~LQjy1x3ahkNi8uQp7 zArdrdYNnzwWN z4&Q_i6hwaMDyw4UqpFLGb=$|0a>2Cl8tc^(JT8wb(f;^J3FE~W6vPW_&Z=qRg9Yjp zd61TvSF5*5x_X!f3wcIAHWpufq;?+U+QtMfEhhb?nGbA)V|c=3PCB4gdHOc&Z0;fe zJ$}x$%-s^q0 zk67vh!CbgsP1gAs1HaSY9I5;FUWEVpE<8yG0Y>wmayy5VB=0JetLZ1y_2L)op#u#Y zKWt%a)xVZ64I`eu)<(jo+0gixkhf+Zmp2gSHkv5KV@REM;2inof4c4p+((f%RGLVz zC*(FYQCvrV%=95!3DNw*%29#yXyn2Lfe z->Qv0dp1A1pn9`6D-)j*yi=`4oLAgI9Fd3t51W4fi!t=xpYYt3Uu_uy3O%c&B z>DR5O1(&Z_i$EOtpR5DDVSM?3{9CE1F5VTO@)&!-~5!uFK{)|+%l)ECvIgm8sD#%U7Tv20Ls8LJhz=ljTvJCD}0ISaYy6LGX z#@*qo5%e~$(7+x!p`bM4kv-t#HE*}SUt$eaI(IDkR+ws_^M~k!w#9LxApi(OJ0btw z_|G!8h=e110EpW)%;GgCv63d+7)21(ivAL5f@C&;c5D{<=}f3eR2W;wiM$t$(Z(n5gXG@*!UFUX6!f-q@A` zEta8w*yk4PZO5Z3`Ilmk{d{Q6)z{o{zC!NfDHxwwz0RWtW_^_-2N~D?qS>ru9A?6< zZLrh+?h0A>C*+qU&(dZ@aclh8_xuqS?zQ0~Xk*Oa>Zg*h7B4j?==d!hms|?O zqAMkrafKH;>_cR(D`LQ$`tc0meD16{B`vd_%)$xxqh{*7Hs9a1k)()5oz@v53t?-Rn|M( z#K+u_dKMDR(jcnj(B~<*h5V^!MI7GJ3d!n2UAR&y32E}{oJ$pmfBGJ;p%?I2j9b$* zxT7cjqY_GVT!HtI=Ol(#{sCDFE+$1m(Re$)@y3bh%!uS_-E)vaxhiy%V<8BJ4G`OZ2V^VHroGT2SA z`1qbEj}o4KSkIq`7oQy8I#>p5rAgL`%^C*|DIE@jVH2a4QO9C)4$x( z!rVKU1uM@Bja@=VmA^fcg3oL34}!;V$MB7FS&VUNqe(TGzgEvzSN&4#yKca*21%{; zf92@1ztX=JMiw!`1E&-;Lr(_E13POgMe*=Iu5p^P^D}WvxC9>aux>I}&jWhxgEAq8 zxJDt?Z_-YUJb4cjlN1fT4>zYr!wuO%%zlTEv7-GuPDk`ZW$(Wa{}!%=jk_1xm=m+X z@$HP(`X0!Kl$9_7_2M(|3yR&z6Nm!Kdne8~MD4Gwu{{9=$*oE`=5z8QO1c#X1DZAM z>cL~9EedKFd7iKy<998M@v%>Eu-?+4m!X!}B_b!(-Sm=WshF~_4d!L?R7ydI)@HbDM_AgckS>{wq;YOR_$#bP}P~j?}@6*TO(Ny@*{|Q_Nz% z^^t;UDa7eq>}d5h-O9(|%y)Y~W__;JHFkXhY}ITcQqt_@m;xE&iXa zjaN^uhvgNn-HW~Di(#Q-&iqC1Z$0kprYVUQwz5L3>`5K7mVKXS!eS1XiZSkgH50^c znU~DaCHp&Jy*D#@j`s4jq#v_s>-fe=x~FoUTQ?H7A!DJ@UINnZO>yf|AW`|=iAR}b zt-GrN{#b%>p0?KJE2PdunJl+N_79ul^T~IQy!_Rc^z`9v{bB=y`opgwKQ$pM!#YJ+ z{n4sfdX$d#2Pr94r(E-a^`G9rzVekXgmrDJ;Vvj8jgi~^V0co}))(&G>Mn3Sy)UYp zONqH8TjHo6HCuNkcfQ_vI>_-WvdCW$@S5)ou`4*GZH$6ld&QNy>ndmX;nvh@V9KBf&NW#r8qssLr}cM^vJnA#u&-w}e7ghNof@i>#hU=o>gQ0dU7N zPOw!Wn%9b+lilcIT3AH;Gi!-npBto2+Hccq%LH^&gP1&9qO;n=Y5Cl341Ee*%`k6l zGF=uhKOQzRSLAC=^NoMmH!G*KQ+klsF?X%v^>~JtbKU=Vpd06R%RE=R&EO^Wy)$v= z%b95U9QPnIC8Ef%5!Y9h={*|!;hjCUrq;yaB}2|a8R;=UWN?C%=BQ34Wik5}(6jeIe=kI&UZ7w~_S{=R+-fKc}=nx@rQ7 zR(w0xj0AH1``+(U>$V$B>ooEA!j`+AOcALcT65Vxsp#nO0)p!B^Jx z59n=)uY)YRcSL48KrN+DCh!e@bV;a;i3%fA~A)3|6VQ%ducB>m4$Gv*4?`8*QH2z-t_>#YviN z*w7(T4Z2f&FcdO!BrjV}h5!w}115wKnWHMLZ@m9iU-vY|a5RldnYaT53n$#kM z63$zSpagAJRIV(BWawJdUxBBk-L-z-&>m7Zn=YAsa{V<*+21-z*s@U~K4dp7yd&w2 z;rs{Uji2mp`v`yLhw{ohR&iIzT);+$ZcR*sA1zROT}Di^&bxk<$S(AIgXw{Z&2+w} zmcg56FOow~FK(Ho%P}>WvN3&`%kdQW;+T~xUYmASNKi_`%$QHOE>T}$CN0b0!m+p~ z`tgDM@;k~uawrtmY-swEHU9R8p?i~RO(`*)W!`Lw%jlXjZ8b?8S{=kJHL%wIa+|pF z6w6l6(s8l)^>p9nrK2_Fgp;V#u|GSfs>k!gb9pd*E+TE9`CgLY{q~GRK*HHhAq8}L z1?3j*$!yxI91Wv?F6D>JhA%!oL(5rjMTLVZe(YTD7Z$DrGhis)95YOUAb2w?DdM$I zb7D0%)J&PO`wRH9bZz(M>JKa3q+h16jm+NSIR+=@e{@FkR0cI` zf!h+gj|h6v$5c#@g}WEIOa|QY;_NSd>-V{7R2j|s!&4V?VpxFn$=t61-CW$7`t1b; zjCa+DprHgy#fLKRJmd62C;G9ST0n^R;9h4x-CC}vBwQq-`-qPbv zC#n_Mrxj9sJ10UTei;Zi+Qtyjk#k{(R*E|OOBv8{)qkLe#q-`T`7GmBnVA}uKC+?j zWFO2gg;z3X7I&}3A@~U%#4s*Uu8!8imo_rHf!}2B<%k`iyBBCAj4G<{=G>J`$JR8N z&BC6M#Jqg7DziTR#W#q|?jE+zY7&VE)3XBC)5HFTWKYPElQ7DziYU$TEDJoB1rWV* zaxk?xe2vK|dh~yk?_^|M#dkR|w0dY!(|_y7uYR~?&CG8QZcGR1)3=4*@h-iN>QT~J z>1)0a$t$jE-1d}RWOwV@rlNP-fDZVVKuF_O99?__Ft2sO^wEG4 zR+Dq;{pF@+Sb~iP^dH_`S6b5s5wX|4RN24O1**xY22!q{?kMd*y6siClN1gUp4U%2 z@1B?oU~Hcg8KvLvO)51c=4#L2zn#U9)!J)fs!F)?x0C>0p_B0iX^>AJNUmP#jY#b3SQO zQ&$oTyncl>uthlU6f;L7S2n6M_JkWz!qxii?L+zFh*^=>Fu7163Y=d^Pj9CChdBQg zgo%JC=jf5bUR(Or2SH5^Wyz6Verpw1Nm7$Anovg!-!Q~Ev`h@nuhz0XonMaII})@4 zqW+R1(eI^lIjvVte|GwD@!4v>da1I}hBjEQAkCc@mdW`5PnsRvLG{IpjfqU{h zgA90!gdeyjf#cQ9DB!~g-NiL%w1hW7Qu!KiK;x>!IRFbBW|Tqp{L%b-1KpM;i=aEH zLep;#m;N7^+0(@jiik->u=2cZKV{DAYNIZO;81-%;gb3jGU%wZ(KW?k&U+o|!iSz1 zeg(KlOD~4DMHD|YH-Hibw&;)rBGt4U@c|iGSsdJXMLFe?<*X{i@(#hdVTXJy2nv-L zz!C&lFl!w95UmxxA9!oBDPg+*$dL{*c~XcipVaPnar^bqjM@p zWi=9Bi0|<5P-WU|>EhYYBR-KC$x=hZOF!R)qQTXpi3X@2n>@<6J1fmcuB{56X*N!! zg4u-5U7W2r&HYDHB)qpxw!vqL3&l-ndmuYs%amM$92#4G+EjByJ~!QhzKZv4I6RE6 zu58)fyV|U&iV(%0oYi#+fxJ9%C|XAT43b2rcT>Hk_viLJjIXN%Fckt2s3qDcJ^ zi#Dz>7PdwwFOPh)*dBPK+uttK$^tL`OM>kqeZHm7}|5&`F z+!u;q0F-+0uVmP2t?OmscQ?`no=1M^t4}c2OX_U5%S(Puy`NFkCup?WuzPi{4mbHF zHsT}z5_HdQxn`OIeS+IV3ZjWSiDUM$AZ`e4p%=IsAU*aEtY#Oe6sE(7Z|Zz0N6>tsYc-B$N!r-P^)9(b!qVX3h}f1 zX#4k%W=ZABI^nExKEBBnFP)3KLtm!&dQAu}<}g0PCw3yz#3*oKIcq-l-kJk;a8iwp zC$b?@IBAmsWe1EJ}zvCp~yzN)yrM0^6 z<>i>hg}8a6)yda)u@AXsDrRNLsNZaAh9#)e-QQeh&ZqBXx&t?&uzHQ z#ZwBtT~Iy*5>1bky1FtHe!<*fbiZ%fYZXG31btR&Kh7(CYdW>XmlGL9p4 z{#8$tybE*woNwzQ3^?>-p2-KC_k$dWSb1_`((okrfs7OBSmI6O!874naO}ls{KEf$ zAO)mte=L|Oj=nc>5F0_RgFPqs3xV8y2j6@BLY6|SykWniIsHjFMnM~yxE~}eb=_)f zmcq+t_`Bf9rnrI7(n+n}GK-W3GpfI60S+Szc*ZZ)%CX z!|r^drwAlPlGz^=gB7O?o;gZe|P_*M84Jc zB*{K(#|p)+j+1FovK!aM8tjn`uQlDoS0AIUCvTA+w~G2Y$Ws9m???89qT4=`qwwyZpiRVSt=Q(s&hQ{lU+Um#K>mDou8v)(Q9+qS=O*w&vMITlFNfn9{p%oRAkktrYk^d~ zM1f03yKK^UH7jS9;Bss*qik=3t}3&7e~f`uqE0|B{$YdNPLRO6GuH#a|far*aiP z`5%i~{D~(6LkSMa7Z1R9Ie~iGq<@87VIJ*5DfNy&De2R9uTA&g*TAq#M%KnwJ1RTA zwB1yUb?uv)i}m?i-tRQ2VqtZv3jNjYcj2<1si2O2J(gP-N>6ft4MT@!`#UMro+D=$BIB-aIL#qo;mS+M`h){j|S9D87BH1Kzp*iJVWhA@q(0 ze!Hly9I%C(?%*M?`KL#Hy7Qj5K>KosY8C{=WS9vT`ddL;v5)<&DgN^Yl{#{Glkb~fp2E89V;PBk` zl|gj?q}wn9Q~NVOBg;T|o|=Ld@@pUK_bED){5i~zn$ikyTgRhmrHg;hHfek|)HL0z zvZl)KgA-nk)aXf%3c5qhknJl?NAPl=2>oJhLXx$kn|J+1v<90^3>seRU`JisNv-lq zzi1*AszHyg6;)Fgws7D}PjV=_0z*EW&R*xrTY`{48Vk{Dy6_GBR;V?531p2= z+t0gE1voKCD`nW2YE`K}$Jopp1lA|Z1!LhrXy`fmmhnrQ9IeE-t zj*lv~c{E2$GR1A%h+P&4*&N1KUKmR~`G~pIly|#&a0X_m`Bi1o9MRO`&b?ig`SB_m zoS>{8SlUcyt7B_&RpIJA>Eh{X?l- z?_(ECmmTxU_oar9xu$3>{@jmXo=vz_P)D^P3apnPh@=TCkd-nz5 zFjKv)gXe|4%IY<{SYbX^424)bx82=et+4G5o5B zM!>}zDq4WIXLhL~;Kkt|{=t^=4V#i~U0myDZiA`bvk6bTL9!)qh~In_E&1zj>|jn( z9yGmob4DYLYkkv!Bcb$igTVCJG={Q;C21WaZM62(6YBVi*ASTMu;f-v&^@AA0PeQb zF`kvi_UdLQrfo=IIT|coTb9Fsj3NrF>;emorhc;c>Yrc$0ffrWpy&Gm=k}QlosWZn zLSggyL7z2jma&aF!}a)bmu|<_=hVV}^OUth9#H0r%KQHulvb%MCn>-p-IVJn{|)!e zI@engv^kM~>gI@#y&}}H1=nByb-c&mlFP6%0sbYib|UmRgHV+6bj}&5u@7vb`HLB3 zg-?Fte9MQHpl1>i^QV_?oQ;j5es}?hggV+TsY4KHr9G~-!o1VSg2vu8@(()e78(on*r$pzwvSqZPZK1e% zW7?27oJB-7GS`AJWkPKIbQtE!MzROir0v`Ai@Ozxfj%COaDNO+a|j?_*EAu8(S4zU zR--p~#rB#HT!iAdnaR;J{g3SGny!qTQAuU|FK5x-KpU-E?#>`J&8c$#Snzn)1gYzb z+V^m(5u!t*>(xd`n=o{YNs7VMaaop&(Ki$3&)R5HNt!!Xy2h-4`g>mj$MX^-k4Zk@ z-epaB%H%GTsP*38eEk!+~Vfh^|FLZ@YsR=V^6tCC8yCDyLrFtlcf7G9@JueFXB_B z*Xg-1C+J*QH)ctg-VRl4=-9PdH!!yYBlf`m75TX@S@HTH8lQ0u! zOurA^*D~VC$@V=f`|ck{2hUYc5$pr2N+#`2D6{FmMV&)OUShlvgJIN2h1Q0w@3#F1 zPGmo<{bsqm{VJC&Tvr)QT|SP1R^z|0FskUyJONupxA4x^AI}mo97Hfe+MwIEhMq1I__6LWWLHtx zf5L_}g@3f%EvKkyEMR9dUgM?XfXCcteOo)+>Yi*o9HXq|k$lR96JJROA}6;{O#*5r zXVkNI-<+^|EK!6Bvas1|GLQr)29cqpVz3-%7KD5Jw$mCm=Tou6&*P|7)Cw$gXkX#8P^jU+#2ys6Au=1rMSF%bdnD9`JVie9(1U zs+E^kot8Puu+K_%ljnFK&K-Pa2o)#m?h;ki{u?sI`#;`x^$y~Dl0f|7>)1VPPzG=Z zwY+!8iPNmD6UAZ;devNH`Ozl@&w?R$*bJH6dw&yGcHjN6rjVWc+JdwJdH1kC=O_l| zey`V#`IZ?ifg`pfnQNpZ_q(%`$v>BR$x8oyJf(5jfr*yO=fCBIDB_pZU+YaqD(tU1 zX1KizE&uPYc&P142q}Q;{9lu_hCC0V%^3Bm_6u7rJCP?}%AG5#+4hjQcf;@0PUqzXJ5e1ez)Sgm$t5ipbE5F#C`Hi#@cBjod(^FilzjYkrWy{T~xP&mz#ib5*rW zr`G4)DK_iKxNT~2yJX&mV%_laZ)4`7H!XI0%E_*ErX+AZ=|QS`R|2)ItX577By?JQ z@6G?;>lG0MOl~5vmlEXh{}7&uryaBD2;WE!`$F_G8B^rXk=yxj_^)M+)&_T{ivrZL zM!~1C(*L>$!msZ6qQW=&x3Ukf8M6xeL8i{2`?^IARICQk?))>0g6!<7SmuiTmYy(A znGJ|<$<9i+D@FC6As_g&4^K@Y)EUn5E|>7Cw@)#A<)j5}y|HP;Q|M!w>vdRlc9mQ` zhc``3MRVFs?oTNGR!8BVDPBrkqSq4gr8`AH+aIAy>g`0|pAB;PcAB41 z{wDz6q*Hpe8gcjN{#woX<9G@LLyQhzO*A@lY?PA(UVAv0-@|>|k|tZN|De(WEwr>3 z%X}fTIC}}hWgMJKh)n33%6{l$4|}=;AexL*q&4;smg!y&UY8azP3D`5@E~I0uNe~ zGG*w;TD6p)3Hkg(7~{izd@n0OQ1?zP{XIiw%@?exH4U|`_sT39BX!@gSXgk)XSPqS z>nKtWHdODojn^yb!@gzkY?R@ync}*9N%HjE4*)DQbVk6g-jpxuf2Tjv)Y4V{o35IE zdldsQ@q)@-U)CaS>5nu!8QAQQu}z6ry!K~~`nSstk+o+>D|j=>O{cEBDXsn8#|~7j z{#U%({za>R`_RVm{^O1AC&4#?q?9_nJUUGUX)eVI`OmeKzvEokF84o=yC{q;756&` znE*vGJseVx8n&MOI9hTT&2IKCN(T7$6O^WAynie8>*z2kY2slWl+u+=s7ql0CIfnY>F~8TSOxOPP<9j2UC#kGbq*Yo-WH`c~H2=Y+A+! z^E<4$)KCRVl^y-f;Ni=ifeJwDyhYXhJb?dCS3Smb;dWV-*;P5k-cl41!%pS zmi2Qm2*|AC3QOEQ)*;$_b7c{b2X7+35vIihWD4JFgz%@B^G_%fA5lMP%lb{J{zVoB z0=c(i#O@KmkKy!RKIQYnz{`X0z&-sI`4M}XfX%R_KF3F$769&Sq z8tGgB4O%X&Of)Y;*O^QqL{|cUN<1KmyFwbq=gLW{y~?^EQphEwIea5 z737cRSGJahl{X~5_a3q|y| ze~kh+GmBO%wWUi`Bc1Tggg>ltFW*I1faR?}6W*9Ur|D#+v_G2gQl3wsHV1axH~+KW zhVx|%p5#lm@&9(L?lb^!!sp^_c%<>soy^t~f!GPw5psYC(Iu-0FpgE~0GZ3B^OdR- zM}_RvwPof3-mAFV$*aQvgPR5f^3ryaV26K80uXZ_MZ_+1tE*+kbW)aNPR11LLKW4P zQjXY{)6}uE#mj$bl7H6d()&G4XeSe-W0&8v+I{({VyKz!up%qF{Kpb`8n-Vr^3Pep z+xy3cNiwk5v`~~%4cCMNU{o@w`;Sqmx z`87kV=X{Wng!Nw?NdQ0$k{$gr|NL7u6z*9vleN~U$+4@`OYBL;2srQyD0TT-@v2(A{m6igRJ}d0f@v>C?oa z+Q47%dFcDbTsF1CI+_zdJ5q1qumVP_6|gLQnES^aOrpOCJ)+d;2qv ztCMYQ>|uYwdM+<%wl<;AM3Z?O>n2x>84t()I5%7gY^^!>h{lr=_qSpL)_ipU405A8 z6OI4wRCx5~C+f8n5r2Jy-t%1uzgAGF`@-cOP&LaS!@F=_sv9;cI@I=`OX`|ZY;_yG zyghHftk9~cP?$aT}%*rrEWt$`(@9FUaaG`Bn;pUyX?;! zEbV2!l{6mwIna}mTH|$pl&SUMU|OSGH&GoRAW&w8^y|Lb>(tgyKAuWuX#VM$^`EWw z%Sf87TdEr^e5z_yVA*8PK*TQXp=?2#?sLW&-lbpXAyy_1OHM_+ZwrdA#jir1FfW zSOA`SCOFH-Z0t?))X<^1iwV4|Jc2!AhYFqWQ0gX3d+cDjSzOO!sc%%3RP;(o;|J z;R{!I`*TGMppxyhuvhy3o`&BJmJtuFTNJByUvQbR#=Bi)Sl@$&I4*2KnRx%gkk5jM z%b%7A(|(&2b9eun59?3bb6skjYpDy8j@RC)JPdOgj;0HjQvIKvlTiYCfw<&Lw0RVm zz$k<-I;@6yzwYM_JZHxv5LOP?(EfHOM~f{U9~1AUghm{_M(OPC49QpH+@*^@*01L4zH@u!!Zst3+u5vo7ZxUWkmlQb za>6~e%V|}5PxduHTQAky&N_>#Y3^jVk5#)Q?(P=}BS!$yj zt*GtobbNC_3KP2(NWPFSXr(E8JG?1yk8%1o`H{^v`{rxj&5F;QjwRcllo28aL`6bq z0BEV@AtJ1=h+6LU+D~lu8dSGGH#*L3(Yimw7q*Nh!*O}pbThodd|YyF(tEv<*3Y5{ zwZ#5RjV7KD(4Z_UWJo3@2bGXo<_TkFro2h*7FJc+zK9x_IX>fTn*r}rogYrd_DKZo z6g$V$PCUIfnxcj#KfcNyc1AR!3(n0Fs}>%VYIEw6^}{LL%PLUrE|q7E($F34(+)PK z7{3!Y^DHZpm0QMbXf|0o4-ED*iO;O=a!5(#Kcm=wzQ@x~{xGAQzh6!8cR44xcL~W; z&SPA>cJUo%X8!BYq7?!C$|&6L!!(f>GU}DN3`dn3nR`Pwk@1;$F> zRt?(Q?SqSJZRVT1c;uK_J9AX?(2_(%7|-VzGy9ufk!sGwDM*TDRLiD~lYsho5&Cw3AIo>6MTF!ic+4TAvG* zak41U3wcXBf#OwPZL&A^?SAON(O4J>!Kh&MNv~6F2~06Q^Whdvd1S4#Q1t<*&nq*K zw?<;DB2{&A?mV&d&;r&U^w1Bc5}(mQ*~W?^MX@bmazWdW0jD_bhHy1ne+W?OibLM zLCzFavec%_FKy7komV7ZSNnRruQBQlmemcG?3m~_d8xcsgtHBA-^X4Sza2;X)I`}D z;2W$r6E`aysy-^bJZtZ`>lZj9rWRQ&i5OTV6ROS0*Ji4AK=`rf-m~NhPi?kKOD*;` zDeLRGwa(MY8$HMFS6mvXgyR%Q$BKE8PI(pb)uOONZ)3~qC~iLKeA=``FH~`HgxA0F ze%l_|AI$loEWN7oUR(GBJA!Gu6#8A!lCqtTt*XpOMk6x_wSuR9~9}leHrCpW`c<_ND>G7fMU3JRcu>g(B_hm9#>n zs@7zQXFHWp@-b2|(|_^9>GIx@x9{Y$7E!cRp^1hLi8`D`3$s+17gqIacGF8jv-jD( z%(S%bT_ed1vDLF_E4=RXEU zAQjPPoR{M%x=rUa-onC=`K#mGyNv!aTO=QGqY;_LVJkCaDzZHYwBDWyE>*b?)9y*u zdba(mwde1RyBjVoEtSc61FCwViE1c~kC;Hb#U25Y?ny)nxxV|v&CBH52n$hrj z(le+oJy^owL`q63y@Y|f&;}REgE`_cjOOEcF$L6mAGlGQ^F8yNxwEQ!v^IYf@AG)ul$E*gZKj ztG!oIaQC=u+>iMR!78b@s2Hq;lHemzn`BUET$aqge(0431sOf`8@THfP6>lpW=Xj#YE{eX7`)w+WYv?oPa57w3N=lfD{s2Cxx9yjTzE zgdgpwib!w!9qE_+xw?1OaCh=2W$rnHK=;un3l3xZB^WEQQ6a&eY)hT>^c}MzbGBkMp#b$fBr>WRfB&y#n=SsSfJ0-)X(WF|3 zkkdQiyR&vh;ePZOMySfh)pIv!#fzo*h0{+rK)C=|y2IID=*r-i^ zzP~v;I$Jo9UP%2@@xDH06i=P%9u|=Dn(fVvQ`(#B-A{Zi3eUpi=n|S-nHNT0K}^nR zPk;STsAtb<|9ZF0`GXCOnJ$A>|0;20_28A%jCZP>)8<%iaOteB##Cl=5<3z*4{?+) zCAAl=jct4nf}|!uqTTQ2Wm?H?1ou_yp$MD8Wy7fTKAQUS-6h7Ct^WLt?#glVwtVtN z+c>o>i17DyuYmXV%cN%jib~>D@U5sm#9M&O<}kB0s94jrb4<`hK%4yr4?as{23Ww1 z`IHi6B75Jr;TxdHsvJ?;-my-NXnN2kwj`q$)dK=|b<-Tos z*zV?f3CBD$0Cqklf@~7;g?nWmj}TEz#tqji{;GN$&F*J(NaA~H>VoCbNEeY6vO`Tj^l8~rtv2NEY6 z3w@su)=djyhqrz@g@_gW^YWeT)$X0;SX76%3a3I<@(&>57r&J!^rgDa?w>`s7209m zknTDf&bZ0*-*?D1xDSWC*~X&7I#`5X)SV+eq27%i---OjfW?0mTpYVet)($K@%KG>U)+%iR&lfVr%e?H3M?% zi*|SLbv)r1KSkYLUr`wT=-_Dcq~_p4NvAQ`r}K$HT|*|7X(uUuZF+aYcGd28;JY1z z5K_s}0yAsvc4vr?+Y9($F9-M}hXj8u{(^!l)6_G1bA1*Ad^2eFH48Ld&amFH<}svc z<1UDH2&15Ye?Redj-O%rN=0{Q-eut^BreNG>QlWsv8rTr%;b2W?*@Z)!oQmq|IDca zVhOWeZ-MF!y4G^h;w%4sVh?)^kNBEH2jbS+Y`+m|J4zXjgU9rt7v-qx9EMF~$JLY- zuIG@nuK<3SkOPBPA$Og#$)Y$hzN)fx?n8q!KZZd$DC{8BP+B$CVa9%J=_EoRGLf6} z`@}yBcnGpeO?|xYRig?6V$2`Xq@alH*DA0Px|8rsRXj329*JPt%grNWqFVdq%Nu?X zHOIj%>bb<46p^<2ZITXlXiqLgZ?JeuocN)>h_3U|%l}DD;?brjmxB>;8Xk*PD`gBw zZ=@Fn)|DUOa_ zO|+caJQkidg_s%K(3_>xuSUnEfG-8$gt}4SR<+9-uBB?W~X{M6X}`J z|NhJ}Wp2N2e?Nks2;b&uR7()2`%d7xwdEAKV&0l(r<|VK(Jm0T7nkXZ#;hpq|H`L2 zwtoY}DlVVZTG$o*caUp#g)nLosT91yeXr&tc|4gKdlNo;2pk88+&A{N`rE^2*;g(g^G#hXcncw^aE({S8fiOGBTKxg zY0^3C;amdqeI#-rZg^LH3iD6M-o?ET9?jab3k%}7Uv0Q-;@bC%=hMkPw2^)om)h6t z>&IX$qlES(e$g&wQ1fUt8sfI-jrKGDmICUzv$t7jEVL7tU<{A^so!^^lp%jP*;}=0 zqF@U^#PV0}OyQIm2teuv2?1-=)2~~ENCYgoC+n<^B`%ZzHt}768JtBYm5;hZA^!)c zijTdfFEsiiFB4y_>1y0TS2C$JF@gv8|7dg~YY6&NNp>KJM#7QLKH>uxFYxbFC9>Zo zpGcreq8w%VI_;of)?adV=zQVpuWd9;g!3z_D6Fp=v&~6dSpdRCpt6UdM30m@rKWxC_Krem4wH`k&EK(-RuVs9fS6O0`wKZSV zI4w ztw?S!Fj(kS9GQ)lypg8Lzc9wXyexe%;X+YGe$X;55B=NAeHCRxX!OS+M7PXZH_zx1z1nk5u9k_;EsCUQY1- z*~nY$OxrIx!vGcczxpsER)6w$?ds;uFLBGS>UTFLs}G9}UM2eRqXJz00tUC=KNTtl zGA|iOuE}T#>>WZ zm60nL@__bYTaRj|O?Jp4EzK4yxI4rGP=LN-Q#8HrYY}+2n5BETX5Ci88BKfq)`s7X}zD{d7`WG!J z(mzAnD698~39fQvthybfu6d+h3B$ z+y?Tr0O7=WPw&UWMl$T)6-kFL2lzFD`QG4r4%Elp z7?SO#X_X3k9AmXj6fn~?OJbGV=j*jl>U*5zn2W8<3`C88Ulv^?GLA{AS+X&ws{AsD z(TUkcKp`myeaS*bGh;tn?XV$K66br*fw9x=S-4kY>%n`hfQ=Q4S5jy#RlG%k|MMvb zZJH*&ou9=-UyYCAHqfD{^7!Vpxxm-22vU*KbXO}>jz4SZE!X9bfg&q~(3Ur5wyKR< zjjDWb{|jY#;dKvDA1&8MC=<`c86kd=BI=^ZC12ws!hwt8``tmwkg+Q{6#n@EABEJ8 z_{`h;1OvbsEoM*MKU;0gK!nbYlub*kHO~SdryErZa_QsLtwI9+?}Uq(x6c}@)3S>& z%zANI)3E`65bTBF(I#>MrGVTTJwMwk#Cn_?wi9RqD>qX#HJtL*_ab9tMJPl1q-{J7 z(z9H_608{or2XC z5^u=duzf``kLO5#GMLU#l#gpsSbf+@nTX6X!nv_wiDi2UA6(JG#!dkyNua=xE(=LKJ z@$|BMD@b`R$uXz?%1~_902ciY04kc=J&lUl>m8%K1^-?@$RCZ7+rjCiQ!>WPx5|m@ ztWNW>W!HS6Aq>vG994GRJbRRWm*$}kOq?u^YX6$b1g3Rms*vKX-bWm-X%?p^`E#dWbWU7$ciQ8M+*9Cyt%spq! zsIHRCmlv*!)Ad}E+#k$|_kab8&z?HugN)=C{|JXYa7;Fz@H*8&jaRaN!>d+04|JGs zefXIYHaxdq`XNB!$d)x1(Wte>Uc^E!iD~A zA15tE_8u8`HNJLQ0t7o6-GkUjVa8RT3lvpZT9A|w-U@ARtQ}mp>WmVH#IXpN_(r}UgW8n=EPmB7QN0Xqc^Eo zEwm(&;^x%yOb=m$wW3vVf|Ew{JkE@!oo1&dnz(Lw)muK8b~|r5jS_`U6)i@ zgq9`zYIM<^!t9~cnSy#E#e>A)VT?s4_(PtUI6l7WpK~^1_P&jsa|?T6)Y)n|J-)R3 z`alv9>$hm-dlH3p&oTvNdIGY18!VWMWDOrj?5BcGAiilft;Kht=0ib++{o$SdrM_v zlm;K8_5OO9ipy0aqJ2{)_c@1iBd{q;1FrDpzP-!f?vvFS_ot(5{>kH%Z1?G5a_VbS zRlEV*##`5}gwB80eT^CfWZ*Q{v5lkuV$pERj15Y_)oz_COs1su`Q#)qN=F%uv*>VS z{5C4Ek-2-6vg{st)1HPoB5%2=->>AwMzNja(BsZo8W#J0u2*dw?xP&#;3r~-o9s{F zduL#jE*e)6kFVgtm0)C|uy`6TRpF;9aw5+e9PJ^$X=#f#=HC_HN~X&1RT7g@dmIX7*o>)PMUEZE;@ zci-K(Q@1Cmj;@cRx=;PO@kNzV0Y_BoGo7`6MiE{x${4N6fUk`oZXU(?FlH=96n`JJ zdj8`I%5=6E6-rY26bfX(eqCm9iXUUBuw+V_9_j)q_3e}0OXepzUg%I_RuRewxh(5s zd84n+op}hjH(Xw%6^Zk8uWNfZPf{w$1%sh%r?AtA|jGh>ulmsJ#@r(us zjNO~nU?Dh-PzV8MjR(zatZpT#B@5~lWN$Xxq1%$b!mTtXU3>dv*kPC?35I%Kw?%$;6x~JUi)q>;*a#eVGu)E`o#y+ z^)YWbdbD{*lS!<$zj3H^<-J#5aJ_b&7?F8QGu^FSO~}PI&ro*XmBD%d1|6mMH4}zR z*4ANd3QY^%g0lrKWsPExfjJ6}Ye2bWMfL}1HzfKT2nI#Ep}mGIkG-G#tG6_bkWQj@ zlT`y{-sl{j)C04XS0_8OxfjUCIn$@3JuxPO)HAMsQ8VWT)^0%DmT8L2+j|@V#w92$ zl!3eR54N`k++lrT_%9CU7m@M!aa(;?=}tqjB7^-FszG$Edz5<;k<5}O)ZF+m@{ul; zURBaeZ_n`F>8n#-4)I$n2Co8nn>zXBfaXXld5u9!n|T9dYE?oDFDW7`uOjmb(lRcd z{;u*_nwaJNJ27Lj#qgV#VFW2Y@wC^B>n}gS0yJhb5N9+n^WXYds4ymnAoGNv8!u$Y| z73w#(6h$p2Z7=Eyv-4~jZVvg2wx{;AN1+l2&@hGi7GOkHHA z@*l)Sg;mu_*=85?F>&KaQQw9<`BMid=1a#BBfv6vSKsnrucK$2qawoA@XXtzH&WBQTJAhw%@0;8(J1npbZ=|hUT*6xl!Ts0zzu; zZ^3JEBkfl$T@k`G&bt&^up9#}ym?>Er-W2U?n=5q&eO7euRC;NSe)Fcgik*>rV+$g z%_y7L>W^dGOUVxJEUhIqZ+vw+@5#pGt?}fUrOXH=7&q+A-fC|u zPreNNM!5&5x+LD{l%*BqsuO|G2nagiYG%dDY$h*M>0?*J-}Cce8doHY5^I<_(1oEU zWLvf6i#z)s@!x-Uj#?K4U*CHEFr3Lg-=C`-kaF3^fUo9ZlvEObEn<%?UFf7E@)PAr zCMv4bq{yd3`vvP5ke|CxbWUCOuwMFwmK7vq^v8xW(|86BU8{y```H3jpui$Jv>vhU zua&CpMJ#H_rktppSm)ChCL~YmcI9S_FA9Nhn^7jn>wHR7#5>N^o$QRO$n5>?9+A>r zFV!!@4KiBV;fQ*y*4)oEk8o5Ks1feBZ-;of?r;28^V$%D zU-jC$xxV~Df>u1{3ulMnL_4}kUCwm*u<>98hZ!K%Gyu@z)!8>5eU{$<+0>X(S?oX)Y_X;HJIbl=u zIXj`wFEN{)($Z!Ys;m^L0^?FRKj2Tg3zZ$mTGf++j1D?oadZwPf`4#1e#MHw89$h9t^c zZc&ZCaZuHB7NIFktBv0*QG^yA{2==-ym zObOSLT;$@Brr`U1t{MKb&UcH1DRP$JtY+8JdHV%D`r z9Q6(^Yq9NHKk2Nrm7p?!u}3q@z4N>$wsPmLAB$Uir(YMb;}mMa(Ry&$ZTagqvXrS} zr1G=f!oN&7Sd={4`-oZGWXdl(tFudDz&nEf2$o(u$<7tG&kxj}?iyQGvQ5S`EYwOZ z5=eOA&G2MpoqN7MUX~c}b?n7XNL^2N;$aEKCGGC(bCR47I6xGzT>nny)^zpYxcWTP zW#U}Bw}aUcm}SF7Zo^#2u{(9n)s#-hMBtaC_?{ImbGwx^l;(klk5X1i!$9k zUK_xxyTIa!&{ll@-}i!rbwhvxv}Ouc*1LALNhqZzd{VhE9iBa~?4a_Ajn0A6_}^sE zmm;GY;@A)i>T{1}inM2Pw2E-$!VT_&j&Q}whIc;WBkkw_X|j3 zn98^8C~O_=QH7gzSMlqf-B_`Z9N1sjn)RL*lnNhKRpZMnDprTTg$g^iP$II;35>Ho z?)!COl6&JhGkco2M^7>(rUr}d%Z1T&ZRR$N!JB(y4ut0_E!gP%Q1mJz!m6@F|E2@dA9Up%F$4o!S)H8E_>yk3hixvPuz z-SicWc3NBZk1ZG-rgywmvSjs2aEErkwEfzkh-n%W*f07ePf)j-IpP1{>ECQ!GIY(8 zi2vjvOua3C`?!g1qRftXBa;@?D^p*to8)@e;(nLz;7=}FvO4Z)tleb@h{DWVl^|kA zUd@C0+)aS?g6>V!?Dc3^4ym+GiUJwT5{L(;NEbOBpCMuly1ccOO&m)HMYMBFejc$d zc<|rp*bo&vAbR3GCQM%59vghQYqDSB%+wuKep92BB|V{A@8M(fq(PR)IiXX*j8if! zoAhJqSrr9bZY{+k!Kz1-FkJQid&5;Ip~1)tO(q{pF09eTVafzTInVw`GE_^JgCPrj zL|v81u66rFxj_8BYB;j5z@?^FikKyuVKFWByz(XA34@jhg`RgNT@HbAmLWZ6N~O}%B6-0aV58cfK|UChII zK;2V;T5h8jRB^W!c4(UDOCiQns?@ZT-Q)D|c*3br-uk)yN>h3U zs@BU_HL`ivOCplcKxk;hjr_#et?~v20YaW=8b^;8{7+xyXo?j$5m8CHd zt@XHb>sCKtOsMfyZq=rQQK~%#ktgk@j%9Gy(P_d3ZvJq+LqM zKb#ks_|NH2a5p@7q37tdEX^TkWAAALv3J96cj<_@NF5ZXOZ^_-@SAVKBV`h!-i(BBtEE@_ zoxZ$|NJeTC9VQOj)n44q++^27YfXB019uuF8`0m~ygaPdH@WsNy**#$G7QekFKB&! zGW}+M3zJPr(K7zBO!3R?Vvxx?4B_0NbMA@M{P) zX|rTQ-3D)c!s9A-mkb_l4g8IaN@~Yq3ZeW+%@o_}@>7F}x}?I7FN^9DmoVhzMNxjo zYXb#6;G>WR;Rjl34&4^KW9ULF3hkX1yp#I<*V$iX3T$O}!(g1f_u*QtTIf(7KOC#Q zx=;aqzQTN}Hx^eCng(){TV{;r);u&H^TN^hdne{vY$)v>8{)g5WeiyK3&~yt9;)=^ zs>3Om)-$^u87 zXR(;Ym%o~H97WOGkEH&by<)271b%$kFD06xa&GR#@kxJchN2h4w@Hhcn#Q4XUd)!C znNs{8K4H>4R^)jVEz+gwtak8qh*<_UC93bHff&wG2YG84Ic!WM3o7Rz?;At5nGQ?7 zJWa(C5T66NJoH5|{Meu2{QT$+Ma)#bCo*h(4?x(#Axl2bQi=3G3sP%TMzZsf3-8nw zv$N#qx0ELMn5yp4Ij$nUOq{0ysAT4FQ7V7ANVEEX#woFPuoY*k|Lph@@6Glkf9{VT z%QHi|w5hHs*Ex&4t&Iw^*aE(+@^G^Hq!M=0c_zbEFZr>yJ8ebz329fQrZ9Eo`< z=JTSPeZ|((WzFIT6|>&M-zV`zCBqbO3Sqvs_=NtLtX*l%pR%R1KGNJa)^iBcLwpsD zSf`)<-0`}fuU;Op)W7m)`hQ#iD$$lKN(`F&;`wiehrDhs59xN1@T#~~?ay|*=|%|@ zd(tUFA%Ed_59Mi@_h1vF9BmKvxLeq^HOudGLqDfa*5?susfmEyD#0Pyr$M`)+KKCfopa z&$CvDO!l&ZZ+d(VUZfi7J1b#At$4}#_SJf4biovi?}{g+)~)7iwa0jzgv>9>#w_hT zYgMM^Uz#u!OV_mgI`Fw9fmMihw(oiUD~4y)1Zlh{=o6XTpF^KI^^S#aGU1?=GXPBn z*AF9S6$yqxJ|0^!#P>fo=B><=^>eV9O3fRS!Fnu2^qe?RrvoB>PcW^w)$o^C(}|#> zS~oB=^$%%U3slaWP_r@(r-xz_$JZ;TLi3e+Wd^C1b#V>7dVgISGm{r-@~o=d&Xu+( z7TdLr{Z&qRz|PuQx{)H|UZVQ7gO?o8+?4RY)Y6yL z^S7#@^e!j9l2`~3<8m62$m6>~co@xE<(SJnY<~6+Z<*5OkIg`%#tXWQ^iMOat5*KOpDXb2j(k*2W{?iV(!f)dqcm46*)PW*%xe}LjKG0hbJ=(LZ{ z8qYn$SheK7h4^Y$v@?@@>Y8YXbzmBj)lIa}%T;-cLAcoMPR?wTFRnSXBJcP4a z*wqb-snsZXfI9h6()b}fxTvvNGs=--+47&+zi)AHV0?Rd(v+g(4Z_@5sI)9d0CQxW zuN#K{;f{)1>L39_#vSWK!-t}?Bm=AU?oAlea1%F(Y)r`XOSYWj9u#C!!os$HXC(5t z0R%lJ)5oCybYgN8JC3nu5W6*i&e~ZTq{5aq(ttcHo!NBJV()eCh`3p`YAcj(E=T{A zniA>I?{<25_LRKP$(s~qo$_gY^-G@>1kg_c3HY%jlvgV1?F zj>V2JVmobquJXKIsbbV}8Z8g=Kqs-M%Iffq^UdUtp&jeelz3*?X?)s68wpQ5rXp>4 z_n=jIwuF6sO6r}HKszJ3jooVwyOBZ*%POr5RT8?;XVtzC=U&ye_0wD7G#$ zZfQ$=ouEi~a^T2#d+Ac_r#R9KQzZ+Q4l&cs(s2`YjSq)7)6s3qCjQNsuVZ7l%uUMQ zMhi(B!_cbODsmbffi$Pi;G>A&8*HO4RFybx8f4_ewDS{=LvZ``BkjQTtQI5st1vf+ z-1x=dDE(@85+HSF4!V3#0vn(35ir3&>|1r?JtxWSdg|9#ico+yHfTRJU3x)q`5J-& zc%!%6>pD^*!@TVaI*x7V?$7OC5%tp2uIb)_X@Jr+M2V6;_kdc|-=t?WE|PWop0Dp2&6T)} zMhZ5rw)hhnP74&wz_jH8u$BD-OVHmm2l>_PzZD^3TqubR?gKH9iLH>6^uff<) zX890m?Wf98CbMK**vlr8@$qs1yy1Vt`R%gW-FyG6mdqcotXEar$I|A~EpoOS@StJ- zRlhB&9mnJ+Uk(L#Gxzyg6AT(IV4+>wlfT|l!U+W3a1R!SHt<%y<~m^@-fsu!AS%3?32`_~nMh z!ZBaktLA1IhfUYbV<8yS&r^MYO?BnuUK^HJ`TsK@ zu4L4^0V?^w4^CJ;7JMwgO{Xe(@~F9Mj$JID<4Q@CMMJLLhI|e>yt@Buss;vTk;!pV z%4!PqJecp%sS2==tXdFkWbV&rSxTjeo8Eijc zCZnLywMq5?JEe^7qONB-1~&G6U)XY)wsU=<3CF@t*C)5ehJR=5u>lf9$KWh3~Umle3Vq2wvgWzW12ccDZ)3F9VqsOd113b50ZV zQ~-toi95DpEBoyjN#l3uTArOI#6~<@{`T=jsntG78H?M4=G*oumDIUP{~VdyxIFW1 zln`pvWE079%yt)vsv6i?#eX!F-UAZU_Fx0ee*YUjE=XUOZEd`rPK6sDO}?2ZOvZzG z7Y_6&JN7zqne9#ojje>hxANl{t1)T+(e>Yev+ zNoD@oy}i}`EGLI27R~u{#Z6=mkHj)A#@2f8F&B8exY-Au_nh)u=1q4@3Y5Lf`^p0` zKk;YBQ}%xsQH1x+%2lA6CZJj#Nsl~^J=FcX5FERyrj+~!w&2+_Xss)BRM#dEa3Bzq zgY0dHa_bu`yK;i*)%JkKNNR+k661|?+_A8>DnnuP#*RtHXb%X zA|-zE44|p%2#6}Ii~SGP=Eo4Jd9lT2;u$k-2Wh```}n0+;`p@V58snBy3v)T=_kv! z3e0NRmRf`wwZP>oQHn>AMiTrp%>=h1E4$yN((BknF;D6flG9>%xhd-y6LvYmnh<&{ z{vP&e3%X}}6Y)>k#fWJ`j1c4BrKO}$fXos-L+x+MB!d51^8inM1v|Di9rIp1I>Dyy zo*NF|V1z`h_erQ?XtBfeGdRnsRR%L0d#|)-0*gFc1Etfk8Nh>_01XR8O%34K-u);B zOYf<-4J-ZOPgFHl$+H$J&Z@bx;#_?=<>$wXFr63+;d!S8bZszivn&^_hk^wN{&z<< zd%leZG8sOF6INY=q_#a?iVDz@IzElSx@dQ=M3*e22%zbMgmaS;FS zyYJs7^H5SNy=p`A@NM>9bo^@VkLX{0s-51%i`ihoIGED&@@Fs5L)g^`K&JOaYnuNr zf3VoIkde$E+gWw5_+8#DO@nufa*Vi@T;@x*NNfyq%a36{?tu{$;<)!V zj3D%?m~3+ZbpR*jaKGnRf|Z!1_cLz_WviT~^zYx$5S9$9l%w6>qg6cpHevTkU{!P| zJLZ$rq8vB4fCj<07mM;wU<{4_ch_Cj6gL}>R%n9Z%mSXrKn@=ThxKB86Wz$@+F*hb zsZZSn>MQdi_0Nt`$p5S^YJi?u4bICEX#>DDfU#vi6@E|+Wtga`#iqHxeAyvN843_b z87x^8o<_*{zHR?Mhd>34C<5|R*Ekdb0G}Tin6PDVTc5emnsHCvnl~1A^#8T@oncL7 zUE7)AQRcD0I65*&b5sNoMQNeO8B_!W6a=KJ2uKYQT4=G1Z4{6ikdjf_00PnpghWN@ zA<{%z04Wg=0)YSlLf&=MdB5-b`~9ACc?rgov-eqR-S@iJ%HAh2FDPMQ^OJ!;Q-AFl z?#w{Lhf9$R*+Df=>&z(mCc6i)2<`aM5}Ewiz~j#6_x+cFL4pj9H@6{juEK)U6W&iC zj^N0=Ilolz?;d39*q4@w9uzroIYN3V&FPXEPYfSQ&EC7Fu}ecelS+X353DYIe+|*>4sQN)_GEYzX<0nOFJ$T+6b*u?y~d2GsKM7efxqc#v6SvI-;iA=4EtRXIJoOQ zBLxfHfPypMz5`tFD_@po5qc_`AMORFKG=Mv#qfR3)eK`!7d#+n8{N7HdKF^TTl{`N>?)?jD zm&O)dN!W(acn5ZXqK=ijkB*#q)0s#qeE`>Vi4cV?AYYGpRav~}HT$cW&0iPIp2YBw zlvG9u3;$03!WY2p`5XFo#(BYFrZt^)?f*N`c=OoG-MdYr_x)|L7g^2eeEu2o#`sS^ z!@AezUia7eRSSQpVhTkUkx74B5c$urVtVN!e;wa4wd>65bz$-Km-_(W=4(`2j`}u9 zJRW9$Jee|3T@e$yn}oyrH~H;D|HJ#&AD`E)7u1!5l7v)-HdWx`5tThmW*)5ybm$CV5fgMgn zUc-90Lap|!<4V$5A3M0EJu(K4zZurJ!U9<(fKmy3{P&fBZ2!64%vXK{_p>`kz4|4; zhKekDbCyTjl)QoCcTqaavLOI%g*cL(>edfA;h_+)v+-Y(pU6v)?I20M`66aBEQ{9q z5w7tEPxSj!M>fC}9N&|Xw~0mArtSXsB=Ygdl}6W-GY?=Fz|H$m017u)?E8O3VWyuE z=lu@1Q%bvJLrSC47m@cbY_2Z#FoM91%>oT%)PSQ6YaM{_tZjp z`Spl|{UHHJ9A-z!SY;2AF0^%JZ_ifumiOP4=K?4SPF-+|X)j1|6WUQ}*c*;O1ErW6 zm;cvYn(asrh4R;_ zhr5&Lu6>o*=%Q+@noW)wX<{@Q^E6=k{Xod{FR(bPW0)7Lbt795umqghHY~gwDOdmm zmWRy0Q*v?&QzHLo?bYqE@iAwQkw{`wOXuYW_s^(2CQZMLvA#hpg8dsNssD(Q?VT0g z{dwhSm6hn3{>q%tgeyqT) z@BtGRf_;DPS>^Y7GyQRb79|bSw0%l)GW-9!lcWFBj+ldm@6O-XU6Z`={|q;Tjli)t zkq*nt?^RNYCJ{F72nmb$uFPFVj2p;inw)%dtlEF_4XD2-FB0 zh`)rO`+saJyzs9u1OlP2!rS=F8PN#-^vKCmgRjPkPNt5I(kW;`icV9n*3;5rja*7kyM75PUT zbnN=i=FNVik@}yQwGwV^sh2ym>AQCC4$)H7WRP(z9jRMq;&KiYNod-kA)q1I7smei z)1ek%0$Y1O!}D9|7OXE!t>wlz%ICrI@y;w*sD~V9I>%;a=)4&nP=bM@Q=ttR4S*!s`8HQG@-g!}90m6VHUh^@ZBZ7Efb% zT0r1>F_?iimca$SVyFT7Ro-<4Q)ZL@4}N(tn2nnTNGB!T)34Cz;`q)P(Vz+GFs&G~zUE}(#-A8QSRR>JRGJf8@J2ob!>8bubjnE}U@BYnx-Imsu)l>3o z1Hl4Ol02D)Xwu96{uB`@tsf;NPu>%e$_sx46c8nYF-=kTUJ=X;_T%E0(^&Inl~F$& zcys>7Rgpk1FH@1gD=$Xh=+_69BAKTsUF}taJOeVoTx* zj4G7tqe{i=ei6R1ZL`qk?_N(l`s2W3TMw?|u+<+s_DUYpS>aZ{I%9_6mmSNRz)vsp z)zE0Oh%kSDRbdgy)|V#;u5^zU&ba8+_GhO$(=%)fCRXOD_Eo;Wj{6;QaB#3Gx!Uxo zXe6$Ugdy#e(`)T5byLyOdeYWLo}8RCG&5s7VjNdi=H!wHT03{{oSdFEb{cxHO+>`? z{qy&Vb`^^GRs}}-`gJ*4td}oOtgf1lffvQa#hV7mQZ^OOwOfdo$L5n0{E?0um+9zb#BfVnF*7bUSD6Isuz9`UObD#;jD@x4otr z<(@sRgVp6KA!z`5ynw%4iXGb6wryKxLBSCzDJgd^FL1OQZf^K#bi)ly>UIfr`=6PZ z$sqW)?Y1;+5@9t*5ZEpH<3M9uT8-bQcTd;(Ljs5D>gsG=*DF`{tu3<|%v!dKukSJ3 zM602(vGLt|_i*dMPJy34#K;;aUWK7;im$wVluleD8U+%${s9wfLxZvOY3uQE8NMQh z|8^Qb-t7=Kno53#pX^XQa`AC7j&;zQ8x?&)CBL*c&k>bvDK5?U(2%iVOsBg;z;lG} zRngA!FO%USy#z57Y8ZC~#_#q}D<~*H+nd{UiqB)V+Fz3_x zI`{70RaR9^brP%!GRb63CF;uWiHbI{=DG0@RbKrSM-UImY|IHb5N=livo!vUfd1*z zwe*mw7Mt2tqgE*y83u%7DUQ{KoL_Ex#IvW6Jc6^%@21Sx%lLi%P>ci+a^>opnj%}e zmb!W(dT1cgp=Ki$LUdxk zuhyyVd^uVom}6~ehS86urAcWAX4*LVqv!Bhx%0RX9WgU`-^5Fo5oIx+tI`EX%K zT7r>me}y+=c91<$CyHrC(|C~*cbWYKR{1Uf4?HVvFd0LL*cg%7@Z1gS^Lf1a`T5U- zYmR|4eF+72PA!#GuG2=IW&bWxV`%gT%4L_0l?9nG@UoX5iAhW!x@O7V#hs^b$4y)< zt3;O@$r9HNyI)ht0pxF|S0rs-q2yb7ic93WhGjmn2FOUXHwSX!rb!qA8?D8Mor2@Y0aU$p* zwk~W1lTti3&82GMKqw`yHxMYvOeQl`JLo6^RZmZ2$FTW3{(&1V#TT8Oo!=KZ5qS$N zR=2eiJzY1H)3{%B$X9hPN(#$bnI8ozZYpI&xcFtwT`(~*!7ud|T^)J72|ryR)msyU zl_spu=SSgJM(!=l)rra(MoDVM_Be*>is~+2N)O{SNl=$2?Wtk-<}EB%5jp$r-Mi22 zD%I1{a0`8&MQ$LdN<+9)W#tZ-jvnj(1O*&v!!dM;OYRl(9zH&8*0fbGNQm(u1X&D1 zgq)c!cifJ;VK)8o?ZaL$5t0P#D$u{FSE5iqZy28Z?ZP@;?eHrJ35kW3QHc`2@jv07 zH>&e*^48D2o&A*?9)dVyQoEbbowsY_+0$CxQmZ1<&Jveg@S;qvYbGt$m~~nuWL{~% z=65UWe{YL+Tl{$OXqp85!(6aOx2+MNIecu#&1Jprpge-|oN2h|CKT!=zX;-Oh{{KR z2+WA&j}&QI_}Y@r+zGSy&uwrmYgMxYMXQ&+JJGQWY{eu zbut5s>k!b0ZCX{#%(Op}i;It&VQMuY`SsQ;*GlSzX)tt`2P|&}<;~8z;1}Dw5q^Jl zTexVAA``K4era|vWoc=Nvhs0j=VoR#Vrz#Qb@0SFX2hDAxU@8Na(cDw^y$+j!Pk2N zGH?!NW@Z3f++;_Vq;}xv>V`B7K@VG7zTey1oAtiXwMSAyc6Q&qv9rI!w^HCf*5*{DIGP$U^PO%TD12sN;^Lx3ejph3sug~|6QTn&PtIz9>X@5&UXZb#=$(=^!~Idp&*n>jI0h)|wu7MWv7@ z&E>Ownv5CP))vgFO$9CV03(7e$D79pG9;2n=b~$Es#Sq-oLOxy>z{kO6cQd;=f|Pf z<)Q__0%l2g*mqmTT`|v{8G{VbH8!F!Xa^5w3zi85RxNK}rH`<1sdxWUst#T`GBUEa zY|>bzFRsistx=3twQ)E9_ae7T!&e|cItB;Bjia5a{oNt;`*FsaF64Jh6mA?Lwz#{K zdCa1RVoGiEqYb5(UfoJ5JniG@*#fG-Z~o(3cM=Wc9OPkl50C1sa0hLzzE034ojGQ1 zSFT*CZ(p>6Tc-yr4ZM9QCPyx@T@KM({ge@Jl;s~Z6#RVoLa7_0EmgA=H`PTKtosmc zN?o(ydav)mS9YQK3f@UZW3~6Xt+US#=2S`(LaWy|2{J?Gylr3X-IKYuHhC={F;luu-$?-a~^aM8aZe(@_7H z+`F+bm2X$XyO`@Q+aV$<$^te4@nu8yb3vRezT*0^xIvnKp=WXAo=i4CySK!pQdPPV z{CC(&kpZd&w=y@<#P<;F;ns%R=~3nU7DkIcztvV&_A~iQ8j|L_cjs(vZGAMTD{=6% zqpK?(umYCV{t1sgMYcD!u&~JMo(hO2`#!~t`%PAl7UXn(_>eR)G4bfpqiplst3Vo+ zqkh5<|hmom)sw;W?`db)2q)YPxxuqz9-X= z%zBQ7?Af!&sN9ymvJzb36YgElaLDfl{ShA(6?OLPfW*UG`2Ru){NV&6g#@GKaX-h< z8Ll{~)G9xVM%W7=>~XjpQ9~zTFrYD-YS^<)MFc*f#AmQiXMJwJyJt#5ef{asIlt{O zm8hw;MJfpLrbatKw@I6wh0|pBrMF_JfracS*V)ObMSUM2hh;K5jMd*0_WXiE*3+jW zg{KOE84mC+9M+u9cUxN%_L){26d@`(na27D1~NOUCdQiOr!;Y{W`&AW;&u^{gNA+m z{h03QRJD9Wqy>HKC_Jx_P;z~=UeUHpV{NIHI9M}82O*hNTB-uJX>Cq8T^vAv|xU7b0UGCC6SJL8Sb(+%UqvxA|z8S_=d5dG?HWl z!`eZ-JeYY^r{2Sus>(d-mI`|+SJy^DqUgCawOxLshGle&gdsSp!!yo^MdNL`MZ-Q= ztkRolMIdSF`b|ZrjS~p)gV>>(fuAqx0cU?6qG1*$0w!{E)FF(st|;xp?x+RZc{$RW ze{e$$Q#&A$arh=zR8?T)ASeC0geq-4y}*`eDRDq;Mb80Q;AkRNoTwZ2nM4P%Y(sg?w$AL0Q0qw%^aoQJ@-0F0WyQ7V; z&J!)c^Ya$drWj^~`H*xz)9j#iEef^k6hHi|?wl!=u_G8{Qq@B(t-{X&?PI?4i87%h zuM76Sc#jK{N>)>t&%!OeF{-s4(fn!^67O&sHaZ!b+~SKlA$VLT_ke z33C;4E^mP}Wa#8HG)PsQRgS3~4yo2!zz7&GUaAV}Wvv%@1xZ+> zM>Q!uMa?pV4WUj$#3OQww*Ip3()GfpU`mUh+7B281uc8mX7@j}Kbn(~u|Fdt15$By zKM`kugfJ*&v7`1?-mK?rQNE2Zr=p@lhudWVh09qiyPdH}CNKZe6GmFu2&x>*Vxb*X zUgH;5VNjHkdRw059JwPT0{w)e6OLw&`PBps1?b4tWq(@ zP7v-l)o5vV?gt9kWxyFQqJnjF+YHU6iPm0mOkw5nwSxx_a$X9Fo-JIZ5P?#3IE{75 zNlA?`9(y{54*K*g*&d+~pZ>-P{KAB+p=o+*?-ur}SFchvu79l1S^jWQ_Df|{>eIrL zKN_>F*VWmbjNrpMQtNpG(~Y(qN8wBr)`Zq(*mR)898}^cd{hn3JP5 zBUnJ_J0%bGQp$p)U@ltI)Xg>n^ZxaNbnstt66lEIgw@Wr^)(vpNm2MrzRinEugV&v zbwgC4_Gy8Ft-`C1j zT-T|kpy;zv2G7}d2 zLjz5e2C5~ixcCq#Zy=j6=&{Fmls~z%Rm`;|kwzZTt2=V!2=oZ>A)(O|+#Ui6X}~}S z1UV17$F58Yp7&Zz8fi|sEos5LzSyF;_*Y?3>1HJYFJIB7hkYzIkk1KVhJ0m5MmX_AR zhT}tx*(NE<$IrKbCS9nPAS8vQ!^aS=GkxWiYUk8dRa>tOjjobLz)(m-CnPi!OoX5k z6u__0#h}9s;u8*AXF|#b$${1x0v=ePVZ6~A)2(fGJ&=4zY%z3?);nox@3ynE< zD3~oQI?H-&j}jN&?37p-zAcL6xo@2*YEzL#xvdHKOWnIK9?GBusO;?46|Q3xx@TE~ zW#rsRtG+Jm>*_;WQ3H+sqe*eJHx6;XBWcA6x&R0yfgcPHL1!ab&GUVZRuACID67Ln z-v#6p{N6myd9=?xoX`X9Ht|#Mv@b&sNJvP?-QB$jd3s=9z<@hYj%Lto7<7|6-@SXh zY3l@pi6&_^40vsl&1Q_Z5aZ&NLj&!Q7U;~GYkIVkjwG3^me<+$47pD$6q&T;cgJ9h+S zPj#ZFc38iIdL4D+v3b?^6a;3emQl zIFb-5`)tk1$v4QGQL}`7O2|(X>cq`>_R^Qv;2+0u|L5iVNODAuP5U@dnjy!o`;A+_ z{&sHfzbAgR#J}eGHz@uWO8;W!U#9p%3;$pIxK7})pEYc^3(`lfVR*{)Wa00ZZv78X 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2240e5fdff1d6051a0aed2a1e0625eb92ad80ea9 Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Thu, 31 Oct 2024 19:31:06 +0600 Subject: [PATCH 02/12] Fix singlestore ops api (#708) Signed-off-by: Neaj Morshad --- docs/guides/singlestore/concepts/opsrequest.md | 8 ++++---- .../reconfigure/reconfigure-steps/index.md | 13 ++++++------- .../reconfigure-steps/yamls/reconfigure-remove.yaml | 2 +- .../yamls/reconfigure-using-applyConfig.yaml | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/docs/guides/singlestore/concepts/opsrequest.md b/docs/guides/singlestore/concepts/opsrequest.md index 2a356704ea..3a04c5efb4 100644 --- a/docs/guides/singlestore/concepts/opsrequest.md +++ b/docs/guides/singlestore/concepts/opsrequest.md @@ -128,7 +128,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: sdb-sample configuration: @@ -149,7 +149,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: sdb-standalone configuration: @@ -166,7 +166,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: sdb-sample configuration: @@ -185,7 +185,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: sdb-standalone configuration: diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md b/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md index dd1b01c344..c8e8120137 100644 --- a/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/index.md @@ -218,7 +218,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: custom-sdb configuration: @@ -231,7 +231,7 @@ spec: Here, - `spec.databaseRef.name` specifies that we are reconfiguring `custom-sdb` database. -- `spec.type` specifies that we are performing `Configuration` on our database. +- `spec.type` specifies that we are performing `Reconfigure` 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, @@ -250,8 +250,7 @@ Let's wait for `SinglestoreOpsRequest` to be `Successful`. Run the following co ```bash $ kubectl get singlestoreopsrequest --all-namespaces NAMESPACE NAME TYPE STATUS AGE -demo sdbops-reconfigure-config Configuration Successful 10m - +demo sdbops-reconfigure-config Reconfigure 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. @@ -277,7 +276,7 @@ Spec: sdb-apply.cnf: max_connections = 550 Database Ref: Name: custom-sdb - Type: Configuration + Type: Reconfigure Status: Conditions: Last Transition Time: 2024-10-04T10:18:22Z @@ -396,7 +395,7 @@ metadata: name: sdbops-reconfigure-remove namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: custom-sdb configuration: @@ -426,7 +425,7 @@ Let's wait for `SingleStoreOpsRequest` to be `Successful`. Run the following co ```bash $ kubectl get singlestoreopsrequest -n demo NAME TYPE STATUS AGE -sdbops-reconfigure-remove Configuration Successful 5m31s +sdbops-reconfigure-remove Reconfigure Successful 5m31s ``` Now let's connect to a singlestore instance and run a singlestore internal command to check the new configuration we have provided. diff --git a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml index b557e898e9..49cdc7cc54 100644 --- a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-remove.yaml @@ -4,7 +4,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: custom-sdb configuration: 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 index 65b617765d..ecacdbd1ad 100644 --- a/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml +++ b/docs/guides/singlestore/reconfigure/reconfigure-steps/yamls/reconfigure-using-applyConfig.yaml @@ -4,7 +4,7 @@ metadata: name: sdbops-reconfigure-config namespace: demo spec: - type: Configuration + type: Reconfigure databaseRef: name: custom-sdb configuration: From 91021bb5ab808a071e640bd1642783c78d706977 Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Fri, 1 Nov 2024 13:01:06 +0600 Subject: [PATCH 03/12] Add MSSQLServer Vertical and Horizontal Scaling Docs (#703) Signed-off-by: Neaj Morshad --- .../horizontal-scaling/msops-hscale-down.yaml | 11 + .../horizontal-scaling/msops-hscale-up.yaml | 11 + .../horizontal-scaling/mssql-ag-cluster.yaml | 46 ++ .../scaling/mssqlserver-ca-issuer.yaml | 8 + .../mops-vscale-ag-cluster.yaml | 18 + .../mops-vscale-standalone.yaml | 17 + .../vertical-scaling/mssql-ag-cluster.yaml | 46 ++ .../vertical-scaling/mssql-standalone.yaml | 23 + .../guides/mssqlserver/concepts/opsrequest.md | 271 +++++++ docs/guides/mssqlserver/scaling/_index.md | 10 + .../scaling/horizontal-scaling/_index.md | 10 + .../scaling/horizontal-scaling/mssqlserver.md | 715 ++++++++++++++++++ .../scaling/horizontal-scaling/overview.md | 56 ++ .../scaling/vertical-scaling/_index.md | 10 + .../scaling/vertical-scaling/ag_cluster.md | 455 +++++++++++ .../scaling/vertical-scaling/overview.md | 54 ++ .../scaling/vertical-scaling/standalone.md | 352 +++++++++ .../mssqlserver/ms-horizontal-scaling.png | Bin 0 -> 66623 bytes .../mssqlserver/ms-vertical-scaling.png | Bin 0 -> 71560 bytes 19 files changed, 2113 insertions(+) create mode 100644 docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-down.yaml create mode 100644 docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-up.yaml create mode 100644 docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/scaling/mssqlserver-ca-issuer.yaml create mode 100644 docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-standalone.yaml create mode 100644 docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml create mode 100644 docs/guides/mssqlserver/concepts/opsrequest.md create mode 100644 docs/guides/mssqlserver/scaling/_index.md create mode 100644 docs/guides/mssqlserver/scaling/horizontal-scaling/_index.md create mode 100644 docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md create mode 100644 docs/guides/mssqlserver/scaling/horizontal-scaling/overview.md create mode 100644 docs/guides/mssqlserver/scaling/vertical-scaling/_index.md create mode 100644 docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md create mode 100644 docs/guides/mssqlserver/scaling/vertical-scaling/overview.md create mode 100644 docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md create mode 100644 docs/images/day-2-operation/mssqlserver/ms-horizontal-scaling.png create mode 100644 docs/images/day-2-operation/mssqlserver/ms-vertical-scaling.png diff --git a/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-down.yaml b/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-down.yaml new file mode 100644 index 0000000000..750157bc24 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-down.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-hscale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: mssql-ag-cluster + horizontalScaling: + replicas: 2 \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-up.yaml b/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-up.yaml new file mode 100644 index 0000000000..3723dc67c1 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-up.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-hscale-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: mssql-ag-cluster + horizontalScaling: + replicas: 3 \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml b/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml new file mode 100644 index 0000000000..449e0edf60 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml @@ -0,0 +1,46 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 2 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: 1 + memory: "2Gi" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/mssqlserver-ca-issuer.yaml b/docs/examples/mssqlserver/scaling/mssqlserver-ca-issuer.yaml new file mode 100644 index 0000000000..7a00e196d9 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/mssqlserver-ca-issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-ag-cluster.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-ag-cluster.yaml new file mode 100644 index 0000000000..1fc44d9d49 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-ag-cluster.yaml @@ -0,0 +1,18 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-vscale-ag-cluster + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: mssql-ag-cluster + verticalScaling: + mssqlserver: + resources: + requests: + memory: "1.7Gi" + cpu: "700m" + limits: + cpu: 2 + memory: "4Gi" \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-standalone.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-standalone.yaml new file mode 100644 index 0000000000..9e5d64e8b6 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-standalone.yaml @@ -0,0 +1,17 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-vscale-standalone + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: mssql-standalone + verticalScaling: + mssqlserver: + resources: + requests: + memory: "5Gi" + cpu: "1000m" + limits: + memory: "5Gi" \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml new file mode 100644 index 0000000000..1102b8f4fd --- /dev/null +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml @@ -0,0 +1,46 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: 1 + memory: "2Gi" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml new file mode 100644 index 0000000000..29629d28a1 --- /dev/null +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml @@ -0,0 +1,23 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-standalone + namespace: demo +spec: + version: "2022-cu12" + replicas: 1 + storageType: Durable + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/mssqlserver/concepts/opsrequest.md b/docs/guides/mssqlserver/concepts/opsrequest.md new file mode 100644 index 0000000000..cb7609e915 --- /dev/null +++ b/docs/guides/mssqlserver/concepts/opsrequest.md @@ -0,0 +1,271 @@ +--- +title: MSSQLServerOpsRequest CRD +menu: + docs_{{ .version }}: + identifier: ms-concepts-ops-request + name: MSSQLServerOpsRequest + parent: ms-concepts + weight: 25 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServerOpsRequest + +## What is MSSQLServerOpsRequest + +`MSSQLServerOpsRequest` is a Kubernetes `Custom Resource Definitions` (CRD). It provides declarative configuration for [Microsoft SQL Server](https://learn.microsoft.com/en-us/sql/sql-server/) administrative operations like database version updating, horizontal scaling, vertical scaling, reconfigure, volume expansion, etc. in a Kubernetes native way. + +## MSSQLServerOpsRequest CRD Specifications + +Like any official Kubernetes resource, a `MSSQLServerOpsRequest` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here, some sample `MSSQLServerOpsRequest` CR for different administrative operations are given below, + +Sample `MSSQLServerOpsRequest` for updating database: + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: update-ms-version + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: mssql-ag + updateVersion: + targetVersion: 2022-cu14 +status: + conditions: + - lastTransitionTime: "2020-06-11T09:59:05Z" + message: The controller has scaled/updated the MSSQLServer successfully + observedGeneration: 3 + reason: OpsRequestSuccessful + status: "True" + type: Successful + observedGeneration: 3 + phase: Successful +``` + +Sample `MSSQLServerOpsRequest` for horizontal scaling: + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-horizontal-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: mssql-ag + horizontalScaling: + replicas: 5 +status: + conditions: + - lastTransitionTime: "2020-06-11T09:59:05Z" + message: The controller has scaled/updated the MSSQLServer successfully + observedGeneration: 3 + reason: OpsRequestSuccessful + status: "True" + type: Successful + observedGeneration: 3 + phase: Successful +``` + +Sample `MSSQLServerOpsRequest` for vertical scaling: + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-vscale-standalone + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: mssql-standalone + verticalScaling: + mssqlserver: + resources: + requests: + memory: "5Gi" + cpu: "1000m" + limits: + memory: "5Gi" +status: + conditions: + - lastTransitionTime: "2020-06-11T09:59:05Z" + message: The controller has scaled/updated the MSSQLServer successfully + observedGeneration: 3 + reason: OpsRequestSuccessful + status: "True" + type: Successful + observedGeneration: 3 + phase: Successful +``` + +Here, we are going to describe the various sections of a `MSSQLServerOpsRequest` CR. + +### MSSQLServerOpsRequest `Spec` + +A `MSSQLServerOpsRequest` object has the following fields in the `spec` section. + +#### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) object where the administrative operations will be applied. This field consists of the following sub-field: + +- **spec.databaseRef.name :** specifies the name of the [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.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 `MSSQLServerOpsRequest`. + +- `UpdateVersion` +- `HorizontalScaling` +- `VerticalScaling` +- `VolumeExpansion` +- `Restart` + +>You can perform only one type of operation on a single `MSSQLServerOpsRequest` CR. For example, if you want to update your database and scale up its replica then you have to create two separate `MSSQLServerOpsRequest`. At first, you have to create a `MSSQLServerOpsRequest` for updating. Once it is completed, then you can create another `MSSQLServerOpsRequest` for scaling. You should not create two `MSSQLServerOpsRequest` simultaneously. + +#### spec.updateVersion + +If you want to update your MSSQLServer 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 [MSSQLServerVersion](/docs/guides/mssqlserver/concepts/catalog.md) CR that contains the MSSQLServer version information where you want to update. + +>You can only update between MSSQLServer versions. KubeDB does not support downgrade for MSSQLServer. + +#### spec.horizontalScaling + +If you want to scale-up or scale-down your MSSQLServer cluster, you have to specify `spec.horizontalScaling` section. This field consists of the following sub-field: + +- `spec.horizontalScaling.replicas` indicates the desired number of replicas for your MSSQLServer cluster after scaling. For example, if your cluster currently has 4 replicas, and you want to add additional 2 replicas then you have to specify 6 in `spec.horizontalScaling.replicas` field. Similarly, if you want to remove one member from the cluster, you have to specify 3 in `spec.horizontalScaling.replicas` field. + +#### spec.verticalScaling + +`spec.verticalScaling` is a required field specifying the information of `MSSQLServer` resources like `cpu`, `memory` etc. that will be scaled. This field consists of the following sub-fields: + +- `spec.verticalScaling.mssqlserver` indicates the `MSSQLServer` server resources. It has the below structure: + +```yaml +resources: + requests: + memory: "5Gi" + cpu: 1 + limits: + memory: "5Gi" + cpu: 2 +``` + +Here, when you specify the resource request for `MSSQLServer` container, 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 `MSSQLServer` 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.verticalScaling.exporter` indicates the `exporter` container resources. It has the same structure as `spec.verticalScaling.mssqlserver` and you can scale the resource the same way as `MSSQLServer` container. + +>You can increase/decrease resources for both `MSSQLServer` container and `exporter` container on a single `MSSQLServerOpsRequest` CR. + +### spec.volumeExpansion + +> To use the volume expansion feature the storage class must support volume expansion + +If you want to expand the volume of your MSSQLServer cluster, you have to specify `spec.volumeExpansion` section. This field consists of the following sub-fields: + +- `spec.volumeExpansion.mode` specifies the volume expansion mode. Supported values are `Online` & `Offline`. The default is `Online`. +- `spec.volumeExpansion.mssqlserver` indicates the desired size for the persistent volumes of a MSSQLServer. + +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: + mode: "Online" + mssqlserver: 30Gi +``` + +This will expand the volume size of all the mssql server nodes to 30 GB. + + +#### 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. + +### MSSQLServerOpsRequest `Status` + +`.status` describes the current state and progress of the `MSSQLServerOpsRequest` operation. It has the following fields: + +### status.phase + +`status.phase` indicates the overall phase of the operation for this `MSSQLServerOpsRequest`. It can have the following values: + +| Phase | Meaning | +|-------------|----------------------------------------------------------------------------------------| +| Successful | KubeDB has successfully performed the operation requested in the MSSQLServerOpsRequest | +| Progressing | KubeDB has started the execution of the applied MSSQLServerOpsRequest | +| Failed | KubeDB has failed the operation requested in the MSSQLServerOpsRequest | +| Denied | KubeDB has denied the operation requested in the MSSQLServerOpsRequest | +| Skipped | KubeDB has skipped the operation requested in the MSSQLServerOpsRequest | + +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 `MSSQLServerOpsRequest` controller. + +#### status.conditions + +`status.conditions` is an array that specifies the conditions of different steps of `MSSQLServerOpsRequest` processing. Each condition entry has the following fields: + +- `types` specifies the type of the condition. MSSQLServerOpsRequest has the following types of conditions: + +| Type | Meaning | +|---------------------|---------------------------------------------------------------------------------------------| +| `Progressing` | Specifies that the operation is now progressing | +| `Successful` | Specifies such a state that the operation on the database has been 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 has been failed. | +| `Scaling` | Specifies such a state that the scaling operation on the database has started | +| `VerticalScaling` | Specifies such a state that vertical scaling has performed successfully on database | +| `HorizontalScaling` | Specifies such a state that horizontal scaling has performed successfully on database | +| `Updating` | Specifies such a state that database updating operation has started | +| `UpdateVersion` | Specifies such a state that version updating on the database have performed successfully | + +- The `status` field is a string, with possible values `"True"`, `"False"`, and `"Unknown"`. + - `status` will be `"True"` if the current transition is succeeded. + - `status` will be `"False"` if the current transition is failed. + - `status` will be `"Unknown"` if the current transition is 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. It has the following possible values: + +| Reason | Meaning | +|------------------------------------------| -------------------------------------------------------------------------------- | +| `OpsRequestProgressingStarted` | Operator has started the OpsRequest processing | +| `OpsRequestFailedToProgressing` | Operator has failed to start the OpsRequest processing | +| `SuccessfullyHaltedDatabase` | Database is successfully halted by the operator | +| `FailedToHaltDatabase` | Database is failed to halt by the operator | +| `SuccessfullyResumedDatabase` | Database is successfully resumed to perform its usual operation | +| `FailedToResumedDatabase` | Database is failed to resume | +| `DatabaseVersionUpdatingStarted` | Operator has started updating the database version | +| `SuccessfullyUpdatedDatabaseVersion` | Operator has successfully updated the database version | +| `FailedToUpdateDatabaseVersion` | Operator has failed to update the database version | +| `HorizontalScalingStarted` | Operator has started the horizontal scaling | +| `SuccessfullyPerformedHorizontalScaling` | Operator has successfully performed on horizontal scaling | +| `FailedToPerformHorizontalScaling` | Operator has failed to perform on horizontal scaling | +| `VerticalScalingStarted` | Operator has started the vertical scaling | +| `SuccessfullyPerformedVerticalScaling` | Operator has successfully performed on vertical scaling | +| `FailedToPerformVerticalScaling` | Operator has failed to perform on vertical scaling | +| `OpsRequestProcessedSuccessfully` | Operator has completed the operation successfully requested by the OpeRequest cr | + +- 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. diff --git a/docs/guides/mssqlserver/scaling/_index.md b/docs/guides/mssqlserver/scaling/_index.md new file mode 100644 index 0000000000..fcf648eaf6 --- /dev/null +++ b/docs/guides/mssqlserver/scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Scaling Microsoft SQL Server +menu: + docs_{{ .version }}: + identifier: ms-scaling + name: Scaling Microsoft SQL Server + parent: guides-mssqlserver + weight: 43 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/scaling/horizontal-scaling/_index.md b/docs/guides/mssqlserver/scaling/horizontal-scaling/_index.md new file mode 100644 index 0000000000..d6c1d24e0f --- /dev/null +++ b/docs/guides/mssqlserver/scaling/horizontal-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Horizontal Scaling +menu: + docs_{{ .version }}: + identifier: ms-scaling-horizontal + name: Horizontal Scaling + parent: ms-scaling + weight: 10 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md b/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md new file mode 100644 index 0000000000..d60e364ec6 --- /dev/null +++ b/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md @@ -0,0 +1,715 @@ +--- +title: Horizontal Scaling MSSQLServer Cluster +menu: + docs_{{ .version }}: + identifier: ms-scaling-horizontal-guide + name: Scale Horizontally + parent: ms-scaling-horizontal + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Horizontal Scale MSSQLServer Cluster + +This guide will show you how to use `KubeDB` Ops Manager to increase/decrease the number of replicas of a `MSSQLServer` Cluster. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [Horizontal Scaling Overview](/docs/guides/mssqlserver/scaling/horizontal-scaling/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/mssqlserver/scaling/horizontal-scaling](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/horizontal-scaling) directory of [kubedb/doc](https://github.com/kubedb/docs) repository. + +### Apply Horizontal Scaling on MSSQLServer Cluster + +Here, we are going to deploy a `MSSQLServer` Cluster using a supported version by `KubeDB` operator. Then we are going to apply horizontal scaling on it. + +#### Prepare Cluster + +At first, we are going to deploy a Cluster server with 2 replicas. Then, we are going to add two additional replicas through horizontal scaling. Finally, we will remove 1 replica from the cluster again via horizontal scaling. + +**Find supported MSSQLServer Version:** + +When you have installed `KubeDB`, it has created `MSSQLServerVersion` CR for all supported `MSSQLServer` versions. Let's check the supported MSSQLServer versions, + +```bash +$ kubectl get mssqlserverversion +NAME VERSION DB_IMAGE DEPRECATED AGE +2022-cu12 2022 mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 176m +2022-cu14 2022 mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 176m +``` + +The version above that does not show `DEPRECATED` `true` is supported by `KubeDB` for `MSSQLServer`. You can use any non-deprecated version. Here, we are going to create a MSSQLServer Cluster using `MSSQLServer` `2022-cu12`. + +**Deploy MSSQLServer Cluster:** + + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +In this section, we are going to deploy a MSSQLServer Cluster with 2 replicas. Then, in the next section we will scale up the cluster using horizontal scaling. Below is the YAML of the `MSSQLServer` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 2 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: 1 + memory: "2Gi" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml +mssqlserver.kubedb.com/mssql-ag-cluster created +``` + +**Wait for the cluster to be ready:** + +`KubeDB` operator watches for `MSSQLServer` objects using Kubernetes API. When a `MSSQLServer` object is created, `KubeDB` operator will create a new PetSet, Services, and Secrets, etc. A secret called `mssql-ag-cluster-auth` (format: {mssqlserver-object-name}-auth) will be created storing the password for mssqlserver superuser. +Now, watch `MSSQLServer` is going to `Running` state and also watch `PetSet` and its pod is created and going to `Running` state, + +```bash +$ watch kubectl get ms,petset,pods -n demo +Every 2.0s: kubectl get ms,petset,pods -n demo + +NAME VERSION STATUS AGE +mssqlserver.kubedb.com/mssql-ag-cluster 2022-cu12 Ready 2m52s + +NAME AGE +petset.apps.k8s.appscode.com/mssql-ag-cluster 2m11s + +NAME READY STATUS RESTARTS AGE +pod/mssql-ag-cluster-0 2/2 Running 0 2m11s +pod/mssql-ag-cluster-1 2/2 Running 0 2m6s + +``` + +Let's verify that the PetSet's pods have created the availability group cluster successfully, + +```bash +$ kubectl get secrets -n demo mssql-ag-cluster-auth -o jsonpath='{.data.\username}' | base64 -d +sa +$ kubectl get secrets -n demo mssql-ag-cluster-auth -o jsonpath='{.data.\password}' | base64 -d +123KKxgOXuOkP206 +``` + +Now, connect to the database using username and password, check the name of the created availability group, replicas of the availability group and see if databases are added to the availability group. +```bash +$ kubectl exec -it -n demo mssql-ag-cluster-0 -c mssql -- bash +mssql@mssql-ag-cluster-2:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "123KKxgOXuOkP206" +1> select name from sys.databases +2> go +name +---------------------------------------------------------------------------------- +master +tempdb +model +msdb +agdb1 +agdb2 +kubedb_system + +(5 rows affected) +1> SELECT name FROM sys.availability_groups +2> go +name +---------------------------------------------------------------------------- +mssqlagcluster + +(1 rows affected) +1> select replica_server_name from sys.availability_replicas; +2> go +replica_server_name +------------------------------------------------------------------------------------------- +mssql-ag-cluster-0 +mssql-ag-cluster-1 +(3 rows affected) +1> select database_name from sys.availability_databases_cluster; +2> go +database_name +------------------------------------------------------------------------------------------ +agdb1 +agdb2 + +(2 rows affected) + +``` + + +So, we can see that our cluster has 2 replicas. Now, we are ready to apply the horizontal scale to this MSSQLServer cluster. + +#### Scale Up + +Here, we are going to add 1 replica in our Cluster using horizontal scaling. + +**Create MSSQLServerOpsRequest:** + +To scale up your cluster, you have to create a `MSSQLServerOpsRequest` CR with your desired number of replicas after scaling. Below is the YAML of the `MSSQLServerOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: ms-scale-horizontal + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: mssql-ag-cluster + horizontalScaling: + replicas: 3 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing operation on `mssql-ag-cluster`. +- `spec.type` specifies that we are performing `HorizontalScaling` on our database. +- `spec.horizontalScaling.replicas` specifies the expected number of replicas after the scaling. + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-up.yaml +mssqlserveropsrequest.ops.kubedb.com/msops-hscale-up created +``` + +**Verify Scale-Up Succeeded:** + +If everything goes well, `KubeDB` Ops Manager will scale up the PetSet's `Pod`. After the scaling process is completed successfully, the `KubeDB` Ops Manager updates the replicas of the `MSSQLServer` object. + +First, we will wait for `MSSQLServerOpsRequest` to be successful. Run the following command to watch `MSSQLServerOpsRequest` cr, + +```bash +$ watch kubectl get mssqlserveropsrequest -n demo msops-hscale-up +Every 2.0s: kubectl get mssqlserveropsrequest -n demo msops-hscale-up + +NAME TYPE STATUS AGE +msops-hscale-up HorizontalScaling Successful 76s + +``` + +You can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest`, we will see that the `MSSQLServer` cluster is scaled up. + +```bash +kubectl describe mssqlserveropsrequest -n demo msops-hscale-up +Name: msops-hscale-up +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T15:09:36Z + Generation: 1 + Resource Version: 752963 + UID: 43193e49-8461-4e14-b1c1-7aaa33d0251a +Spec: + Apply: IfReady + Database Ref: + Name: mssql-ag-cluster + Horizontal Scaling: + Replicas: 3 + Type: HorizontalScaling +Status: + Conditions: + Last Transition Time: 2024-10-24T15:09:36Z + Message: MSSQLServer ops-request has started to horizontally scaling the nodes + Observed Generation: 1 + Reason: HorizontalScaling + Status: True + Type: HorizontalScaling + Last Transition Time: 2024-10-24T15:09:39Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-24T15:10:29Z + Message: Successfully Scaled Up Node + Observed Generation: 1 + Reason: HorizontalScaleUp + Status: True + Type: HorizontalScaleUp + Last Transition Time: 2024-10-24T15:09:44Z + Message: get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetCurrentLeader--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T15:09:44Z + Message: get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetRaftNode--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T15:09:44Z + Message: add raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: AddRaftNode--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:09:49Z + Message: patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: PatchPetset--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:09:49Z + Message: mssql-ag-cluster already has desired replicas + Observed Generation: 1 + Reason: HorizontalScale + Status: True + Type: HorizontalScale + Last Transition Time: 2024-10-24T15:09:59Z + Message: is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: IsPodReady--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:10:19Z + Message: is mssql running; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsMssqlRunning + Last Transition Time: 2024-10-24T15:10:24Z + Message: ensure replica join; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: EnsureReplicaJoin + Last Transition Time: 2024-10-24T15:10:34Z + Message: successfully reconciled the MSSQLServer with modified replicas + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T15:10:35Z + Message: Successfully updated MSSQLServer + Observed Generation: 1 + Reason: UpdateDatabase + Status: True + Type: UpdateDatabase + Last Transition Time: 2024-10-24T15:10:35Z + Message: Successfully completed the HorizontalScaling for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m22s KubeDB Ops-manager Operator Start processing for MSSQLServerOpsRequest: demo/msops-hscale-up + Normal Starting 2m22s KubeDB Ops-manager Operator Pausing MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 2m22s KubeDB Ops-manager Operator Successfully paused MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: msops-hscale-up + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 2m14s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 2m14s KubeDB Ops-manager Operator get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning add raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 2m14s KubeDB Ops-manager Operator add raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 2m9s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 2m9s KubeDB Ops-manager Operator get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 2m9s KubeDB Ops-manager Operator patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 2m4s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning is pod ready; ConditionStatus:False; PodName:mssql-ag-cluster-2 2m4s KubeDB Ops-manager Operator is pod ready; ConditionStatus:False; PodName:mssql-ag-cluster-2 + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 119s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 119s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning is mssql running; ConditionStatus:False 109s KubeDB Ops-manager Operator is mssql running; ConditionStatus:False + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 109s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 109s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 99s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 99s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning is mssql running; ConditionStatus:True 99s KubeDB Ops-manager Operator is mssql running; ConditionStatus:True + Warning ensure replica join; ConditionStatus:False 98s KubeDB Ops-manager Operator ensure replica join; ConditionStatus:False + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 94s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 94s KubeDB Ops-manager Operator is pod ready; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning is mssql running; ConditionStatus:True 94s KubeDB Ops-manager Operator is mssql running; ConditionStatus:True + Warning ensure replica join; ConditionStatus:True 94s KubeDB Ops-manager Operator ensure replica join; ConditionStatus:True + Warning get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 89s KubeDB Ops-manager Operator get current leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Normal HorizontalScaleUp 89s KubeDB Ops-manager Operator Successfully Scaled Up Node + Normal UpdatePetSets 84s KubeDB Ops-manager Operator successfully reconciled the MSSQLServer with modified replicas + Normal UpdateDatabase 83s KubeDB Ops-manager Operator Successfully updated MSSQLServer + Normal Starting 83s KubeDB Ops-manager Operator Resuming MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 83s KubeDB Ops-manager Operator Successfully resumed MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: msops-hscale-up + Normal UpdateDatabase 83s KubeDB Ops-manager Operator Successfully updated MSSQLServer +``` + +Now, we are going to verify whether the number of replicas has increased to meet up the desired state. So let's check the new pods coordinator container's logs to see if this is joined in the cluster as new replica. + +```bash +$ kubectl logs -f -n demo mssql-ag-cluster-2 -c mssql-coordinator +raft2024/10/24 15:09:55 INFO: 3 switched to configuration voters=(1 2 3) +raft2024/10/24 15:09:55 INFO: 3 switched to configuration voters=(1 2 3) +raft2024/10/24 15:09:55 INFO: 3 switched to configuration voters=(1 2 3) +raft2024/10/24 15:09:55 INFO: 3 [term: 1] received a MsgHeartbeat message with higher term from 1 [term: 3] +raft2024/10/24 15:09:55 INFO: 3 became follower at term 3 +raft2024/10/24 15:09:55 INFO: raft.node: 3 elected leader 1 at term 3 +I1024 15:09:56.855261 1 mssql.go:94] new elected primary is :mssql-ag-cluster-0. +I1024 15:09:56.864197 1 mssql.go:120] New primary is ready to accept connections... +I1024 15:09:56.864213 1 mssql.go:171] lastLeaderId : 0, currentLeaderId : 1 +I1024 15:09:56.864230 1 on_leader_change.go:47] New Leader elected. +I1024 15:09:56.864237 1 on_leader_change.go:82] This pod is now a secondary according to raft +I1024 15:09:56.864243 1 on_leader_change.go:100] instance demo/mssql-ag-cluster-2 running according to the role +I1024 15:09:56.864317 1 utils.go:219] /scripts/run_signal.txt file created successfully +E1024 15:09:56.935767 1 exec_utils.go:65] Error while trying to get process output from the pod. Error: could not execute: command terminated with exit code 1 +I1024 15:09:56.935794 1 on_leader_change.go:110] mssql is not ready yet +I1024 15:10:07.980792 1 on_leader_change.go:110] mssql is not ready yet +I1024 15:10:18.049036 1 on_leader_change.go:110] mssql is not ready yet +I1024 15:10:18.116939 1 on_leader_change.go:118] mssql is ready now +I1024 15:10:18.127315 1 ag_status.go:43] No Availability Group found +I1024 15:10:18.127336 1 ag.go:79] Joining Availability Group... +I1024 15:10:24.638144 1 on_leader_change.go:94] Successfully patched label of demo/mssql-ag-cluster-2 to secondary +I1024 15:10:24.650611 1 health.go:50] Sequence Number updated. new sequenceNumber = 4294967322, previous sequenceNumber = 0 +I1024 15:10:24.650632 1 health.go:51] 1:1A (4294967322) +``` + + +Now, connect to the database, check updated configurations of the availability group cluster. +```bash +$ kubectl exec -it -n demo mssql-ag-cluster-2 -c mssql -- bash +mssql@mssql-ag-cluster-2:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "123KKxgOXuOkP206" +1> SELECT name FROM sys.availability_groups +2> go +name +---------------------------------------------------------------------------- +mssqlagcluster + +(1 rows affected) +1> select replica_server_name from sys.availability_replicas; +2> go +replica_server_name +------------------------------------------------------------------------------------------- +mssql-ag-cluster-0 +mssql-ag-cluster-1 + +mssql-ag-cluster-2 + +(3 rows affected) +1> select database_name from sys.availability_databases_cluster; +2> go +database_name +------------------------------------------------------------------------------------------ +agdb1 +agdb2 + +(2 rows affected) +``` + +#### Scale Down + +Here, we are going to remove 1 replica from our cluster using horizontal scaling. + +**Create MSSQLServerOpsRequest:** + +To scale down your cluster, you have to create a `MSSQLServerOpsRequest` CR with your desired number of replicas after scaling. Below is the YAML of the `MSSQLServerOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-hscale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: mssql-ag-cluster + horizontalScaling: + replicas: 2 +``` + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/horizontal-scaling/msops-hscale-down.yaml +mssqlserveropsrequest.ops.kubedb.com/msops-hscale-down created +``` + +**Verify Scale-down Succeeded:** + +If everything goes well, `KubeDB` Ops Manager will scale down the PetSet's `Pod`. After the scaling process is completed successfully, the `KubeDB` Ops Manager updates the replicas of the `MSSQLServer` object. + +Now, we will wait for `MSSQLServerOpsRequest` to be successful. Run the following command to watch `MSSQLServerOpsRequest` cr, + +```bash +$ watch kubectl get mssqlserveropsrequest -n demo msops-hscale-down +Every 2.0s: kubectl get mssqlserveropsrequest -n demo msops-hscale-down + +NAME TYPE STATUS AGE +msops-hscale-down HorizontalScaling Successful 98s +``` + +You can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest`, we shall see that the `MSSQLServer` cluster is scaled down. + +```bash +$ kubectl describe mssqlserveropsrequest -n demo msops-hscale-down +Name: msops-hscale-down +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T15:22:54Z + Generation: 1 + Resource Version: 754237 + UID: c5dc6971-5f60-4736-992a-8fdf5a2911d9 +Spec: + Apply: IfReady + Database Ref: + Name: mssql-ag-cluster + Horizontal Scaling: + Replicas: 2 + Type: HorizontalScaling +Status: + Conditions: + Last Transition Time: 2024-10-24T15:22:54Z + Message: MSSQLServer ops-request has started to horizontally scaling the nodes + Observed Generation: 1 + Reason: HorizontalScaling + Status: True + Type: HorizontalScaling + Last Transition Time: 2024-10-24T15:23:06Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-24T15:24:06Z + Message: Successfully Scaled Down Node + Observed Generation: 1 + Reason: HorizontalScaleDown + Status: True + Type: HorizontalScaleDown + Last Transition Time: 2024-10-24T15:23:21Z + Message: get current raft leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetCurrentRaftLeader--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T15:23:11Z + Message: get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetRaftNode--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T15:23:11Z + Message: remove raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: RemoveRaftNode--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:23:21Z + Message: patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: PatchPetset--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:23:21Z + Message: mssql-ag-cluster already has desired replicas + Observed Generation: 1 + Reason: HorizontalScale + Status: True + Type: HorizontalScale + Last Transition Time: 2024-10-24T15:23:26Z + Message: get pod; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: GetPod + Last Transition Time: 2024-10-24T15:23:56Z + Message: get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: GetPod--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:23:56Z + Message: delete pvc; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: DeletePvc--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T15:24:01Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-10-24T15:24:01Z + Message: ag node remove; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: AgNodeRemove + Last Transition Time: 2024-10-24T15:24:11Z + Message: successfully reconciled the MSSQLServer with modified replicas + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T15:24:11Z + Message: Successfully updated MSSQLServer + Observed Generation: 1 + Reason: UpdateDatabase + Status: True + Type: UpdateDatabase + Last Transition Time: 2024-10-24T15:24:11Z + Message: Successfully completed the HorizontalScaling for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m1s KubeDB Ops-manager Operator Start processing for MSSQLServerOpsRequest: demo/msops-hscale-down + Normal Starting 2m1s KubeDB Ops-manager Operator Pausing MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 2m1s KubeDB Ops-manager Operator Successfully paused MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: msops-hscale-down + Warning get current raft leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 104s KubeDB Ops-manager Operator get current raft leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 104s KubeDB Ops-manager Operator get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning remove raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 104s KubeDB Ops-manager Operator remove raft node; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get current raft leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 94s KubeDB Ops-manager Operator get current raft leader; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 94s KubeDB Ops-manager Operator get raft node; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 94s KubeDB Ops-manager Operator patch petset; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 59s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning delete pvc; ConditionStatus:True; PodName:mssql-ag-cluster-2 59s KubeDB Ops-manager Operator delete pvc; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get pvc; ConditionStatus:False 59s KubeDB Ops-manager Operator get pvc; ConditionStatus:False + Warning get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 54s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning delete pvc; ConditionStatus:True; PodName:mssql-ag-cluster-2 54s KubeDB Ops-manager Operator delete pvc; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning get pvc; ConditionStatus:True 54s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning ag node remove; ConditionStatus:True 54s KubeDB Ops-manager Operator ag node remove; ConditionStatus:True + Normal HorizontalScaleDown 49s KubeDB Ops-manager Operator Successfully Scaled Down Node + Normal UpdatePetSets 44s KubeDB Ops-manager Operator successfully reconciled the MSSQLServer with modified replicas + Normal UpdateDatabase 44s KubeDB Ops-manager Operator Successfully updated MSSQLServer + Normal Starting 44s KubeDB Ops-manager Operator Resuming MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 44s KubeDB Ops-manager Operator Successfully resumed MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: msops-hscale-down + Normal UpdateDatabase 44s KubeDB Ops-manager Operator Successfully updated MSSQLServer +``` + +Now, we are going to verify whether the number of replicas has decreased to meet up the desired state, Let's check, the mssqlserver status if it's ready then the scale-down is successful. + +```bash +$ kubectl get ms,petset,pods -n demo +NAME VERSION STATUS AGE +mssqlserver.kubedb.com/mssql-ag-cluster 2022-cu12 Ready 39m + +NAME AGE +petset.apps.k8s.appscode.com/mssql-ag-cluster 38m + +NAME READY STATUS RESTARTS AGE +pod/mssql-ag-cluster-0 2/2 Running 0 38m +pod/mssql-ag-cluster-1 2/2 Running 0 38m +``` + + +Now, connect to the database, check updated configurations of the availability group cluster. +```bash +$ kubectl exec -it -n demo mssql-ag-cluster-0 -c mssql -- bash +mssql@mssql-ag-cluster-0:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "123KKxgOXuOkP206" +1> SELECT name FROM sys.availability_groups +2> go +name +---------------------------------------------------- +mssqlagcluster + +(1 rows affected) +1> select replica_server_name from sys.availability_replicas; +2> go +replica_server_name +-------------------------------------- +mssql-ag-cluster-0 +mssql-ag-cluster-1 + +(2 rows affected) +``` + +You can see above that our `MSSQLServer` cluster now has a total of 2 replicas. It verifies that we have successfully scaled down. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete ms -n demo mssql-ag-cluster +kubectl delete mssqlserveropsrequest -n demo msops-hscale-up +kubectl delete mssqlserveropsrequest -n demo msops-hscale-down +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` diff --git a/docs/guides/mssqlserver/scaling/horizontal-scaling/overview.md b/docs/guides/mssqlserver/scaling/horizontal-scaling/overview.md new file mode 100644 index 0000000000..fec27fd65c --- /dev/null +++ b/docs/guides/mssqlserver/scaling/horizontal-scaling/overview.md @@ -0,0 +1,56 @@ +--- +title: MSSQLServer Horizontal Scaling Overview +menu: + docs_{{ .version }}: + identifier: ms-scaling-horizontal-overview + name: Overview + parent: ms-scaling-horizontal + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Horizontal Scaling Overview + +This guide will give you an overview of how `KubeDB` Ops Manager scales up/down the number of members of a `MSSQLServer`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + +## How Horizontal Scaling Process Works + +The following diagram shows how `KubeDB` Ops Manager used to scale up the number of members of a `MSSQLServer` cluster. Open the image in a new tab to see the enlarged version. + +
    + Horizontal scaling Flow +
    Fig: Horizontal scaling process of MSSQLServer
    +
    + +The horizontal scaling process consists of the following steps: + +1. At first, a user creates a `MSSQLServer` CR. + +2. `KubeDB` provisioner operator watches for the `MSSQLServer` CR. + +3. When it finds one, it creates a `PetSet` and related necessary stuff like secret, service, etc. + +4. Then, in order to scale the cluster up or down, the user creates a `MSSQLServerOpsRequest` CR with the desired number of replicas after scaling. + +5. `KubeDB` Ops Manager watches for `MSSQLServerOpsRequest`. + +6. When it finds one, it halts the `MSSQLServer` object so that the `KubeDB` provisioner operator doesn't perform any operation on the `MSSQLServer` during the scaling process. + +7. Then `KubeDB` Ops Manager will add nodes in case of scale up or remove nodes in case of scale down. + +8. Then the `KubeDB` Ops Manager will scale the PetSet replicas to reach the expected number of replicas for the cluster. + +9. After successful scaling of the PetSet's replica, the `KubeDB` Ops Manager updates the `spec.replicas` field of `MSSQLServer` object to reflect the updated cluster state. + +10. After successful scaling of the `MSSQLServer` replicas, the `KubeDB` Ops Manager resumes the `MSSQLServer` 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 scaling of a MSSQLServer cluster using Horizontal Scaling. \ No newline at end of file diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/_index.md b/docs/guides/mssqlserver/scaling/vertical-scaling/_index.md new file mode 100644 index 0000000000..05b1216f53 --- /dev/null +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Vertical Scaling +menu: + docs_{{ .version }}: + identifier: ms-scaling-vertical + name: Vertical Scaling + parent: ms-scaling + weight: 20 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md b/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md new file mode 100644 index 0000000000..8867b49748 --- /dev/null +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md @@ -0,0 +1,455 @@ +--- +title: Vertical Scaling MSSQLServer +menu: + docs_{{ .version }}: + identifier: ms-scaling-vertical-ag-cluster + name: Availability Group (HA Cluster) + parent: ms-scaling-vertical + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Vertical Scale SQL Server Availability Group (HA Cluster) + +This guide will show you how to use `kubeDB-Ops-Manager` to update the resources of a SQL Server Availability Group Cluster. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [Vertical Scaling Overview](/docs/guides/mssqlserver/scaling/vertical-scaling/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/mssqlserver/scaling/vertical-scaling](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling) directory of [kubedb/doc](https://github.com/kubedb/docs) repository. + +### Apply Vertical Scaling on MSSQLServer Availability Group Cluster + +Here, we are going to deploy a `MSSQLServer` instance using a supported version by `KubeDB` operator. Then we are going to apply vertical scaling on it. + +**Find supported MSSQLServer Version:** + +When you have installed `KubeDB`, it has created `MSSQLServerVersion` CR for all supported `MSSQLServer` versions. Let's check the supported MSSQLServer versions, + +```bash +$ kubectl get mssqlserverversion +NAME VERSION DB_IMAGE DEPRECATED AGE +2022-cu12 2022 mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 3d21h +2022-cu14 2022 mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 3d21h +``` + +The version above that does not show `DEPRECATED` `true` is supported by `KubeDB` for `MSSQLServer`. You can use any non-deprecated version. Here, we are going to create a mssqlserver using non-deprecated `MSSQLServer` version `2022-cu12`. + + +At first, we need to create an Issuer/ClusterIssuer which will be used to generate the certificate used for TLS configurations. + +#### 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=MSSQLServer/O=kubedb" +``` +- +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +**Deploy MSSQLServer Availability Group Cluster:** + +In this section, we are going to deploy a MSSQLServer instance. Then, in the next section, we will update the resources of the database server using vertical scaling. +Below is the YAML of the `MSSQLServer` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: 1 + memory: "2Gi" + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml +mssqlserver.kubedb.com/mssql-ag-cluster created +``` + + +**Check mssqlserver Ready to Scale:** + +`KubeDB` watches for `MSSQLServer` objects using Kubernetes API. When a `MSSQLServer` object is created, `KubeDB` will create a new PetSet, Services, and Secrets, etc. +Now, watch `MSSQLServer` is going to be in `Running` state and also watch `PetSet` and its pod is created and going to be in `Running` state, + + +```bash +$ watch kubectl get ms,petset,pods -n demo +Every 2.0s: kubectl get ms,petset,pods -n demo + +NAME VERSION STATUS AGE +mssqlserver.kubedb.com/mssql-ag-cluster 2022-cu12 Ready 4m40s + +NAME AGE +petset.apps.k8s.appscode.com/mssql-ag-cluster 3m57s + +NAME READY STATUS RESTARTS AGE +pod/mssql-ag-cluster-0 2/2 Running 0 3m57s +pod/mssql-ag-cluster-1 2/2 Running 0 3m51s +pod/mssql-ag-cluster-2 2/2 Running 0 3m46s +``` + +Let's check pod's `mssql` container's resources, `mssql` container is the first container So it's index will be 0. + +```bash +$ kubectl get pod -n demo mssql-ag-cluster-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "1", + "memory": "2Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +$ kubectl get pod -n demo mssql-ag-cluster-1 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "1", + "memory": "2Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +$ kubectl get pod -n demo mssql-ag-cluster-2 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "1", + "memory": "2Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +``` + +Now, We are ready to apply a vertical scale on this mssqlserver database. + +#### Vertical Scaling + +Here, we are going to update the resources of the mssqlserver to meet up with the desired resources after scaling. + +**Create MSSQLServerOpsRequest:** + +In order to update the resources of your database, you have to create a `MSSQLServerOpsRequest` CR with your desired resources for scaling. Below is the YAML of the `MSSQLServerOpsRequest` CR that we are going to create, + + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-vscale-ag-cluster + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: mssql-ag-cluster + verticalScaling: + mssqlserver: + resources: + requests: + memory: "1.7Gi" + cpu: "700m" + limits: + cpu: 2 + memory: "4Gi" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing operation on `mssql-ag-cluster` database. +- `spec.type` specifies that we are performing `VerticalScaling` on our database. +- `spec.VerticalScaling.mssqlserver` specifies the expected `mssql` container resources after scaling. + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-ag-cluster.yaml +mssqlserveropsrequest.ops.kubedb.com/mops-vscale-ag-cluster created +``` + +**Verify MSSQLServer resources updated successfully:** + +If everything goes well, `KubeDB-Ops-Manager` will update the resources of the PetSet's `Pod` containers. After a successful scaling process is done, the `KubeDB-Ops-Manager` updates the resources of the `MSSQLServer` object. + +First, we will wait for `MSSQLServerOpsRequest` to be successful. Run the following command to watch `MSSQLServerOpsRequest` CR, + +```bash +$ watch kubectl get mssqlserveropsrequest -n demo mops-vscale-ag-cluster +Every 2.0s: kubectl get mssqlserveropsrequest -n demo mops-vscale-ag-cluster + +NAME TYPE STATUS AGE +mops-vscale-ag-cluster VerticalScaling Successful 7m17s +``` + +We can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest`, we will see that the mssqlserver resources are updated. + +```bash +$ kubectl describe mssqlserveropsrequest -n demo mops-vscale-ag-cluster +Name: mops-vscale-ag-cluster +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T14:13:05Z + Generation: 1 + Resource Version: 747632 + UID: ed3c5cbc-e74e-46ba-b243-143a6007ac36 +Spec: + Apply: IfReady + Database Ref: + Name: mssql-ag-cluster + Type: VerticalScaling + Vertical Scaling: + Mssqlserver: + Resources: + Limits: + Cpu: 2 + Memory: 4Gi + Requests: + Cpu: 700m + Memory: 1.7Gi +Status: + Conditions: + Last Transition Time: 2024-10-24T14:13:05Z + Message: MSSQLServer ops-request has started to vertically scaling the MSSQLServer nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-24T14:13:08Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-24T14:13:08Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T14:13:13Z + Message: get pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetPod--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T14:13:13Z + Message: evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: EvictPod--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T14:13:48Z + Message: check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssql-ag-cluster-0 + Last Transition Time: 2024-10-24T14:13:53Z + Message: get pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: GetPod--mssql-ag-cluster-1 + Last Transition Time: 2024-10-24T14:13:53Z + Message: evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: EvictPod--mssql-ag-cluster-1 + Last Transition Time: 2024-10-24T14:14:28Z + Message: check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssql-ag-cluster-1 + Last Transition Time: 2024-10-24T14:14:33Z + Message: get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: GetPod--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T14:14:33Z + Message: evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: EvictPod--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T14:15:08Z + Message: check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssql-ag-cluster-2 + Last Transition Time: 2024-10-24T14:15:13Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-24T14:15:13Z + Message: Successfully completed the VerticalScaling for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 7m46s KubeDB Ops-manager Operator Start processing for MSSQLServerOpsRequest: demo/mops-vscale-ag-cluster + Normal Starting 7m46s KubeDB Ops-manager Operator Pausing MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 7m46s KubeDB Ops-manager Operator Successfully paused MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: mops-vscale-ag-cluster + Normal UpdatePetSets 7m43s KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 7m38s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 7m38s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-0 7m33s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-0 + Warning check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-0 7m3s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-0 + Warning get pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 6m58s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Warning evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 6m58s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Warning check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-1 6m53s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-1 + Warning check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-1 6m23s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-1 + Warning get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 6m18s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 6m18s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Warning check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-2 6m13s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:mssql-ag-cluster-2 + Warning check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-2 5m43s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:mssql-ag-cluster-2 + Normal RestartPods 5m38s KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting 5m38s KubeDB Ops-manager Operator Resuming MSSQLServer database: demo/mssql-ag-cluster + Normal Successful 5m38s KubeDB Ops-manager Operator Successfully resumed MSSQLServer database: demo/mssql-ag-cluster for MSSQLServerOpsRequest: mops-vscale-ag-cluster +``` + +Now, we are going to verify whether the resources of the mssqlserver instance has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo mssql-ag-cluster-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "2", + "memory": "4Gi" + }, + "requests": { + "cpu": "700m", + "memory": "1825361100800m" + } +} +$ kubectl get pod -n demo mssql-ag-cluster-1 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "2", + "memory": "4Gi" + }, + "requests": { + "cpu": "700m", + "memory": "1825361100800m" + } +} +$ kubectl get pod -n demo mssql-ag-cluster-2 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "2", + "memory": "4Gi" + }, + "requests": { + "cpu": "700m", + "memory": "1825361100800m" + } +} +``` + +The above output verifies that we have successfully scaled up the resources of the MSSQLServer. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete mssqlserver -n demo mssql-ag-cluster +kubectl delete mssqlserveropsrequest -n demo mops-vscale-ag-cluster +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` + + + diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/overview.md b/docs/guides/mssqlserver/scaling/vertical-scaling/overview.md new file mode 100644 index 0000000000..92635094d9 --- /dev/null +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/overview.md @@ -0,0 +1,54 @@ +--- +title: Microsoft SQL Server Vertical Scaling Overview +menu: + docs_{{ .version }}: + identifier: ms-scaling-vertical-overview + name: Overview + parent: ms-scaling-vertical + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Vertical Scaling MSSQLServer + +This guide will give you an overview of how KubeDB Ops Manager updates the resources(for example Memory, CPU etc.) of the `MSSQLServer`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + +## How Vertical Scaling Process Works + +The following diagram shows how the `KubeDB` Ops Manager used to update the resources of the `MSSQLServer`. Open the image in a new tab to see the enlarged version. + +
    +  Vertical scaling process of MSSQLServer +
    Fig: Vertical scaling process of MSSQLServer
    +
    + +The vertical scaling process consists of the following steps: + +1. At first, a user creates a `MSSQLServer` CR. + +2. `KubeDB` provisioner operator watches for the `MSSQLServer` CR. + +3. When the operator finds a `MSSQLServer` CR, it creates a `PetSet` and related necessary stuff like secret, service, etc. + +4. Then, in order to update the resources(for example `CPU`, `Memory` etc.) of the `MSSQLServer` cluster the user creates a `MSSQLServerOpsRequest` CR with desired information. + +5. `KubeDB` Ops Manager watches for `MSSQLServerOpsRequest`. + +6. When it finds one, it halts the `MSSQLServer` object so that the `KubeDB` provisioner operator doesn't perform any operation on the `MSSQLServer` during the scaling process. + +7. Then the KubeDB Ops-manager operator will update resources of the PetSet's Pods to reach desired state. + +8. After successful updating of the resources of the PetSet's Pods, the `KubeDB` Ops Manager updates the `MSSQLServer` object resources to reflect the updated state. + +9. After successful updating of the `MSSQLServer` resources, the `KubeDB` Ops Manager resumes the `MSSQLServer` object so that the `KubeDB` Provisioner operator resumes its usual operations. + +In the next doc, we are going to show a step-by-step guide on updating resources of MSSQLServer database using vertical scaling operation. diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md b/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md new file mode 100644 index 0000000000..72d97a6d9d --- /dev/null +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md @@ -0,0 +1,352 @@ +--- +title: Vertical Scaling MSSQLServer +menu: + docs_{{ .version }}: + identifier: ms-scaling-vertical-standalone + name: Standalone + parent: ms-scaling-vertical + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Vertical Scale MSSQLServer Instances + +This guide will show you how to use `kubeDB-Ops-Manager` to update the resources of a MSSQLServer instances. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [Vertical Scaling Overview](/docs/guides/mssqlserver/scaling/vertical-scaling/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/mssqlserver/scaling/vertical-scaling](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling) directory of [kubedb/doc](https://github.com/kubedb/docs) repository. + +### Apply Vertical Scaling on MSSQLServer + +Here, we are going to deploy a `MSSQLServer` instance using a supported version by `KubeDB` operator. Then we are going to apply vertical scaling on it. + +**Find supported MSSQLServer Version:** + +When you have installed `KubeDB`, it has created `MSSQLServerVersion` CR for all supported `MSSQLServer` versions. Let's check the supported MSSQLServer versions, + +```bash +$ kubectl get mssqlserverversion +NAME VERSION DB_IMAGE DEPRECATED AGE +2022-cu12 2022 mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 3d21h +2022-cu14 2022 mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 3d21h +``` + +The version above that does not show `DEPRECATED` `true` is supported by `KubeDB` for `MSSQLServer`. You can use any non-deprecated version. Here, we are going to create a mssqlserver using non-deprecated `MSSQLServer` version `2022-cu12`. + + +At first, we need to create an Issuer/ClusterIssuer which will be used to generate the certificate used for TLS configurations. + +#### 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=MSSQLServer/O=kubedb" +``` +- +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +**Deploy MSSQLServer:** + +In this section, we are going to deploy a MSSQLServer instance. Then, in the next section, we will update the resources of the database server using vertical scaling. +Below is the YAML of the `MSSQLServer` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-standalone + namespace: demo +spec: + version: "2022-cu12" + replicas: 1 + storageType: Durable + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml +mssqlserver.kubedb.com/mssql-standalone created +``` + + +**Check mssqlserver Ready to Scale:** + +`KubeDB` watches for `MSSQLServer` objects using Kubernetes API. When a `MSSQLServer` object is created, `KubeDB` will create a new PetSet, Services, and Secrets, etc. +Now, watch `MSSQLServer` is going to be in `Running` state and also watch `PetSet` and its pod is created and going to be in `Running` state, + + + + + +```bash +$ watch kubectl get ms,petset,pods -n demo +Every 2.0s: kubectl get ms,petset,pods -n demo + +NAME VERSION STATUS AGE +mssqlserver.kubedb.com/mssql-standalone 2022-cu12 Ready 4m7s + +NAME AGE +petset.apps.k8s.appscode.com/mssql-standalone 3m33s + +NAME READY STATUS RESTARTS AGE +pod/mssql-standalone-0 1/1 Running 0 3m33s +``` + +Let's check the `mssql-standalone-0` pod's `mssql` container's resources, `mssql` container is the first container So it's index will be 0. + +```bash +$ kubectl get pod -n demo mssql-standalone-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "memory": "4Gi" + }, + "requests": { + "cpu": "500m", + "memory": "4Gi" + } +} +``` + +Now, We are ready to apply a vertical scale on this mssqlserver database. + +#### Vertical Scaling + +Here, we are going to update the resources of the mssqlserver to meet up with the desired resources after scaling. + +**Create MSSQLServerOpsRequest:** + +In order to update the resources of your database, you have to create a `MSSQLServerOpsRequest` CR with your desired resources for scaling. Below is the YAML of the `MSSQLServerOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-vscale-standalone + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: mssql-standalone + verticalScaling: + mssqlserver: + resources: + requests: + memory: "5Gi" + cpu: "1000m" + limits: + memory: "5Gi" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing operation on `mssql-standalone` database. +- `spec.type` specifies that we are performing `VerticalScaling` on our database. +- `spec.VerticalScaling.mssqlserver` specifies the expected `mssql` container resources after scaling. + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/scaling/vertical-scaling/mops-vscale-standalone.yaml +mssqlserveropsrequest.ops.kubedb.com/mops-vscale-standalone created +``` + +**Verify MSSQLServer resources updated successfully:** + +If everything goes well, `KubeDB-Ops-Manager` will update the resources of the PetSet's `Pod` containers. After a successful scaling process is done, the `KubeDB-Ops-Manager` updates the resources of the `MSSQLServer` object. + +First, we will wait for `MSSQLServerOpsRequest` to be successful. Run the following command to watch `MSSQLServerOpsRequest` CR, + +```bash +$ watch kubectl get mssqlserveropsrequest -n demo mops-vscale-standalone +Every 2.0s: kubectl get mssqlserveropsrequest -n demo mops-vscale-standalone + +NAME TYPE STATUS AGE +mops-vscale-standalone VerticalScaling Successful 3m22s +``` + +We can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest`, we will see that the mssqlserver resources are updated. + +```bash +$ kubectl describe mssqlserveropsrequest -n demo mops-vscale-standalone +Name: mops-vscale-standalone +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T13:43:57Z + Generation: 1 + Resource Version: 744508 + UID: 68bcc122-2ad7-4ae0-ab72-1a3e01fd6f40 +Spec: + Apply: IfReady + Database Ref: + Name: mssql-standalone + Type: VerticalScaling + Vertical Scaling: + Mssqlserver: + Resources: + Limits: + Cpu: 2 + Memory: 5Gi + Requests: + Cpu: 1 + Memory: 5Gi +Status: + Conditions: + Last Transition Time: 2024-10-24T13:43:57Z + Message: MSSQLServer ops-request has started to vertically scaling the MSSQLServer nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-24T13:44:24Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-24T13:44:24Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T13:44:29Z + Message: get pod; ConditionStatus:True; PodName:mssql-standalone-0 + Observed Generation: 1 + Status: True + Type: GetPod--mssql-standalone-0 + Last Transition Time: 2024-10-24T13:44:29Z + Message: evict pod; ConditionStatus:True; PodName:mssql-standalone-0 + Observed Generation: 1 + Status: True + Type: EvictPod--mssql-standalone-0 + Last Transition Time: 2024-10-24T13:45:04Z + Message: check pod running; ConditionStatus:True; PodName:mssql-standalone-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssql-standalone-0 + Last Transition Time: 2024-10-24T13:45:09Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-24T13:45:09Z + Message: Successfully completed the VerticalScaling for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 3m55s KubeDB Ops-manager Operator Start processing for MSSQLServerOpsRequest: demo/mops-vscale-standalone + Normal Starting 3m55s KubeDB Ops-manager Operator Pausing MSSQLServer database: demo/mssql-standalone + Normal Successful 3m55s KubeDB Ops-manager Operator Successfully paused MSSQLServer database: demo/mssql-standalone for MSSQLServerOpsRequest: mops-vscale-standalone + Normal UpdatePetSets 3m28s KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:mssql-standalone-0 3m23s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:mssql-standalone-0 + Warning evict pod; ConditionStatus:True; PodName:mssql-standalone-0 3m23s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:mssql-standalone-0 + Warning check pod running; ConditionStatus:False; PodName:mssql-standalone-0 3m18s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:mssql-standalone-0 + Warning check pod running; ConditionStatus:True; PodName:mssql-standalone-0 2m48s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:mssql-standalone-0 + Normal RestartPods 2m43s KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting 2m43s KubeDB Ops-manager Operator Resuming MSSQLServer database: demo/mssql-standalone + Normal Successful 2m43s KubeDB Ops-manager Operator Successfully resumed MSSQLServer database: demo/mssql-standalone for MSSQLServerOpsRequest: mops-vscale-standalone +``` + +Now, we are going to verify whether the resources of the mssqlserver instance has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo mssql-standalone-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "2", + "memory": "5Gi" + }, + "requests": { + "cpu": "1", + "memory": "5Gi" + } +``` + +The above output verifies that we have successfully scaled up the resources of the MSSQLServer. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete mssqlserver -n demo mssql-standalone +kubectl delete mssqlserveropsrequest -n demo mops-vscale-standalone +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` + + +## Next Steps + +- Detail concepts of [MSSQLServer object](/docs/guides/mssqlserver/concepts/mssqlserver.md). +- [Backup and Restore](/docs/guides/mssqlserver/backup/overview/index.md) MSSQLServer databases using KubeStash. + + diff --git a/docs/images/day-2-operation/mssqlserver/ms-horizontal-scaling.png b/docs/images/day-2-operation/mssqlserver/ms-horizontal-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd21f300c16303d438da89ceda4b4b097024b2c GIT binary patch literal 66623 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�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 literal 0 HcmV?d00001 diff --git a/docs/images/day-2-operation/mssqlserver/ms-vertical-scaling.png b/docs/images/day-2-operation/mssqlserver/ms-vertical-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..db3542685977af0a502028ec104f45671b9f5500 GIT binary patch literal 71560 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

    wj^_#1d%`br^R%*XRjVOy}$8 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 Date: Fri, 1 Nov 2024 16:39:17 +0600 Subject: [PATCH 04/12] Add MSSQLServer Restart Doc (#705) Signed-off-by: Neaj Morshad --- .../mssqlserver/restart/msops-restart.yaml | 11 + .../restart/mssqlserver-ag-cluster.yaml | 35 +++ .../restart/mssqlserver-ca-issuer.yaml | 8 + docs/guides/mssqlserver/restart/_index.md | 10 + docs/guides/mssqlserver/restart/restart.md | 276 ++++++++++++++++++ 5 files changed, 340 insertions(+) create mode 100644 docs/examples/mssqlserver/restart/msops-restart.yaml create mode 100644 docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/restart/mssqlserver-ca-issuer.yaml create mode 100644 docs/guides/mssqlserver/restart/_index.md create mode 100644 docs/guides/mssqlserver/restart/restart.md diff --git a/docs/examples/mssqlserver/restart/msops-restart.yaml b/docs/examples/mssqlserver/restart/msops-restart.yaml new file mode 100644 index 0000000000..cb6eea527d --- /dev/null +++ b/docs/examples/mssqlserver/restart/msops-restart.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-restart + namespace: demo +spec: + type: Restart + databaseRef: + name: mssqlserver-ag-cluster + timeout: 3m + apply: Always \ No newline at end of file diff --git a/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml new file mode 100644 index 0000000000..12c229439e --- /dev/null +++ b/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml @@ -0,0 +1,35 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut diff --git a/docs/examples/mssqlserver/restart/mssqlserver-ca-issuer.yaml b/docs/examples/mssqlserver/restart/mssqlserver-ca-issuer.yaml new file mode 100644 index 0000000000..7a00e196d9 --- /dev/null +++ b/docs/examples/mssqlserver/restart/mssqlserver-ca-issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca \ No newline at end of file diff --git a/docs/guides/mssqlserver/restart/_index.md b/docs/guides/mssqlserver/restart/_index.md new file mode 100644 index 0000000000..cbd526b865 --- /dev/null +++ b/docs/guides/mssqlserver/restart/_index.md @@ -0,0 +1,10 @@ +--- +title: Restart MSSQLServer +menu: + docs_{{ .version }}: + identifier: ms-restart + name: Restart + parent: guides-mssqlserver + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/restart/restart.md b/docs/guides/mssqlserver/restart/restart.md new file mode 100644 index 0000000000..3f4832e76b --- /dev/null +++ b/docs/guides/mssqlserver/restart/restart.md @@ -0,0 +1,276 @@ +--- +title: Restart MSSQLServer +menu: + docs_{{ .version }}: + identifier: ms-restart-guide + name: Restart MSSQLServer + parent: ms-restart + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Restart MSSQLServer + +KubeDB supports restarting the MSSQLServer via a MSSQLServerOpsRequest. 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 + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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 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/examples/mssqlserver](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/mssqlserver) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Deploy MSSQLServer + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +In this section, we are going to deploy a MSSQLServer database using KubeDB. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storageType: Durable + storage: + storageClassName: "standard" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml +mssqlserver.kubedb.com/mssqlserver-ag-cluster created +``` + +Check the database is provisioned successfully +```bash +$ kubectl get ms -n demo mssqlserver-ag-cluster +NAME VERSION STATUS AGE +mssqlserver-ag-cluster 2022-cu12 Ready 4m +``` + + +## Apply Restart opsRequest + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: msops-restart + namespace: demo +spec: + type: Restart + databaseRef: + name: mssqlserver-ag-cluster + timeout: 3m + apply: Always +``` + +- `spec.type` specifies the Type of the ops Request +- `spec.databaseRef` holds the name of the MSSQLServer database. The db should be available in the same namespace as the opsRequest +- The meaning of `spec.timeout` & `spec.apply` fields can be found [here](/docs/guides/mssqlserver/concepts/opsrequest.md) + +> Note: The method of restarting the standalone & cluster mode db is exactly same as above. All you need, is to specify the corresponding MSSQLServer name in `spec.databaseRef.name` section. + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/restart/msops-restart.yaml +mssqlserveropsrequest.ops.kubedb.com/msops-restart created +``` + +Now the Ops-manager operator will first restart the general secondary pods and lastly will restart the Primary pod of the database. + +```shell +$ kubectl get msops -n demo msops-restart +NAME TYPE STATUS AGE +msops-restart Restart Successful 5m23s + +$ kubectl get msops -n demo msops-restart -oyaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"ops.kubedb.com/v1alpha1","kind":"MSSQLServerOpsRequest","metadata":{"annotations":{},"name":"msops-restart","namespace":"demo"},"spec":{"apply":"Always","databaseRef":{"name":"mssqlserver-ag-cluster"},"timeout":"3m","type":"Restart"}} + creationTimestamp: "2024-10-25T06:58:21Z" + generation: 1 + name: msops-restart + namespace: demo + resourceVersion: "771141" + uid: 9e531521-c369-4ce4-983f-a3dafd90cb8a +spec: + apply: Always + databaseRef: + name: mssqlserver-ag-cluster + timeout: 3m + type: Restart +status: + conditions: + - lastTransitionTime: "2024-10-25T06:58:21Z" + message: MSSQLServerOpsRequest has started to restart MSSQLServer nodes + observedGeneration: 1 + reason: Restart + status: "True" + type: Restart + - lastTransitionTime: "2024-10-25T06:58:45Z" + message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + observedGeneration: 1 + status: "True" + type: GetPod--mssqlserver-ag-cluster-0 + - lastTransitionTime: "2024-10-25T06:58:45Z" + message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + observedGeneration: 1 + status: "True" + type: EvictPod--mssqlserver-ag-cluster-0 + - lastTransitionTime: "2024-10-25T06:59:20Z" + message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--mssqlserver-ag-cluster-0 + - lastTransitionTime: "2024-10-25T06:59:25Z" + message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + observedGeneration: 1 + status: "True" + type: GetPod--mssqlserver-ag-cluster-1 + - lastTransitionTime: "2024-10-25T06:59:25Z" + message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + observedGeneration: 1 + status: "True" + type: EvictPod--mssqlserver-ag-cluster-1 + - lastTransitionTime: "2024-10-25T07:00:00Z" + message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--mssqlserver-ag-cluster-1 + - lastTransitionTime: "2024-10-25T07:00:05Z" + message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + observedGeneration: 1 + status: "True" + type: GetPod--mssqlserver-ag-cluster-2 + - lastTransitionTime: "2024-10-25T07:00:05Z" + message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + observedGeneration: 1 + status: "True" + type: EvictPod--mssqlserver-ag-cluster-2 + - lastTransitionTime: "2024-10-25T07:00:40Z" + message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--mssqlserver-ag-cluster-2 + - lastTransitionTime: "2024-10-25T07:00:45Z" + message: Successfully restarted MSSQLServer nodes + observedGeneration: 1 + reason: RestartNodes + status: "True" + type: RestartNodes + - lastTransitionTime: "2024-10-25T07:00:45Z" + message: Controller has successfully restart the MSSQLServer replicas + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +We can see that, the database is ready after restarting the pods +```bash +$ kubectl get ms -n demo mssqlserver-ag-cluster +NAME VERSION STATUS AGE +mssqlserver-ag-cluster 2022-cu12 Ready 14m +``` + +## Cleaning up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete mssqlserveropsrequest -n demo msops-restart +kubectl delete mssqlserver -n demo mssqlserver-ag-cluster +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` + +## Next Steps + +- Learn about [backup and restore](/docs/guides/mssqlserver/backup/overview/index.md) MSSQLServer database using KubeStash. +- Want to set up MSSQLServer cluster? Check how to [Configure SQL Server Availability Group Cluster](/docs/guides/mssqlserver/clustering/ag_cluster.md) +- Detail concepts of [MSSQLServer Object](/docs/guides/mssqlserver/concepts/mssqlserver.md). + +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). From 6d900f1a5663d4c2888c89c8df1e530cc5f7b39d Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Fri, 1 Nov 2024 16:42:29 +0600 Subject: [PATCH 05/12] Add MSSQLServer Monitoring Doc (#707) Signed-off-by: Neaj Morshad --- .../monitoring/mssql-monitoring.yaml | 48 ++ docs/guides/mssqlserver/monitoring/_index.md | 10 + .../guides/mssqlserver/monitoring/overview.md | 104 +++++ .../monitoring/using-prometheus-operator.md | 439 ++++++++++++++++++ .../monitoring/mssql-monitoring-targets.png | Bin 0 -> 150985 bytes 5 files changed, 601 insertions(+) create mode 100644 docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml create mode 100755 docs/guides/mssqlserver/monitoring/_index.md create mode 100644 docs/guides/mssqlserver/monitoring/overview.md create mode 100644 docs/guides/mssqlserver/monitoring/using-prometheus-operator.md create mode 100644 docs/images/mssqlserver/monitoring/mssql-monitoring-targets.png diff --git a/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml b/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml new file mode 100644 index 0000000000..da1027aa74 --- /dev/null +++ b/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml @@ -0,0 +1,48 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-monitoring + namespace: demo +spec: + version: "2022-cu12" + replicas: 1 + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + monitor: + agent: prometheus.io/operator + prometheus: + exporter: + port: 9399 + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 10001 + runAsNonRoot: true + runAsUser: 10001 + seccompProfile: + type: RuntimeDefault + serviceMonitor: + interval: 10s + labels: + release: prometheus + storageType: Durable + storage: + storageClassName: standard + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/mssqlserver/monitoring/_index.md b/docs/guides/mssqlserver/monitoring/_index.md new file mode 100755 index 0000000000..a7c806c4cc --- /dev/null +++ b/docs/guides/mssqlserver/monitoring/_index.md @@ -0,0 +1,10 @@ +--- +title: Monitoring Microsoft SQL Server +menu: + docs_{{ .version }}: + identifier: ms-monitoring + name: Monitoring + parent: guides-mssqlserver + weight: 50 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/monitoring/overview.md b/docs/guides/mssqlserver/monitoring/overview.md new file mode 100644 index 0000000000..47540c2e24 --- /dev/null +++ b/docs/guides/mssqlserver/monitoring/overview.md @@ -0,0 +1,104 @@ +--- +title: MSSQLServer Monitoring Overview +description: MSSQLServer Monitoring Overview +menu: + docs_{{ .version }}: + identifier: ms-monitoring-overview + name: Overview + parent: ms-monitoring + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring MSSQLServer 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 CR to enable monitoring. + +## Overview + +KubeDB uses Prometheus [exporter](https://prometheus.io/docs/instrumenting/exporters/#databases) images to export Prometheus metrics for respective databases. Following diagram shows the logical flow of database monitoring with KubeDB. + +

    +  Database Monitoring Flow +

    + +When a user creates a database CR 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` CR. | +| `spec.monitor.prometheus.serviceMonitor.interval` | `Optional` | Interval at which metrics should be scraped. | + +## Sample Configuration + +A sample YAML for MSSQLServer CR 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: MSSQLServer +metadata: + name: mssql-monitoring + namespace: demo +spec: + version: "2022-cu12" + replicas: 1 + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + monitor: + agent: prometheus.io/operator + prometheus: + exporter: + port: 9399 + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 10001 + runAsNonRoot: true + runAsUser: 10001 + seccompProfile: + type: RuntimeDefault + serviceMonitor: + interval: 10s + labels: + release: prometheus + storageType: Durable + storage: + storageClassName: standard + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +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` CR in `monitoring` namespace and this `ServiceMonitor` will have `release: prometheus` label. + +## Next Steps + +- Learn how to monitor Microsoft SQL Server with KubeDB using [Prometheus operator](/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md). diff --git a/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md b/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md new file mode 100644 index 0000000000..d19fac6b82 --- /dev/null +++ b/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md @@ -0,0 +1,439 @@ +--- +title: Monitor SQL Server using Prometheus Operator +menu: + docs_{{ .version }}: + identifier: ms-monitoring-prometheus-operator + name: Prometheus Operator + parent: ms-monitoring + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring MSSQLServer 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 MSSQLServer deployed with KubeDB. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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 learn how Prometheus monitoring works with KubeDB in general, please visit [here](/docs/guides/mssqlserver/monitoring/overview.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 + ``` + +- We need a [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) instance running. If you don't already have a running instance, you can deploy one using this helm chart [here](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack). + + +> Note: YAML files used in this tutorial are stored in [docs/examples/mssqlserver/monitoring](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/mssqlserver/monitoring) 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 `Prometheus` Operator. We are going to provide these labels in `spec.monitor.prometheus.labels` field of MSSQLServer CR 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 DESIRED READY RECONCILED AVAILABLE AGE +monitoring prometheus-kube-prometheus-prometheus v2.54.1 1 1 True True 16d +``` + +> 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-kube-prometheus-prometheus` in `monitoring` namespace. + +```bash +$ kubectl get prometheus -n monitoring prometheus-kube-prometheus-prometheus -oyaml +``` +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + annotations: + meta.helm.sh/release-name: prometheus + meta.helm.sh/release-namespace: monitoring + creationTimestamp: "2024-10-14T10:14:36Z" + generation: 1 + labels: + app: kube-prometheus-stack-prometheus + app.kubernetes.io/instance: prometheus + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: kube-prometheus-stack + app.kubernetes.io/version: 65.2.0 + chart: kube-prometheus-stack-65.2.0 + heritage: Helm + release: prometheus + name: prometheus-kube-prometheus-prometheus + namespace: monitoring + resourceVersion: "1004097" + uid: b7879d3e-e4bb-4425-8d78-f917561d95f7 +spec: + alerting: + alertmanagers: + - apiVersion: v2 + name: prometheus-kube-prometheus-alertmanager + namespace: monitoring + pathPrefix: / + port: http-web + automountServiceAccountToken: true + enableAdminAPI: false + evaluationInterval: 30s + externalUrl: http://prometheus-kube-prometheus-prometheus.monitoring:9090 + hostNetwork: false + image: quay.io/prometheus/prometheus:v2.54.1 + listenLocal: false + logFormat: logfmt + logLevel: info + paused: false + podMonitorNamespaceSelector: {} + podMonitorSelector: + matchLabels: + release: prometheus + portName: http-web + probeNamespaceSelector: {} + probeSelector: + matchLabels: + release: prometheus + replicas: 1 + retention: 10d + routePrefix: / + ruleNamespaceSelector: {} + ruleSelector: + matchLabels: + release: prometheus + scrapeConfigNamespaceSelector: {} + scrapeConfigSelector: + matchLabels: + release: prometheus + scrapeInterval: 30s + securityContext: + fsGroup: 2000 + runAsGroup: 2000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + serviceAccountName: prometheus-kube-prometheus-prometheus + serviceMonitorNamespaceSelector: {} + serviceMonitorSelector: + matchLabels: + release: prometheus + shards: 1 + tsdb: + outOfOrderTimeWindow: 0s + version: v2.54.1 + walCompression: true +status: + availableReplicas: 1 + conditions: + - lastTransitionTime: "2024-10-31T07:38:36Z" + message: "" + observedGeneration: 1 + reason: "" + status: "True" + type: Available + - lastTransitionTime: "2024-10-31T07:38:36Z" + message: "" + observedGeneration: 1 + reason: "" + status: "True" + type: Reconciled + paused: false + replicas: 1 + selector: app.kubernetes.io/instance=prometheus-kube-prometheus-prometheus,app.kubernetes.io/managed-by=prometheus-operator,app.kubernetes.io/name=prometheus,operator.prometheus.io/name=prometheus-kube-prometheus-prometheus,prometheus=prometheus-kube-prometheus-prometheus + shardStatuses: + - availableReplicas: 1 + replicas: 1 + shardID: "0" + unavailableReplicas: 0 + updatedReplicas: 1 + shards: 1 + unavailableReplicas: 0 + updatedReplicas: 1 +``` + +Notice the `spec.serviceMonitorSelector` section. Here, `release: prometheus` label is used to select `ServiceMonitor` CR. So, we are going to use this label in `spec.monitor.prometheus.labels` field of MSSQLServer CR. + +## Deploy MSSQLServer with Monitoring Enabled + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +Now, let's deploy an MSSQLServer with monitoring enabled. Below is the MSSQLServer object that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssql-monitoring + namespace: demo +spec: + version: "2022-cu12" + replicas: 1 + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + monitor: + agent: prometheus.io/operator + prometheus: + exporter: + port: 9399 + resources: + limits: + memory: 512Mi + requests: + cpu: 200m + memory: 256Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsGroup: 10001 + runAsNonRoot: true + runAsUser: 10001 + seccompProfile: + type: RuntimeDefault + serviceMonitor: + interval: 10s + labels: + release: prometheus + storageType: Durable + storage: + storageClassName: standard + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Here, + +- `monitor.agent: prometheus.io/operator` indicates that we are going to monitor this server using Prometheus operator. + +- `monitor.prometheus.serviceMonitor.labels` specifies that KubeDB should create `ServiceMonitor` with these labels. + +- `monitor.prometheus.interval` indicates that the Prometheus server should scrape metrics from this database with 10 seconds interval. + +Let's create the MSSQLServer object that we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml +mssqlserverql.kubedb.com/mssql-monitoring created +``` + +Now, wait for the database to go into `Ready` state. + +```bash +$ kubectl get ms -n demo mssql-monitoring +NAME VERSION STATUS AGE +mssql-monitoring 2022-cu12 Ready 108m +``` + +KubeDB will create a separate stats service with name `{mssqlserver cr name}-stats` for monitoring purpose. + +```bash +$ kubectl get svc -n demo --selector="app.kubernetes.io/instance=mssql-monitoring" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +mssql-monitoring ClusterIP 10.96.225.130 1433/TCP 108m +mssql-monitoring-pods ClusterIP None 1433/TCP 108m +mssql-monitoring-stats ClusterIP 10.96.147.93 9399/TCP 108m +``` + +Here, `mssql-monitoring-stats` service has been created for monitoring purpose. + +Let's describe this stats service. + + +```bash +$ kubectl describe svc -n demo mssql-monitoring-stats +``` +```yaml +Name: mssql-monitoring-stats +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=mssql-monitoring + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=mssqlservers.kubedb.com + kubedb.com/role=stats +Annotations: monitoring.appscode.com/agent: prometheus.io/operator +Selector: app.kubernetes.io/instance=mssql-monitoring,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=mssqlservers.kubedb.com +Type: ClusterIP +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.96.147.93 +IPs: 10.96.147.93 +Port: metrics 9399/TCP +TargetPort: metrics/TCP +Endpoints: 10.244.0.47:9399 +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` CR in `demo` namespace that select the endpoints of `mssql-monitoring-stats` service. Verify that the `ServiceMonitor` CR has been created. + +```bash +$ kubectl get servicemonitor -n demo +NAME AGE +mssql-monitoring-stats 110m +``` + +Let's verify that the `ServiceMonitor` has the label that we had specified in `spec.monitor` section of MSSQLServer CR. + +```bash +$ kubectl get servicemonitor -n demo mssql-monitoring-stats -o yaml +``` + +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + creationTimestamp: "2024-10-31T07:38:36Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: mssql-monitoring + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mssqlservers.kubedb.com + release: prometheus + name: mssql-monitoring-stats + namespace: demo + ownerReferences: + - apiVersion: v1 + blockOwnerDeletion: true + controller: true + kind: Service + name: mssql-monitoring-stats + uid: 99193679-301b-41fd-aae5-a732b3070d19 + resourceVersion: "1004080" + uid: 87635ad4-dfb2-4544-89af-e48b40783205 +spec: + endpoints: + - honorLabels: true + interval: 10s + path: /metrics + port: metrics + namespaceSelector: + matchNames: + - demo + selector: + matchLabels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: mssql-monitoring + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: mssqlservers.kubedb.com + kubedb.com/role: stats +``` + +Notice that the `ServiceMonitor` has label `release: prometheus` that we had specified in MSSQLServer CR. + +Also notice that the `ServiceMonitor` has selector which match the labels we have seen in the `mssql-monitoring-stats` service. It also, target the `metrics` port that we have seen in the stats service. + +## Verify Monitoring Metrics + +At first, let's find out the respective Prometheus pod for `prometheus-kube-prometheus-prometheus` Prometheus server. + +```bash +$ kubectl get pod -n monitoring -l=app.kubernetes.io/name=prometheus +NAME READY STATUS RESTARTS AGE +prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 1 16d +``` + +Prometheus server is listening to port `9090` of `prometheus-prometheus-kube-prometheus-prometheus-0` pod. We are going to use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to access Prometheus dashboard. + +Run following command on a separate terminal to forward the port 9090 of `prometheus-prometheus-0` pod, + +```bash +$ kubectl port-forward -n monitoring prometheus-prometheus-kube-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 `metrics` endpoint of `mssql-monitoring-stats` service as one of the targets. + +

    +  Prometheus Target +

    + +Check the `endpoint` and `service` labels. 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 dashboards with collected metrics. + +# Grafana Dashboards + +There are three dashboards to monitor Microsoft SQL Server Databases managed by KubeDB. + +- KubeDB / MSSQLServer / Summary: Shows overall summary of Microsoft SQL Server instance. +- KubeDB / MSSQLServer / Pod: Shows individual pod-level information. +- KubeDB / MSSQLServer / Database: Shows Microsoft SQL Server internal metrics for an instance. +> Note: These dashboards are developed in Grafana version 7.5.5 + + +To use KubeDB `Grafana Dashboards` to monitor Microsoft SQL Server Databases managed by `KubeDB`, Check out [mssqlserver-dashboards](https://github.com/ops-center/grafana-dashboards/tree/master/mssqlserver) + +## Cleaning up + +To clean up the Kubernetes resources created by this tutorial, run following commands + +```bash +kubectl delete -n demo ms/mssql-monitoring +kubectl delete ns demo + +helm uninstall prometheus -n monitoring +kubectl delete ns monitoring +``` + +## Next Steps +- Learn about [backup and restore](/docs/guides/mssqlserver/backup/overview/index.md) SQL Server using KubeStash. +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/images/mssqlserver/monitoring/mssql-monitoring-targets.png b/docs/images/mssqlserver/monitoring/mssql-monitoring-targets.png new file mode 100644 index 0000000000000000000000000000000000000000..fcdf4c9134d5a75ee2b392b219ac8400d4a23ec1 GIT binary patch literal 150985 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�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�E#x_`#hK@Z6C<@O;q`RS-Z8~ZyeS~P&)1H3 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 Date: Mon, 4 Nov 2024 15:05:16 +0600 Subject: [PATCH 06/12] update task names (#709) Signed-off-by: sayedppqq --- .../auto-backup/examples/backupblueprint.yaml | 2 +- .../mongodb/backup/kubestash/auto-backup/index.md | 4 ++-- .../examples/backup/passing-args.yaml | 2 +- .../examples/backup/resource-limit.yaml | 2 +- .../examples/backup/specific-user.yaml | 2 +- .../customization/examples/restore/restore.yaml | 2 +- .../backup/kubestash/customization/index.md | 14 +++++++------- .../examples/backupconfiguration-replicaset.yaml | 2 +- .../examples/restoresession-replicaset.yaml | 2 +- .../backup/kubestash/logical/replicaset/index.md | 4 ++-- .../examples/backupconfiguration-sharding.yaml | 2 +- .../sharding/examples/restoresession-sharding.yaml | 2 +- .../backup/kubestash/logical/sharding/index.md | 4 ++-- .../standalone/examples/backupconfiguration.yaml | 2 +- .../standalone/examples/restoresession.yaml | 2 +- .../backup/kubestash/logical/standalone/index.md | 4 ++-- 16 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/guides/mongodb/backup/kubestash/auto-backup/examples/backupblueprint.yaml b/docs/guides/mongodb/backup/kubestash/auto-backup/examples/backupblueprint.yaml index dc02d18415..22bf8d23d2 100644 --- a/docs/guides/mongodb/backup/kubestash/auto-backup/examples/backupblueprint.yaml +++ b/docs/guides/mongodb/backup/kubestash/auto-backup/examples/backupblueprint.yaml @@ -33,4 +33,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup \ No newline at end of file + - name: logical-backup \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/auto-backup/index.md b/docs/guides/mongodb/backup/kubestash/auto-backup/index.md index 519fb1e456..2a5fede487 100644 --- a/docs/guides/mongodb/backup/kubestash/auto-backup/index.md +++ b/docs/guides/mongodb/backup/kubestash/auto-backup/index.md @@ -169,7 +169,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup ``` Here, we define a template for `BackupConfiguration`. Notice the `backends` and `sessions` fields of `backupConfigurationTemplate` section. We have used some variables in form of `${VARIABLE_NAME}`. KubeStash will automatically resolve those variables from the database annotations information to make `BackupConfiguration` according to that databases need. @@ -269,7 +269,7 @@ spec: - addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup failurePolicy: Fail name: frequent repositories: diff --git a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/passing-args.yaml b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/passing-args.yaml index c947f7428d..32271cbb29 100644 --- a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/passing-args.yaml +++ b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/passing-args.yaml @@ -33,6 +33,6 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup params: args: "--db=testdb" \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/resource-limit.yaml b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/resource-limit.yaml index 9cb2794841..35f4a18b0d 100644 --- a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/resource-limit.yaml +++ b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/resource-limit.yaml @@ -33,7 +33,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup containerRuntimeSettings: resources: requests: diff --git a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/specific-user.yaml b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/specific-user.yaml index d3dcc848c5..f3359271ba 100644 --- a/docs/guides/mongodb/backup/kubestash/customization/examples/backup/specific-user.yaml +++ b/docs/guides/mongodb/backup/kubestash/customization/examples/backup/specific-user.yaml @@ -33,7 +33,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup jobTemplate: spec: securityContext: diff --git a/docs/guides/mongodb/backup/kubestash/customization/examples/restore/restore.yaml b/docs/guides/mongodb/backup/kubestash/customization/examples/restore/restore.yaml index 786b98395c..041bf890ad 100644 --- a/docs/guides/mongodb/backup/kubestash/customization/examples/restore/restore.yaml +++ b/docs/guides/mongodb/backup/kubestash/customization/examples/restore/restore.yaml @@ -18,7 +18,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestoress + - name: logical-backup-restore jobTemplate: spec: securityContext: diff --git a/docs/guides/mongodb/backup/kubestash/customization/index.md b/docs/guides/mongodb/backup/kubestash/customization/index.md index fecda2249c..15179de9e8 100644 --- a/docs/guides/mongodb/backup/kubestash/customization/index.md +++ b/docs/guides/mongodb/backup/kubestash/customization/index.md @@ -61,7 +61,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup params: args: "--db=testdb" ``` @@ -108,7 +108,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup jobTemplate: spec: securityContext: @@ -156,7 +156,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup containerRuntimeSettings: resources: requests: @@ -196,7 +196,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestoress + - name: logical-backup-restore params: args: "--db=testdb" ``` @@ -235,7 +235,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestoress + - name: logical-backup-restore ``` >Please, do not specify multiple snapshots here. Each snapshot represents a complete backup of your database. Multiple snapshots are only usable during file/directory restore. @@ -265,7 +265,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestoress + - name: logical-backup-restore jobTemplate: spec: securityContext: @@ -298,7 +298,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestoress + - name: logical-backup-restore containerRuntimeSettings: resources: requests: diff --git a/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/backupconfiguration-replicaset.yaml b/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/backupconfiguration-replicaset.yaml index aa9ada7a11..86a7bb5089 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/backupconfiguration-replicaset.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/backupconfiguration-replicaset.yaml @@ -33,4 +33,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup \ No newline at end of file + - name: logical-backup \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/restoresession-replicaset.yaml b/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/restoresession-replicaset.yaml index 56920b806c..d814bde882 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/restoresession-replicaset.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/replicaset/examples/restoresession-replicaset.yaml @@ -18,4 +18,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore \ No newline at end of file + - name: logical-backup-restore \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/replicaset/index.md b/docs/guides/mongodb/backup/kubestash/logical/replicaset/index.md index 48546f1116..babd8cfa06 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/replicaset/index.md +++ b/docs/guides/mongodb/backup/kubestash/logical/replicaset/index.md @@ -300,7 +300,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup ``` Here, @@ -508,7 +508,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore + - name: logical-backup-restore ``` Here, diff --git a/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/backupconfiguration-sharding.yaml b/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/backupconfiguration-sharding.yaml index 27389a4bcc..4c65fa04fb 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/backupconfiguration-sharding.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/backupconfiguration-sharding.yaml @@ -33,4 +33,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup \ No newline at end of file + - name: logical-backup \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/restoresession-sharding.yaml b/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/restoresession-sharding.yaml index d0d8614d7d..5d01e36384 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/restoresession-sharding.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/sharding/examples/restoresession-sharding.yaml @@ -18,4 +18,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore \ No newline at end of file + - name: logical-backup-restore \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/sharding/index.md b/docs/guides/mongodb/backup/kubestash/logical/sharding/index.md index 3c6c931cee..06477237d3 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/sharding/index.md +++ b/docs/guides/mongodb/backup/kubestash/logical/sharding/index.md @@ -308,7 +308,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup ``` Here, @@ -523,7 +523,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore + - name: logical-backup-restore ``` Here, diff --git a/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/backupconfiguration.yaml b/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/backupconfiguration.yaml index f4b7178ccb..395a8b05ba 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/backupconfiguration.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/backupconfiguration.yaml @@ -33,4 +33,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup \ No newline at end of file + - name: logical-backup \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/restoresession.yaml b/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/restoresession.yaml index 1020635be4..decae59096 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/restoresession.yaml +++ b/docs/guides/mongodb/backup/kubestash/logical/standalone/examples/restoresession.yaml @@ -18,4 +18,4 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore \ No newline at end of file + - name: logical-backup-restore \ No newline at end of file diff --git a/docs/guides/mongodb/backup/kubestash/logical/standalone/index.md b/docs/guides/mongodb/backup/kubestash/logical/standalone/index.md index a0390db610..7f055465b3 100644 --- a/docs/guides/mongodb/backup/kubestash/logical/standalone/index.md +++ b/docs/guides/mongodb/backup/kubestash/logical/standalone/index.md @@ -294,7 +294,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackup + - name: logical-backup ``` Here, @@ -501,7 +501,7 @@ spec: addon: name: mongodb-addon tasks: - - name: LogicalBackupRestore + - name: logical-backup-restore ``` Here, From 1b408f73cd3fa1e31d8099580f436d51288ab759 Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Mon, 4 Nov 2024 16:03:46 +0600 Subject: [PATCH 07/12] Add MSSQLServer Volume Expansion Doc (#704) Signed-off-by: Neaj Morshad --- .../mops-volume-exp-ag-cluster.yaml | 12 + .../mssqlserver-ag-cluster.yaml | 35 +++ .../mssqlserver/clustering/ag_cluster.md | 4 +- docs/guides/mssqlserver/tls/overview.md | 2 +- .../mssqlserver/volume-expansion/_index.md | 10 + .../mssqlserver/volume-expansion/overview.md | 57 ++++ .../volume-expansion/volume-expansion.md | 269 ++++++++++++++++++ .../day-2-operation/mssqlserver/ms-tls.png | Bin 0 -> 40851 bytes .../day-2-operation/mssqlserver/ms-tls.svg | 4 - .../mssqlserver/ms-volume-expansion.png | Bin 0 -> 75319 bytes 10 files changed, 386 insertions(+), 7 deletions(-) create mode 100644 docs/examples/mssqlserver/volume-expansion/mops-volume-exp-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml create mode 100644 docs/guides/mssqlserver/volume-expansion/_index.md create mode 100644 docs/guides/mssqlserver/volume-expansion/overview.md create mode 100644 docs/guides/mssqlserver/volume-expansion/volume-expansion.md create mode 100644 docs/images/day-2-operation/mssqlserver/ms-tls.png delete mode 100644 docs/images/day-2-operation/mssqlserver/ms-tls.svg create mode 100644 docs/images/day-2-operation/mssqlserver/ms-volume-expansion.png diff --git a/docs/examples/mssqlserver/volume-expansion/mops-volume-exp-ag-cluster.yaml b/docs/examples/mssqlserver/volume-expansion/mops-volume-exp-ag-cluster.yaml new file mode 100644 index 0000000000..c02c193fe1 --- /dev/null +++ b/docs/examples/mssqlserver/volume-expansion/mops-volume-exp-ag-cluster.yaml @@ -0,0 +1,12 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-volume-exp-ag-cluster + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: mssqlserver-ag-cluster + volumeExpansion: + mode: "Offline" # Online + mssqlserver: 2Gi diff --git a/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml new file mode 100644 index 0000000000..c3f849b482 --- /dev/null +++ b/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml @@ -0,0 +1,35 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/mssqlserver/clustering/ag_cluster.md b/docs/guides/mssqlserver/clustering/ag_cluster.md index fac342f09c..5d699968d0 100644 --- a/docs/guides/mssqlserver/clustering/ag_cluster.md +++ b/docs/guides/mssqlserver/clustering/ag_cluster.md @@ -861,6 +861,6 @@ If you are just testing some basic functionalities, you might want to avoid addi ## Next Steps - Learn about [backup and restore](/docs/guides/mssqlserver/backup/overview/index.md) SQL Server using KubeStash. -- Want to set up SQL Server Availability Group clusters? Check how to [Configure SQL Server Availability Gruop Cluster](/docs/guides/mssqlserver/clustering/ag_cluster.md) -- Detail concepts of [MSSQLServer object](/docs/guides/mssqlserver/concepts/mssqlserver.md). +- Want to set up SQL Server Availability Group clusters? Check how to [Configure SQL Server Availability Group Cluster](/docs/guides/mssqlserver/clustering/ag_cluster.md) +- Detail concepts of [MSSQLServer Object](/docs/guides/mssqlserver/concepts/mssqlserver.md). - Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/mssqlserver/tls/overview.md b/docs/guides/mssqlserver/tls/overview.md index d0e020060e..8518c9b4d6 100644 --- a/docs/guides/mssqlserver/tls/overview.md +++ b/docs/guides/mssqlserver/tls/overview.md @@ -42,7 +42,7 @@ Read about the fields in details from [MSSQLServer Concepts](/docs/guides/mssqls The following figure shows how `KubeDB` used to configure TLS/SSL in MSSQLServer. Open the image in a new tab to see the enlarged version.

    -Deploy MSSQLServer with TLS/SSL +Deploy MSSQLServer with TLS/SSL
    Fig: Deploy MSSQLServer with TLS/SSL
    diff --git a/docs/guides/mssqlserver/volume-expansion/_index.md b/docs/guides/mssqlserver/volume-expansion/_index.md new file mode 100644 index 0000000000..899484bfd1 --- /dev/null +++ b/docs/guides/mssqlserver/volume-expansion/_index.md @@ -0,0 +1,10 @@ +--- +title: Volume Expansion +menu: + docs_{{ .version }}: + identifier: ms-volume-expansion + name: Volume Expansion + parent: guides-mssqlserver + weight: 42 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/volume-expansion/overview.md b/docs/guides/mssqlserver/volume-expansion/overview.md new file mode 100644 index 0000000000..7663e353c9 --- /dev/null +++ b/docs/guides/mssqlserver/volume-expansion/overview.md @@ -0,0 +1,57 @@ +--- +title: MSSQLServer Volume Expansion Overview +menu: + docs_{{ .version }}: + identifier: ms-volume-expansion-overview + name: Overview + parent: ms-volume-expansion + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServer Volume Expansion + +This guide will give an overview on how KubeDB Ops Manager expand the volume of `MSSQLServer`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + +## How Volume Expansion Process Works + +The following diagram shows how KubeDB Ops Manager expand the volumes of `MSSQLServer` database components. Open the image in a new tab to see the enlarged version. + +
    +  Volume Expansion process of MSSQLServer +
    Fig: Volume Expansion process of MSSQLServer
    +
    + +The Volume Expansion process consists of the following steps: + +1. At first, a user creates a `MSSQLServer` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `MSSQLServer` CR. + +3. When the operator finds a `MSSQLServer` 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 `MSSQLServer` database the user creates a `MSSQLServerOpsRequest` CR with desired information. + +6. `KubeDB` Ops-manager operator watches the `MSSQLServerOpsRequest` CR. + +7. When it finds a `MSSQLServerOpsRequest` CR, it pauses the `MSSQLServer` object which is referred from the `MSSQLServerOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `MSSQLServer` 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 `MSSQLServerOpsRequest` CR. + +9. After the successful expansion of the volume of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the new volume size in the `MSSQLServer` object to reflect the updated state. + +10. After the successful Volume Expansion of the `MSSQLServer`, the `KubeDB` Ops-manager operator resumes the `MSSQLServer` 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 MSSQLServer database using `MSSQLServerOpsRequest` CRD. + diff --git a/docs/guides/mssqlserver/volume-expansion/volume-expansion.md b/docs/guides/mssqlserver/volume-expansion/volume-expansion.md new file mode 100644 index 0000000000..cc2983f534 --- /dev/null +++ b/docs/guides/mssqlserver/volume-expansion/volume-expansion.md @@ -0,0 +1,269 @@ +--- +title: MSSQLServer Volume Expansion +menu: + docs_{{ .version }}: + identifier: mssqlserver-volume-expansion-guide + name: MSSQLServer Volume Expansion + parent: ms-volume-expansion + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServer Volume Expansion + +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a MSSQLServer. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + +- You must have a `StorageClass` that supports volume expansion. + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [Volume Expansion Overview](/docs/guides/mssqlserver/volume-expansion/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 +``` + +## Expand Volume of MSSQLServer + +Here, we are going to deploy a `MSSQLServer` cluster using a supported version by `KubeDB` operator. Then we are going to apply `MSSQLServerOpsRequest` to expand its volume. The process of expanding MSSQLServer `standalone` is same as MSSQLServer Availability Group cluster. + +### Prepare MSSQLServer + +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 2d +longhorn (default) driver.longhorn.io Delete Immediate true 3m25s +longhorn-static driver.longhorn.io Delete Immediate true 3m19s +``` + +We can see from the output that `longhorn (default)` storage class has `ALLOWVOLUMEEXPANSION` field as true. So, this storage class supports volume expansion. We will use this storage class. + + +Now, we are going to deploy a `MSSQLServer` in `AvailabilityGroup` Mode with version `2022-cu12`. + +### Deploy MSSQLServer + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +In this section, we are going to deploy a MSSQLServer Cluster with 1GB volume. Then, in the next section we will expand its volume to 2GB using `MSSQLServerOpsRequest` CRD. Below is the YAML of the `MSSQLServer` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml +mssqlserver.kubedb.com/mssqlserver-ag-cluster created +``` + +Now, wait until `mssqlserver-ag-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get mssqlserver -n demo mssqlserver-ag-cluster +NAME VERSION STATUS AGE +mssqlserver-ag-cluster 2022-cu12 Ready 5m1s +``` + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo mssqlserver-ag-cluster -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-059f186a-01a4-441d-85f1-95aef34934be 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-0 longhorn 82s +pvc-87bea35f-4a55-4aa5-903a-e4da9f548241 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-1 longhorn 52s +pvc-9d1c3c9c-f928-4fa2-a2e1-becf2ab9c564 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-2 longhorn 35s +``` + +You can see the petset has 1GB storage, and the capacity of all the persistent volumes are also 1GB. + +We are now ready to apply the `MSSQLServerOpsRequest` CR to expand the volume of this database. + +### Volume Expansion + +Here, we are going to expand the volume of the MSSQLServer cluster. + +#### Create MSSQLServerOpsRequest + +In order to expand the volume of the database, we have to create a `MSSQLServerOpsRequest` CR with our desired volume size. Below is the YAML of the `MSSQLServerOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MSSQLServerOpsRequest +metadata: + name: mops-volume-exp-ag-cluster + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: mssqlserver-ag-cluster + volumeExpansion: + mode: "Offline" # Online + mssqlserver: 2Gi +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing volume expansion operation on `mssqlserver-ag-cluster` database. +- `spec.type` specifies that we are performing `VolumeExpansion` on our database. +- `spec.volumeExpansion.mssqlserver` specifies the desired volume size. +- `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 support `Online` Volume Expansion, Try Online volume expansion by using `spec.volumeExpansion.mode:"Online"`. + +During `Online` VolumeExpansion KubeDB expands volume without deleting the pods, it directly updates the underlying PVC. And for Offline volume expansion, the database is paused. The Pods are deleted and PVC is updated. Then the database Pods are recreated with updated PVC. + + +Let's create the `MSSQLServerOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/example/mssqlserver/volume-expansion/mops-volume-exp-ag-cluster.yaml +mssqlserveropsrequest.ops.kubedb.com/mops-volume-exp-ag-cluster created +``` + +#### Verify MSSQLServer volume expanded successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `MSSQLServer` object and related `PetSet` and `Persistent Volumes`. + +Let's wait for `MSSQLServerOpsRequest` to be `Successful`. Run the following command to watch `MSSQLServerOpsRequest` CR, + +```bash +$ kubectl get mssqlserveropsrequest -n demo +NAME TYPE STATUS AGE +mops-volume-exp-ag-cluster VolumeExpansion Successful 8m30s +``` + +We can see from the above output that the `MSSQLServerOpsRequest` has succeeded. + +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 mssqlserver-ag-cluster -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"2Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-059f186a-01a4-441d-85f1-95aef34934be 2Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-0 longhorn 29m +pvc-87bea35f-4a55-4aa5-903a-e4da9f548241 2Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-1 longhorn 29m +pvc-9d1c3c9c-f928-4fa2-a2e1-becf2ab9c564 2Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-2 longhorn 29m +``` + +The above output verifies that we have successfully expanded the volume of the MSSQLServer database. + +## Standalone Mode + +The volume expansion process is same for all the MSSQLServer modes. The `MSSQLServerOpsRequest` CR has the same fields. The database needs to refer to a mssqlserver +in standalone mode. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + + +```bash +$ kubectl patch -n demo ms/mssqlserver-ag-cluster -p '{"spec":{"deletionPolicy":"WipeOut"}}' --type="merge" +mssqlserver.kubedb.com/mssqlserver-ag-cluster patched + +$ kubectl delete -n demo mssqlserver mssqlserver-ag-cluster +mssqlserver.kubedb.com "mssqlserver-ag-cluster" deleted + +$ kubectl delete -n demo mssqlserveropsrequest mops-volume-exp-ag-cluster +mssqlserveropsrequest.ops.kubedb.com "mops-volume-exp-ag-cluster" deleted + +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [MSSQLServer object](/docs/guides/mssqlserver/concepts/mssqlserver.md). +- [Backup and Restore](/docs/guides/mssqlserver/backup/overview/index.md) MSSQLServer databases using KubeStash. \ No newline at end of file diff --git a/docs/images/day-2-operation/mssqlserver/ms-tls.png b/docs/images/day-2-operation/mssqlserver/ms-tls.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0abe1c6a0794abe29c974954e8bb1db4888e6e GIT binary patch literal 40851 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 - - -            Enterprise            Operator              Community            Operator
    service
    se...
    secret
    se...
    tls-secret
    tls-secret
    Cert- manager
    Cert- ma...
    StatefulSet
    Statef...
    Issuer/Cluster Issuer
    Issuer...
    Kafka
    Kafka
    Certificates
    Certif...
    User
    User
    2.Create
    2.Create
    1.Create
    1.Create
    5a.Watch
    5a.Watch
    3.Watch
    3.Watch
    4.Create
    4.Create
    5c.Watch
    5c.Watch
    6.Create
    6.Create
    7.Watch
    7.Watch
    uses
    uses
    8.Create
    8.Create
    9.Watch
    9.Watch
    10.Create
    10.Create
    5b.Watch
    5b.Watch
    refers to
    refers to
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/images/day-2-operation/mssqlserver/ms-volume-expansion.png b/docs/images/day-2-operation/mssqlserver/ms-volume-expansion.png new file mode 100644 index 0000000000000000000000000000000000000000..14ab5ae1fcdedbe91374e13481a716d973acb077 GIT binary patch literal 75319 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

    Z1UKPtTj_N9W5%`bq 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 VE%83(&2PYAebM0p>D=|?{{q}7O&0(F literal 0 HcmV?d00001 From 37890d297341955f2d98bcc4341ab97e0ff53d06 Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Mon, 4 Nov 2024 17:42:01 +0600 Subject: [PATCH 08/12] Add MSSQLServer Autoscaling Doc (#706) Signed-off-by: Neaj Morshad --- .../autoscaler/compute/ms-as-compute.yaml | 24 + .../compute/mssqlserver-ag-cluster.yaml | 46 ++ .../autoscaler/storage/ms-as-storage.yaml | 15 + .../storage/mssqlserver-ag-cluster.yaml | 46 ++ docs/guides/mssqlserver/autoscaler/_index.md | 10 + .../mssqlserver/autoscaler/compute/_index.md | 10 + .../mssqlserver/autoscaler/compute/cluster.md | 603 ++++++++++++++++++ .../autoscaler/compute/overview.md | 55 ++ .../mssqlserver/autoscaler/storage/_index.md | 10 + .../mssqlserver/autoscaler/storage/cluster.md | 453 +++++++++++++ .../autoscaler/storage/overview.md | 57 ++ .../guides/mssqlserver/concepts/autoscaler.md | 108 ++++ .../mssqlserver/ms-compute-autoscaling.png | Bin 0 -> 63121 bytes .../mssqlserver/ms-storage-autoscaling.png | Bin 0 -> 65145 bytes 14 files changed, 1437 insertions(+) create mode 100644 docs/examples/mssqlserver/autoscaler/compute/ms-as-compute.yaml create mode 100644 docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml create mode 100644 docs/examples/mssqlserver/autoscaler/storage/ms-as-storage.yaml create mode 100644 docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml create mode 100644 docs/guides/mssqlserver/autoscaler/_index.md create mode 100644 docs/guides/mssqlserver/autoscaler/compute/_index.md create mode 100644 docs/guides/mssqlserver/autoscaler/compute/cluster.md create mode 100644 docs/guides/mssqlserver/autoscaler/compute/overview.md create mode 100644 docs/guides/mssqlserver/autoscaler/storage/_index.md create mode 100644 docs/guides/mssqlserver/autoscaler/storage/cluster.md create mode 100644 docs/guides/mssqlserver/autoscaler/storage/overview.md create mode 100644 docs/guides/mssqlserver/concepts/autoscaler.md create mode 100644 docs/images/mssqlserver/ms-compute-autoscaling.png create mode 100644 docs/images/mssqlserver/ms-storage-autoscaling.png diff --git a/docs/examples/mssqlserver/autoscaler/compute/ms-as-compute.yaml b/docs/examples/mssqlserver/autoscaler/compute/ms-as-compute.yaml new file mode 100644 index 0000000000..8bb784d2be --- /dev/null +++ b/docs/examples/mssqlserver/autoscaler/compute/ms-as-compute.yaml @@ -0,0 +1,24 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: MSSQLServerAutoscaler +metadata: + name: ms-as-compute + namespace: demo +spec: + databaseRef: + name: mssqlserver-ag-cluster + opsRequestOptions: + timeout: 5m + apply: IfReady + compute: + mssqlserver: + trigger: "On" + podLifeTimeThreshold: 5m + resourceDiffPercentage: 10 + minAllowed: + cpu: 800m + memory: 2Gi + maxAllowed: + cpu: 1 + memory: 3Gi + containerControlledValues: "RequestsAndLimits" + controlledResources: ["cpu", "memory"] \ No newline at end of file diff --git a/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml new file mode 100644 index 0000000000..c43e3b77d1 --- /dev/null +++ b/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml @@ -0,0 +1,46 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: "600m" + memory: "1.6Gi" + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/examples/mssqlserver/autoscaler/storage/ms-as-storage.yaml b/docs/examples/mssqlserver/autoscaler/storage/ms-as-storage.yaml new file mode 100644 index 0000000000..796ae16d9a --- /dev/null +++ b/docs/examples/mssqlserver/autoscaler/storage/ms-as-storage.yaml @@ -0,0 +1,15 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: MSSQLServerAutoscaler +metadata: + name: ms-as-storage + namespace: demo +spec: + databaseRef: + name: mssqlserver-ag-cluster + storage: + mssqlserver: + trigger: "On" + usageThreshold: 60 + scalingThreshold: 50 + expansionMode: "Offline" + upperBound: "100Gi" \ No newline at end of file diff --git a/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml new file mode 100644 index 0000000000..c43e3b77d1 --- /dev/null +++ b/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml @@ -0,0 +1,46 @@ +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: "600m" + memory: "1.6Gi" + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut \ No newline at end of file diff --git a/docs/guides/mssqlserver/autoscaler/_index.md b/docs/guides/mssqlserver/autoscaler/_index.md new file mode 100644 index 0000000000..b6fdc08188 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/_index.md @@ -0,0 +1,10 @@ +--- +title: Autoscaling +menu: + docs_{{ .version }}: + identifier: ms-autoscaling + name: Autoscaling + parent: guides-mssqlserver + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/autoscaler/compute/_index.md b/docs/guides/mssqlserver/autoscaler/compute/_index.md new file mode 100644 index 0000000000..cea75aa0c6 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/compute/_index.md @@ -0,0 +1,10 @@ +--- +title: Compute Autoscaling +menu: + docs_{{ .version }}: + identifier: ms-compute-autoscaling + name: Compute Autoscaling + parent: ms-autoscaling + weight: 10 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/autoscaler/compute/cluster.md b/docs/guides/mssqlserver/autoscaler/compute/cluster.md new file mode 100644 index 0000000000..14bc5ddf97 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/compute/cluster.md @@ -0,0 +1,603 @@ +--- +title: MSSQLServer Availability Group Cluster Autoscaling +menu: + docs_{{ .version }}: + identifier: ms-autoscaling-cluster + name: Cluster + parent: ms-compute-autoscaling + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Autoscaling the Compute Resource of a MSSQLServer Availability Group Cluster Database + +This guide will show you how to use `KubeDB` to auto-scale compute resources i.e. cpu and memory of a MSSQLServer cluster database. + +## Before You Begin + + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + +- Install `Metrics Server` from [here](https://github.com/kubernetes-sigs/metrics-server#installation) + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [Compute Resource Autoscaling Overview](/docs/guides/mssqlserver/autoscaler/compute/overview.md) + - [MSSQLServerAutoscaler](/docs/guides/mssqlserver/concepts/autoscaler.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 +``` +## Autoscaling of MSSQLServer Availability Group Cluster + +Here, we are going to deploy a `MSSQLServer` Availability Group Cluster using a supported version by `KubeDB` operator. Then we are going to apply `MSSQLServerAutoscaler` to set up autoscaling. + +#### Deploy MSSQLServer Availability Group Cluster + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +In this section, we are going to deploy a MSSQLServer Availability Group Cluster with version `2022-cu12`. Then, in the next section we will set up autoscaling for this database using `MSSQLServerAutoscaler` CRD. Below is the YAML of the `MSSQLServer` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: "600m" + memory: "1.6Gi" + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml +mssqlserver.kubedb.com/mssqlserver-ag-cluster created +``` + +Now, wait until `mssqlserver-ag-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get mssqlserver -n demo +NAME VERSION STATUS AGE +mssqlserver-ag-cluster 2022-cu12 Ready 8m27s +``` + +Let's check the MSSQLServer resources, +```bash +$ kubectl get ms -n demo mssqlserver-ag-cluster -o json | jq '.spec.podTemplate.spec.containers[] | select(.name == "mssql") | .resources' +{ + "limits": { + "cpu": "600m", + "memory": "1717986918400m" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +``` + + +Let's check the Pod containers resources, there are two containers here, first one with index 0 named `mssql` is the main container of mssqlserver. + +```bash +$ kubectl get pod -n demo mssqlserver-ag-cluster-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "600m", + "memory": "1717986918400m" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +$ kubectl get pod -n demo mssqlserver-ag-cluster-1 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "600m", + "memory": "1717986918400m" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +$ kubectl get pod -n demo mssqlserver-ag-cluster-2 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "600m", + "memory": "1717986918400m" + }, + "requests": { + "cpu": "500m", + "memory": "1536Mi" + } +} +``` + + +You can see from the above outputs that the resources are same as the one we have assigned while deploying the mssqlserver. + +We are now ready to apply the `MSSQLServerAutoscaler` CRO to set up autoscaling for this database. + +### Compute Resource Autoscaling + +Here, we are going to set up compute resource autoscaling using a `MSSQLServerAutoscaler` Object. + +#### Create MSSQLServerAutoscaler Object + +In order to set up compute resource autoscaling for this database cluster, we have to create a `MSSQLServerAutoscaler` CRO with our desired configuration. Below is the YAML of the `MSSQLServerAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: MSSQLServerAutoscaler +metadata: + name: ms-as-compute + namespace: demo +spec: + databaseRef: + name: mssqlserver-ag-cluster + opsRequestOptions: + timeout: 5m + apply: IfReady + compute: + mssqlserver: + trigger: "On" + podLifeTimeThreshold: 5m + resourceDiffPercentage: 10 + minAllowed: + cpu: 800m + memory: 2Gi + maxAllowed: + cpu: 1 + memory: 3Gi + containerControlledValues: "RequestsAndLimits" + controlledResources: ["cpu", "memory"] +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing compute resource scaling operation on `mssqlserver-ag-cluster` database. +- `spec.compute.mssqlserver.trigger` specifies that compute autoscaling is enabled for this database. +- `spec.compute.mssqlserver.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.mssqlserver.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.mssqlserver.minAllowed` specifies the minimum allowed resources for the database. +- `spec.compute.mssqlserver.maxAllowed` specifies the maximum allowed resources for the database. +- `spec.compute.mssqlserver.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.mssqlserver.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.opsRequestOptions.apply` has two supported value : `IfReady` & `Always`. + Use `IfReady` if you want to process the opsReq only when the database is Ready. And use `Always` if you want to process the execution of opsReq irrespective of the Database state. +- `spec.opsRequestOptions.timeout` specifies the maximum time for each step of the opsRequest(in seconds). + If a step doesn't finish within the specified timeout, the ops request will result in failure. + + +Let's create the `MSSQLServerAutoscaler` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/autoscaler/compute/ms-as-compute.yaml +mssqlserverautoscaler.autoscaling.kubedb.com/ms-as-compute created +``` + +#### Verify Autoscaling is set up successfully + +Let's check that the `mssqlserverautoscaler` resource is created successfully, + +```bash +$ kubectl get mssqlserverautoscaler -n demo +NAME AGE +ms-as-compute 16s + +$ kubectl describe mssqlserverautoscaler ms-as-compute -n demo +Name: ms-as-compute +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: MSSQLServerAutoscaler +Metadata: + Creation Timestamp: 2024-10-25T15:02:58Z + Generation: 1 + Resource Version: 106200 + UID: cc34737b-2e42-4b94-bcc4-cfcac98eb6a6 +Spec: + Compute: + Mssqlserver: + Container Controlled Values: RequestsAndLimits + Controlled Resources: + cpu + memory + Max Allowed: + Cpu: 1 + Memory: 3Gi + Min Allowed: + Cpu: 800m + Memory: 2Gi + Pod Life Time Threshold: 5m + Resource Diff Percentage: 10 + Trigger: On + Database Ref: + Name: mssqlserver-ag-cluster + Ops Request Options: + Apply: IfReady + Timeout: 5m +Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 524 + Index: 20 + Weight: 456 + Index: 28 + Weight: 2635 + Index: 34 + Weight: 455 + Index: 35 + Weight: 10000 + Index: 36 + Weight: 6980 + Reference Timestamp: 2024-10-25T15:10:00Z + Total Weight: 2.465794209092962 + First Sample Start: 2024-10-25T15:03:11Z + Last Sample Start: 2024-10-25T15:13:21Z + Last Update Time: 2024-10-25T15:13:34Z + Memory Histogram: + Bucket Weights: + Index: 36 + Weight: 10000 + Index: 37 + Weight: 5023 + Index: 39 + Weight: 5710 + Index: 40 + Weight: 2918 + Reference Timestamp: 2024-10-25T15:15:00Z + Total Weight: 2.8324869288693995 + Ref: + Container Name: mssql + Vpa Object Name: mssqlserver-ag-cluster + Total Samples Count: 30 + Version: v3 + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 10000 + Index: 1 + Weight: 3741 + Index: 2 + Weight: 1924 + Reference Timestamp: 2024-10-25T15:10:00Z + Total Weight: 2.033798492571757 + First Sample Start: 2024-10-25T15:03:11Z + Last Sample Start: 2024-10-25T15:12:22Z + Last Update Time: 2024-10-25T15:12:34Z + Memory Histogram: + Bucket Weights: + Index: 3 + Weight: 1357 + Index: 4 + Weight: 10000 + Reference Timestamp: 2024-10-25T15:15:00Z + Total Weight: 2.8324869288693995 + Ref: + Container Name: mssql-coordinator + Vpa Object Name: mssqlserver-ag-cluster + Total Samples Count: 26 + Version: v3 + Conditions: + Last Transition Time: 2024-10-25T15:10:27Z + Message: Successfully created MSSQLServerOpsRequest demo/msops-mssqlserver-ag-cluster-v5xep9 + Observed Generation: 1 + Reason: CreateOpsRequest + Status: True + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2024-10-25T15:03:34Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: mssql + Lower Bound: + Cpu: 844m + Memory: 2Gi + Target: + Cpu: 1 + Memory: 2Gi + Uncapped Target: + Cpu: 1168m + Memory: 1389197403 + Upper Bound: + Cpu: 1 + Memory: 3Gi + Container Name: mssql-coordinator + Lower Bound: + Cpu: 50m + Memory: 131072k + Target: + Cpu: 50m + Memory: 131072k + Uncapped Target: + Cpu: 50m + Memory: 131072k + Upper Bound: + Cpu: 4992m + Memory: 9063982612 + Vpa Name: mssqlserver-ag-cluster +Events: +``` +So, the `mssqlserverautoscaler` resource is created successfully. + +We can verify from the above output that `status.vpas` contains the `RecommendationProvided` condition to true. And in the same time, `status.vpas.recommendation.containerRecommendations` contain the actual generated recommendation. + +Our autoscaler operator continuously watches the recommendation generated and creates an `mssqlserveropsrequest` based on the recommendations, if the database pod resources are needed to scaled up or down. + +Let's watch the `mssqlserveropsrequest` in the demo namespace to see if any `mssqlserveropsrequest` object is created. After some time you'll see that a `mssqlserveropsrequest` will be created based on the recommendation. + +```bash +$ kubectl get mssqlserveropsrequest -n demo +NAME TYPE STATUS AGE +msops-mssqlserver-ag-cluster-6xc1kc VerticalScaling Progressing 7s +``` + +Let's wait for the ops request to become successful. + +```bash +$ kubectl get mssqlserveropsrequest -n demo +NAME TYPE STATUS AGE +msops-mssqlserver-ag-cluster-8li26q VerticalScaling Successful 11m +``` + +We can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest` we will get an overview of the steps that were followed to scale the database. + +```bash +$ kubectl describe msops -n demo msops-mssqlserver-ag-cluster-8li26q +Name: msops-mssqlserver-ag-cluster-8li26q +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=mssqlserver-ag-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=mssqlservers.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-10-25T15:04:27Z + Generation: 1 + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: MSSQLServerAutoscaler + Name: ms-as-compute + UID: cc34737b-2e42-4b94-bcc4-cfcac98eb6a6 + Resource Version: 105300 + UID: b2f29a6a-f4cf-4c97-871c-f203e08af320 +Spec: + Apply: IfReady + Database Ref: + Name: mssqlserver-ag-cluster + Timeout: 5m0s + Type: VerticalScaling + Vertical Scaling: + Mssqlserver: + Resources: + Limits: + Cpu: 960m + Memory: 2290649225 + Requests: + Cpu: 800m + Memory: 2Gi +Status: + Conditions: + Last Transition Time: 2024-10-25T15:04:27Z + Message: MSSQLServer ops-request has started to vertically scaling the MSSQLServer nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-25T15:04:30Z + Message: Successfully paused database + Observed Generation: 1 + Reason: DatabasePauseSucceeded + Status: True + Type: DatabasePauseSucceeded + Last Transition Time: 2024-10-25T15:04:30Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-25T15:04:35Z + Message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: GetPod--mssqlserver-ag-cluster-0 + Last Transition Time: 2024-10-25T15:04:35Z + Message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: EvictPod--mssqlserver-ag-cluster-0 + Last Transition Time: 2024-10-25T15:05:15Z + Message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssqlserver-ag-cluster-0 + Last Transition Time: 2024-10-25T15:05:20Z + Message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: GetPod--mssqlserver-ag-cluster-1 + Last Transition Time: 2024-10-25T15:05:20Z + Message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: EvictPod--mssqlserver-ag-cluster-1 + Last Transition Time: 2024-10-25T15:05:55Z + Message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssqlserver-ag-cluster-1 + Last Transition Time: 2024-10-25T15:06:00Z + Message: get pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: GetPod--mssqlserver-ag-cluster-2 + Last Transition Time: 2024-10-25T15:06:00Z + Message: evict pod; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: EvictPod--mssqlserver-ag-cluster-2 + Last Transition Time: 2024-10-25T15:06:35Z + Message: check pod running; ConditionStatus:True; PodName:mssqlserver-ag-cluster-2 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--mssqlserver-ag-cluster-2 + Last Transition Time: 2024-10-25T15:06:40Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-25T15:06:40Z + Message: Successfully completed the VerticalScaling for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +``` + +Now, we are going to verify from the Pod, and the MSSQLServer yaml whether the resources of the cluster database has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo mssqlserver-ag-cluster-0 -o json | jq '.spec.containers[0].resources' +{ + "limits": { + "cpu": "960m", + "memory": "2290649225" + }, + "requests": { + "cpu": "800m", + "memory": "2Gi" + } +} + +$ kubectl get ms -n demo mssqlserver-ag-cluster -o json | jq '.spec.podTemplate.spec.containers[] | select(.name == "mssql") | .resources' +{ + "limits": { + "cpu": "960m", + "memory": "2290649225" + }, + "requests": { + "cpu": "800m", + "memory": "2Gi" + } +} +``` + + +The above output verifies that we have successfully autoscaled the resources of the MSSQLServer cluster. + + +### Autoscaling for Standalone MSSQLServer +Autoscaling for Standalone MSSQLServer is exactly same as cluster mode. Just refer the standalone mssqlserver in `databaseRef` field of `MSSQLServerAutoscaler` spec. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete mssqlserver -n demo mssqlserver-ag-cluster +kubectl delete mssqlserverautoscaler -n demo ms-as-compute +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` \ No newline at end of file diff --git a/docs/guides/mssqlserver/autoscaler/compute/overview.md b/docs/guides/mssqlserver/autoscaler/compute/overview.md new file mode 100644 index 0000000000..ac034a16bb --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/compute/overview.md @@ -0,0 +1,55 @@ +--- +title: MSSQLServer Compute Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: ms-autoscaling-overview + name: Overview + parent: ms-compute-autoscaling + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServer 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 `MSSQLServerAutoscaler` crd. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [MSSQLServerAutoscaler](/docs/guides/mssqlserver/concepts/autoscaler.md) + +## How Compute Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `MSSQLServer` database components. Open the image in a new tab to see the enlarged version. + +

    +  Compute Auto Scaling process of MSSQLServer +
    Fig: Compute Auto Scaling process of MSSQLServer
    +
    + +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `MSSQLServer` Custom Resource Object (CRO). + +2. `KubeDB` Provisioner operator watches the `MSSQLServer` CRO. + +3. When the operator finds a `MSSQLServer` 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 `MSSQLServer` database the user creates a `MSSQLServerAutoscaler` CRO with desired configuration. + +5. `KubeDB` Autoscaler operator watches the `MSSQLServerAutoscaler` 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 `MSSQLServerAutoscaler` CRO. + +7. If the generated recommendation doesn't match the current resources of the database, then `KubeDB` Autoscaler operator creates a `MSSQLServerOpsRequest` CRO to scale the database to match the recommendation generated. + +8. `KubeDB` Ops-manager operator watches the `MSSQLServerOpsRequest` CRO. + +9. Then the `KubeDB` Ops-manager operator will scale the database component vertically as specified on the `MSSQLServerOpsRequest` CRO. + +In the next docs, we are going to show a step-by-step guide on Autoscaling of various MSSQLServer database using `MSSQLServerAutoscaler` CRD. diff --git a/docs/guides/mssqlserver/autoscaler/storage/_index.md b/docs/guides/mssqlserver/autoscaler/storage/_index.md new file mode 100644 index 0000000000..58a3cd83a4 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/storage/_index.md @@ -0,0 +1,10 @@ +--- +title: Storage Autoscaling +menu: + docs_{{ .version }}: + identifier: ms-storage-autoscaling + name: Storage Autoscaling + parent: ms-autoscaling + weight: 20 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/mssqlserver/autoscaler/storage/cluster.md b/docs/guides/mssqlserver/autoscaler/storage/cluster.md new file mode 100644 index 0000000000..f95cf858f8 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/storage/cluster.md @@ -0,0 +1,453 @@ +--- +title: MSSQLServer Cluster Autoscaling +menu: + docs_{{ .version }}: + identifier: ms-storage-autoscaling-cluster + name: Cluster + parent: ms-storage-autoscaling + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Storage Autoscaling of a MSSQLServer Availability Group Cluster + +This guide will show you how to use `KubeDB` to autoscale the storage of a MSSQLServer Availability Group Cluster. + +## Before You Begin + +- 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). Make sure install with helm command including `--set global.featureGates.MSSQLServer=true` to ensure MSSQLServer CRD installation. + +- To configure TLS/SSL in `MSSQLServer`, `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/). + +- 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: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [MSSQLServerAutoscaler](/docs/guides/mssqlserver/concepts/autoscaler.md) + - [Storage Autoscaling Overview](/docs/guides/mssqlserver/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 +``` + +## Storage Autoscaling MSSQLServer 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 +local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 4d21h +longhorn (default) driver.longhorn.io Delete Immediate true 2d20h +longhorn-static driver.longhorn.io Delete Immediate true 2d20h +``` + +We can see from the output the `longhorn` storage class has `ALLOWVOLUMEEXPANSION` field as true. So, this storage class supports volume expansion. We can use it. + +Now, we are going to deploy a `MSSQLServer` cluster using a supported version by `KubeDB` operator. Then we are going to apply `MSSQLServerAutoscaler` to set up autoscaling. + +#### Deploy MSSQLServer Cluster + +First, an issuer needs to be created, even if TLS is not enabled for SQL Server. The issuer will be used to configure the TLS-enabled Wal-G proxy server, which is required for the SQL Server backup and restore operations. + +### 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=MSSQLServer/O=kubedb" +``` +- Create a secret using the certificate files we have just generated, +```bash +$ kubectl create secret tls mssqlserver-ca --cert=ca.crt --key=ca.key --namespace=demo +secret/mssqlserver-ca created +``` +Now, we are going to create an `Issuer` using the `mssqlserver-ca` secret that contains 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: mssqlserver-ca-issuer + namespace: demo +spec: + ca: + secretName: mssqlserver-ca +``` + +Let’s create the `Issuer` CR we have shown above, +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/ag-cluster/mssqlserver-ca-issuer.yaml +issuer.cert-manager.io/mssqlserver-ca-issuer created +``` + +Now, we are going to deploy a MSSQLServer cluster database with version `2022-cu12`. Then, in the next section we will set up autoscaling for this database using `MSSQLServerAutoscaler` CRD. Below is the YAML of the `MSSQLServer` CR that we are going to create, + +> If you want to autoscale MSSQLServer `Standalone`, Just deploy a [standalone](/docs/guides/mssqlserver/clustering/standalone.md) sql server instance using KubeDB. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: MSSQLServer +metadata: + name: mssqlserver-ag-cluster + namespace: demo +spec: + version: "2022-cu12" + replicas: 3 + topology: + mode: AvailabilityGroup + availabilityGroup: + databases: + - agdb1 + - agdb2 + internalAuth: + endpointCert: + issuerRef: + apiGroup: cert-manager.io + name: mssqlserver-ca-issuer + kind: Issuer + tls: + issuerRef: + name: mssqlserver-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + resources: + requests: + cpu: "500m" + memory: "1.5Gi" + limits: + cpu: "600m" + memory: "1.6Gi" + storageType: Durable + storage: + storageClassName: "longhorn" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +Let's create the `MSSQLServer` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml +mssqlserver.kubedb.com/mssqlserver-ag-cluster created +``` + +Now, wait until `mssqlserver-ag-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get mssqlserver -n demo +NAME VERSION STATUS AGE +mssqlserver-ag-cluster 2022-cu12 Ready 4m +``` + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo mssqlserver-ag-cluster -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-1497dd6d-9cbd-467a-8e0c-c3963ce09e1b 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-1 longhorn 8m +pvc-37a7bc8d-2c04-4eb4-8e53-e610fd1daaf5 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-0 longhorn 8m +pvc-817866af-5277-4d51-8d81-434e8ec1c442 1Gi RWO Delete Bound demo/data-mssqlserver-ag-cluster-2 longhorn 8m +``` + +You can see the petset has 1GB storage, and the capacity of all the persistent volume is also 1GB. + +We are now ready to apply the `MSSQLServerAutoscaler` CRO to set up storage autoscaling for this database. + +### Storage Autoscaling + +Here, we are going to set up storage autoscaling using a `MSSQLServerAutoscaler` Object. + +#### Create MSSQLServerAutoscaler Object + +In order to set up storage autoscaling for this database cluster, we have to create a `MSSQLServerAutoscaler` CRO with our desired configuration. Below is the YAML of the `MSSQLServerAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: MSSQLServerAutoscaler +metadata: + name: ms-as-storage + namespace: demo +spec: + databaseRef: + name: mssqlserver-ag-cluster + storage: + mssqlserver: + trigger: "On" + usageThreshold: 60 + scalingThreshold: 50 + expansionMode: "Offline" + upperBound: "100Gi" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing volume expansion operation on `mssqlserver-ag-cluster` database. +- `spec.storage.mssqlserver.trigger` specifies that storage autoscaling is enabled for this database. +- `spec.storage.mssqlserver.usageThreshold` specifies storage usage threshold, if storage usage exceeds `60%` then storage autoscaling will be triggered. +- `spec.storage.mssqlserver.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `50%` of the current amount. +- `spec.storage.mssqlserver.expansionMode` specifies the expansion mode of volume expansion `MSSQLServerOpsRequest` created by `MSSQLServerAutoscaler`, `longhorn` supports offline volume expansion so here `expansionMode` is set as "Offline". + +Let's create the `MSSQLServerAutoscaler` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/mssqlserver/autoscaler/storage/ms-as-storage.yaml +mssqlserverautoscaler.autoscaling.kubedb.com/ms-as-storage created +``` + +#### Storage Autoscaling is set up successfully + +Let's check that the `mssqlserverautoscaler` resource is created successfully, + +```bash +$ kubectl get mssqlserverautoscaler -n demo +NAME AGE +ms-as-storage 17s + + +$ kubectl describe mssqlserverautoscaler ms-as-storage -n demo +Name: ms-as-storage +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: MSSQLServerAutoscaler +Metadata: + Creation Timestamp: 2024-11-01T09:39:54Z + Generation: 1 + Resource Version: 922388 + UID: 1e239b31-c6c8-4e2c-8cf6-2b95a88b9d45 +Spec: + Database Ref: + Name: mssqlserver-ag-cluster + Ops Request Options: + Apply: IfReady + Storage: + Mssqlserver: + Expansion Mode: Offline + Scaling Rules: + Applies Upto: + Threshold: 50pc + Scaling Threshold: 50 + Trigger: On + Upper Bound: 100Gi + Usage Threshold: 60 +Events: +``` + +So, the `mssqlserverautoscaler` resource is created successfully. + +Now, for this demo, we are going to manually fill up the persistent volume to exceed the `usageThreshold` using `dd` command to see storage autoscaling. + +Lets exec into the database pod and fill the database volume(`/var/opt/mssql/`) using the following commands: + +```bash +$ kubectl exec -it -n demo mssqlserver-ag-cluster-0 -c mssql -- bash +mssql@mssqlserver-ag-cluster-0:/$ df -h /var/opt/mssql +Filesystem Size Used Avail Use% Mounted on +/dev/longhorn/pvc-37a7bc8d-2c04-4eb4-8e53-e610fd1daaf5 974M 274M 685M 29% /var/opt/mssql + +mssql@mssqlserver-ag-cluster-0:/$ dd if=/dev/zero of=/var/opt/mssql/file.img bs=120M count=5 +5+0 records in +5+0 records out +629145600 bytes (629 MB, 600 MiB) copied, 6.09315 s, 103 MB/s +mssql@mssqlserver-ag-cluster-0:/$ df -h /var/opt/mssql +Filesystem Size Used Avail Use% Mounted on +/dev/longhorn/pvc-37a7bc8d-2c04-4eb4-8e53-e610fd1daaf5 974M 874M 85M 92% /var/opt/mssql +``` + +So, from the above output we can see that the storage usage is 92%, which exceeded the `usageThreshold` 60%. + +Let's watch the `mssqlserveropsrequest` in the demo namespace to see if any `mssqlserveropsrequest` object is created. After some time you'll see that a `mssqlserveropsrequest` of type `VolumeExpansion` will be created based on the `scalingThreshold`. + + +```bash +$ watch kubectl get mssqlserveropsrequest -n demo +NAME TYPE STATUS AGE +msops-mssqlserver-ag-cluster-8m7l5s VolumeExpansion Progressing 2m20s +``` + +Let's wait for the ops request to become successful. + +```bash +$ kubectl get mssqlserveropsrequest -n demo +NAME TYPE STATUS AGE +msops-mssqlserver-ag-cluster-8m7l5s VolumeExpansion Successful 17m +``` + +We can see from the above output that the `MSSQLServerOpsRequest` has succeeded. If we describe the `MSSQLServerOpsRequest` we will get an overview of the steps that were followed to expand the volume of the database. + +```bash +$ kubectl describe mssqlserveropsrequest -n demo msops-mssqlserver-ag-cluster-8m7l5s +Name: msops-mssqlserver-ag-cluster-8m7l5s +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=mssqlserver-ag-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=mssqlservers.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: MSSQLServerOpsRequest +Metadata: + Creation Timestamp: 2024-11-01T09:40:05Z + Generation: 1 + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: MSSQLServerAutoscaler + Name: ms-as-storage + UID: 1e239b31-c6c8-4e2c-8cf6-2b95a88b9d45 + Resource Version: 924068 + UID: d0dfbe3d-4f0f-43ec-bdff-6d9f3fa96516 +Spec: + Apply: IfReady + Database Ref: + Name: mssqlserver-ag-cluster + Type: VolumeExpansion + Volume Expansion: + Mode: Offline + Mssqlserver: 1531054080 +Status: + Conditions: + Last Transition Time: 2024-11-01T09:40:05Z + Message: MSSQLServer ops-request has started to expand volume of mssqlserver nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-11-01T09:40:13Z + Message: get petset; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetset + Last Transition Time: 2024-11-01T09:40:13Z + Message: delete petset; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: DeletePetset + Last Transition Time: 2024-11-01T09:40:23Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-11-01T09:46:48Z + Message: get pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPod + Last Transition Time: 2024-11-01T09:40:28Z + Message: patch ops request; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: PatchOpsRequest + Last Transition Time: 2024-11-01T09:40:28Z + Message: delete pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: DeletePod + Last Transition Time: 2024-11-01T09:41:03Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-11-01T09:41:03Z + Message: patch pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: PatchPvc + Last Transition Time: 2024-11-01T09:48:33Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-11-01T09:42:48Z + Message: create pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CreatePod + Last Transition Time: 2024-11-01T09:42:53Z + Message: running mssql server; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: RunningMssqlServer + Last Transition Time: 2024-11-01T09:48:58Z + Message: successfully updated node PVC sizes + Observed Generation: 1 + Reason: UpdateNodePVCs + Status: True + Type: UpdateNodePVCs + Last Transition Time: 2024-11-01T09:49:03Z + Message: successfully reconciled the MSSQLServer resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-11-01T09:49:03Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-11-01T09:49:03Z + Message: Successfully completed volumeExpansion for MSSQLServer + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +``` + +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 mssqlserver-ag-cluster -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1531054080" +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-2ff83356-1bbc-44ab-99f1-025e3690a471 1462Mi RWO Delete Bound demo/data-mssqlserver-ag-cluster-2 longhorn 15m +pvc-a5cc0ae9-2c8d-456c-ace2-fc4fafc6784f 1462Mi RWO Delete Bound demo/data-mssqlserver-ag-cluster-1 longhorn 16m +pvc-e8ab47a4-17a6-45fb-9f39-e71a03498ab5 1462Mi RWO Delete Bound demo/data-mssqlserver-ag-cluster-0 longhorn 16m +``` + +The above output verifies that we have successfully autoscaled the volume of the MSSQLServer cluster database. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete mssqlserver -n demo mssqlserver-ag-cluster +kubectl delete mssqlserverautoscaler -n demo ms-as-storage +kubectl delete issuer -n demo mssqlserver-ca-issuer +kubectl delete secret -n demo mssqlserver-ca +kubectl delete ns demo +``` diff --git a/docs/guides/mssqlserver/autoscaler/storage/overview.md b/docs/guides/mssqlserver/autoscaler/storage/overview.md new file mode 100644 index 0000000000..2e537cb4f9 --- /dev/null +++ b/docs/guides/mssqlserver/autoscaler/storage/overview.md @@ -0,0 +1,57 @@ +--- +title: MSSQLServer Storage Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: ms-storage-autoscaling-overview + name: Overview + parent: ms-storage-autoscaling + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServer Storage Autoscaling + +This guide will give an overview on how KubeDB `Autoscaler` operator autoscales the database storage using `MSSQLServerAutoscaler` CRD. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) + - [MSSQLServerOpsRequest](/docs/guides/mssqlserver/concepts/opsrequest.md) + - [MSSQLServerAutoscaler](/docs/guides/mssqlserver/concepts/autoscaler.md) + +## How Storage Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `MSSQLServer`. Open the image in a new tab to see the enlarged version. + +
    +  Storage Auto Scaling process of MSSQLServer +
    Fig: Storage Auto Scaling process of MSSQLServer
    +
    + + +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `MSSQLServer` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `MSSQLServer` CR. + +3. When the operator finds a `MSSQLServer` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Each PetSet creates a Persistent Volumes according to the Volume Claim Template provided in the petset's configuration. + +5. Then, in order to set up storage autoscaling of the `MSSQLServer` database the user creates a `MSSQLServerAutoscaler` CRO with desired configuration. + +6. `KubeDB` Autoscaler operator watches the `MSSQLServerAutoscaler` CRO. + +7. `KubeDB` Autoscaler operator continuously watches persistent volumes of the databases to check if it exceeds the specified usage threshold. +8. If the usage exceeds the specified usage threshold, then `KubeDB` Autoscaler operator creates a `MSSQLServerOpsRequest` to expand the storage of the database. + +9. `KubeDB` Ops-manager operator watches the `MSSQLServerOpsRequest` CRO. + +10. Then the `KubeDB` Ops-manager operator will expand the storage of the database as specified on the `MSSQLServerOpsRequest` CRO. + +In the next docs, we are going to show a step-by-step guide on Autoscaling storage of MSSQLServer database using `MSSQLServerAutoscaler` CRD. diff --git a/docs/guides/mssqlserver/concepts/autoscaler.md b/docs/guides/mssqlserver/concepts/autoscaler.md new file mode 100644 index 0000000000..60294932bc --- /dev/null +++ b/docs/guides/mssqlserver/concepts/autoscaler.md @@ -0,0 +1,108 @@ +--- +title: MSSQLServerAutoscaler CRD +menu: + docs_{{ .version }}: + identifier: ms-concepts-autoscaler + name: MSSQLServerAutoscaler + parent: ms-concepts + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# MSSQLServerAutoscaler + +## What is MSSQLServerAutoscaler + +`MSSQLServerAutoscaler` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration for autoscaling [Microsoft SQL Server](https://learn.microsoft.com/en-us/sql/sql-server/) compute resources and storage of database in a Kubernetes native way. + +## MSSQLServerAutoscaler CRD Specifications + +Like any official Kubernetes resource, a `MSSQLServerAutoscaler` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here is a sample `MSSQLServerAutoscaler` CRO for autoscaling is given below: + +**Sample `MSSQLServerAutoscaler` for mssqlserver database:** + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: MSSQLServerAutoscaler +metadata: + name: standalone-autoscaler + namespace: demo +spec: + databaseRef: + name: mssqlserver-standalone + opsRequestOptions: + apply: IfReady + timeout: 5m + compute: + mssqlserver: + trigger: "On" + podLifeTimeThreshold: 5m + minAllowed: + cpu: 800m + memory: 2Gi + maxAllowed: + cpu: 2 + memory: 4Gi + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" + resourceDiffPercentage: 10 + storage: + mssqlserver: + expansionMode: "Online" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 50 +``` + +Here, we are going to describe the various sections of a `MSSQLServerAutoscaler` CRD. + +A `MSSQLServerAutoscaler` object has the following fields in the `spec` section. + +### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.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 [MSSQLServer](/docs/guides/mssqlserver/concepts/mssqlserver.md) object. + +### spec.opsRequestOptions +These are the options to pass in the internally created opsRequest CRO. `opsRequestOptions` has two fields. They have been described in details [here](/docs/guides/mssqlserver/concepts/opsrequest.md#spectimeout). + +### spec.compute + +`spec.compute` specifies the autoscaling configuration for to compute resources i.e. cpu and memory of the database. This field consists of the following sub-field: + +- `spec.compute.mssqlserver` indicates the desired compute autoscaling configuration for a MSSQLServer database. + +This has the following sub-fields: + +- `trigger` indicates if compute autoscaling is enabled for 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.storage` specifies the autoscaling configuration for the storage resources of the database. This field consists of the following sub-field: + +- `spec.storage.mssqlserver` indicates the desired storage autoscaling configuration for a MSSQLServer database. + + It has the following sub-fields: + +- `trigger` indicates if storage autoscaling is enabled for 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. + +## Next Steps + +- Learn about [backup and restore](/docs/guides/mssqlserver/backup/overview/index.md) SQL Server using KubeStash. +- Learn about MSSQLServer CRD [here](/docs/guides/mssqlserver/concepts/mssqlserver.md). +- Deploy your first MSSQLServer database with MSSQLServer by following the guide [here](/docs/guides/mssqlserver/quickstart/quickstart.md). diff --git a/docs/images/mssqlserver/ms-compute-autoscaling.png b/docs/images/mssqlserver/ms-compute-autoscaling.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4de5e7f34d7b05fa592f8f2aeb4dd57f63869a GIT binary patch literal 63121 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 G{C@!Df&MT6 literal 0 HcmV?d00001 diff --git a/docs/images/mssqlserver/ms-storage-autoscaling.png b/docs/images/mssqlserver/ms-storage-autoscaling.png new file mode 100644 index 0000000000000000000000000000000000000000..633350be56a124292b00f6108c4067c8a9336660 GIT binary patch literal 65145 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 literal 0 HcmV?d00001 From d416e8747578e4a273791d24c4df4337c37e6ea4 Mon Sep 17 00:00:00 2001 From: lgtm <1gtm@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:57:28 -0800 Subject: [PATCH 09/12] Prepare for release v2024.11.8-rc.0 (#712) ProductLine: KubeDB Release: v2024.11.8-rc.0 Release-tracker: https://github.com/kubedb/CHANGELOG/pull/100 Signed-off-by: 1gtm <1gtm@appscode.com> --- docs/CHANGELOG-v2024.11.8-rc.0.md | 645 ++++++++++++++++++++++++++++++ 1 file changed, 645 insertions(+) create mode 100644 docs/CHANGELOG-v2024.11.8-rc.0.md diff --git a/docs/CHANGELOG-v2024.11.8-rc.0.md b/docs/CHANGELOG-v2024.11.8-rc.0.md new file mode 100644 index 0000000000..9dc671e434 --- /dev/null +++ b/docs/CHANGELOG-v2024.11.8-rc.0.md @@ -0,0 +1,645 @@ +--- +title: Changelog | KubeDB +description: Changelog +menu: + docs_{{.version}}: + identifier: changelog-kubedb-v2024.11.8-rc.0 + name: Changelog-v2024.11.8-rc.0 + parent: welcome + weight: 20241108 +product_name: kubedb +menu_name: docs_{{.version}} +section_menu_id: welcome +url: /docs/{{.version}}/welcome/changelog-v2024.11.8-rc.0/ +aliases: + - /docs/{{.version}}/CHANGELOG-v2024.11.8-rc.0/ +--- + +# KubeDB v2024.11.8-rc.0 (2024-11-09) + + +## [kubedb/apimachinery](https://github.com/kubedb/apimachinery) + +### [v0.49.0-rc.0](https://github.com/kubedb/apimachinery/releases/tag/v0.49.0-rc.0) + + + + +## [kubedb/autoscaler](https://github.com/kubedb/autoscaler) + +### [v0.34.0-rc.0](https://github.com/kubedb/autoscaler/releases/tag/v0.34.0-rc.0) + +- [0e555ac9](https://github.com/kubedb/autoscaler/commit/0e555ac9) Prepare for release v0.34.0-rc.0 (#228) +- [9a723b6e](https://github.com/kubedb/autoscaler/commit/9a723b6e) Add autoscaler for solr (#227) +- [6fa6ac10](https://github.com/kubedb/autoscaler/commit/6fa6ac10) Use debian:12 base image (#226) +- [7b4b559f](https://github.com/kubedb/autoscaler/commit/7b4b559f) Use debian:12 base image (#225) + + + +## [kubedb/cassandra](https://github.com/kubedb/cassandra) + +### [v0.2.0-rc.0](https://github.com/kubedb/cassandra/releases/tag/v0.2.0-rc.0) + +- [c8344e76](https://github.com/kubedb/cassandra/commit/c8344e76) Prepare for release v0.2.0-rc.0 (#10) +- [49bea527](https://github.com/kubedb/cassandra/commit/49bea527) Fix Petset observedGeneration issue & Add Monitoring Support (#7) +- [08e51996](https://github.com/kubedb/cassandra/commit/08e51996) Use debian:12 base image (#8) + + + +## [kubedb/cli](https://github.com/kubedb/cli) + +### [v0.49.0-rc.0](https://github.com/kubedb/cli/releases/tag/v0.49.0-rc.0) + +- [a10a51fa](https://github.com/kubedb/cli/commit/a10a51fa) Prepare for release v0.49.0-rc.0 (#780) + + + +## [kubedb/clickhouse](https://github.com/kubedb/clickhouse) + +### [v0.4.0-rc.0](https://github.com/kubedb/clickhouse/releases/tag/v0.4.0-rc.0) + +- [c3e50828](https://github.com/kubedb/clickhouse/commit/c3e50828) Prepare for release v0.4.0-rc.0 (#24) +- [8dd25781](https://github.com/kubedb/clickhouse/commit/8dd25781) Use debian:12 base image (#21) + + + +## [kubedb/crd-manager](https://github.com/kubedb/crd-manager) + +### [v0.4.0-rc.0](https://github.com/kubedb/crd-manager/releases/tag/v0.4.0-rc.0) + +- [71f313ce](https://github.com/kubedb/crd-manager/commit/71f313ce) Prepare for release v0.4.0-rc.0 (#54) +- [27c3d99b](https://github.com/kubedb/crd-manager/commit/27c3d99b) Use debian:12 base image (#53) +- [f45b9afd](https://github.com/kubedb/crd-manager/commit/f45b9afd) Use debian:12 base image (#52) + + + +## [kubedb/dashboard-restic-plugin](https://github.com/kubedb/dashboard-restic-plugin) + +### [v0.7.0-rc.0](https://github.com/kubedb/dashboard-restic-plugin/releases/tag/v0.7.0-rc.0) + +- [7672ced](https://github.com/kubedb/dashboard-restic-plugin/commit/7672ced) Prepare for release v0.7.0-rc.0 (#23) +- [504cae4](https://github.com/kubedb/dashboard-restic-plugin/commit/504cae4) Use debian:12 base image (#22) + + + +## [kubedb/db-client-go](https://github.com/kubedb/db-client-go) + +### [v0.4.0-rc.0](https://github.com/kubedb/db-client-go/releases/tag/v0.4.0-rc.0) + +- [bc1b92c5](https://github.com/kubedb/db-client-go/commit/bc1b92c5) Prepare for release v0.4.0-rc.0 (#150) +- [e8210401](https://github.com/kubedb/db-client-go/commit/e8210401) Update Cassandra/client.go (#143) +- [8f470859](https://github.com/kubedb/db-client-go/commit/8f470859) adding tls for pgbouncer (#149) +- [7e70d363](https://github.com/kubedb/db-client-go/commit/7e70d363) Fix druid auth name (#147) +- [234b5778](https://github.com/kubedb/db-client-go/commit/234b5778) Update apimachinery Dependency (#146) +- [8b8905b9](https://github.com/kubedb/db-client-go/commit/8b8905b9) Update deps & fix authsecret mutation (#145) +- [db011c56](https://github.com/kubedb/db-client-go/commit/db011c56) Add TLS config to druid client (#139) +- [fbbd601a](https://github.com/kubedb/db-client-go/commit/fbbd601a) Use debian:12 base image (#144) +- [7b28debe](https://github.com/kubedb/db-client-go/commit/7b28debe) Add DeleteCollection method for Solr (#141) + + + +## [kubedb/druid](https://github.com/kubedb/druid) + +### [v0.4.0-rc.0](https://github.com/kubedb/druid/releases/tag/v0.4.0-rc.0) + +- [73e2f14b](https://github.com/kubedb/druid/commit/73e2f14b) Prepare for release v0.4.0-rc.0 (#55) +- [cb3fc57a](https://github.com/kubedb/druid/commit/cb3fc57a) Fix druid auth secret name (#52) +- [20da2c3a](https://github.com/kubedb/druid/commit/20da2c3a) Add druid TLS (#45) +- [9f72c688](https://github.com/kubedb/druid/commit/9f72c688) Use debian:12 base image (#51) + + + +## [kubedb/elasticsearch](https://github.com/kubedb/elasticsearch) + +### [v0.49.0-rc.0](https://github.com/kubedb/elasticsearch/releases/tag/v0.49.0-rc.0) + +- [d3aaacf3](https://github.com/kubedb/elasticsearch/commit/d3aaacf37) Prepare for release v0.49.0-rc.0 (#738) +- [57de6b5e](https://github.com/kubedb/elasticsearch/commit/57de6b5e6) Fix local Webhook Registration (#737) +- [494c5f03](https://github.com/kubedb/elasticsearch/commit/494c5f03b) Use debian:12 base image (#736) +- [986f6f22](https://github.com/kubedb/elasticsearch/commit/986f6f224) Use debian:12 base image (#735) + + + +## [kubedb/elasticsearch-restic-plugin](https://github.com/kubedb/elasticsearch-restic-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/elasticsearch-restic-plugin/releases/tag/v0.12.0-rc.0) + +- [3e60416](https://github.com/kubedb/elasticsearch-restic-plugin/commit/3e60416) Prepare for release v0.12.0-rc.0 (#46) + + + +## [kubedb/ferretdb](https://github.com/kubedb/ferretdb) + +### [v0.4.0-rc.0](https://github.com/kubedb/ferretdb/releases/tag/v0.4.0-rc.0) + +- [46e66e54](https://github.com/kubedb/ferretdb/commit/46e66e54) Prepare for release v0.4.0-rc.0 (#49) +- [d6dbb82a](https://github.com/kubedb/ferretdb/commit/d6dbb82a) Update pg tp v1 (#47) +- [498cf1e3](https://github.com/kubedb/ferretdb/commit/498cf1e3) Use debian:12 base image (#46) + + + +## [kubedb/installer](https://github.com/kubedb/installer) + +### [v2024.11.8-rc.0](https://github.com/kubedb/installer/releases/tag/v2024.11.8-rc.0) + + + + +## [kubedb/kafka](https://github.com/kubedb/kafka) + +### [v0.20.0-rc.0](https://github.com/kubedb/kafka/releases/tag/v0.20.0-rc.0) + +- [c80ff7a2](https://github.com/kubedb/kafka/commit/c80ff7a2) Prepare for release v0.20.0-rc.0 (#116) +- [96e3de84](https://github.com/kubedb/kafka/commit/96e3de84) Prepare for release v0.42.0-rc.0 +- [6f702d94](https://github.com/kubedb/kafka/commit/6f702d94) Fix breaking helper functions (#115) +- [7e43c33f](https://github.com/kubedb/kafka/commit/7e43c33f) Use debian:12 base image (#111) + + + +## [kubedb/kibana](https://github.com/kubedb/kibana) + +### [v0.25.0-rc.0](https://github.com/kubedb/kibana/releases/tag/v0.25.0-rc.0) + +- [772026c0](https://github.com/kubedb/kibana/commit/772026c0) Prepare for release v0.25.0-rc.0 (#130) +- [ffd6e402](https://github.com/kubedb/kibana/commit/ffd6e402) Use debian:12 base image (#129) +- [0dc26c52](https://github.com/kubedb/kibana/commit/0dc26c52) Use debian:12 base image (#128) + + + +## [kubedb/kubedb-manifest-plugin](https://github.com/kubedb/kubedb-manifest-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/kubedb-manifest-plugin/releases/tag/v0.12.0-rc.0) + +- [7021daa](https://github.com/kubedb/kubedb-manifest-plugin/commit/7021daa) Prepare for release v0.12.0-rc.0 (#76) +- [bea1697](https://github.com/kubedb/kubedb-manifest-plugin/commit/bea1697) Use debian:12 base image (#75) +- [dd34241](https://github.com/kubedb/kubedb-manifest-plugin/commit/dd34241) Add Manifest backup/restore support for redis (#74) + + + +## [kubedb/mariadb](https://github.com/kubedb/mariadb) + +### [v0.33.0-rc.0](https://github.com/kubedb/mariadb/releases/tag/v0.33.0-rc.0) + +- [b73a732a](https://github.com/kubedb/mariadb/commit/b73a732ad) Prepare for release v0.33.0-rc.0 (#290) +- [bd9c114a](https://github.com/kubedb/mariadb/commit/bd9c114a4) Use debian:12 base image (#288) + + + +## [kubedb/mariadb-archiver](https://github.com/kubedb/mariadb-archiver) + +### [v0.9.0-rc.0](https://github.com/kubedb/mariadb-archiver/releases/tag/v0.9.0-rc.0) + +- [8498c843](https://github.com/kubedb/mariadb-archiver/commit/8498c843) Prepare for release v0.9.0-rc.0 (#30) + + + +## [kubedb/mariadb-coordinator](https://github.com/kubedb/mariadb-coordinator) + +### [v0.29.0-rc.0](https://github.com/kubedb/mariadb-coordinator/releases/tag/v0.29.0-rc.0) + +- [f1a7ed08](https://github.com/kubedb/mariadb-coordinator/commit/f1a7ed08) Prepare for release v0.29.0-rc.0 (#129) +- [896d4206](https://github.com/kubedb/mariadb-coordinator/commit/896d4206) Use debian:12 base image (#128) + + + +## [kubedb/mariadb-csi-snapshotter-plugin](https://github.com/kubedb/mariadb-csi-snapshotter-plugin) + +### [v0.9.0-rc.0](https://github.com/kubedb/mariadb-csi-snapshotter-plugin/releases/tag/v0.9.0-rc.0) + +- [92594f3](https://github.com/kubedb/mariadb-csi-snapshotter-plugin/commit/92594f3) Prepare for release v0.9.0-rc.0 (#33) +- [cdc664f](https://github.com/kubedb/mariadb-csi-snapshotter-plugin/commit/cdc664f) Use debian:12 base image (#32) + + + +## [kubedb/mariadb-restic-plugin](https://github.com/kubedb/mariadb-restic-plugin) + +### [v0.7.0-rc.0](https://github.com/kubedb/mariadb-restic-plugin/releases/tag/v0.7.0-rc.0) + +- [d9af547](https://github.com/kubedb/mariadb-restic-plugin/commit/d9af547) Prepare for release v0.7.0-rc.0 (#28) +- [610dab6](https://github.com/kubedb/mariadb-restic-plugin/commit/610dab6) Add external databases backup/restore support (#27) + + + +## [kubedb/memcached](https://github.com/kubedb/memcached) + +### [v0.42.0-rc.0](https://github.com/kubedb/memcached/releases/tag/v0.42.0-rc.0) + + + + +## [kubedb/mongodb](https://github.com/kubedb/mongodb) + +### [v0.42.0-rc.0](https://github.com/kubedb/mongodb/releases/tag/v0.42.0-rc.0) + +- [df91f37e](https://github.com/kubedb/mongodb/commit/df91f37e3) Prepare for release v0.42.0-rc.0 (#664) +- [decf3281](https://github.com/kubedb/mongodb/commit/decf32819) Fix MongoDBArchiver for Minio TLS backend (#659) +- [d1b57cfe](https://github.com/kubedb/mongodb/commit/d1b57cfe0) Use debian:12 base image (#663) + + + +## [kubedb/mongodb-csi-snapshotter-plugin](https://github.com/kubedb/mongodb-csi-snapshotter-plugin) + +### [v0.10.0-rc.0](https://github.com/kubedb/mongodb-csi-snapshotter-plugin/releases/tag/v0.10.0-rc.0) + +- [c84b8c0](https://github.com/kubedb/mongodb-csi-snapshotter-plugin/commit/c84b8c0) Prepare for release v0.10.0-rc.0 (#38) +- [bca72d6](https://github.com/kubedb/mongodb-csi-snapshotter-plugin/commit/bca72d6) Use debian:12 base image (#37) +- [780554d](https://github.com/kubedb/mongodb-csi-snapshotter-plugin/commit/780554d) Use debian:12 base image (#36) + + + +## [kubedb/mongodb-restic-plugin](https://github.com/kubedb/mongodb-restic-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/mongodb-restic-plugin/releases/tag/v0.12.0-rc.0) + +- [3f6d291](https://github.com/kubedb/mongodb-restic-plugin/commit/3f6d291) Prepare for release v0.12.0-rc.0 (#68) + + + +## [kubedb/mssql-coordinator](https://github.com/kubedb/mssql-coordinator) + +### [v0.4.0-rc.0](https://github.com/kubedb/mssql-coordinator/releases/tag/v0.4.0-rc.0) + +- [ae1c7c69](https://github.com/kubedb/mssql-coordinator/commit/ae1c7c69) Prepare for release v0.4.0-rc.0 (#20) +- [395372a7](https://github.com/kubedb/mssql-coordinator/commit/395372a7) Check AG Database exists before resume, clean LSN string (#18) +- [505f0d8e](https://github.com/kubedb/mssql-coordinator/commit/505f0d8e) Use debian:12 base image (#19) + + + +## [kubedb/mssqlserver](https://github.com/kubedb/mssqlserver) + +### [v0.4.0-rc.0](https://github.com/kubedb/mssqlserver/releases/tag/v0.4.0-rc.0) + +- [b43a0b19](https://github.com/kubedb/mssqlserver/commit/b43a0b19) Prepare for release v0.4.0-rc.0 (#37) +- [69c1a4de](https://github.com/kubedb/mssqlserver/commit/69c1a4de) Use debian:12 base image (#35) +- [c243e70b](https://github.com/kubedb/mssqlserver/commit/c243e70b) Add some fixes: Validate user envs (#33) +- [39de8531](https://github.com/kubedb/mssqlserver/commit/39de8531) Skip creating extra initial backup session for pitr (#34) + + + +## [kubedb/mssqlserver-archiver](https://github.com/kubedb/mssqlserver-archiver) + +### [v0.3.0-rc.0](https://github.com/kubedb/mssqlserver-archiver/releases/tag/v0.3.0-rc.0) + +- [8ab2080](https://github.com/kubedb/mssqlserver-archiver/commit/8ab2080) Use debian:12 base image (#4) + + + +## [kubedb/mssqlserver-walg-plugin](https://github.com/kubedb/mssqlserver-walg-plugin) + +### [v0.3.0-rc.0](https://github.com/kubedb/mssqlserver-walg-plugin/releases/tag/v0.3.0-rc.0) + +- [e05e217](https://github.com/kubedb/mssqlserver-walg-plugin/commit/e05e217) Prepare for release v0.3.0-rc.0 (#9) +- [4a9db7b](https://github.com/kubedb/mssqlserver-walg-plugin/commit/4a9db7b) Use debian:12 base image (#8) + + + +## [kubedb/mysql](https://github.com/kubedb/mysql) + +### [v0.42.0-rc.0](https://github.com/kubedb/mysql/releases/tag/v0.42.0-rc.0) + +- [1ab34fa2](https://github.com/kubedb/mysql/commit/1ab34fa2e) Prepare for release v0.42.0-rc.0 (#649) + + + +## [kubedb/mysql-archiver](https://github.com/kubedb/mysql-archiver) + +### [v0.10.0-rc.0](https://github.com/kubedb/mysql-archiver/releases/tag/v0.10.0-rc.0) + +- [beb27b22](https://github.com/kubedb/mysql-archiver/commit/beb27b22) Prepare for release v0.10.0-rc.0 (#43) + + + +## [kubedb/mysql-coordinator](https://github.com/kubedb/mysql-coordinator) + +### [v0.27.0-rc.0](https://github.com/kubedb/mysql-coordinator/releases/tag/v0.27.0-rc.0) + +- [81d40c27](https://github.com/kubedb/mysql-coordinator/commit/81d40c27) Prepare for release v0.27.0-rc.0 (#127) + + + +## [kubedb/mysql-csi-snapshotter-plugin](https://github.com/kubedb/mysql-csi-snapshotter-plugin) + +### [v0.10.0-rc.0](https://github.com/kubedb/mysql-csi-snapshotter-plugin/releases/tag/v0.10.0-rc.0) + +- [be7cf34](https://github.com/kubedb/mysql-csi-snapshotter-plugin/commit/be7cf34) Prepare for release v0.10.0-rc.0 (#33) + + + +## [kubedb/mysql-restic-plugin](https://github.com/kubedb/mysql-restic-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/mysql-restic-plugin/releases/tag/v0.12.0-rc.0) + +- [310725e](https://github.com/kubedb/mysql-restic-plugin/commit/310725e) Prepare for release v0.12.0-rc.0 (#59) + + + +## [kubedb/mysql-router-init](https://github.com/kubedb/mysql-router-init) + +### [v0.27.0-rc.0](https://github.com/kubedb/mysql-router-init/releases/tag/v0.27.0-rc.0) + +- [a0ee1f6](https://github.com/kubedb/mysql-router-init/commit/a0ee1f6) Use debian:12 base image (#47) + + + +## [kubedb/ops-manager](https://github.com/kubedb/ops-manager) + +### [v0.36.0-rc.0](https://github.com/kubedb/ops-manager/releases/tag/v0.36.0-rc.0) + +- [eb4dfe2f](https://github.com/kubedb/ops-manager/commit/eb4dfe2fe) Prepare for release v0.36.0-rc.0 (#656) +- [a03bb54e](https://github.com/kubedb/ops-manager/commit/a03bb54e3) Update all db deps +- [6b0cf17f](https://github.com/kubedb/ops-manager/commit/6b0cf17fa) Fix recommendation (#642) +- [1b049295](https://github.com/kubedb/ops-manager/commit/1b0492953) Add support for Druid TLS and Ops-Requests (#629) +- [e72ae41d](https://github.com/kubedb/ops-manager/commit/e72ae41dc) Fix reconfigure tls mg patch issue (#650) +- [5d328f00](https://github.com/kubedb/ops-manager/commit/5d328f00b) Use debian:12 base image (#647) +- [1f32a6cf](https://github.com/kubedb/ops-manager/commit/1f32a6cf0) Use debian:12 base image (#646) +- [3d69bbcc](https://github.com/kubedb/ops-manager/commit/3d69bbcc7) Update zk deps (#645) +- [c71245eb](https://github.com/kubedb/ops-manager/commit/c71245eb4) Add TLS for ZooKeeper (#640) +- [0624ed34](https://github.com/kubedb/ops-manager/commit/0624ed346) Update deps (#643) +- [0c2abc62](https://github.com/kubedb/ops-manager/commit/0c2abc62f) Fix Ops Request Reconfiguration and Version Update (#641) + + + +## [kubedb/percona-xtradb](https://github.com/kubedb/percona-xtradb) + +### [v0.36.0-rc.0](https://github.com/kubedb/percona-xtradb/releases/tag/v0.36.0-rc.0) + +- [de5d228a](https://github.com/kubedb/percona-xtradb/commit/de5d228ac) Prepare for release v0.36.0-rc.0 (#383) +- [23f321d4](https://github.com/kubedb/percona-xtradb/commit/23f321d42) Use debian:12 base image (#382) + + + +## [kubedb/percona-xtradb-coordinator](https://github.com/kubedb/percona-xtradb-coordinator) + +### [v0.22.0-rc.0](https://github.com/kubedb/percona-xtradb-coordinator/releases/tag/v0.22.0-rc.0) + +- [23075738](https://github.com/kubedb/percona-xtradb-coordinator/commit/23075738) Prepare for release v0.22.0-rc.0 (#83) +- [86853e65](https://github.com/kubedb/percona-xtradb-coordinator/commit/86853e65) Use debian:12 base image (#82) + + + +## [kubedb/pg-coordinator](https://github.com/kubedb/pg-coordinator) + +### [v0.33.0-rc.0](https://github.com/kubedb/pg-coordinator/releases/tag/v0.33.0-rc.0) + +- [f8d96212](https://github.com/kubedb/pg-coordinator/commit/f8d96212) Prepare for release v0.33.0-rc.0 (#176) +- [0e372546](https://github.com/kubedb/pg-coordinator/commit/0e372546) Add PITR modes support (#175) +- [87ab3dfe](https://github.com/kubedb/pg-coordinator/commit/87ab3dfe) Use debian:12 base image (#174) + + + +## [kubedb/pgbouncer](https://github.com/kubedb/pgbouncer) + +### [v0.36.0-rc.0](https://github.com/kubedb/pgbouncer/releases/tag/v0.36.0-rc.0) + +- [5b075c85](https://github.com/kubedb/pgbouncer/commit/5b075c85) Prepare for release v0.36.0-rc.0 (#350) +- [5780e16a](https://github.com/kubedb/pgbouncer/commit/5780e16a) Use debian:12 base image (#348) + + + +## [kubedb/pgpool](https://github.com/kubedb/pgpool) + +### [v0.4.0-rc.0](https://github.com/kubedb/pgpool/releases/tag/v0.4.0-rc.0) + +- [5422557f](https://github.com/kubedb/pgpool/commit/5422557f) Prepare for release v0.4.0-rc.0 (#50) +- [b1e214ca](https://github.com/kubedb/pgpool/commit/b1e214ca) Use debian:12 base image (#49) + + + +## [kubedb/postgres](https://github.com/kubedb/postgres) + +### [v0.49.0-rc.0](https://github.com/kubedb/postgres/releases/tag/v0.49.0-rc.0) + +- [a8a62aea](https://github.com/kubedb/postgres/commit/a8a62aea3) Prepare for release v0.49.0-rc.0 (#764) +- [c39cd034](https://github.com/kubedb/postgres/commit/c39cd034f) Fix cross region restore issue (#763) +- [be0d9cba](https://github.com/kubedb/postgres/commit/be0d9cba1) Use debian:12 base image (#761) + + + +## [kubedb/postgres-archiver](https://github.com/kubedb/postgres-archiver) + +### [v0.10.0-rc.0](https://github.com/kubedb/postgres-archiver/releases/tag/v0.10.0-rc.0) + +- [9fa2492a](https://github.com/kubedb/postgres-archiver/commit/9fa2492a) Prepare for release v0.10.0-rc.0 (#41) + + + +## [kubedb/postgres-csi-snapshotter-plugin](https://github.com/kubedb/postgres-csi-snapshotter-plugin) + +### [v0.10.0-rc.0](https://github.com/kubedb/postgres-csi-snapshotter-plugin/releases/tag/v0.10.0-rc.0) + +- [a48321d](https://github.com/kubedb/postgres-csi-snapshotter-plugin/commit/a48321d) Prepare for release v0.10.0-rc.0 (#41) +- [1571bab](https://github.com/kubedb/postgres-csi-snapshotter-plugin/commit/1571bab) Use debian:12 base image (#40) +- [7393bf4](https://github.com/kubedb/postgres-csi-snapshotter-plugin/commit/7393bf4) Use debian:12 base image (#39) + + + +## [kubedb/postgres-restic-plugin](https://github.com/kubedb/postgres-restic-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/postgres-restic-plugin/releases/tag/v0.12.0-rc.0) + +- [f744dce](https://github.com/kubedb/postgres-restic-plugin/commit/f744dce) Prepare for release v0.12.0-rc.0 (#55) + + + +## [kubedb/provider-aws](https://github.com/kubedb/provider-aws) + +### [v0.11.0-rc.0](https://github.com/kubedb/provider-aws/releases/tag/v0.11.0-rc.0) + + + + +## [kubedb/provider-azure](https://github.com/kubedb/provider-azure) + +### [v0.11.0-rc.0](https://github.com/kubedb/provider-azure/releases/tag/v0.11.0-rc.0) + + + + +## [kubedb/provider-gcp](https://github.com/kubedb/provider-gcp) + +### [v0.11.0-rc.0](https://github.com/kubedb/provider-gcp/releases/tag/v0.11.0-rc.0) + + + + +## [kubedb/provisioner](https://github.com/kubedb/provisioner) + +### [v0.49.0-rc.0](https://github.com/kubedb/provisioner/releases/tag/v0.49.0-rc.0) + +- [1fec3354](https://github.com/kubedb/provisioner/commit/1fec33545) Prepare for release v0.49.0-rc.0 (#121) +- [ad392149](https://github.com/kubedb/provisioner/commit/ad392149a) Update all db deps + + + +## [kubedb/proxysql](https://github.com/kubedb/proxysql) + +### [v0.36.0-rc.0](https://github.com/kubedb/proxysql/releases/tag/v0.36.0-rc.0) + +- [a6c29b60](https://github.com/kubedb/proxysql/commit/a6c29b60b) Prepare for release v0.36.0-rc.0 (#364) +- [ad781b1e](https://github.com/kubedb/proxysql/commit/ad781b1ec) Use debian:12 base image (#362) + + + +## [kubedb/rabbitmq](https://github.com/kubedb/rabbitmq) + +### [v0.4.0-rc.0](https://github.com/kubedb/rabbitmq/releases/tag/v0.4.0-rc.0) + +- [3eabf7e9](https://github.com/kubedb/rabbitmq/commit/3eabf7e9) Prepare for release v0.4.0-rc.0 (#51) +- [bb92e142](https://github.com/kubedb/rabbitmq/commit/bb92e142) Revert "Add ReconcileState struct as reconcile methods receiver (#50)" +- [208e2ebc](https://github.com/kubedb/rabbitmq/commit/208e2ebc) Add ReconcileState struct as reconcile methods receiver (#50) +- [c62f41c0](https://github.com/kubedb/rabbitmq/commit/c62f41c0) Use debian:12 base image (#49) + + + +## [kubedb/redis](https://github.com/kubedb/redis) + +### [v0.42.0-rc.0](https://github.com/kubedb/redis/releases/tag/v0.42.0-rc.0) + +- [1869d651](https://github.com/kubedb/redis/commit/1869d6514) Prepare for release v0.42.0-rc.0 (#564) +- [60db928f](https://github.com/kubedb/redis/commit/60db928f4) Use debian:12 base image (#563) + + + +## [kubedb/redis-coordinator](https://github.com/kubedb/redis-coordinator) + +### [v0.28.0-rc.0](https://github.com/kubedb/redis-coordinator/releases/tag/v0.28.0-rc.0) + +- [9bbeb8af](https://github.com/kubedb/redis-coordinator/commit/9bbeb8af) Prepare for release v0.28.0-rc.0 (#114) +- [81465dcd](https://github.com/kubedb/redis-coordinator/commit/81465dcd) Use debian:12 base image (#113) + + + +## [kubedb/redis-restic-plugin](https://github.com/kubedb/redis-restic-plugin) + +### [v0.12.0-rc.0](https://github.com/kubedb/redis-restic-plugin/releases/tag/v0.12.0-rc.0) + +- [ce0f2c5](https://github.com/kubedb/redis-restic-plugin/commit/ce0f2c5) Prepare for release v0.12.0-rc.0 (#50) + + + +## [kubedb/replication-mode-detector](https://github.com/kubedb/replication-mode-detector) + +### [v0.36.0-rc.0](https://github.com/kubedb/replication-mode-detector/releases/tag/v0.36.0-rc.0) + +- [637b35b0](https://github.com/kubedb/replication-mode-detector/commit/637b35b0) Prepare for release v0.36.0-rc.0 (#280) +- [002dffe1](https://github.com/kubedb/replication-mode-detector/commit/002dffe1) Use debian:12 base image (#279) + + + +## [kubedb/schema-manager](https://github.com/kubedb/schema-manager) + +### [v0.25.0-rc.0](https://github.com/kubedb/schema-manager/releases/tag/v0.25.0-rc.0) + +- [b96dc475](https://github.com/kubedb/schema-manager/commit/b96dc475) Prepare for release v0.25.0-rc.0 (#124) +- [6b295a6b](https://github.com/kubedb/schema-manager/commit/6b295a6b) Use debian:12 base image (#123) +- [095be7c6](https://github.com/kubedb/schema-manager/commit/095be7c6) Use debian:12 base image (#122) + + + +## [kubedb/singlestore](https://github.com/kubedb/singlestore) + +### [v0.4.0-rc.0](https://github.com/kubedb/singlestore/releases/tag/v0.4.0-rc.0) + +- [143ac48c](https://github.com/kubedb/singlestore/commit/143ac48c) Prepare for release v0.4.0-rc.0 (#50) +- [c6d41c61](https://github.com/kubedb/singlestore/commit/c6d41c61) Use debian:12 base image (#48) + + + +## [kubedb/singlestore-coordinator](https://github.com/kubedb/singlestore-coordinator) + +### [v0.4.0-rc.0](https://github.com/kubedb/singlestore-coordinator/releases/tag/v0.4.0-rc.0) + +- [2c8c88b](https://github.com/kubedb/singlestore-coordinator/commit/2c8c88b) Prepare for release v0.4.0-rc.0 (#29) +- [6414517](https://github.com/kubedb/singlestore-coordinator/commit/6414517) Use debian:12 base image (#28) + + + +## [kubedb/singlestore-restic-plugin](https://github.com/kubedb/singlestore-restic-plugin) + +### [v0.7.0-rc.0](https://github.com/kubedb/singlestore-restic-plugin/releases/tag/v0.7.0-rc.0) + +- [fe8a465](https://github.com/kubedb/singlestore-restic-plugin/commit/fe8a465) Prepare for release v0.7.0-rc.0 (#27) + + + +## [kubedb/solr](https://github.com/kubedb/solr) + +### [v0.4.0-rc.0](https://github.com/kubedb/solr/releases/tag/v0.4.0-rc.0) + +- [b337c65c](https://github.com/kubedb/solr/commit/b337c65c) Prepare for release v0.4.0-rc.0 (#55) +- [71366144](https://github.com/kubedb/solr/commit/71366144) Revert "Add ReconcileState struct to pass reconciling objects as parameter (#54)" +- [ca96f684](https://github.com/kubedb/solr/commit/ca96f684) Add ReconcileState struct to pass reconciling objects as parameter (#54) +- [ef5fecdb](https://github.com/kubedb/solr/commit/ef5fecdb) Update deps & fix authsecret mutation (#53) +- [c5fb9263](https://github.com/kubedb/solr/commit/c5fb9263) Use debian:12 base image (#52) + + + +## [kubedb/tests](https://github.com/kubedb/tests) + +### [v0.34.0-rc.0](https://github.com/kubedb/tests/releases/tag/v0.34.0-rc.0) + +- [ec82963a](https://github.com/kubedb/tests/commit/ec82963a) Prepare for release v0.34.0-rc.0 (#401) +- [ddfac099](https://github.com/kubedb/tests/commit/ddfac099) Add Health Check Test (#329) +- [cfb52cc6](https://github.com/kubedb/tests/commit/cfb52cc6) Add Druid Restart Test (#397) +- [69f18704](https://github.com/kubedb/tests/commit/69f18704) Add Druid AutoScaling Test (#396) +- [d846af1b](https://github.com/kubedb/tests/commit/d846af1b) Add Postgres AutoScaling Tests (#364) +- [d67c3869](https://github.com/kubedb/tests/commit/d67c3869) Kubestash Backup-Restore Test for Postgres (#388) +- [4eafce8f](https://github.com/kubedb/tests/commit/4eafce8f) Add Pgpool metrics exporter tests (#377) +- [eaa4499a](https://github.com/kubedb/tests/commit/eaa4499a) Add Postgres metrics exporter tests (#368) +- [564d1cde](https://github.com/kubedb/tests/commit/564d1cde) Add Pgbouncer metrics exporter test (#385) +- [4ffa3df4](https://github.com/kubedb/tests/commit/4ffa3df4) Add Solr metrics exporter test (#390) +- [4183f879](https://github.com/kubedb/tests/commit/4183f879) working well (#381) +- [a3eb7976](https://github.com/kubedb/tests/commit/a3eb7976) Use debian:12 base image (#392) +- [ec4d737f](https://github.com/kubedb/tests/commit/ec4d737f) Add zookeeper metrics exporter test (#391) +- [be48f627](https://github.com/kubedb/tests/commit/be48f627) Add ops manager to CI (#386) +- [fa41180f](https://github.com/kubedb/tests/commit/fa41180f) remove branch from checkout (#380) +- [ac4d8455](https://github.com/kubedb/tests/commit/ac4d8455) Remove extra print (#384) +- [b26e740e](https://github.com/kubedb/tests/commit/b26e740e) Add ElasticSearch metrics exporter tests (#373) +- [f15066fb](https://github.com/kubedb/tests/commit/f15066fb) Add Singlestore metrics exporter tests (#378) +- [f5765a67](https://github.com/kubedb/tests/commit/f5765a67) mysql exporter unfocus (#382) +- [a873ff4a](https://github.com/kubedb/tests/commit/a873ff4a) Add Perconaxtradb metrics exporter tests (#375) +- [dc7c42c9](https://github.com/kubedb/tests/commit/dc7c42c9) Add MySQL metrics exporter tests (#371) +- [46189f39](https://github.com/kubedb/tests/commit/46189f39) Add MariaDB metrics exporter tests (#366) +- [4b4fa18d](https://github.com/kubedb/tests/commit/4b4fa18d) Add PGBouncer update-version, reconfiguration, custom-config and auto-scaling test (#372) +- [fe911856](https://github.com/kubedb/tests/commit/fe911856) Add kubestash-Backupstorage Phase (#374) + + + +## [kubedb/ui-server](https://github.com/kubedb/ui-server) + +### [v0.25.0-rc.0](https://github.com/kubedb/ui-server/releases/tag/v0.25.0-rc.0) + +- [ee26c6b4](https://github.com/kubedb/ui-server/commit/ee26c6b4) Prepare for release v0.25.0-rc.0 (#138) + + + +## [kubedb/webhook-server](https://github.com/kubedb/webhook-server) + +### [v0.25.0-rc.0](https://github.com/kubedb/webhook-server/releases/tag/v0.25.0-rc.0) + +- [781984da](https://github.com/kubedb/webhook-server/commit/781984da) Prepare for release v0.25.0-rc.0 (#135) +- [fa8b1b2f](https://github.com/kubedb/webhook-server/commit/fa8b1b2f) Use debian:12 base image (#134) + + + +## [kubedb/zookeeper](https://github.com/kubedb/zookeeper) + +### [v0.4.0-rc.0](https://github.com/kubedb/zookeeper/releases/tag/v0.4.0-rc.0) + +- [258b140f](https://github.com/kubedb/zookeeper/commit/258b140f) Prepare for release v0.4.0-rc.0 (#46) +- [04989850](https://github.com/kubedb/zookeeper/commit/04989850) Fix Auth-Secret Name (#45) +- [108a5495](https://github.com/kubedb/zookeeper/commit/108a5495) Use debian:12 base image (#44) +- [f275c44a](https://github.com/kubedb/zookeeper/commit/f275c44a) Add TLS for ZooKeeper (#42) + + + +## [kubedb/zookeeper-restic-plugin](https://github.com/kubedb/zookeeper-restic-plugin) + +### [v0.5.0-rc.0](https://github.com/kubedb/zookeeper-restic-plugin/releases/tag/v0.5.0-rc.0) + +- [18c68cd](https://github.com/kubedb/zookeeper-restic-plugin/commit/18c68cd) Prepare for release v0.5.0-rc.0 (#19) +- [e5240ed](https://github.com/kubedb/zookeeper-restic-plugin/commit/e5240ed) Use debian:12 base image (#18) + + + + From c684c3278953b5a0510bbe33f63409f4891977c0 Mon Sep 17 00:00:00 2001 From: Raihan Khan Date: Mon, 11 Nov 2024 14:28:12 +0600 Subject: [PATCH 10/12] Remove Community and Enterprise columns from DB overview (#713) Signed-off-by: raihankhan --- docs/guides/druid/README.md | 2 +- docs/guides/elasticsearch/README.md | 90 +++++++++++++++------------- docs/guides/mongodb/README.md | 46 +++++++------- docs/guides/mysql/README.md | 36 +++++------ docs/guides/percona-xtradb/README.md | 22 +++---- docs/guides/pgpool/README.md | 2 +- docs/guides/postgres/README.md | 2 +- docs/guides/proxysql/README.md | 2 +- docs/guides/redis/README.md | 38 ++++++------ docs/guides/zookeeper/README.md | 36 +++++------ 10 files changed, 140 insertions(+), 136 deletions(-) diff --git a/docs/guides/druid/README.md b/docs/guides/druid/README.md index c55d970dfc..3117d47cb3 100644 --- a/docs/guides/druid/README.md +++ b/docs/guides/druid/README.md @@ -37,7 +37,7 @@ aliases: KubeDB supports The following Druid versions. - `28.0.1` -- `30.0.0` +- `30.0.1` > The listed DruidVersions are tested and provided as a part of the installation process (ie. catalog chart), but you are open to create your own [DruidVersion](/docs/guides/druid/concepts/catalog.md) object with your custom Druid image. diff --git a/docs/guides/elasticsearch/README.md b/docs/guides/elasticsearch/README.md index 4dcbfd21d5..d71a8d7d5f 100644 --- a/docs/guides/elasticsearch/README.md +++ b/docs/guides/elasticsearch/README.md @@ -17,28 +17,27 @@ aliases: ## Elasticsearch Features -| Features | Community | Enterprise | -|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| :----------: |:----------:| -| Combined Cluster (n nodes with master,data,ingest: ture; n >= 1 ) | ✓ | ✓ | -| Topology Cluster (n master, m data, x ingest nodes; n,m,x >= 1 ) | ✓ | ✓ | -| Hot-Warm-Cold Topology Cluster (a hot, b warm, c cold nodes; a,b,c >= 1 ) | ✓ | ✓ | -| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✗ | ✓ | -| Automated Version Update | ✗ | ✓ | -| Automatic Vertical Scaling | ✗ | ✓ | -| Automated Horizontal Scaling | ✗ | ✓ | -| Automated Volume Expansion | ✗ | ✓ | -| Backup/Recovery: Instant, Scheduled ( [Stash](https://stash.run/) ) | ✓ | ✓ | -| Dashboard ( Kibana , Opensearch-Dashboards ) | ✓ | ✓ | -| Grafana Dashboards | ✗ | ✓ | -| Initialization from Snapshot ( [Stash](https://stash.run/) ) | ✓ | ✓ | -| Authentication ( [OpensSearch](https://opensearch.org/) / [X-Pack](https://www.elastic.co/guide/en/elasticsearch/reference/7.9/setup-xpack.html) / [OpenDistro](https://opendistro.github.io/for-elasticsearch-docs/) / [Search Guard](https://docs.search-guard.com/latest/) ) | ✓ | ✓ | -| Authorization ( [OpensSearch](https://opensearch.org/) / [X-Pack](https://www.elastic.co/guide/en/elasticsearch/reference/7.9/setup-xpack.html) / [OpenDistro](https://opendistro.github.io/for-elasticsearch-docs/) / [Search Guard](https://docs.search-guard.com/latest/) ) | ✓ | ✓ | -| Persistent Volume | ✓ | ✓ | -| Exports Prometheus Matrices | ✓ | ✓ | -| Custom Configuration | ✓ | ✓ | -| Using Custom Docker Image | ✓ | ✓ | -| Initialization From Script | ✗ | ✗ | -| Autoscaling (vertically) | ✗ | ✓ | +| Features | Availability | +|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------:| +| Combined Cluster (n nodes with master,data,ingest: ture; n >= 1 ) | ✓ | +| Topology Cluster (n master, m data, x ingest nodes; n,m,x >= 1 ) | ✓ | +| Hot-Warm-Cold Topology Cluster (a hot, b warm, c cold nodes; a,b,c >= 1 ) | ✓ | +| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | +| Automated Version Update | ✓ | +| Automatic Vertical Scaling | ✓ | +| Automated Horizontal Scaling | ✓ | +| Automated Volume Expansion | ✓ | +| Backup/Recovery: Instant, Scheduled ( [Stash](https://stash.run/) ) | ✓ | +| Dashboard ( Kibana , Opensearch-Dashboards ) | ✓ | +| Grafana Dashboards | ✓ | +| Initialization from Snapshot ( [Stash](https://stash.run/) ) | ✓ | +| Authentication ( [OpensSearch](https://opensearch.org/) / [X-Pack](https://www.elastic.co/guide/en/elasticsearch/reference/7.9/setup-xpack.html) / [OpenDistro](https://opendistro.github.io/for-elasticsearch-docs/) / [Search Guard](https://docs.search-guard.com/latest/) ) | ✓ | +| Authorization ( [OpensSearch](https://opensearch.org/) / [X-Pack](https://www.elastic.co/guide/en/elasticsearch/reference/7.9/setup-xpack.html) / [OpenDistro](https://opendistro.github.io/for-elasticsearch-docs/) / [Search Guard](https://docs.search-guard.com/latest/) ) | ✓ | +| Persistent Volume | ✓ | +| Exports Prometheus Matrices | ✓ | +| Custom Configuration | ✓ | +| Using Custom Docker Image | ✓ | +| Autoscaling (vertically) | ✓ | ## Lifecycle of Elasticsearch Object @@ -60,31 +59,36 @@ KubeDB supports `Elasticsearch` provided by Elastic with `xpack` auth plugin. `O -| Version | ElasticSearch | Dashboard(Kibana) | -|:--------:|:-------------:|:-----------------:| -| 6.8.x | ✓ | ✓ | -| 7.13.x | ✓ | ✓ | -| 7.14.x | ✓ | ✓ | -| 7.16.x | ✓ | ✓ | -| 7.17.x | ✓ | ✓ | -| 8.2.x | ✓ | ✓ | -| 8.5.x | ✓ | ✓ | -| 8.6.x | ✓ | ✓ | -| 8.8.x | ✓ | ✓ | -| 8.11.x | ✓ | ✓ | +| Version | ElasticSearch | Dashboard(Kibana) | +|:-------:|:-------------:|:-----------------:| +| 6.8.x | ✓ | ✓ | +| 7.13.x | ✓ | ✓ | +| 7.14.x | ✓ | ✓ | +| 7.16.x | ✓ | ✓ | +| 7.17.x | ✓ | ✓ | +| 8.2.x | ✓ | ✓ | +| 8.5.x | ✓ | ✓ | +| 8.6.x | ✓ | ✓ | +| 8.8.x | ✓ | ✓ | +| 8.11.x | ✓ | ✓ | +| 8.13.x | ✓ | ✓ | +| 8.14.x | ✓ | ✓ | +| 8.15.x | ✓ | ✓ | -| Version | OpenSearch | Dashboard
    (OpenSearch-Dashboards) | -|:--------:|:----------:|:-------------------------------------:| -| 1.1.x | ✓ | ✓ | -| 1.2.x | ✓ | ✓ | -| 1.3.x | ✓ | ✓ | -| 2.0.x | ✓ | ✓ | -| 2.5.x | ✓ | ✓ | -| 2.8.x | ✓ | ✓ | -| 2.11.x | ✓ | ✓ | +| Version | OpenSearch | Dashboard
    (OpenSearch-Dashboards) | +|:-------:|:----------:|:-------------------------------------:| +| 1.1.x | ✓ | ✓ | +| 1.2.x | ✓ | ✓ | +| 1.3.x | ✓ | ✓ | +| 2.0.x | ✓ | ✓ | +| 2.5.x | ✓ | ✓ | +| 2.8.x | ✓ | ✓ | +| 2.11.x | ✓ | ✓ | +| 2.14.x | ✓ | ✓ | +| 2.16.x | ✓ | ✓ | diff --git a/docs/guides/mongodb/README.md b/docs/guides/mongodb/README.md index 1d6e0d1f2f..7577452979 100644 --- a/docs/guides/mongodb/README.md +++ b/docs/guides/mongodb/README.md @@ -18,29 +18,29 @@ aliases: ## Supported MongoDB Features -| Features | Community | Enterprise | -|------------------------------------------------------------------------------------|:---------:|:----------:| -| Clustering - Sharding | ✓ | ✓ | -| Clustering - Replication | ✓ | ✓ | -| Custom Configuration | ✓ | ✓ | -| Using Custom Docker Image | ✓ | ✓ | -| Initialization From Script (\*.js and/or \*.sh) | ✓ | ✓ | -| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | ✓ | -| Authentication & Autorization | ✓ | ✓ | -| Arbiter support | ✓ | ✓ | -| Persistent Volume | ✓ | ✓ | -| Instant Backup | ✓ | ✓ | -| Scheduled Backup | ✓ | ✓ | -| Builtin Prometheus Discovery | ✓ | ✓ | -| Using Prometheus operator | ✓ | ✓ | -| Automated Version Update | ✗ | ✓ | -| Automatic Vertical Scaling | ✗ | ✓ | -| Automated Horizontal Scaling | ✗ | ✓ | -| Automated db-configure Reconfiguration | ✗ | ✓ | -| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✗ | ✓ | -| Automated Reprovision | ✗ | ✓ | -| Automated Volume Expansion | ✗ | ✓ | -| Autoscaling (vertically) | ✗ | ✓ | +| Features | Availability | +|------------------------------------------------------------------------------------|:------------:| +| Clustering - Sharding | ✓ | +| Clustering - Replication | ✓ | +| Custom Configuration | ✓ | +| Using Custom Docker Image | ✓ | +| Initialization From Script (\*.js and/or \*.sh) | ✓ | +| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | +| Authentication & Autorization | ✓ | +| Arbiter support | ✓ | +| Persistent Volume | ✓ | +| Instant Backup | ✓ | +| Scheduled Backup | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | +| Automated Version Update | ✓ | +| Automatic Vertical Scaling | ✓ | +| Automated Horizontal Scaling | ✓ | +| Automated db-configure Reconfiguration | ✓ | +| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | +| Automated Reprovision | ✓ | +| Automated Volume Expansion | ✓ | +| Autoscaling (vertically) | ✓ | ## Life Cycle of a MongoDB Object diff --git a/docs/guides/mysql/README.md b/docs/guides/mysql/README.md index ad11191d13..0d7cac726e 100644 --- a/docs/guides/mysql/README.md +++ b/docs/guides/mysql/README.md @@ -17,24 +17,24 @@ aliases: ## Supported MySQL Features -| Features | Availability | -| --------------------------------------------------------------------------------------- | :----------: | -| Group Replication | ✓ | -| Innodb Cluster | ✓ | -| SemiSynchronous cluster | ✓ | -| Read Replicas | ✓ | -| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | -| Automated Version update | ✓ | -| Automatic Vertical Scaling | ✓ | -| Automated Horizontal Scaling | ✓ | -| Automated Volume Expansion | ✓ | -| Backup/Recovery: Instant, Scheduled ( [Stash](https://stash.run/) ) | ✓ | -| Initialize using Snapshot | ✓ | -| Initialize using Script (\*.sql, \*sql.gz and/or \*.sh) | ✓ | -| Custom Configuration | ✓ | -| Using Custom docker image | ✓ | -| Builtin Prometheus Discovery | ✓ | -| Using Prometheus operator | ✓ | +| Features | Availability | +|------------------------------------------------------------------------------------|:------------:| +| Group Replication | ✓ | +| Innodb Cluster | ✓ | +| SemiSynchronous cluster | ✓ | +| Read Replicas | ✓ | +| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | +| Automated Version update | ✓ | +| Automatic Vertical Scaling | ✓ | +| Automated Horizontal Scaling | ✓ | +| Automated Volume Expansion | ✓ | +| Backup/Recovery: Instant, Scheduled ( [Stash](https://stash.run/) ) | ✓ | +| Initialize using Snapshot | ✓ | +| Initialize using Script (\*.sql, \*sql.gz and/or \*.sh) | ✓ | +| Custom Configuration | ✓ | +| Using Custom docker image | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | ## Life Cycle of a MySQL Object diff --git a/docs/guides/percona-xtradb/README.md b/docs/guides/percona-xtradb/README.md index 26ca2b23f5..7064337785 100644 --- a/docs/guides/percona-xtradb/README.md +++ b/docs/guides/percona-xtradb/README.md @@ -18,17 +18,17 @@ aliases: ## Supported PerconaXtraDB Features -| Features | Availability | -| ------------------------------------------------------- | :----------: | -| Clustering | ✓ | -| Persistent Volume | ✓ | -| Instant Backup | ✓ | -| Scheduled Backup | ✓ | -| Initialize using Snapshot | ✓ | -| Custom Configuration | ✓ | -| Using Custom docker image | ✓ | -| Builtin Prometheus Discovery | ✓ | -| Using Prometheus operator | ✓ | +| Features | Availability | +|------------------------------|:------------:| +| Clustering | ✓ | +| Persistent Volume | ✓ | +| Instant Backup | ✓ | +| Scheduled Backup | ✓ | +| Initialize using Snapshot | ✓ | +| Custom Configuration | ✓ | +| Using Custom docker image | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | ## Life Cycle of a PerconaXtraDB Object diff --git a/docs/guides/pgpool/README.md b/docs/guides/pgpool/README.md index 0d703af274..a309c343e1 100644 --- a/docs/guides/pgpool/README.md +++ b/docs/guides/pgpool/README.md @@ -24,7 +24,7 @@ KubeDB operator now comes bundled with Pgpool crd to manage all the essential fe ## Supported Pgpool Features | Features | Availability | -|-------------------------------------------------------------| :----------: | +|-------------------------------------------------------------|:------------:| | Clustering | ✓ | | Multiple Pgpool Versions | ✓ | | Custom Configuration | ✓ | diff --git a/docs/guides/postgres/README.md b/docs/guides/postgres/README.md index 7cc8130805..cf088bedc1 100644 --- a/docs/guides/postgres/README.md +++ b/docs/guides/postgres/README.md @@ -18,7 +18,7 @@ aliases: ## Supported PostgreSQL Features | Features | Availability | -| ---------------------------------- |:------------:| +|------------------------------------|:------------:| | Clustering | ✓ | | Warm Standby | ✓ | | Hot Standby | ✓ | diff --git a/docs/guides/proxysql/README.md b/docs/guides/proxysql/README.md index 2f98e0db82..d554d46342 100644 --- a/docs/guides/proxysql/README.md +++ b/docs/guides/proxysql/README.md @@ -18,7 +18,7 @@ aliases: ## Supported ProxySQL Features | Features | Availability | -| ------------------------------------ | :----------: | +|--------------------------------------|:------------:| | Load balance MySQL Group Replication | ✓ | | Load balance PerconaXtraDB Cluster | ✓ | | Custom Configuration | ✓ | diff --git a/docs/guides/redis/README.md b/docs/guides/redis/README.md index 1d465374a6..37c0c255f9 100644 --- a/docs/guides/redis/README.md +++ b/docs/guides/redis/README.md @@ -16,25 +16,25 @@ aliases: > New to KubeDB? Please start [here](/docs/README.md). ## Supported Redis Features -| Features | Community | Enterprise | -|------------------------------------------------------------------------------------|:---------:|:----------:| -| Clustering | ✓ | ✓ | -| Sentinel | ✓ | ✓ | -| Standalone | ✓ | ✓ | -| Authentication & Autorization | ✓ | ✓ | -| Persistent Volume | ✓ | ✓ | -| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | ✓ | -| Instant Backup (Sentinel and Standalone Mode) | ✓ | ✓ | -| Scheduled Backup (Sentinel and Standalone Mode) | ✓ | ✓ | -| Builtin Prometheus Discovery | ✓ | ✓ | -| Using Prometheus operator | ✓ | ✓ | -| Automated Version Update | ✗ | ✓ | -| Automatic Vertical Scaling | ✗ | ✓ | -| Automated Horizontal Scaling | ✗ | ✓ | -| Automated db-configure Reconfiguration | ✗ | ✓ | -| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✗ | ✓ | -| Automated Volume Expansion | ✗ | ✓ | -| Autoscaling (vertically) | ✗ | ✓ | +| Features | Availability | +|------------------------------------------------------------------------------------|:------------:| +| Clustering | ✓ | +| Sentinel | ✓ | +| Standalone | ✓ | +| Authentication & Autorization | ✓ | +| Persistent Volume | ✓ | +| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | +| Instant Backup (Sentinel and Standalone Mode) | ✓ | +| Scheduled Backup (Sentinel and Standalone Mode) | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | +| Automated Version Update | ✗ | +| Automatic Vertical Scaling | ✗ | +| Automated Horizontal Scaling | ✗ | +| Automated db-configure Reconfiguration | ✗ | +| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✗ | +| Automated Volume Expansion | ✗ | +| Autoscaling (vertically) | ✗ | ## Life Cycle of a Redis Object diff --git a/docs/guides/zookeeper/README.md b/docs/guides/zookeeper/README.md index 8b2ad1a940..16d087f674 100644 --- a/docs/guides/zookeeper/README.md +++ b/docs/guides/zookeeper/README.md @@ -16,25 +16,25 @@ aliases: > New to KubeDB? Please start [here](/docs/README.md). ## Supported ZooKeeper Features -| Features | Availability | -|---------------------------------------------------------------------------|:------------:| -| Ensemble | ✓ | -| Standalone | ✓ | -| Authentication & Autorization | ✓ | -| Custom Configuration | ✓ | -| Grafana Dashboards | ✓ | -| Externally manageable Auth Secret | ✓ | -| Reconfigurable Health Checker | ✓ | +| Features | Availability | +|------------------------------------------------------------------------------------|:------------:| +| Ensemble | ✓ | +| Standalone | ✓ | +| Authentication & Autorization | ✓ | +| Custom Configuration | ✓ | +| Grafana Dashboards | ✓ | +| Externally manageable Auth Secret | ✓ | +| Reconfigurable Health Checker | ✓ | | TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | -| Automated Version update | ✓ | -| Automatic Vertical Scaling | ✓ | -| Automated Horizontal Scaling | ✓ | -| Automated Volume Expansion | ✓ | -| Backup/Recovery: Instant, Scheduled ([KubeStash](https://kubestash.com/)) | ✓ | -| Persistent Volume | ✓ | -| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | -| Builtin Prometheus Discovery | ✓ | -| Using Prometheus operator | ✓ | +| Automated Version update | ✓ | +| Automatic Vertical Scaling | ✓ | +| Automated Horizontal Scaling | ✓ | +| Automated Volume Expansion | ✓ | +| Backup/Recovery: Instant, Scheduled ([KubeStash](https://kubestash.com/)) | ✓ | +| Persistent Volume | ✓ | +| Initializing from Snapshot ( [Stash](https://stash.run/) ) | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | ## Life Cycle of a ZooKeeper Object From 4fec9528439d9229e81d4c0c14a05623799e9029 Mon Sep 17 00:00:00 2001 From: Tapajit Chandra Paul <33987732+tapojit047@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:09:03 +0600 Subject: [PATCH 11/12] Add Druid Complete Docs (#699) * Add druid concepts Signed-off-by: Tapajit Chandra Paul --- docs/guides/README.md | 2 +- docs/guides/druid/README.md | 60 +- docs/guides/druid/autoscaler/_index.md | 10 + .../guides/druid/autoscaler/compute/_index.md | 10 + docs/guides/druid/autoscaler/compute/guide.md | 864 +++++++++ .../compute/images/compute-autoscaling.png | Bin 0 -> 65595 bytes .../druid/autoscaler/compute/overview.md | 55 + .../compute/yamls/deep-storage-config.yaml | 16 + .../compute/yamls/druid-autoscaler.yaml | 31 + .../compute/yamls/druid-cluster.yaml | 31 + .../guides/druid/autoscaler/storage/_index.md | 10 + docs/guides/druid/autoscaler/storage/guide.md | 896 ++++++++++ .../storage/images/storage-autoscaling.png | Bin 0 -> 66996 bytes .../druid/autoscaler/storage/overview.md | 55 + .../storage/yamls/deep-storage-config.yaml | 16 + .../storage/yamls/druid-cluster.yaml | 40 + .../yamls/druid-storage-autoscaler.yaml | 19 + docs/guides/druid/backup/_index.md | 2 +- .../druid/backup/application-level/index.md | 3 +- docs/guides/druid/backup/auto-backup/index.md | 2 +- .../backup/cross-ns-dependencies/index.md | 2 +- docs/guides/druid/backup/logical/index.md | 2 +- docs/guides/druid/backup/overview/index.md | 2 +- docs/guides/druid/clustering/_index.md | 10 + docs/guides/druid/clustering/guide/index.md | 925 ++++++++++ .../guide/yamls/deep-storage-config.yaml | 16 + .../clustering/guide/yamls/druid-cluster.yaml | 15 + .../overview/images/druid-architecture.svg | 19 + .../guides/druid/clustering/overview/index.md | 115 ++ docs/guides/druid/concepts/_index.md | 2 +- docs/guides/druid/concepts/appbinding.md | 277 +-- docs/guides/druid/concepts/catalog.md | 111 -- docs/guides/druid/concepts/druid.md | 679 +++++--- docs/guides/druid/concepts/druidautoscaler.md | 132 ++ docs/guides/druid/concepts/druidopsrequest.md | 473 +++++ docs/guides/druid/concepts/druidversion.md | 102 ++ docs/guides/druid/configuration/_index.md | 10 + .../config-file/images/druid-updated-ui.png | Bin 0 -> 48477 bytes .../druid/configuration/config-file/index.md | 284 +++ .../config-file/yamls/config-secret.yaml | 10 + .../yamls/deep-storage-config.yaml | 16 + .../config-file/yamls/druid-with-config.yaml | 17 + .../configuration/podtemplating/index.md | 618 +++++++ .../yamls/deep-storage-config.yaml | 16 + .../podtemplating/yamls/druid-cluster.yaml | 43 + .../yamls/druid-node-selector.yaml | 20 + .../yamls/druid-with-tolerations.yaml | 58 + .../yamls/druid-without-tolerations.yaml | 15 + docs/guides/druid/monitoring/_index.md | 10 + .../monitoring/images/druid-monitoring.png | Bin 0 -> 68080 bytes .../monitoring/images/druid-prometheus.png | Bin 0 -> 209966 bytes docs/guides/druid/monitoring/overview.md | 139 ++ .../monitoring/using-builtin-prometheus.md | 372 ++++ .../monitoring/using-prometheus-operator.md | 343 ++++ .../monitoring/yamls/deep-storage-config.yaml | 16 + .../yamls/druid-monitoring-builtin.yaml | 24 + .../yamls/druid-with-monitoring.yaml | 23 + docs/guides/druid/quickstart/_index.md | 2 +- .../quickstart/{overview => guide}/index.md | 12 +- docs/guides/druid/reconfigure-tls/_index.md | 10 + docs/guides/druid/reconfigure-tls/guide.md | 1539 +++++++++++++++++ .../druid/reconfigure-tls/images/druid-ui.png | Bin 0 -> 46148 bytes .../reconfigure-tls/images/druid-with-tls.png | Bin 0 -> 99499 bytes .../images/druid-without-tls.png | Bin 0 -> 114409 bytes .../images/reconfigure-tls.png | Bin 0 -> 37055 bytes docs/guides/druid/reconfigure-tls/overview.md | 54 + .../yamls/deep-storage-config.yaml | 16 + .../reconfigure-tls/yamls/drops-add-tls.yaml | 23 + .../reconfigure-tls/yamls/drops-remove.yaml | 11 + .../reconfigure-tls/yamls/drops-rotate.yaml | 11 + .../yamls/druid-ca-issuer.yaml | 8 + .../reconfigure-tls/yamls/druid-cluster.yaml | 16 + .../yamls/druid-new-issuer.yaml | 8 + .../yamls/druid-update-tls-issuer.yaml | 14 + docs/guides/druid/reconfigure/_index.md | 10 + docs/guides/druid/reconfigure/guide.md | 704 ++++++++ .../druid/reconfigure/images/druid-ui.png | Bin 0 -> 47241 bytes .../druid/reconfigure/images/reconfigure.svg | 120 ++ docs/guides/druid/reconfigure/overview.md | 54 + .../reconfigure/yamls/config-secret.yaml | 10 + .../yamls/deep-storage-config.yaml | 16 + .../reconfigure/yamls/druid-cluster.yaml | 15 + .../yamls/reconfigure-druid-ops.yaml | 12 + docs/guides/druid/restart/_index.md | 10 + docs/guides/druid/restart/guide.md | 283 +++ .../restart/yamls/deep-storage-config.yaml | 16 + .../druid/restart/yamls/druid-cluster.yaml | 16 + docs/guides/druid/restart/yamls/restart.yaml | 11 + docs/guides/druid/scaling/_index.md | 10 + .../scaling/horizontal-scaling/_index.md | 10 + .../druid/scaling/horizontal-scaling/guide.md | 603 +++++++ .../images/dr-horizontal-scaling.png | Bin 0 -> 68725 bytes .../images/druid-ui-scaled-up.png | Bin 0 -> 52430 bytes .../horizontal-scaling/images/druid-ui.png | Bin 0 -> 46148 bytes .../scaling/horizontal-scaling/overview.md | 54 + .../yamls/deep-storage-config.yaml | 16 + .../yamls/druid-cluster.yaml | 16 + .../yamls/druid-hscale-down.yaml | 13 + .../yamls/druid-hscale-up.yaml | 13 + .../druid/scaling/vertical-scaling/_index.md | 10 + .../druid/scaling/vertical-scaling/guide.md | 454 +++++ .../images/dr-vertical-scaling.png | Bin 0 -> 73609 bytes .../scaling/vertical-scaling/overview.md | 54 + .../yamls/deep-storage-config.yaml | 16 + .../vertical-scaling/yamls/druid-cluster.yaml | 15 + .../vertical-scaling/yamls/druid-vscale.yaml | 28 + docs/guides/druid/tls/_index.md | 10 + docs/guides/druid/tls/guide.md | 307 ++++ docs/guides/druid/tls/images/druid-ui.png | Bin 0 -> 99499 bytes docs/guides/druid/tls/images/tls.png | Bin 0 -> 41254 bytes docs/guides/druid/tls/overview.md | 70 + .../druid/tls/yamls/deep-storage-config.yaml | 16 + .../druid/tls/yamls/druid-ca-issuer.yaml | 8 + .../druid/tls/yamls/druid-cluster-tls.yaml | 21 + docs/guides/druid/update-version/_index.md | 10 + docs/guides/druid/update-version/guide.md | 448 +++++ .../images/dr-update-version.png | Bin 0 -> 73376 bytes .../update-version/images/druid-ui-28.png | Bin 0 -> 46732 bytes .../update-version/images/druid-ui-30.png | Bin 0 -> 48517 bytes docs/guides/druid/update-version/overview.md | 53 + .../yamls/deep-storage-config.yaml | 16 + .../update-version/yamls/druid-cluster.yaml | 15 + .../yamls/update-version-ops.yaml | 13 + docs/guides/druid/volume-expansion/_index.md | 10 + docs/guides/druid/volume-expansion/guide.md | 498 ++++++ .../images/druid-volume-expansion.png | Bin 0 -> 76116 bytes .../guides/druid/volume-expansion/overview.md | 56 + .../yamls/deep-storage-config.yaml | 16 + .../volume-expansion/yamls/druid-cluster.yaml | 34 + .../yamls/volume-expansion-ops.yaml | 13 + 130 files changed, 12370 insertions(+), 595 deletions(-) create mode 100644 docs/guides/druid/autoscaler/_index.md create mode 100644 docs/guides/druid/autoscaler/compute/_index.md create mode 100644 docs/guides/druid/autoscaler/compute/guide.md create mode 100644 docs/guides/druid/autoscaler/compute/images/compute-autoscaling.png create mode 100644 docs/guides/druid/autoscaler/compute/overview.md create mode 100644 docs/guides/druid/autoscaler/compute/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/autoscaler/compute/yamls/druid-autoscaler.yaml create mode 100644 docs/guides/druid/autoscaler/compute/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/autoscaler/storage/_index.md create mode 100644 docs/guides/druid/autoscaler/storage/guide.md create mode 100644 docs/guides/druid/autoscaler/storage/images/storage-autoscaling.png create mode 100644 docs/guides/druid/autoscaler/storage/overview.md create mode 100644 docs/guides/druid/autoscaler/storage/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/autoscaler/storage/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/autoscaler/storage/yamls/druid-storage-autoscaler.yaml create mode 100644 docs/guides/druid/clustering/_index.md create mode 100644 docs/guides/druid/clustering/guide/index.md create mode 100644 docs/guides/druid/clustering/guide/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/clustering/guide/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/clustering/overview/images/druid-architecture.svg create mode 100644 docs/guides/druid/clustering/overview/index.md delete mode 100644 docs/guides/druid/concepts/catalog.md create mode 100644 docs/guides/druid/concepts/druidautoscaler.md create mode 100644 docs/guides/druid/concepts/druidopsrequest.md create mode 100644 docs/guides/druid/concepts/druidversion.md create mode 100644 docs/guides/druid/configuration/_index.md create mode 100644 docs/guides/druid/configuration/config-file/images/druid-updated-ui.png create mode 100644 docs/guides/druid/configuration/config-file/index.md create mode 100644 docs/guides/druid/configuration/config-file/yamls/config-secret.yaml create mode 100644 docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml create mode 100644 docs/guides/druid/configuration/podtemplating/index.md create mode 100644 docs/guides/druid/configuration/podtemplating/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/configuration/podtemplating/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/configuration/podtemplating/yamls/druid-node-selector.yaml create mode 100644 docs/guides/druid/configuration/podtemplating/yamls/druid-with-tolerations.yaml create mode 100644 docs/guides/druid/configuration/podtemplating/yamls/druid-without-tolerations.yaml create mode 100755 docs/guides/druid/monitoring/_index.md create mode 100644 docs/guides/druid/monitoring/images/druid-monitoring.png create mode 100644 docs/guides/druid/monitoring/images/druid-prometheus.png create mode 100644 docs/guides/druid/monitoring/overview.md create mode 100644 docs/guides/druid/monitoring/using-builtin-prometheus.md create mode 100644 docs/guides/druid/monitoring/using-prometheus-operator.md create mode 100644 docs/guides/druid/monitoring/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/monitoring/yamls/druid-monitoring-builtin.yaml create mode 100644 docs/guides/druid/monitoring/yamls/druid-with-monitoring.yaml rename docs/guides/druid/quickstart/{overview => guide}/index.md (97%) create mode 100644 docs/guides/druid/reconfigure-tls/_index.md create mode 100644 docs/guides/druid/reconfigure-tls/guide.md create mode 100644 docs/guides/druid/reconfigure-tls/images/druid-ui.png create mode 100644 docs/guides/druid/reconfigure-tls/images/druid-with-tls.png create mode 100644 docs/guides/druid/reconfigure-tls/images/druid-without-tls.png create mode 100644 docs/guides/druid/reconfigure-tls/images/reconfigure-tls.png create mode 100644 docs/guides/druid/reconfigure-tls/overview.md create mode 100644 docs/guides/druid/reconfigure-tls/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/drops-add-tls.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/drops-remove.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/drops-rotate.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/druid-ca-issuer.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/druid-new-issuer.yaml create mode 100644 docs/guides/druid/reconfigure-tls/yamls/druid-update-tls-issuer.yaml create mode 100644 docs/guides/druid/reconfigure/_index.md create mode 100644 docs/guides/druid/reconfigure/guide.md create mode 100644 docs/guides/druid/reconfigure/images/druid-ui.png create mode 100644 docs/guides/druid/reconfigure/images/reconfigure.svg create mode 100644 docs/guides/druid/reconfigure/overview.md create mode 100644 docs/guides/druid/reconfigure/yamls/config-secret.yaml create mode 100644 docs/guides/druid/reconfigure/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/reconfigure/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/reconfigure/yamls/reconfigure-druid-ops.yaml create mode 100644 docs/guides/druid/restart/_index.md create mode 100644 docs/guides/druid/restart/guide.md create mode 100644 docs/guides/druid/restart/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/restart/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/restart/yamls/restart.yaml create mode 100644 docs/guides/druid/scaling/_index.md create mode 100644 docs/guides/druid/scaling/horizontal-scaling/_index.md create mode 100644 docs/guides/druid/scaling/horizontal-scaling/guide.md create mode 100644 docs/guides/druid/scaling/horizontal-scaling/images/dr-horizontal-scaling.png create mode 100644 docs/guides/druid/scaling/horizontal-scaling/images/druid-ui-scaled-up.png create mode 100644 docs/guides/druid/scaling/horizontal-scaling/images/druid-ui.png create mode 100644 docs/guides/druid/scaling/horizontal-scaling/overview.md create mode 100644 docs/guides/druid/scaling/horizontal-scaling/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/scaling/horizontal-scaling/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-down.yaml create mode 100644 docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-up.yaml create mode 100644 docs/guides/druid/scaling/vertical-scaling/_index.md create mode 100644 docs/guides/druid/scaling/vertical-scaling/guide.md create mode 100644 docs/guides/druid/scaling/vertical-scaling/images/dr-vertical-scaling.png create mode 100644 docs/guides/druid/scaling/vertical-scaling/overview.md create mode 100644 docs/guides/druid/scaling/vertical-scaling/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/scaling/vertical-scaling/yamls/druid-vscale.yaml create mode 100755 docs/guides/druid/tls/_index.md create mode 100644 docs/guides/druid/tls/guide.md create mode 100644 docs/guides/druid/tls/images/druid-ui.png create mode 100644 docs/guides/druid/tls/images/tls.png create mode 100644 docs/guides/druid/tls/overview.md create mode 100644 docs/guides/druid/tls/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/tls/yamls/druid-ca-issuer.yaml create mode 100644 docs/guides/druid/tls/yamls/druid-cluster-tls.yaml create mode 100644 docs/guides/druid/update-version/_index.md create mode 100644 docs/guides/druid/update-version/guide.md create mode 100644 docs/guides/druid/update-version/images/dr-update-version.png create mode 100644 docs/guides/druid/update-version/images/druid-ui-28.png create mode 100644 docs/guides/druid/update-version/images/druid-ui-30.png create mode 100644 docs/guides/druid/update-version/overview.md create mode 100644 docs/guides/druid/update-version/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/update-version/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/update-version/yamls/update-version-ops.yaml create mode 100644 docs/guides/druid/volume-expansion/_index.md create mode 100644 docs/guides/druid/volume-expansion/guide.md create mode 100644 docs/guides/druid/volume-expansion/images/druid-volume-expansion.png create mode 100644 docs/guides/druid/volume-expansion/overview.md create mode 100644 docs/guides/druid/volume-expansion/yamls/deep-storage-config.yaml create mode 100644 docs/guides/druid/volume-expansion/yamls/druid-cluster.yaml create mode 100644 docs/guides/druid/volume-expansion/yamls/volume-expansion-ops.yaml diff --git a/docs/guides/README.md b/docs/guides/README.md index e7f0486867..065bc32b01 100644 --- a/docs/guides/README.md +++ b/docs/guides/README.md @@ -16,7 +16,7 @@ aliases: # Guides Guides to show you how to perform tasks with KubeDB: -- [Druid](/docs/guides/kafka/README.md). Shows how to manage Druid using KubeDB. +- [Druid](/docs/guides/druid/README.md). Shows how to manage Druid using KubeDB. - [Elasticsearch](/docs/guides/elasticsearch/README.md). Shows how to manage Elasticsearch & OpenSearch using KubeDB. - [Kafka](/docs/guides/kafka/README.md). Shows how to manage Kafka using KubeDB. - [FerretDB](/docs/guides/ferretdb/README.md). Shows how to manage FerretDB using KubeDB. diff --git a/docs/guides/druid/README.md b/docs/guides/druid/README.md index 3117d47cb3..e1f9c98d61 100644 --- a/docs/guides/druid/README.md +++ b/docs/guides/druid/README.md @@ -15,23 +15,35 @@ aliases: > New to KubeDB? Please start [here](/docs/README.md). +## Overview + +Apache Druid is a real-time analytics database designed for fast slice-and-dice analytics ("OLAP" queries) on large data sets. Druid is most often used as a database for powering use cases where real-time ingest, fast query performance, and high uptime are important. As such, Druid is commonly used for powering GUIs of analytical applications, or as a backend for highly-concurrent APIs that need fast aggregations. Druid works best with event-oriented data. + ## Supported Druid Features -| Features | Availability | -|----------------------------------------------------------------------------|:------------:| -| Clustering | ✓ | -| Druid Dependency Management (MySQL, PostgreSQL and ZooKeeper) | ✓ | -| Authentication & Authorization | ✓ | -| Custom Configuration | ✓ | -| Backup/Recovery: Instant, Scheduled ( [KubeStash](https://kubestash.com/)) | ✓ | -| Monitoring with Prometheus & Grafana | ✓ | -| Builtin Prometheus Discovery | ✓ | -| Using Prometheus operator | ✓ | -| Externally manageable Auth Secret | ✓ | -| Reconfigurable Health Checker | ✓ | -| Persistent volume | ✓ | -| Dashboard ( Druid Web Console ) | ✓ | +| Features | Availability | +|------------------------------------------------------------------------------------|:-----:| +| Clustering | ✓ | +| Druid Dependency Management (MySQL, PostgreSQL and ZooKeeper) | ✓ | +| Authentication & Authorization | ✓ | +| Custom Configuration | ✓ | +| Backup/Recovery: Instant, Scheduled ( [KubeStash](https://kubestash.com/)) | ✓ | +| Monitoring with Prometheus & Grafana | ✓ | +| Builtin Prometheus Discovery | ✓ | +| Using Prometheus operator | ✓ | +| Externally manageable Auth Secret | ✓ | +| Reconfigurable Health Checker | ✓ | +| Persistent volume | ✓ | +| Dashboard ( Druid Web Console ) | ✓ | +| Automated Version Update | ✓ | +| Automatic Vertical Scaling | ✓ | +| Automated Horizontal Scaling | ✓ | +| Automated db-configure Reconfiguration | ✓ | +| TLS: Add, Remove, Update, Rotate ( [Cert Manager](https://cert-manager.io/docs/) ) | ✓ | +| Automated Reprovision | ✓ | +| Automated Volume Expansion | ✓ | +| Autoscaling (vertically) | ✓ | ## Supported Druid Versions @@ -39,7 +51,7 @@ KubeDB supports The following Druid versions. - `28.0.1` - `30.0.1` -> The listed DruidVersions are tested and provided as a part of the installation process (ie. catalog chart), but you are open to create your own [DruidVersion](/docs/guides/druid/concepts/catalog.md) object with your custom Druid image. +> The listed DruidVersions are tested and provided as a part of the installation process (ie. catalog chart), but you are open to create your own [DruidVersion](/docs/guides/druid/concepts/druidversion.md) object with your custom Druid image. ## Lifecycle of Druid Object @@ -52,14 +64,12 @@ ref : https://cacoo.com/diagrams/bbB63L6KRIbPLl95/9A5B0

    ## User Guide -- [Quickstart Druid](/docs/guides/druid/quickstart/overview/index.md) with KubeDB Operator. - -[//]: # (- Druid Clustering supported by KubeDB) - -[//]: # ( - [Topology Clustering](/docs/guides/druid/clustering/topology-cluster/index.md)) - -[//]: # (- Use [kubedb cli](/docs/guides/druid/cli/cli.md) to manage databases like kubectl for Kubernetes.) - +- [Quickstart Druid](/docs/guides/druid/quickstart/guide/index.md) with KubeDB Operator. +- [Druid Clustering](/docs/guides/druid/clustering/overview/index.md) with KubeDB Operator. +- [Backup & Restore](/docs/guides/druid/backup/overview/index.md) Druid databases using KubeStash. +- Start [Druid with Custom Config](/docs/guides/druid/configuration/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). +- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md). - Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). - -[//]: # (- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md).) \ No newline at end of file +- Detail concepts of [DruidVersion object](/docs/guides/druid/concepts/druidversion.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/druid/autoscaler/_index.md b/docs/guides/druid/autoscaler/_index.md new file mode 100644 index 0000000000..a39f2bfba3 --- /dev/null +++ b/docs/guides/druid/autoscaler/_index.md @@ -0,0 +1,10 @@ +--- +title: Autoscaling +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler + name: Autoscaling + parent: guides-druid + weight: 100 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/autoscaler/compute/_index.md b/docs/guides/druid/autoscaler/compute/_index.md new file mode 100644 index 0000000000..c2c1eea280 --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/_index.md @@ -0,0 +1,10 @@ +--- +title: Compute Autoscaling +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-compute + name: Compute Autoscaling + parent: guides-druid-autoscaler + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/autoscaler/compute/guide.md b/docs/guides/druid/autoscaler/compute/guide.md new file mode 100644 index 0000000000..b0810f67b2 --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/guide.md @@ -0,0 +1,864 @@ +--- +title: Druid Topology Autoscaling +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-compute-guide + name: Druid Compute Autoscaling + parent: guides-druid-autoscaler-compute + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Autoscaling the Compute Resource of a Druid Topology Cluster + +This guide will show you how to use `KubeDB` to autoscale compute resources i.e. cpu and memory of a Druid topology 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) + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidAutoscaler](/docs/guides/druid/concepts/druidautoscaler.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Compute Resource Autoscaling Overview](/docs/guides/druid/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/druid](/docs/examples/druid) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Autoscaling of Topology Cluster + +Here, we are going to deploy a `Druid` Topology Cluster using a supported version by `KubeDB` operator. Then we are going to apply `DruidAutoscaler` to set up autoscaling. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/compute/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Now, we are going to deploy a `Druid` combined cluster with version `28.0.1`. + +### Deploy Druid Cluster + +In this section, we are going to deploy a Druid Topology cluster with version `28.0.1`. Then, in the next section we will set up autoscaling for this database using `DruidAutoscaler` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: WipeOut +``` + +Let's create the `Druid` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/compute/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get kf -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 24s +. +. +druid-cluster kubedb.com/v1alpha2 28.0.1 Ready 118s +``` + +## Druid Topology Autoscaler + +Let's check the Druid resources for coordinators and historicals, + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.coordinators.podTemplate.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} + +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.historicals.podTemplate.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} +``` + +Let's check the coordinators and historicals Pod containers resources, + +```bash +$ kubectl get pod -n demo druid-cluster-coordinators-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} + +$ kubectl get pod -n demo druid-cluster-historicals-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} +``` + +You can see from the above outputs that the resources for coordinators and historicals are same as the one we have assigned while deploying the druid. + +We are now ready to apply the `DruidAutoscaler` CRO to set up autoscaling for these coordinators and historicals nodes. + +### Compute Resource Autoscaling + +Here, we are going to set up compute resource autoscaling using a DruidAutoscaler Object. + +#### Create DruidAutoscaler Object + +In order to set up compute resource autoscaling for this topology cluster, we have to create a `DruidAutoscaler` CRO with our desired configuration. Below is the YAML of the `DruidAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: DruidAutoscaler +metadata: + name: druid-autoscaler + namespace: demo +spec: + databaseRef: + name: druid-quickstart + compute: + coordinators: + trigger: "On" + podLifeTimeThreshold: 1m + minAllowed: + cpu: 600m + memory: 2Gi + maxAllowed: + cpu: 1000m + memory: 5Gi + resourceDiffPercentage: 20 + controlledResources: ["cpu", "memory"] + historicals: + trigger: "On" + podLifeTimeThreshold: 1m + minAllowed: + cpu: 600m + memory: 2Gi + maxAllowed: + cpu: 1000m + memory: 5Gi + resourceDiffPercentage: 20 + controlledResources: [ "cpu", "memory"] +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing compute resource scaling operation on `druid-cluster` cluster. +- `spec.compute.coordinators.trigger` specifies that compute autoscaling is enabled for this node. +- `spec.compute.coordinators.podLifeTimeThreshold` specifies the minimum lifetime for at least one of the pod to initiate a vertical scaling. +- `spec.compute.coordinators.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.coordinators.minAllowed` specifies the minimum allowed resources for the cluster. +- `spec.compute.coordinators.maxAllowed` specifies the maximum allowed resources for the cluster. +- `spec.compute.coordinators.controlledResources` specifies the resources that are controlled by the autoscaler. +- `spec.compute.coordinators.containerControlledValues` specifies which resource values should be controlled. The default is "RequestsAndLimits". +- `spec.compute.historicals` can be configured the same way shown above. +- `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". + +> **Note:** You can also configure autoscaling configurations for all other nodes as well. You can apply autoscaler for each node in separate YAML or combinedly in one a YAML as shown above. + +Let's create the `DruidAutoscaler` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/compute/yamls/druid-autoscaler.yaml +druidautoscaler.autoscaling.kubedb.com/druid-autoscaler created +``` + +#### Verify Autoscaling is set up successfully + +Let's check that the `druidautoscaler` resource is created successfully, + +```bash +$ kubectl describe druidautoscaler druid-autoscaler -n demo + kubectl describe druidautoscaler druid-autoscaler -n demo +Name: druid-autoscaler +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: DruidAutoscaler +Metadata: + Creation Timestamp: 2024-10-24T10:04:22Z + Generation: 1 + Managed Fields: + API Version: autoscaling.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:compute: + .: + f:coordinators: + .: + f:controlledResources: + f:maxAllowed: + .: + f:cpu: + f:memory: + f:minAllowed: + .: + f:cpu: + f:memory: + f:podLifeTimeThreshold: + f:resourceDiffPercentage: + f:trigger: + f:historicals: + .: + f:controlledResources: + f:maxAllowed: + .: + f:cpu: + f:memory: + f:minAllowed: + .: + f:cpu: + f:memory: + f:podLifeTimeThreshold: + f:resourceDiffPercentage: + f:trigger: + f:databaseRef: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-24T10:04:22Z + API Version: autoscaling.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:ownerReferences: + .: + k:{"uid":"c2a5c29d-3589-49d8-bc18-585b9c05bf8d"}: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-24T10:04:22Z + API Version: autoscaling.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:checkpoints: + f:conditions: + f:vpas: + Manager: kubedb-autoscaler + Operation: Update + Subresource: status + Time: 2024-10-24T10:16:20Z + Owner References: + API Version: kubedb.com/v1alpha2 + Block Owner Deletion: true + Controller: true + Kind: Druid + Name: druid-cluster + UID: c2a5c29d-3589-49d8-bc18-585b9c05bf8d + Resource Version: 274969 + UID: 069fbdd7-87ad-4fd7-acc7-9753fa188312 +Spec: + Compute: + Coordinators: + Controlled Resources: + cpu + memory + Max Allowed: + Cpu: 1000m + Memory: 5Gi + Min Allowed: + Cpu: 600m + Memory: 2Gi + Pod Life Time Threshold: 1m + Resource Diff Percentage: 20 + Trigger: On + Historicals: + Controlled Resources: + cpu + memory + Max Allowed: + Cpu: 1000m + Memory: 5Gi + Min Allowed: + Cpu: 600m + Memory: 2Gi + Pod Life Time Threshold: 1m + Resource Diff Percentage: 20 + Trigger: On + Database Ref: + Name: druid-cluster +Status: + Checkpoints: + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 10000 + Index: 5 + Weight: 490 + Reference Timestamp: 2024-10-24T10:05:00Z + Total Weight: 2.871430450948392 + First Sample Start: 2024-10-24T10:05:07Z + Last Sample Start: 2024-10-24T10:16:03Z + Last Update Time: 2024-10-24T10:16:20Z + Memory Histogram: + Bucket Weights: + Index: 25 + Weight: 3648 + Index: 29 + Weight: 10000 + Reference Timestamp: 2024-10-24T10:10:00Z + Total Weight: 3.3099198846728424 + Ref: + Container Name: druid + Vpa Object Name: druid-cluster-historicals + Total Samples Count: 12 + Version: v3 + Cpu Histogram: + Bucket Weights: + Index: 0 + Weight: 3040 + Index: 1 + Weight: 10000 + Index: 2 + Weight: 3278 + Index: 14 + Weight: 1299 + Reference Timestamp: 2024-10-24T10:10:00Z + Total Weight: 1.0092715955023177 + First Sample Start: 2024-10-24T10:04:53Z + Last Sample Start: 2024-10-24T10:14:03Z + Last Update Time: 2024-10-24T10:14:20Z + Memory Histogram: + Bucket Weights: + Index: 24 + Weight: 10000 + Index: 27 + Weight: 8706 + Reference Timestamp: 2024-10-24T10:10:00Z + Total Weight: 3.204567438391289 + Ref: + Container Name: druid + Vpa Object Name: druid-cluster-coordinators + Total Samples Count: 10 + Version: v3 + Conditions: + Last Transition Time: 2024-10-24T10:07:19Z + Message: Successfully created druidOpsRequest demo/drops-druid-cluster-coordinators-g02xtu + Observed Generation: 1 + Reason: CreateOpsRequest + Status: True + Type: CreateOpsRequest + Vpas: + Conditions: + Last Transition Time: 2024-10-24T10:05:19Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: druid + Lower Bound: + Cpu: 600m + Memory: 2Gi + Target: + Cpu: 600m + Memory: 2Gi + Uncapped Target: + Cpu: 100m + Memory: 764046746 + Upper Bound: + Cpu: 1 + Memory: 5Gi + Vpa Name: druid-cluster-historicals + Conditions: + Last Transition Time: 2024-10-24T10:06:19Z + Status: True + Type: RecommendationProvided + Recommendation: + Container Recommendations: + Container Name: druid + Lower Bound: + Cpu: 600m + Memory: 2Gi + Target: + Cpu: 600m + Memory: 2Gi + Uncapped Target: + Cpu: 100m + Memory: 671629701 + Upper Bound: + Cpu: 1 + Memory: 5Gi + Vpa Name: druid-cluster-coordinators +Events: +``` +So, the `druidautoscaler` 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 `druidopsrequest` based on the recommendations, if the database pods resources are needed to scaled up or down. + +Let's watch the `druidopsrequest` in the demo namespace to see if any `druidopsrequest` object is created. After some time you'll see that a `druidopsrequest` will be created based on the recommendation. + +```bash +$ watch kubectl get druidopsrequest -n demo +Every 2.0s: kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +drops-druid-cluster-coordinators-g02xtu VerticalScaling Progressing 8m +drops-druid-cluster-historicals-g3oqje VerticalScaling Progressing 8m + +``` +Progressing +Let's wait for the ops request to become successful. + +```bash +$ kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +drops-druid-cluster-coordinators-g02xtu VerticalScaling Successful 12m +drops-druid-cluster-historicals-g3oqje VerticalScaling Successful 13m +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to scale the cluster. + +```bash +$ kubectl describe druidopsrequests -n demo drops-druid-cluster-coordinators-f6qbth +Name: drops-druid-cluster-coordinators-g02xtu +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T10:07:19Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: + f:app.kubernetes.io/component: + f:app.kubernetes.io/instance: + f:app.kubernetes.io/managed-by: + f:app.kubernetes.io/name: + f:ownerReferences: + .: + k:{"uid":"069fbdd7-87ad-4fd7-acc7-9753fa188312"}: + f:spec: + .: + f:apply: + f:databaseRef: + f:type: + f:verticalScaling: + .: + f:coordinators: + .: + f:resources: + .: + f:limits: + .: + f:memory: + f:requests: + .: + f:cpu: + f:memory: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-24T10:07:19Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-24T10:07:43Z + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: DruidAutoscaler + Name: druid-autoscaler + UID: 069fbdd7-87ad-4fd7-acc7-9753fa188312 + Resource Version: 273990 + UID: d14d964b-f4ae-4570-a296-38e91c802473 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Type: VerticalScaling + Vertical Scaling: + Coordinators: + Resources: + Limits: + Memory: 2Gi + Requests: + Cpu: 600m + Memory: 2Gi +Status: + Conditions: + Last Transition Time: 2024-10-24T10:07:19Z + Message: Druid ops-request has started to vertically scale the Druid nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-24T10:07:28Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T10:07:43Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-24T10:07:33Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-24T10:07:33Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-24T10:07:38Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-24T10:07:43Z + Message: Successfully completed the vertical scaling for RabbitMQ + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 12m KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-druid-cluster-coordinators-g02xtu + Normal Starting 12m KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 12m KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-coordinators-g02xtu + Normal UpdatePetSets 12m KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 12m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 12m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 12m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartPods 12m KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting 12m KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 12m KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-coordinators-g02xtu +``` + +Let's describe the other `DruidOpsRequest` created for scaling of historicals. + +```bash +$ kubectl describe druidopsrequests -n demo drops-druid-cluster-historicals-g3oqje +Name: drops-druid-cluster-historicals-g3oqje +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-24T10:06:19Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: + f:app.kubernetes.io/component: + f:app.kubernetes.io/instance: + f:app.kubernetes.io/managed-by: + f:app.kubernetes.io/name: + f:ownerReferences: + .: + k:{"uid":"069fbdd7-87ad-4fd7-acc7-9753fa188312"}: + f:spec: + .: + f:apply: + f:databaseRef: + f:type: + f:verticalScaling: + .: + f:historicals: + .: + f:resources: + .: + f:limits: + .: + f:memory: + f:requests: + .: + f:cpu: + f:memory: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-24T10:06:19Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-24T10:06:37Z + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: DruidAutoscaler + Name: druid-autoscaler + UID: 069fbdd7-87ad-4fd7-acc7-9753fa188312 + Resource Version: 273770 + UID: fc13624c-42d4-4b03-9448-80f451b1a888 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Type: VerticalScaling + Vertical Scaling: + Historicals: + Resources: + Limits: + Memory: 2Gi + Requests: + Cpu: 600m + Memory: 2Gi +Status: + Conditions: + Last Transition Time: 2024-10-24T10:06:19Z + Message: Druid ops-request has started to vertically scale the Druid nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-24T10:06:22Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-24T10:06:37Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-24T10:06:27Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-24T10:06:27Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-24T10:06:32Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-24T10:06:37Z + Message: Successfully completed the vertical scaling for RabbitMQ + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 16m KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-druid-cluster-historicals-g3oqje + Normal Starting 16m KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 16m KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-historicals-g3oqje + Normal UpdatePetSets 16m KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 16m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 16m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 16m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Normal RestartPods 16m KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting 16m KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 16m KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-historicals-g3oqje + +``` + +Now, we are going to verify from the Pod, and the Druid yaml whether the resources of the coordinators and historicals node has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo druid-cluster-coordinators-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "1536Mi" + }, + "requests": { + "cpu": "600m", + "memory": "1536Mi" + } +} + +$ kubectl get pod -n demo druid-cluster-historicals-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "2Gi" + }, + "requests": { + "cpu": "600m", + "memory": "2Gi" + } +} + +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.coordinators.podTemplate.spec.containers[].resources' +{ + "limits": { + "memory": "1536Mi" + }, + "requests": { + "cpu": "600m", + "memory": "1536Mi" + } +} + +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.historicals.podTemplate.spec.containers[].resources' +{ + "limits": { + "memory": "2Gi" + }, + "requests": { + "cpu": "600m", + "memory": "2Gi" + } +} +``` + +The above output verifies that we have successfully auto scaled the resources of the Druid topology cluster for coordinators and historicals. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete druidopsrequest -n demo drops-druid-cluster-coordinators-g02xtu drops-druid-cluster-historicals-g3oqje +kubectl delete druidautoscaler -n demo druid-autoscaler +kubectl delete dr -n demo druid-cluster +kubectl delete ns demo +``` +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/autoscaler/compute/images/compute-autoscaling.png b/docs/guides/druid/autoscaler/compute/images/compute-autoscaling.png new file mode 100644 index 0000000000000000000000000000000000000000..9406e2b2e99121bf6a2e8b13c83b248fae3ebd80 GIT binary patch literal 65595 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
    BobY%gu*Nn9W(%x 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/autoscaler/compute/overview.md b/docs/guides/druid/autoscaler/compute/overview.md new file mode 100644 index 0000000000..457bbfe62c --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/overview.md @@ -0,0 +1,55 @@ +--- +title: Druid Compute Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-compute-overview + name: Overview + parent: guides-druid-autoscaler-compute + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid 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 `druidautoscaler` crd. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidAutoscaler](/docs/guides/druid/concepts/druidautoscaler.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How Compute Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `Druid` database components. Open the image in a new tab to see the enlarged version. + +
    +  Volume Expansion process of Druid +
    Fig: Compute Auto Scaling process of Druid
    +
    + +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource Object (CRO). + +2. `KubeDB` Provisioner operator watches the `Druid` CRO. + +3. When the operator finds a `Druid` 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. Coordinators, Overlords, Historicals, MiddleManagers, Brokers, Routers) of the `Druid` cluster the user creates a `DruidAutoscaler` CRO with desired configuration. + +5. `KubeDB` Autoscaler operator watches the `DruidAutoscaler` 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 `DruidAutoscaler` CRO. + +7. If the generated recommendation doesn't match the current resources of the database, then `KubeDB` Autoscaler operator creates a `DruidOpsRequest` CRO to scale the database to match the recommendation generated. + +8. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CRO. + +9. Then the `KubeDB` Ops-manager operator will scale the database component vertically as specified on the `DruidOpsRequest` CRO. + +In the next docs, we are going to show a step-by-step guide on Autoscaling of various Druid database components using `DruidAutoscaler` CRD. diff --git a/docs/guides/druid/autoscaler/compute/yamls/deep-storage-config.yaml b/docs/guides/druid/autoscaler/compute/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/autoscaler/compute/yamls/druid-autoscaler.yaml b/docs/guides/druid/autoscaler/compute/yamls/druid-autoscaler.yaml new file mode 100644 index 0000000000..ef5d96ec78 --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/yamls/druid-autoscaler.yaml @@ -0,0 +1,31 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: DruidAutoscaler +metadata: + name: druid-storage-autoscaler + namespace: demo +spec: + databaseRef: + name: druid-cluster + compute: + coordinators: + trigger: "On" + podLifeTimeThreshold: 1m + minAllowed: + cpu: 600m + memory: 2Gi + maxAllowed: + cpu: 1000m + memory: 5Gi + resourceDiffPercentage: 20 + controlledResources: ["cpu", "memory"] + historicals: + trigger: "On" + podLifeTimeThreshold: 1m + minAllowed: + cpu: 600m + memory: 2Gi + maxAllowed: + cpu: 1000m + memory: 5Gi + resourceDiffPercentage: 20 + controlledResources: [ "cpu", "memory"] diff --git a/docs/guides/druid/autoscaler/compute/yamls/druid-cluster.yaml b/docs/guides/druid/autoscaler/compute/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..ffac2b300b --- /dev/null +++ b/docs/guides/druid/autoscaler/compute/yamls/druid-cluster.yaml @@ -0,0 +1,31 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + historicals: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + middleManagers: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/autoscaler/storage/_index.md b/docs/guides/druid/autoscaler/storage/_index.md new file mode 100644 index 0000000000..e197ec8429 --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/_index.md @@ -0,0 +1,10 @@ +--- +title: Storage Autoscaling +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-storage + name: Storage Autoscaling + parent: guides-druid-autoscaler + weight: 46 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/autoscaler/storage/guide.md b/docs/guides/druid/autoscaler/storage/guide.md new file mode 100644 index 0000000000..02b3571625 --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/guide.md @@ -0,0 +1,896 @@ +--- +title: Druid Topology Autoscaling +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-storage-guide + name: Druid Storage Autoscaling + parent: guides-druid-autoscaler-storage + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Storage Autoscaling of a Druid Topology Cluster + +This guide will show you how to use `KubeDB` to autoscale the storage of a Druid Topology 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidAutoscaler](/docs/guides/druid/concepts/druidautoscaler.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Storage Autoscaling Overview](/docs/guides/druid/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/druid](/docs/examples/druid) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Storage Autoscaling of Topology 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 +local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 28h +longhorn (default) driver.longhorn.io Delete Immediate true 28h +longhorn-static driver.longhorn.io Delete Immediate true 28h +``` + +We can see from the output the `longhorn` storage class has `ALLOWVOLUMEEXPANSION` field as true. So, this storage class supports volume expansion. We can use it. + +Now, we are going to deploy a `Druid` topology using a supported version by `KubeDB` operator. Then we are going to apply `DruidAutoscaler` to set up autoscaling. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/storage/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +### Deploy Druid Cluster + +In this section, we are going to deploy a Druid topology cluster with monitoring enabled and with version `28.0.1`. Then, in the next section we will set up autoscaling for this cluster using `DruidAutoscaler` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + historicals: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + middleManagers: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + routers: + replicas: 1 + deletionPolicy: Delete + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s +``` + +Let's create the `Druid` CRO we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/storage/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 24s +. +. +druid-cluster kubedb.com/v1alpha2 28.0.1 Ready 2m20s +``` + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" +$ kubectl get petset -n demo druid-cluster-middleManagers -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-2c0ef2aa-0438-4d75-9cb2-c12a176bae6a 1Gi RWO Delete Bound demo/druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 longhorn 95s +pvc-5f4cea5f-e0c8-4339-b67c-9cb8b02ba49d 1Gi RWO Delete Bound demo/druid-cluster-segment-cache-druid-cluster-historicals-0 longhorn 96s +``` + +You can see the petset for both historicals and middleManagers has 1GB storage, and the capacity of all the persistent volume is also 1GB. + +We are now ready to apply the `DruidAutoscaler` CRO to set up storage autoscaling for this cluster(historicals and middleManagers). + +### Storage Autoscaling + +Here, we are going to set up storage autoscaling using a DruidAutoscaler Object. + +#### Create DruidAutoscaler Object + +In order to set up vertical autoscaling for this topology cluster, we have to create a `DruidAutoscaler` CRO with our desired configuration. Below is the YAML of the `DruidAutoscaler` object that we are going to create, + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: DruidAutoscaler +metadata: + name: druid-storage-autoscaler + namespace: demo +spec: + databaseRef: + name: druid-cluster + storage: + historicals: + expansionMode: "Offline" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 100 + middleManagers: + expansionMode: "Offline" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 100 +``` + +Here, + +- `spec.clusterRef.name` specifies that we are performing vertical scaling operation on `druid-cluster` cluster. +- `spec.storage.historicals.trigger/spec.storage.middleManagers.trigger` specifies that storage autoscaling is enabled for historicals and middleManagers of topology cluster. +- `spec.storage.historicals.usageThreshold/spec.storage.middleManagers.usageThreshold` specifies storage usage threshold, if storage usage exceeds `60%` then storage autoscaling will be triggered. +- `spec.storage.historicals.scalingThreshold/spec.storage.historicals.scalingThreshold` specifies the scaling threshold. Storage will be scaled to `100%` of the current amount. +- It has another field `spec.storage.historicals.expansionMode/spec.storage.middleManagers.expansionMode` to set the opsRequest volumeExpansionMode, which support two values: `Online` & `Offline`. Default value is `Online`. + +Let's create the `DruidAutoscaler` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/autoscaler/storage/yamls/druid-storage-autoscaler.yaml +druidautoscaler.autoscaling.kubedb.com/druid-storage-autoscaler created +``` + +#### Storage Autoscaling is set up successfully + +Let's check that the `druidautoscaler` resource is created successfully, + +```bash +$ kubectl get druidautoscaler -n demo +NAME AGE +druid-storage-autoscaler 34s + +$ kubectl describe druidautoscaler -n demo druid-storage-autoscaler +Name: druid-storage-autoscaler +Namespace: demo +Labels: +Annotations: +API Version: autoscaling.kubedb.com/v1alpha1 +Kind: DruidAutoscaler +Metadata: + Creation Timestamp: 2024-10-25T09:52:37Z + Generation: 1 + Managed Fields: + API Version: autoscaling.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:databaseRef: + f:storage: + .: + f:historicals: + .: + f:expansionMode: + f:scalingThreshold: + f:trigger: + f:usageThreshold: + f:middleManagers: + .: + f:expansionMode: + f:scalingThreshold: + f:trigger: + f:usageThreshold: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-25T09:52:37Z + API Version: autoscaling.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:ownerReferences: + .: + k:{"uid":"712730e8-41ef-4700-b184-825b30ecbc8c"}: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-25T09:52:37Z + Owner References: + API Version: kubedb.com/v1alpha2 + Block Owner Deletion: true + Controller: true + Kind: Druid + Name: druid-cluster + UID: 712730e8-41ef-4700-b184-825b30ecbc8c + Resource Version: 226662 + UID: 57cbd906-a9b7-4649-bfe0-304840bb60c1 +Spec: + Database Ref: + Name: druid-cluster + Ops Request Options: + Apply: IfReady + Storage: + Historicals: + Expansion Mode: Offline + Scaling Rules: + Applies Upto: + Threshold: 100pc + Scaling Threshold: 100 + Trigger: On + Usage Threshold: 60 + Middle Managers: + Expansion Mode: Offline + Scaling Rules: + Applies Upto: + Threshold: 100pc + Scaling Threshold: 100 + Trigger: On + Usage Threshold: 60 +Events: +``` +So, the `druidautoscaler` resource is created successfully. + +Now, for this demo, we are going to manually fill up the persistent volume to exceed the `usageThreshold` using `dd` command to see if storage autoscaling is working or not. + +We are autoscaling volume for both historicals and middleManagers. So we need to fill up the persistent volume for both historicals and middleManagers. + +1. Lets exec into the historicals pod and fill the cluster volume using the following commands: + +```bash +$ kubectl exec -it -n demo druid-cluster-historicals-0 -- bash +bash-5.1$ df -h /druid/data/segments +Filesystem Size Used Available Use% Mounted on +/dev/longhorn/pvc-d4ef15ef-b1af-4a1f-ad25-ad9bc990a2fb 973.4M 92.0K 957.3M 0% /druid/data/segment + +bash-5.1$ dd if=/dev/zero of=/druid/data/segments/file.img bs=600M count=1 +1+0 records in +1+0 records out +629145600 bytes (600.0MB) copied, 46.709228 seconds, 12.8MB/s + +bash-5.1$ df -h /druid/data/segments +Filesystem Size Used Available Use% Mounted on +/dev/longhorn/pvc-d4ef15ef-b1af-4a1f-ad25-ad9bc990a2fb 973.4M 600.1M 357.3M 63% /druid/data/segments +``` + +2. Let's exec into the middleManagers pod and fill the cluster volume using the following commands: + +```bash +$ kubectl exec -it -n demo druid-cluster-middleManagers-0 -- bash +druid@druid-cluster-middleManagers-0:~$ df -h /var/druid/task +Filesystem Size Used Available Use% Mounted on +/dev/longhorn/pvc-2c0ef2aa-0438-4d75-9cb2-c12a176bae6a 973.4M 24.0K 957.4M 0% /var/druid/task +druid@druid-cluster-middleManagers-0:~$ dd if=/dev/zero of=/var/druid/task/file.img bs=600M count=1 +1+0 records in +1+0 records out +629145600 bytes (629 MB, 600 MiB) copied, 3.39618 s, 185 MB/s +druid@druid-cluster-middleManagers-0:~$ df -h /var/druid/task +Filesystem Size Used Available Use% Mounted on +/dev/longhorn/pvc-2c0ef2aa-0438-4d75-9cb2-c12a176bae6a 973.4M 600.0M 357.4M 63% /var/druid/task +``` + +So, from the above output we can see that the storage usage is 63% for both nodes, which exceeded the `usageThreshold` 60%. + +There will be two `DruidOpsRequest` created for both historicals and middleManagers to expand the volume of the cluster for both nodes. +Let's watch the `druidopsrequest` in the demo namespace to see if any `druidopsrequest` object is created. After some time you'll see that a `druidopsrequest` of type `VolumeExpansion` will be created based on the `scalingThreshold`. + +```bash +$ watch kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druidopsrequest.ops.kubedb.com/drops-druid-cluster-gq9huj VolumeExpansion Progressing 46s +druidopsrequest.ops.kubedb.com/drops-druid-cluster-kbw4fd VolumeExpansion Successful 4m46s +``` + +Once ops request has succeeded. Let's wait for the other one to become successful. + +```bash +$ kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druidopsrequest.ops.kubedb.com/drops-druid-cluster-gq9huj VolumeExpansion Successful 3m18s +druidopsrequest.ops.kubedb.com/drops-druid-cluster-kbw4fd VolumeExpansion Successful 7m18s +``` + +We can see from the above output that the both `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` one by one we will get an overview of the steps that were followed to expand the volume of the cluster. + +```bash +$ kubectl describe druidopsrequest -n demo drops-druid-cluster-kbw4fd +Name: drops-druid-cluster-kbw4fd +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-25T09:57:14Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: + f:app.kubernetes.io/component: + f:app.kubernetes.io/instance: + f:app.kubernetes.io/managed-by: + f:app.kubernetes.io/name: + f:ownerReferences: + .: + k:{"uid":"57cbd906-a9b7-4649-bfe0-304840bb60c1"}: + f:spec: + .: + f:apply: + f:databaseRef: + f:type: + f:volumeExpansion: + .: + f:historicals: + f:mode: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-25T09:57:14Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-25T10:00:20Z + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: DruidAutoscaler + Name: druid-storage-autoscaler + UID: 57cbd906-a9b7-4649-bfe0-304840bb60c1 + Resource Version: 228016 + UID: 1fa750bb-2db3-4684-a7cf-1b3047bc07af +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Type: VolumeExpansion + Volume Expansion: + Historicals: 2041405440 + Mode: Offline +Status: + Conditions: + Last Transition Time: 2024-10-25T09:57:14Z + Message: Druid ops-request has started to expand volume of druid nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-10-25T09:57:22Z + Message: get pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetSet + Last Transition Time: 2024-10-25T09:57:22Z + Message: is pet set deleted; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPetSetDeleted + Last Transition Time: 2024-10-25T09:57:32Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-10-25T09:57:37Z + Message: get pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPod + Last Transition Time: 2024-10-25T09:57:37Z + Message: is ops req patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsOpsReqPatched + Last Transition Time: 2024-10-25T09:57:37Z + Message: create pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CreatePod + Last Transition Time: 2024-10-25T09:57:42Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-10-25T09:57:42Z + Message: is pvc patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPvcPatched + Last Transition Time: 2024-10-25T09:59:27Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-10-25T09:59:27Z + Message: create; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: Create + Last Transition Time: 2024-10-25T09:59:35Z + Message: is druid running; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: IsDruidRunning + Last Transition Time: 2024-10-25T09:59:57Z + Message: successfully updated historicals node PVC sizes + Observed Generation: 1 + Reason: UpdateHistoricalsNodePVCs + Status: True + Type: UpdateHistoricalsNodePVCs + Last Transition Time: 2024-10-25T10:00:15Z + Message: successfully reconciled the Druid resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-25T10:00:20Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-10-25T10:00:20Z + Message: Successfully completed volumeExpansion for Druid + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 8m29s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-druid-cluster-kbw4fd + Normal Starting 8m29s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 8m29s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-kbw4fd + Warning get pet set; ConditionStatus:True 8m21s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning is pet set deleted; ConditionStatus:True 8m21s KubeDB Ops-manager Operator is pet set deleted; ConditionStatus:True + Warning get pet set; ConditionStatus:True 8m16s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal OrphanPetSetPods 8m11s KubeDB Ops-manager Operator successfully deleted the petSets with orphan propagation policy + Warning get pod; ConditionStatus:True 8m6s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 8m6s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning create pod; ConditionStatus:True 8m6s KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m1s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m1s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 8m1s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning compare storage; ConditionStatus:False 8m1s KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 7m56s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m56s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m51s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m51s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m46s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m46s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m41s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m41s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m36s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m36s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m31s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m31s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m26s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m26s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m21s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m21s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m16s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m16s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m11s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m11s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m6s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m6s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 7m1s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 7m1s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m56s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m56s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m51s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m51s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m46s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m46s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m41s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m41s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m36s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m36s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m31s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m31s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m26s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m26s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m21s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m21s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m16s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 6m16s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 6m16s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create; ConditionStatus:True 6m16s KubeDB Ops-manager Operator create; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 6m16s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m11s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is druid running; ConditionStatus:False 6m8s KubeDB Ops-manager Operator is druid running; ConditionStatus:False + Warning get pod; ConditionStatus:True 6m6s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 6m1s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 5m56s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 5m51s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateHistoricalsNodePVCs 5m46s KubeDB Ops-manager Operator successfully updated historicals node PVC sizes + Normal UpdatePetSets 5m28s KubeDB Ops-manager Operator successfully reconciled the Druid resources + Warning get pet set; ConditionStatus:True 5m23s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal ReadyPetSets 5m23s KubeDB Ops-manager Operator PetSet is recreated + Normal Starting 5m23s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 5m23s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-kbw4fd + Normal UpdatePetSets 5m18s KubeDB Ops-manager Operator successfully reconciled the Druid resources + Normal UpdatePetSets 5m8s KubeDB Ops-manager Operator successfully reconciled the Druid resources + Normal UpdatePetSets 4m57s KubeDB Ops-manager Operator successfully reconciled the Druid resources +``` + +```bash +$ kubectl describe druidopsrequest -n demo drops-druid-cluster-gq9huj +Name: drops-druid-cluster-gq9huj +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-cluster + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-25T10:01:14Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: + f:app.kubernetes.io/component: + f:app.kubernetes.io/instance: + f:app.kubernetes.io/managed-by: + f:app.kubernetes.io/name: + f:ownerReferences: + .: + k:{"uid":"57cbd906-a9b7-4649-bfe0-304840bb60c1"}: + f:spec: + .: + f:apply: + f:databaseRef: + f:type: + f:volumeExpansion: + .: + f:middleManagers: + f:mode: + Manager: kubedb-autoscaler + Operation: Update + Time: 2024-10-25T10:01:14Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-25T10:04:12Z + Owner References: + API Version: autoscaling.kubedb.com/v1alpha1 + Block Owner Deletion: true + Controller: true + Kind: DruidAutoscaler + Name: druid-storage-autoscaler + UID: 57cbd906-a9b7-4649-bfe0-304840bb60c1 + Resource Version: 228783 + UID: 3b97380c-e867-467f-b366-4b50c7cd7d6d +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Type: VolumeExpansion + Volume Expansion: + Middle Managers: 2041405440 + Mode: Offline +Status: + Conditions: + Last Transition Time: 2024-10-25T10:01:14Z + Message: Druid ops-request has started to expand volume of druid nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-10-25T10:01:22Z + Message: get pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetSet + Last Transition Time: 2024-10-25T10:01:22Z + Message: is pet set deleted; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPetSetDeleted + Last Transition Time: 2024-10-25T10:01:32Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-10-25T10:01:37Z + Message: get pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPod + Last Transition Time: 2024-10-25T10:01:37Z + Message: is ops req patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsOpsReqPatched + Last Transition Time: 2024-10-25T10:01:37Z + Message: create pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CreatePod + Last Transition Time: 2024-10-25T10:01:42Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-10-25T10:01:42Z + Message: is pvc patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPvcPatched + Last Transition Time: 2024-10-25T10:03:32Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-10-25T10:03:32Z + Message: create; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: Create + Last Transition Time: 2024-10-25T10:03:40Z + Message: is druid running; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: IsDruidRunning + Last Transition Time: 2024-10-25T10:03:52Z + Message: successfully updated middleManagers node PVC sizes + Observed Generation: 1 + Reason: UpdateMiddleManagersNodePVCs + Status: True + Type: UpdateMiddleManagersNodePVCs + Last Transition Time: 2024-10-25T10:04:07Z + Message: successfully reconciled the Druid resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-25T10:04:12Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-10-25T10:04:12Z + Message: Successfully completed volumeExpansion for Druid + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 5m33s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-druid-cluster-gq9huj + Normal Starting 5m33s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 5m33s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-gq9huj + Warning get pet set; ConditionStatus:True 5m25s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning is pet set deleted; ConditionStatus:True 5m25s KubeDB Ops-manager Operator is pet set deleted; ConditionStatus:True + Warning get pet set; ConditionStatus:True 5m20s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal OrphanPetSetPods 5m15s KubeDB Ops-manager Operator successfully deleted the petSets with orphan propagation policy + Warning get pod; ConditionStatus:True 5m10s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 5m10s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning create pod; ConditionStatus:True 5m10s KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 5m5s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m5s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 5m5s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning compare storage; ConditionStatus:False 5m5s KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 5m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 5m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m55s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m55s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m50s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m50s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m45s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m45s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m40s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m40s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m35s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m35s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m30s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m30s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m25s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m25s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m20s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m20s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m15s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m15s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m10s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m10s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m5s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m5s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 4m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 4m KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m55s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m55s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m50s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m50s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m45s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m45s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m40s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m40s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m35s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m35s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m30s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m30s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m25s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m25s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m20s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m20s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m15s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 3m15s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 3m15s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create; ConditionStatus:True 3m15s KubeDB Ops-manager Operator create; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 3m15s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m10s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is druid running; ConditionStatus:False 3m7s KubeDB Ops-manager Operator is druid running; ConditionStatus:False + Warning get pod; ConditionStatus:True 3m5s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 3m KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateMiddleManagersNodePVCs 2m55s KubeDB Ops-manager Operator successfully updated middleManagers node PVC sizes + Normal UpdatePetSets 2m40s KubeDB Ops-manager Operator successfully reconciled the Druid resources + Warning get pet set; ConditionStatus:True 2m35s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal ReadyPetSets 2m35s KubeDB Ops-manager Operator PetSet is recreated + Normal Starting 2m35s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 2m35s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-druid-cluster-gq9huj +``` + +Now, we are going to verify from the `Petset`, and the `Persistent Volume` whether the volume of the topology cluster has expanded to meet the desired state, Let's check, + +```bash +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"2041405440" +$ kubectl get petset -n demo druid-cluster-middleManagers -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"2041405440" +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-2c0ef2aa-0438-4d75-9cb2-c12a176bae6a 1948Mi RWO Delete Bound demo/druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 longhorn 19m +pvc-5f4cea5f-e0c8-4339-b67c-9cb8b02ba49d 1948Mi RWO Delete Bound demo/druid-cluster-segment-cache-druid-cluster-historicals-0 longhorn 19m +``` + +The above output verifies that we have successfully autoscaled the volume of the Druid topology cluster for both historicals and middleManagers. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete druidopsrequests -n demo drops-druid-cluster-gq9huj drops-druid-cluster-kbw4fd +kubectl delete druidutoscaler -n demo druid-storage-autoscaler +kubectl delete dr -n demo druid-cluster +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/autoscaler/storage/images/storage-autoscaling.png b/docs/guides/druid/autoscaler/storage/images/storage-autoscaling.png new file mode 100644 index 0000000000000000000000000000000000000000..a48b564e1cd28537d8b7520a09eaa0889a6b3940 GIT binary patch literal 66996 zcmeFYhgVb07cQ(KAdm!UN=HDciWI4#h(Sf9Ns}goj`SKjc>zfPrHKeg6G4zBO?vOW zC?G+47YLyV0RrJ3EWhu&|HI8%>M|?m%*>uWdq2;!_k?SzKLk@UQ=U6_4*W=2N$cFX zi->dQE}XkW27I&fZrvLAhr&hK!2R4gD!Q{j=g+-MVFbQB@2>Um-nq{MtgFC(F4`!n zDV{r55>0h%Mtbf%>7z$ViaOrsu~Ssu#!CT0M_$(tgPSWH9EzJ0mQar`T<>bXbL)jS zeH{HaT1#fi>MidS_7qv0obnW@967(MvZyQ@{9U_h4MIu>mMxOSjkCMM&Gv%YHD>hP z*WeMi3)dO7sL9M-%N;^QFz=+-pUoWIv43m*fcyCa_pgNBGEuR032w7T_S1*RQ|ik! z|L^nL0@CFibgijbDGjl{_ zGD}BR-Q3fKxlky!cVYbEU!RE;(JIzvM(*b;ugZBwFk?k^p<(al4F1lUD>Db4a~<&@ zzxf#-`EAx7>>cWNGXGl;8L*)F{uc~p&Z+WZukwt!9-R(^{_{pA5>hC)O68GPkMKo7 zzWMaq^LPKw$`VA6ee;>&-w@(T%>!X%+C(;Tt9aLAsNetn`n}O@>teh6ohzAq$z3X^ z15W?5QBZK|Ys-q{2@m?Eq3toq>5MGju&U8NW3TdI_#b8WPD&KwVM(qsH2BTyJ<#E| zf1g(6p+u;dwImd7G4oO5?mk?>u<(2N2i6l#?I(-*meTCS{%1kuX7z5e1>EUgb&x8{ z&^KtdOU}Zs(|eM}BVO94<^S7@hZnVKqSQP4TYRUSll@-ObH%D-s{(8&I;%M~hk5W- z>SbK@Omar^|1%FcDKv8_6xwejJaWwVsQ4+w5RtL6sU38p|8;m7*L$L$Ya!^bm$}j_ z_rFJYfk(c6W%3Mpr-rMyjjh)r7REhmU;V~i7__l%rWo^gab0}5o$CCIKRx^##=xGw zYSC;(v2IY`2G(t-`p($vs8`o9m9CUKE|Hx11+eDjoA$%vhsM@f0{-3zsQGCmQ~DR`l5sY`ylD ztgB=!H}L+|bPHD2BWq1RpV?Z^MN~Cw`3iR2nkRd3E8v~y<3H2P+UCQQ$jCQRcU5_P z>+KazJ!CFkBeT8VuW4cZXXMxinQ(OJsLaBqqs7rL>@LTR$@f1Ebadkuh%?NminWBj z8=QX)2+km#k8s%Wo%nSOV`9G2IJH_Sq*BG%V>l8VHJCGbx-!+=fQ!4~%T1acDwZ#XkkdN2v;Jl*SMgL-+z=LK8+SKQp+^3X$vzE+oJr)Mo z-$Au#-r-pFSA_!p{~0(0?&ud|Bixks@AUMKl96cgg^YZv+DeqzhBejYEvTqov^hx!EFEg`RIiVh=>1x zqQRY8q@w>EKlctPw8QsW@Q&uEf8)_v08>a3f(r+g+D%{3JNIuVbufz%gl`SmUTrr|s$f?wM~EJjcxtjob70 z5w}xxe@vNu@A-|ohI_ErT_{<<yBsszi(b9kL1>FjzD zzx<{3S^_1oa~q*Sgf;Z)ywJR$TH` zzG({mH5sL5ySi>28~M8)hP4pb@6OQ_fQ-$KCmn+GtKlU7V9aw!VrGghs~|9cPf>vz1pmhTO!|GJ#zB|$`r z>^fan;dg^gA;R%TNsm_xMGF;EU8y%-c6uI8P+##D$_1h1K;HAXQj+CHwGPvRnc!2k zn&W^TX{-9bM?*D6D>#);)s}9L!#yAxIkR2a9$UyrvFRsV{4DRKuI!V_&{$;6uH&dDP4K21!v+4(G!uQ^~49WVuPsQVnl2N(lH361=;bXH)^baeFqW_Gd zYybrFCE>(s=4Ei;H)I`M_RM4Y?3~BWa3p!PoH68zbmc-i_xapxc_anOWzL}bz!@Ib zs8;sZbCeALKvV1A>S#@l+f_TZvxG6~Ew)X5WE;0`NPZHm%0uUBbs_(QFbqkHlW^fy zjStf?Z7AlI6&zDZG&9npeHZ^fPb&Uq{n$2@MBB=}{1gKjR-7#Xo65u(6~dlaCU19` z1+xgYxS*-}==bbT+{ZmZNciUCsiA*LNTQF6-PqJb)#E2PZO5zXX8iezg| z`iOJ8lzp#Ny?kmxVL2K9qVcw%FC%7=<(-8JLexZv9^_nS&emv0PDJE#{BOG#K2S!N zxWlJCcEM61EDh2c%j4)EFxqw-eDHl}pRunvWo!FMVlnRlN`Y3Nk?TYw5k8PDJ!kZs zbuPmg;+A8maS!&-AMB#p0vVz^lP4#Z?ThLw#_Lb063^LCs#djns>O6a`2T*F%7MFM z>hbkH$Su33_w@Yka=?+#N~+{2wI3t)(}l+l7&? zCj`bGS+nqn)ww$7+%o(UW)=lTSXcFWG``L;C^PTod(QXN(KY5|v&jnlH#;>Pnt{;< zKFtFyp;S!E{>;n$cz$7BC~Mls2sVCl@KPRophhM!Ah2=ogyHu&e12IiP#1zW6TuvU z?g2T&JlFi8fD){lM~{9Xc`9lKNq)5X2O4OJF=A9*S#6G1bJ7DvkKs1cbv|Ml5p22a zz-wQrCvL9jJ1F9i|w4Fb<`mJ1!tkNu~1YQm@ zwPV^vj@OsRX5s!A{31Md1ESjg;?1*#X z$#8N?gn*SOcu8PH$|uWCggEii-12z(2Ao)5K|0{rm{YI0$^CotVs~~z*z~Zfz1k&o zAVe^urIHAOVv$<^$MK5OUV;-cl}&;KdBS5k;{wfaS323NIBIF2iEgfIo?LNu2B$ic zKS*2RjXExxfZ!E_#-`q_NHxqoqx0@h4RV|-Dgjd>cnmWkOK$g~55;%v1+I+jtZyp0 zA`%nm^snBRpq~d08@@#Ri$))kt2}!P(7uz*D>-gZat!a>$55zyP0w#aJ@`r) zAl#vxhi|mb&t4<&BX1TfM3=W(VK4J^&Rp58oH+5iM(Buf9-+g%R>HYYNUpMVHEh4) zYLwa`heAqW#yj;+wV#Ko&AS3fSOV1~VqUM=jbs>e>tfqtko$sUaTP5>l)ERF*4noy z>n@gZ#-1E54K_ngrLp*a#r>IvKc{hV0VQ6?v{n+*qSm^{pF zR{zpu574M&o?gw*7yB9&1KEzN$1m>gjcf8n%_&G8k5fTf=Leq`A4LVvM9)fN2baB% z^v8P?es3RB<`v~a!RM5_KKd2rUV(=}jAwX&8S-l6(KyIqg?MVbI=jgC}|f!VaP2n`r{bftsum zjD+!=H3?2?m71E*3GT{CI+OrHv4n4(MijIWn}q#hS;E;XZeW_ls~-{hh*%NCv* zB^U7N7RBOeQh7^}WVk~*7mM}yHPpJ-!Ae=YxFaKbl;eGgOQi}k_9vYcly>4fWv#a> zxx5&kLFsY7y+E0yL=Le7X_wio+imHObJU)F&-h?$@eAFdAEMwPqANCJt~EhsS2jAt zVN|`!OXH45l$2Y(ySdN6SVT*!{5)`y^GA`>-m`m_J6Mb4dqx!W>=6tQg!zzW!2<@)=PCz4QyC4}~f`{{9LR8fs}dEMo>bMgwv3ESu=7=gt%?XMez%=Zsa z?GXhKul`tX$_#EHh+te?)WN2Bem58v_OEd#U#7#uV`$qXpK+5y>30XsWR}V{LJSjIDSx$ z4LPjA7I)hQS|o z%JmqaTzf?{D7SXF2|>A)=dgT<>Z#PPp8fnDNn=6N%w0w|bWmutYYfXp(&W1@e_LF~ zc$yu$yWF1~?$92U{rT#1)kx7dg0G6E_M1v0ze#ddW{8p$Ob@wEUSV$;4aI^?<}42C z&G;$?O&zutek(6o=lMXNs6hzPAVS(x6Q3IgxgI=U(!=hc&U-yN>iyp2OGXb-9dhMV zeQyR!mG^p7-OGMj^`>!zvO!&MSIO*X3A2`&Rr`fdxmCGI!Pe_Ji2A<0zS-lh+J~$I zEfan=y^ya<|3l1`KOP3SzZ0tY`2pTOkQ1AV^Z(QdQL-$x{{rAs-`3W0+AfroUNNu6 zR^k+C6!p{de>d*cm_;WUbk3jz9-QhwoEnWz4YmGq!0!(#&(I&%i|x)zL%WIm=XP&h zf3-D6V9mJwE7GaW_R|ig(yO(C0>O@MN zQy%y^6oN>#i@CLo1!E}1)d#L(x4c4_d4Jow>qXCm?D#WvgDqJBy-9QmL$Q15Y?WxY zEa-z}oeGB*zEcFg5|Kyr98_h#=ycQ#WMyl&prJ{+SjP?(j{NNIi*2Gt96uj2Iu4Xw zup*%mB8N?wGfpSB;06_DQ;F;If&0`csWpktpJa{+&60-xyS5?Mplu(-JskQ>_c>W^ zdL9ruV!>9vyLCbbgEoW1G%^|^3WH9dMwiR6N9;X7%BaJWy$!e=s}f=AJr_z&AQ1ej zkK0X;+Z)EqY@TAb6B>Sfq~WM7;@8gYoTzl3dDgS=tQMiWxUGRa8h*{rOB+75A?DHpLNLr)Drl)k+$ zZ#Q^{_?@06DcTzVP$>DzLyE*T?3kQA-Ra>)U0%q zo!cA_DIL&_)VFEhw)UySZExZaCnk;wg~SqsLT%(=q8Sp4pQ0 z#9v3IWm7_2+zW%5B%pqP6ibZE4Z2X4iwQoZx8}K7%J7IwixZdpln6##<2uZ`a#Oz; z#KmQmwK}j4<6(}pe%)=^2KGeh)nr6@`Az$*%zYVFcNa@_UGWe}l(dXGts>91;|VV* zasKr>$dex#-qNRD#+FS9&uKK(nANXs97Q{vvm9*B&^})9=A@*;**~r#?9}nl@TZ>m zU?~d9fP{A_)}3ChMyxoGJcVP1(c!V6$@EVv^k=vs=`tn4jziG!-K1vcG>0gX=zn|C zXQ!LD+R~WOrmBp#wKIFSUth2^9gzUrG8Rc33LUI&H+{P@e*2a473q|S=F2mmZand> z6Aj@e=TZJay4#^u@1fLl+Z59}!vP2hEyrmF9GEmEiN*1SnYX+6$S~D{3UUtr;=R&d zp^z|;*Pt98!#VIMEbPrAx~%2)1y?^w-trO#D1GFEPNUCsRI(3UR$)$bP2Y!3%unuU z5gm&&QbH!@^y<=IP(0W7X_fS-_|T!~#9tZW@RL52>2>=8EuXRL@ES+ik7pG}gov)T zxj_%w<&|g!G{}jYc#A`<&lQe(I6hu&7oaCZ!(U+0`}S7h<=DEK+SFXd1Ka$QLyD^0|)*InsDZcgaU^`3l)wqc(zm2fKp}&)j3c ze%MVe;;RW%XSoa@Q7lHx1mLIm!<0>kgPnkq|0Wh?J}Ncfu|zHrTQ(pgSmrW!k5$SA zZcF%Z|K-;4?%)D+<`B}+tT*k@Rdx&Dl0A^l`D7tTrpu&NS>xc{+3!v^=i1>s5V`_~ zo#?rt+|Nx!e{LI_k-5N)F1;C#BfO(+8Qpkxj_axHR2S;5V)Gp91~E_sd4jMMJm(-D z6sD8@SIBww+PXcD`gpVL@_@P@u0LW)sBCiS1Eg7JePW_%#NRQA8d-0obIB&7k8P4pAJxKey0$l!8)JaIwQ%EZezcVawfhJ zn%Hg_K$Pv`e6eBl8SGFlEs8u$F16a#XC6;>Eu!VVdjO2FvhHC1rAhn1@!_tGda{J0 z%l86<5Dodm>-nDFG^@C|Xz79Ib4_yO(HS@I$!ly(H_IcT>EKa+JM{S-B|fEobk#pUyrjhKEXHX> zRr-{Mby;R+7<0vc-JcDiw&Q!Nd>&XMHB$b=+57t=bU8$$<@OUd&Xmpg3_vpK7+f!L z2h5?UgrfR|d2~-HOO>8}1g(6B*-@P*4mAIchB2bt_Unh{m2_m_)(`ulQO%n)vEgT9 zklF&Tf5IGbgUc!>BJ~JPQlBBZ7Mv8vc87fKh05R-bUt#wuH?@x&dz z1EOq@j|JSOo!NsV6`v~QI^TG>Zhm~3 zYTn6OdrmGbpn|gYAIszyY6ygg0VA+^rq#W*Q%kM59c1mx4b4QitC8ajG`Sjp+_EqK zoG)PnyoX`JbvS2l{Ul0iKC z{!pvv41dd&RVydbDB2_v3B>t(%_~=w&HEUid!#&o0&%p)q zsfkSK3HjZI;jPujE3iD9lcT+=_0P2xHD1s&i>jPoBRPeNxB80`GBe`GBT`dwJ2tqJ zFSY6bVB|6fjHoIF96&aZ4{<5yb~UHQe&-RLpn7|UF4Z;N%nW@lEd;PB=Lpy;{gT$u z){U5els*QbXuyp`)RibS2{SOkpT$&Z-VF4sQWa}?Ykr|2=z{d25=yb2*w*i z4wHk8BIGB8XSi=clX)Dm@6R%Y=82~rC?o|cU(uH=@=|qZSJZNT%6(Ao_%IAOMX%_w zBjmS>0nV62$E$vQs(4ln08HS`U~b zbjgp`Sb_M8ye(8$9QZyrchz)w^_O8S%NZN&Y6E0S{!dTP=4{duVcgCi(S?<|!h6AH z1CcYTKKR2Qji*WO*XUGWB|uaGW}OhGKy~G`))iHt!Rc30pb1zu?-3xl=Fo(sCL^~l z;0|@?8s@$H`?j;`dDWqT3zFKf69<9k%U^h$DR*B^t`OTIs&8o65UXqPnfO)i=@TP) zf1c02l@SFzF+eSZ9|~;p?Fwm81)-V_u#Xl(4p7qa9>c0%Fqd|!yKTmPm`L|s#S8`L z?Wrn#vPge9coO;0v>iAM!W4bxD>%ifURRL7`lZXS@7tz2X zpx6@Yn~`B0Y5&(nry?J;ykGWflu7iOC|K>US__s=l$Im-@F&xW!KGcQO3zcH(IOZM zvPanoQDWwMfLSKd5Ahs(ICm+%dN6NkL=EBQT(-6l+}`OCNT~1k1DM@r0N7-*T=Xyb3gHFKMG}GSGF3W z-<idTH%Hl-np}QRjeF!ZWfY zZ-*Ck_;w2uQfiyVdGll$G%4DoUbrQu#J@SJ+0>fB%pjElKUB9(k9d?l{$XdTA_HS@_tM;bFA{ii>ohKw%Wv!viFIf_vw|g zSPzy(NrzbxTwDF??&K|Hgc^_CoQw(u=5= ziPz#1te5h@MzyuI+A(?3_+P6qJf6&YT|g2gRPf5|eQN}>1gSN~LJr8})Ax)A?U)Ht zRky+jOGc)b@Jl`+gGTEWPE+rK0e+{P#E(h3sGs2u?W4JgCRrKg|oFC*5d5q8<}QiZGPG*0bg(%8y7v~%?rUo+7m{ZGxteUE!m%}iL9mVhG7Fw) zVMiXj8vAdz!w58Zi}ciM@>j>)O{de`2c++#Ujm6u2HgHm>8Mto(G=r@6y%EC;}!o{ zOWt?CFw9aKN9$nQCF$!A!z?MNH(eAq?(8{7#s~76Cn5qbbmj$>XSjPDbPDyC)we1* z<(ww2fYFkCTmEds(n$rLIcEz@=A0o{C{Sov`qZfoE)MDsBh-tBxm6L5)?Ih|B^PWI z2uz>rc6u`Q&=9s3Hm}K`NES(7Id7GXcx_O=JLB@!WaXsWOD~h@mEAFtKM|=|OmP5< zb!2G^j~ZIbVyU?9W23kd{o!t0h-<_(u^2^n(+qi;;UQKe)oOmMB6<3-d}Ek5f($o7 zbz6chn)LfFn0@Bp#xCoiO6s$WlWvO1nfMjyjmrXr?2^k3*)}B6nZ)hpYoEwl(f@^a zb?t=80T4p!jeP*z52$Jhs>&hqUID6%Lxk?UECXYd)YTX|pnTiOR|= zFg2)(pfql8)6~~?gRA<$y;;(ZMe~Sv3n8UbwZqGJk&TiKAZ>A59A%9UAI@$o4_4m! z5~Vo89;STb4E7al%B7vem78zB3MRM;c-Yr5K-)BPw6xR6OAK>{cF!REWtt=a4X9pL zFn&b;gLv<0ZM`z9WGC2uIs$~K<{x~ge7!Zhpw-tgODriBz^?uDtX}V5KBh5`R}*e3 zNgvsb9M?M)$)9x4VDVGEjCQP6@SAqwCmP>3^TqZl&QYd>5T(7ipn@7D>D?c@qWU$O zE-Lz$bx9^dR7VHh!n%}(HHEm3%8LRD_fRZO|EbDKJZ@Ndx}1JF-{r?(lCH~4XPQ_u zB>C3WWZHUqkdYKtrMagI2ha~FeLm0=@jLikMjNqV+r<;NKyKWx@DI-DSN z{fp_GXm7khq5Ehp)r!5uNXAd85H@w2fd&bXr^-f-1 zR<&T!8^PXsIqU)RXNI=f>x^~9HOmbI+-?i~eqHt6ccUi)sJpUPb8c03id++Dukl>3 zvluHf-BinT3Sn3GlK0!knwiA{H1Rz=CnMEG|4n>2Xq`m#I$b#H3qWEV`QV!p|5y&e zqq#YZuAh6_2=$os>(jK^O}{B1(>p3Td9Dj*>QJS}NJ59=S1hPAt7@^j!`QLK2$_p$ zH=nK%{9M&S<;b{C-Zuc>Gca+CS3wqL0ILZrt8tJi-o_2d{NS;F8!}Rh#8ku zMipY2o>%D&0Xr`0z?N^pSW5p|`Fg~DpILFMFe>PYi=l`7)j>y*Hj0IY$>`C0vT16` z2I6gG10b&+xprS^QeP||fE-J|+NO|IxU`;747`eekhRc$i=%6m#H|BG@Upr599nD@ zPXq%qyOX`8DMVg<;`91bljdh4kr?o)F?(>qZ9x*h^s6vQx!~L3L4@{pIK!^6yYKdX z(wNuj6^(k2zFK52dhn(+Cbm@NmVPmuNlB?knE?v6Q?w}}$r`Kj(w@^qPlzg4TEzg& zTSVM<(ej1fB}ehTs3miu)l`xDPjPEPoB^zCh&*B_~^I!S(= z3pL0?_L48m1#r=v-n$j@EJN*PDozQJH)?YF_Np_>F+n8JK-#ttxqh&oOFsTmu2v`% zOW)`JY@eH}_VcJh=UsToirQK4mO!C#nVVV%<3I2^BJ~xpWkK zC4*_nuK@~0{ClE+mD_TXO@+9mT&^W~pjrOBIw$@=z!oy2KSd+@mMhy`!gM}GqymO{- z`kHhX7{y3meza0X;JMKG@IvRr<>!Ts)KDxUIs*n05@qFT4))ctj@*80A0@Y|Ytws^MAoCCZ|8TPvwMB! z`20{(sMRc521N4!WGkAaIuCH}-3y^&P$cGU)Sb--Ox34~ zq2Aa+_0k_A$1|iMSINZH;m>-WVT-F~>)tod_PWKe3}80wFRZ8>;=L}Kn0{;I=-h%w zTwOQ}&J7_}$8~Y2-ol$&BsZo7H|sP+6hSO)ELV4;y<))IuY<;%$4Eou$j3Q-5eh7- z{BHoUkRAHQel{=vv*BQdev0qAImlJ@$Ng3SV18dys#ah@`ZR5 z8iJDwf=8uun`BrjFaqomhn4;gx8;MIRVN!g;R30Q^Th^U-%MvVoF^8XD?1B*jZFym z>#1&gx^x-0n5N&>pO;`!y|vqj;@ctDM$}9J4FRUYiFWwtA{}8XG|$D5T>lv)P3(hG zVvk@Eb`2-w|Ge$}3gC6EgMs^H8MA24%OaB{W*Xusw<)igfU5ZjLCxDzeFBHS%znuS zT#Uvcxoud`CMAz{c=b{!bJ_l~;C6#GnLqj%us{rEjtt7?BXI+c>fKWNL^q8Y8ToQ^ z>0W5k+*6Z}>MR6YUD9(WYU;1FxvmndCHP(jRnib9D7_HikHvsfGEkzhF+KjxTC^5a z*$8eH2hxz-il&DB!^#8GUOh|GMsW6P;+QUWJ^E-J%ZvLjn4g9zlSm9C5Q;1%us-wQ zymf>@g;Uu)kvHr66V5BiP7ae*G-J=a*m}Yl#OpPZ&-L!tCyCcHJ! zeSf7vw!`abR6KUiu12YILpH0Iy!3;B#h=B$q$ZCfp_k2qj}+ z#D|PgD1LKhv;NSXHRo2UI`w+y!e@K0+lH?{UDjLevu*L6P?e7Bz8;<7Q+|&vmSX9k zlK-?~)YOKArFHl)I1+VD&4qEIY9eWQ0$nO&^teR2i z89n zmjUz^do#4VX{@EV3k3(xaeo&?r0=R~A%*OzesHdYWr#G3DyiUrR#%`Y+o=TOJ<|L! zB|F_;_ND|wgKVgca_bhV7eGI#?`X8!6u|SXn0nedMaygk_xD#0eN2Q3Ce26(y-CELefdq6_b?szMJJso~ zn4hf`&k1(3BGJYAjN1W+gyRpb<)qVdDlh7{rz+Ic$-EbqLA^rC@jtV5MWn1 zs@%UY@wtq!Ol4g)GfE6VDU)<2FBTptt3NNT%CBjh6V~4$~X8hOuU`0hQq6OZu=WObj9dNV)zew{moWR z*us<$FUA^^p1*6&(4kVmH$f!(S1&oQ=&Z21g(|!6s5v8Uf@^^V(LsQIkpm3z*(z0m z`-OFf;%_wiHh8wj!tE!t#1sE!9oCOeWg~eKODXOOCzke)RcjQR3o!ehM4guZ=&8J3 zYT9@b_@lU=Oq+iZ^0jOQ^x6G*Virlq|D+ma9yz9uaw};ZP?Ma}*-Dvgq&@Mn)cOh( z9)2g$V#{t?leZ9N(83HEEXEf844BJ$2!jI1K}y?_wz~P%!X_PlY#bi3{?x)en4i6|u4`L;_Q1b+ ze zM@Js6zh;ydWFx4wpLk9VLNZMvC)uAAGRnUZiue|MW1>^QR5*SI4`v_q1c*yER#V<+ zD!#}(Zv-xIlz==;fDXv47wGNhmuREKZqD6n=IKPR;n|!Q766r*+LYXM22fcjA>F0= zpBW_n{UudG)B2 zzeBzs_UO~ue04vWcadpNcJA9oa3X~nKI=2D-2ghAAF}(jO>{kPtG+xoPS%bf%Y&aX ze_p7V-9FQJ0KH^xs*!-Jt#<^On3p70MsdDmWA{80R)#WQCYm1Wg_XYRfFdXFEOlkf zRl!eo(7rY2HuA7{dbeiGnj0n4Tm-Yc12l3g2`DxXFam|@rX(59yj#2Mw^7jKvw40y zw*ziB*K8>c4K};fdZl*Y^NNg-oCWOa1TT7J4rBnbbr5bf+V3qP{D7k!?t{^K<8!*< zN-a>1R(AG5ce$gVnbRWnW1st1TeX#?nfWDUh+c=^D;wJ1lA5&IP3x5jm?TX&cPYMh4iJvxf6EjaE2$Gp!W`=G4x*j;$xstueMV% zkhepO4N3Z=E62ZChkeki2$r?tHjJW=qn)Fp8mQ{5{Zy;*gDK(1n4xpk9GT8=J$`y! z{Gs)yCQ4TIMs^2}<0ca7MKFz&ai1OuLyHPqsLaPXe8gN7LrU&V4l)N;`LV9^gTT%{ zw-NiTha~fK*?PV|HnbT?k^Zs!;P-YK2_0`oBW2%Chge*3=yMp?M2|{=Jca6ieM{Lm z3?@NAfODaff7xkFXXPW69*n^v|GkvQ=dbw)cArHWqQ4T5_pRbs%S4Zl^mfz=x7Lme(i^y#KGN__dor@rGsO`jZcD1mn6F zlh^zuR2G_4VJgX*Fbm9mfK2rCOQ=IE;7xXy^?cumF~ZBK1s^ifljc9fIv9$|9H)uY zb=%OQWVpB(fM~vl&WKu=u^DRXNnH{ij*0+gr=xA)i^b&jF|BP84_DGR_u5OO+R#Dj zH-v{u&Z}?foo~a4G?j=Y8XP-!r9DWA#8R0av}7fT037+O;8-FiTX|FL2$cdgMZ+WS*f7E8`F0 zItuguI(qojp@SKQhk2#UvA<*Vr_KSsTLz^s+NmKG$IfA)SLO)GJ!NxAEZly zTUcVv)?F;-Q}tBmT&q00I->g&==IiH+)|Shxx;@)TUWd!ni|Ht|2=klL1(Ap>)v#| zU;XK{f8VA^;}~d%N73rd*+{@$4<-`)JolAwCA}K2bWf5bA<1Z_Jz>61*B{?j?~r_e z;iPGC(nk>+5V|#~`}=eD@TNCsolwg07lF>)#p1&)It|$%h0|SyPSUH!!e2Ph%YA8b z6D+T_^GAgXxaP)O+8LhS?TDVyP)82jMK`No1}aHTHQfZsW-|oXnDgus&F`WnCg^y$ zK&+4AEmVxv4t=z7HioB?bL~b2o8+VmZ2f3&ydlW)tJD-kk=7jq1>an}JQA$`^bqDN7OYri4t{(f{GD5ve~qUw(WhJSwHf%F{$a z#Jf-4Aaj4xzVRorN~hvVNtauBO>(YJTKVP5A+p>UQNr|Q%33!yEj&T6D|*^$*9Q<+ zSl=d4HxbLB?}sQ#8$VHRpwh
    7Y84b182{+^dgiMU(d2U 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/autoscaler/storage/overview.md b/docs/guides/druid/autoscaler/storage/overview.md new file mode 100644 index 0000000000..607e246032 --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/overview.md @@ -0,0 +1,55 @@ +--- +title: Druid Storage Autoscaling Overview +menu: + docs_{{ .version }}: + identifier: guides-druid-autoscaler-storage-overview + name: Overview + parent: guides-druid-autoscaler-storage + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid Vertical Autoscaling + +This guide will give an overview on how KubeDB Autoscaler operator autoscales the database storage using `druidautoscaler` crd. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidAutoscaler](/docs/guides/druid/concepts/druidautoscaler.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How Storage Autoscaling Works + +The following diagram shows how KubeDB Autoscaler operator autoscales the resources of `Druid` cluster components. Open the image in a new tab to see the enlarged version. + +
    +  Storage Auto Scaling process of Druid +
    Fig: Storage Auto Scaling process of Druid
    +
    + +The Auto Scaling process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Each PetSet creates a Persistent Volume according to the Volume Claim Template provided in the petset configuration. + +5. Then, in order to set up storage autoscaling of the druid data nodes (i.e. Historicals, MiddleManagers) of the `Druid` cluster, the user creates a `DruidAutoscaler` CRO with desired configuration. + +6. `KubeDB` Autoscaler operator watches the `DruidAutoscaler` CRO. + +7. `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 `DruidOpsRequest` to expand the storage of the database. + +8. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CRO. + +9. Then the `KubeDB` Ops-manager operator will expand the storage of the cluster component as specified on the `DruidOpsRequest` CRO. + +In the next docs, we are going to show a step-by-step guide on Autoscaling storage of various Druid cluster components using `DruidAutoscaler` CRD. diff --git a/docs/guides/druid/autoscaler/storage/yamls/deep-storage-config.yaml b/docs/guides/druid/autoscaler/storage/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/autoscaler/storage/yamls/druid-cluster.yaml b/docs/guides/druid/autoscaler/storage/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..5415590a2b --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/yamls/druid-cluster.yaml @@ -0,0 +1,40 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + historicals: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + middleManagers: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + routers: + replicas: 1 + deletionPolicy: Delete + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s diff --git a/docs/guides/druid/autoscaler/storage/yamls/druid-storage-autoscaler.yaml b/docs/guides/druid/autoscaler/storage/yamls/druid-storage-autoscaler.yaml new file mode 100644 index 0000000000..d1a2f5c438 --- /dev/null +++ b/docs/guides/druid/autoscaler/storage/yamls/druid-storage-autoscaler.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: DruidAutoscaler +metadata: + name: druid-storage-autoscaler + namespace: demo +spec: + databaseRef: + name: druid-cluster + storage: + historicals: + expansionMode: "Offline" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 100 + middleManagers: + expansionMode: "Offline" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 100 diff --git a/docs/guides/druid/backup/_index.md b/docs/guides/druid/backup/_index.md index bb47dcc106..31146d6c14 100644 --- a/docs/guides/druid/backup/_index.md +++ b/docs/guides/druid/backup/_index.md @@ -5,6 +5,6 @@ menu: identifier: guides-druid-backup name: Backup & Restore parent: guides-druid - weight: 40 + weight: 50 menu_name: docs_{{ .version }} --- \ No newline at end of file diff --git a/docs/guides/druid/backup/application-level/index.md b/docs/guides/druid/backup/application-level/index.md index 4c6394ca81..627c865406 100644 --- a/docs/guides/druid/backup/application-level/index.md +++ b/docs/guides/druid/backup/application-level/index.md @@ -20,7 +20,7 @@ This guide will give you how you can take application-level backup and restore y ## 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 `Minikube` or `Kind`. -- Install `KubeDB` in your cluster following the steps [here](/docs/setup/README.md). +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. - Install `KubeStash` in your cluster following the steps [here](https://kubestash.com/docs/latest/setup/install/kubestash). - Install KubeStash `kubectl` plugin following the steps [here](https://kubestash.com/docs/latest/setup/install/kubectl-plugin/). - If you are not familiar with how KubeStash backup and restore Druid databases, please check the following guide [here](/docs/guides/druid/backup/overview/index.md). @@ -52,7 +52,6 @@ This section will demonstrate how to take application-level backup of a `Druid` ## Deploy Sample Druid Database - **Create External Dependency (Deep Storage):** One of the external dependency of Druid is deep storage where the segments are stored. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. diff --git a/docs/guides/druid/backup/auto-backup/index.md b/docs/guides/druid/backup/auto-backup/index.md index 3c16e8bf33..d2ba2b5bbc 100644 --- a/docs/guides/druid/backup/auto-backup/index.md +++ b/docs/guides/druid/backup/auto-backup/index.md @@ -20,7 +20,7 @@ In this tutorial, we are going to show how you can configure a backup blueprint ## 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 `Minikube` or `Kind`. -- Install `KubeDB` in your cluster following the steps [here](/docs/setup/README.md). +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. - Install `KubeStash` in your cluster following the steps [here](https://kubestash.com/docs/latest/setup/install/kubestash). - Install KubeStash `kubectl` plugin following the steps [here](https://kubestash.com/docs/latest/setup/install/kubectl-plugin/). - If you are not familiar with how KubeStash backup and restore Druid databases, please check the following guide [here](/docs/guides/druid/backup/overview/index.md). diff --git a/docs/guides/druid/backup/cross-ns-dependencies/index.md b/docs/guides/druid/backup/cross-ns-dependencies/index.md index a3f200ec6f..9cbb5a066e 100644 --- a/docs/guides/druid/backup/cross-ns-dependencies/index.md +++ b/docs/guides/druid/backup/cross-ns-dependencies/index.md @@ -22,7 +22,7 @@ This guide will give you how you can take [Application Level Backup](https://git ## 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 `Minikube` or `Kind`. -- Install `KubeDB` in your cluster following the steps [here](/docs/setup/README.md). +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. - Install `KubeStash` in your cluster following the steps [here](https://kubestash.com/docs/latest/setup/install/kubestash). - Install KubeStash `kubectl` plugin following the steps [here](https://kubestash.com/docs/latest/setup/install/kubectl-plugin/). - If you are not familiar with how KubeStash backup and restore Druid databases, please check the following guide [here](/docs/guides/druid/backup/overview/index.md). diff --git a/docs/guides/druid/backup/logical/index.md b/docs/guides/druid/backup/logical/index.md index dbce094ab8..e6e1d06447 100644 --- a/docs/guides/druid/backup/logical/index.md +++ b/docs/guides/druid/backup/logical/index.md @@ -20,7 +20,7 @@ This guide will give you how you can take backup and restore your `Druid` databa ## 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 `Minikube` or `Kind`. -- Install `KubeDB` in your cluster following the steps [here](/docs/setup/README.md). +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. - Install `KubeStash` in your cluster following the steps [here](https://kubestash.com/docs/latest/setup/install/kubestash). - Install KubeStash `kubectl` plugin following the steps [here](https://kubestash.com/docs/latest/setup/install/kubectl-plugin/). - If you are not familiar with how KubeStash backup and restore Druid databases, please check the following guide [here](/docs/guides/druid/backup/overview/index.md). diff --git a/docs/guides/druid/backup/overview/index.md b/docs/guides/druid/backup/overview/index.md index c8adef63e6..723754834f 100644 --- a/docs/guides/druid/backup/overview/index.md +++ b/docs/guides/druid/backup/overview/index.md @@ -2,7 +2,7 @@ title: Backup & Restore Druid Overview menu: docs_{{ .version }}: - identifier: guides-druid-backup-overview + identifier: guides-druid-backup-guide name: Overview parent: guides-druid-backup weight: 10 diff --git a/docs/guides/druid/clustering/_index.md b/docs/guides/druid/clustering/_index.md new file mode 100644 index 0000000000..20b929a8a2 --- /dev/null +++ b/docs/guides/druid/clustering/_index.md @@ -0,0 +1,10 @@ +--- +title: Druid Clustering +menu: + docs_{{ .version }}: + identifier: guides-druid-clustering + name: Clustering + parent: guides-druid + weight: 30 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/clustering/guide/index.md b/docs/guides/druid/clustering/guide/index.md new file mode 100644 index 0000000000..b062348a72 --- /dev/null +++ b/docs/guides/druid/clustering/guide/index.md @@ -0,0 +1,925 @@ +--- +title: Druid Topology Cluster Guide +menu: + docs_{{ .version }}: + identifier: guides-druid-clustering-guide + name: Deploy Druid Cluster + parent: guides-druid-clustering + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# KubeDB - Druid Cluster + +This tutorial will show you how to use KubeDB to provision a Druid Cluster. + +## Before You Begin + +Before proceeding: + +- Read [druid topology cluster overview](/docs/guides/druid/clustering/overview/index.md) to get a basic idea about the design and architecture of Druid. + +- 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) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. + +- 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/guides/druid/clustering/topology-cluster-guide/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/druid/clustering/topology-cluster-guide/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/backup/application-level/examples/deep-storage-config.yaml +secret/deep-storage-config created +``` + +## Deploy Druid Cluster + +The following is an example `Druid` object which creates a Druid cluster of six nodes (coordinators, overlords, brokers, routers, historicals and middleManager). Each with one replica. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/clustering/guide/yamls/druid-with-monitoring.yaml +druid.kubedb.com/druid-cluster created +``` + +KubeDB operator watches for `Druid` objects using Kubernetes API. When a `Druid` object is created, KubeDB operator will create new PetSets and Services with the matching Druid object name. KubeDB operator will also create a governing service for the PetSet with the name `-pods`. + +```bash +$ kubectl describe druid -n demo druid-cluster +Name: druid-cluster +Namespace: demo +Labels: +Annotations: +API Version: kubedb.com/v1alpha2 +Kind: Druid +Metadata: + Creation Timestamp: 2024-10-21T06:01:32Z + Finalizers: + kubedb.com/druid + Generation: 1 + Managed Fields: + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:finalizers: + .: + v:"kubedb.com/druid": + Manager: druid-operator + Operation: Update + Time: 2024-10-21T06:01:32Z + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:deepStorage: + .: + f:configSecret: + f:type: + f:deletionPolicy: + f:healthChecker: + .: + f:failureThreshold: + f:periodSeconds: + f:timeoutSeconds: + f:topology: + .: + f:routers: + .: + f:replicas: + f:version: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-21T06:01:32Z + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:phase: + Manager: druid-operator + Operation: Update + Subresource: status + Time: 2024-10-21T06:04:29Z + Resource Version: 52093 + UID: a2e12db2-6694-419f-ad07-2c906df5b611 +Spec: + Auth Secret: + Name: druid-cluster-admin-cred + Deep Storage: + Config Secret: + Name: deep-storage-config + Type: s3 + Deletion Policy: Delete + Health Checker: + Failure Threshold: 3 + Period Seconds: 30 + Timeout Seconds: 10 + Metadata Storage: + Create Tables: true + Linked DB: druid + Name: druid-cluster-mysql-metadata + Namespace: demo + Type: MySQL + Version: 8.0.35 + Topology: + Brokers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Coordinators: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Historicals: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Storage: + Access Modes: + ReadWriteOnce + Resources: + Requests: + Storage: 1Gi + Storage Type: Durable + Middle Managers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 2560Mi + Requests: + Cpu: 500m + Memory: 2560Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Storage: + Access Modes: + ReadWriteOnce + Resources: + Requests: + Storage: 1Gi + Storage Type: Durable + Routers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Version: 28.0.1 + Zookeeper Ref: + Name: druid-cluster-zk + Namespace: demo + Version: 3.7.2 +Status: + Conditions: + Last Transition Time: 2024-10-21T06:01:32Z + Message: The KubeDB operator has started the provisioning of Druid: demo/druid-cluster + Observed Generation: 1 + Reason: DatabaseProvisioningStartedSuccessfully + Status: True + Type: ProvisioningStarted + Phase: Provisioning +Events: + +$ kubectl get petset -n demo +NAME AGE +druid-cluster-brokers 13m +druid-cluster-coordinators 13m +druid-cluster-historicals 13m +druid-cluster-middlemanagers 13m +druid-cluster-mysql-metadata 14m +druid-cluster-routers 13m +druid-cluster-zk 14m + +$ kubectl get pvc -n demo -l app.kubernetes.io/name=druids.kubedb.com +NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 Bound pvc-d288b621-d281-4004-995d-7a25bb4149de 1Gi RWO standard 14m +druid-cluster-segment-cache-druid-cluster-historicals-0 Bound pvc-ccca6be2-658a-46af-a270-de1c6a041af7 1Gi RWO standard 14m + + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +pvc-4f8538f6-a6ce-4233-b533-8566852f5b98 1Gi RWO Delete Bound demo/druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 standard 4m39s +pvc-8823d3ad-d614-4172-89ac-c2284a17f502 1Gi RWO Delete Bound demo/druid-cluster-segment-cache-druid-cluster-historicals-0 standard 4m35s + +$ kubectl get service -n demo +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +druid-cluster-brokers ClusterIP 10.96.186.168 8082/TCP 17m +druid-cluster-coordinators ClusterIP 10.96.122.235 8081/TCP 17m +druid-cluster-mysql-metadata ClusterIP 10.96.109.2 3306/TCP 18m +druid-cluster-mysql-metadata-pods ClusterIP None 3306/TCP 18m +druid-cluster-mysql-metadata-standby ClusterIP 10.96.97.152 3306/TCP 18m +druid-cluster-pods ClusterIP None 8081/TCP,8090/TCP,8083/TCP,8091/TCP,8082/TCP,8888/TCP 17m +druid-cluster-routers ClusterIP 10.96.138.237 8888/TCP 17m +druid-cluster-zk ClusterIP 10.96.148.251 2181/TCP 18m +druid-cluster-zk-admin-server ClusterIP 10.96.2.106 8080/TCP 18m +druid-cluster-zk-pods ClusterIP None 2181/TCP,2888/TCP,3888/TCP 18m +``` + +KubeDB operator sets the `status.phase` to `Ready` once the database is successfully created. Run the following command to see the modified `Druid` object: + +```bash +$ kubectl describe druid -n demo druid-cluster +Name: druid-cluster +Namespace: demo +Labels: +Annotations: +API Version: kubedb.com/v1alpha2 +Kind: Druid +Metadata: + Creation Timestamp: 2024-10-21T06:01:32Z + Finalizers: + kubedb.com/druid + Generation: 1 + Managed Fields: + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:finalizers: + .: + v:"kubedb.com/druid": + Manager: druid-operator + Operation: Update + Time: 2024-10-21T06:01:32Z + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:deepStorage: + .: + f:configSecret: + f:type: + f:deletionPolicy: + f:healthChecker: + .: + f:failureThreshold: + f:periodSeconds: + f:timeoutSeconds: + f:topology: + .: + f:routers: + .: + f:replicas: + f:version: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-21T06:01:32Z + API Version: kubedb.com/v1alpha2 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:phase: + Manager: druid-operator + Operation: Update + Subresource: status + Time: 2024-10-21T06:04:29Z + Resource Version: 52093 + UID: a2e12db2-6694-419f-ad07-2c906df5b611 +Spec: + Auth Secret: + Name: druid-cluster-admin-cred + Deep Storage: + Config Secret: + Name: deep-storage-config + Type: s3 + Deletion Policy: Delete + Health Checker: + Failure Threshold: 3 + Period Seconds: 30 + Timeout Seconds: 10 + Metadata Storage: + Create Tables: true + Linked DB: druid + Name: druid-cluster-mysql-metadata + Namespace: demo + Type: MySQL + Version: 8.0.35 + Topology: + Brokers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Coordinators: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Historicals: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Storage: + Access Modes: + ReadWriteOnce + Resources: + Requests: + Storage: 1Gi + Storage Type: Durable + Middle Managers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 2560Mi + Requests: + Cpu: 500m + Memory: 2560Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Storage: + Access Modes: + ReadWriteOnce + Resources: + Requests: + Storage: 1Gi + Storage Type: Durable + Routers: + Pod Template: + Controller: + Metadata: + Spec: + Containers: + Name: druid + Resources: + Limits: + Memory: 1Gi + Requests: + Cpu: 500m + Memory: 1Gi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Init Containers: + Name: init-druid + Resources: + Limits: + Memory: 512Mi + Requests: + Cpu: 200m + Memory: 512Mi + Security Context: + Allow Privilege Escalation: false + Capabilities: + Drop: + ALL + Run As Non Root: true + Run As User: 1000 + Seccomp Profile: + Type: RuntimeDefault + Pod Placement Policy: + Name: default + Security Context: + Fs Group: 1000 + Replicas: 1 + Version: 28.0.1 + Zookeeper Ref: + Name: druid-cluster-zk + Namespace: demo + Version: 3.7.2 +Status: + Conditions: + Last Transition Time: 2024-10-21T06:01:32Z + Message: The KubeDB operator has started the provisioning of Druid: demo/druid-cluster + Observed Generation: 1 + Reason: DatabaseProvisioningStartedSuccessfully + Status: True + Type: ProvisioningStarted + Last Transition Time: 2024-10-21T06:03:03Z + Message: Database dependency is ready + Observed Generation: 1 + Reason: DatabaseDependencyReady + Status: True + Type: DatabaseDependencyReady + Last Transition Time: 2024-10-21T06:03:34Z + Message: All desired replicas are ready. + Observed Generation: 1 + Reason: AllReplicasReady + Status: True + Type: ReplicaReady + Last Transition Time: 2024-10-21T06:04:04Z + Message: The Druid: demo/druid-cluster is accepting client requests and nodes formed a cluster + Observed Generation: 1 + Reason: DatabaseAcceptingConnectionRequest + Status: True + Type: AcceptingConnection + Last Transition Time: 2024-10-21T06:04:29Z + Message: The Druid: demo/druid-cluster is ready. + Observed Generation: 1 + Reason: ReadinessCheckSucceeded + Status: True + Type: Ready + Last Transition Time: 2024-10-21T06:04:29Z + Message: The Druid: demo/druid-cluster is successfully provisioned. + Observed Generation: 1 + Reason: DatabaseSuccessfullyProvisioned + Status: True + Type: Provisioned + Phase: Ready +Events: +``` + + +## Connect with Druid Database +We will use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to connect with our routers of the Druid database. Then we will use `curl` to send `HTTP` requests to check cluster health to verify that our Druid database is working well. It is also possible to use `External-IP` to access druid nodes if you make `service` type of that node as `LoadBalancer`. + +### Check the Service Health + +Let's port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + +Now, the Druid cluster is accessible at `localhost:8888`. Let's check the [Service Health](https://druid.apache.org/docs/latest/api-reference/service-status-api/#get-service-health) of Routers of the Druid database. + +```bash +$ curl "http://localhost:8888/status/health" +true +``` +From the retrieved health information above, we can see that our Druid cluster’s status is `true`, indicating that the service can receive API calls and is healthy. In the same way it possible to check the health of other druid nodes by port-forwarding the appropriate services. + +### Access the web console + +We can also access the [web console](https://druid.apache.org/docs/latest/operations/web-console) of Druid database from any browser by port-forwarding the routers in the same way shown in the aforementioned step or directly using the `External-IP` if the router service type is `LoadBalancer`. + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + +You can use this web console for loading data, managing datasources and tasks, and viewing server status and segment information. You can also run SQL and native Druid queries in the console. + +## Cleaning up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl patch -n demo druid druid-cluster -p '{"spec":{"deletionPolicy":"WipeOut"}}' --type="merge" +kafka.kubedb.com/druid-cluster patched + +$ kubectl delete dr druid-cluster -n demo +druid.kubedb.com "druid-cluster" deleted + +$ kubectl delete namespace demo +namespace "demo" deleted +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Detail concepts of [DruidDBVersion object](/docs/guides/druid/concepts/druidversion.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/clustering/guide/yamls/deep-storage-config.yaml b/docs/guides/druid/clustering/guide/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/clustering/guide/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/clustering/guide/yamls/druid-cluster.yaml b/docs/guides/druid/clustering/guide/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..7a89d0dc91 --- /dev/null +++ b/docs/guides/druid/clustering/guide/yamls/druid-cluster.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/clustering/overview/images/druid-architecture.svg b/docs/guides/druid/clustering/overview/images/druid-architecture.svg new file mode 100644 index 0000000000..3f86a412cf --- /dev/null +++ b/docs/guides/druid/clustering/overview/images/druid-architecture.svg @@ -0,0 +1,19 @@ + + diff --git a/docs/guides/druid/clustering/overview/index.md b/docs/guides/druid/clustering/overview/index.md new file mode 100644 index 0000000000..24893bcce0 --- /dev/null +++ b/docs/guides/druid/clustering/overview/index.md @@ -0,0 +1,115 @@ +--- +title: Druid Topology Cluster Overview +menu: + docs_{{ .version }}: + identifier: guides-druid-clustering-overview + name: Druid Clustering Overview + parent: guides-druid-clustering + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid Architecture + +Druid has a distributed architecture that is designed to be cloud-friendly and easy to operate. You can configure and scale services independently for maximum flexibility over cluster operations. This design includes enhanced fault tolerance: an outage of one component does not immediately affect other components. + +The following diagram shows the services that make up the Druid architecture, their typical arrangement across servers, and how queries and data flow through this architecture. + +![Druid Architecture](/docs/guides/druid/clustering/overview/images/druid-architecture.svg) + +Image ref: [Druid Official Documentation](https://druid.apache.org/assets/images/druid-architecture-7db1cd79d2d70b2e5ccc73b6bebfcaa4.svg) + + +## Druid services + +Druid has several types of services: + +- **Coordinator** manages data availability on the cluster. +- **Overlord** controls the assignment of data ingestion workloads. +- **Broker** handles queries from external clients. +- **Router** routes requests to Brokers, Coordinators, and Overlords. +- **Historical** stores queryable data. +- **MiddleManager** and Peon ingest data. +- **Indexer** serves an alternative to the MiddleManager + Peon task execution system. + +## Druid servers + +You can deploy Druid services according to your preferences. For ease of deployment, we recommend organizing them into three server types: **Master**, **Query**, and **Data**. + +### Master server +A Master server manages data ingestion and availability. It is responsible for starting new ingestion jobs and coordinating availability of data on the Data server. + +Master servers divide operations between **Coordinator** and **Overlord** services. + +#### Coordinator service +[Coordinator](https://druid.apache.org/docs/latest/design/coordinator/) services watch over the Historical services on the Data servers. They are responsible for assigning segments to specific servers, and for ensuring segments are well-balanced across Historicals. + +### Overlord service +[Overlord](https://druid.apache.org/docs/latest/design/overlord/) services watch over the MiddleManager services on the Data servers and are the controllers of data ingestion into Druid. They are responsible for assigning ingestion tasks to MiddleManagers and for coordinating segment publishing. + +### Query server +A Query server provides the endpoints that users and client applications interact with, routing queries to Data servers or other Query servers (and optionally proxied Master server requests). + +Query servers divide operations between Broker and Router services. + +#### Broker service +[Broker](https://druid.apache.org/docs/latest/design/broker/) services receive queries from external clients and forward those queries to Data servers. When Brokers receive results from those subqueries, they merge those results and return them to the caller. Typically, you query Brokers rather than querying Historical or MiddleManager services on Data servers directly. + +#### Router service +[Router](https://druid.apache.org/docs/latest/design/router/) services provide a unified API gateway in front of Brokers, Overlords, and Coordinators. + +The Router service also runs the web console, a UI for loading data, managing datasources and tasks, and viewing server status and segment information. + +### Data server +A Data server executes ingestion jobs and stores queryable data. + +Data servers divide operations between Historical and MiddleManager services. + +#### Historical service +[Historical](https://druid.apache.org/docs/latest/design/historical/) services handle storage and querying on historical data, including any streaming data that has been in the system long enough to be committed. Historical services download segments from deep storage and respond to queries about these segments. They don't accept writes. + +#### MiddleManager service +[MiddleManager](https://druid.apache.org/docs/latest/design/middlemanager) services handle ingestion of new data into the cluster. They are responsible for reading from external data sources and publishing new Druid segments. + +## External dependencies +In addition to its built-in service types, Druid also has three external dependencies. These are intended to be able to leverage existing infrastructure, where present. + +### Deep storage +Druid uses deep storage to store any data that has been ingested into the system. Deep storage is shared file storage accessible by every Druid server. In a clustered deployment, this is typically a distributed object store like S3 or HDFS, or a network mounted filesystem. In a single-server deployment, this is typically local disk. + +Druid uses deep storage for the following purposes: + +- To store all the data you ingest. Segments that get loaded onto Historical services for low latency queries are also kept in deep storage for backup purposes. Additionally, segments that are only in deep storage can be used for queries from deep storage. +- As a way to transfer data in the background between Druid services. Druid stores data in files called segments. + +Historical services cache data segments on local disk and serve queries from that cache as well as from an in-memory cache. Segments on disk for Historical services provide the low latency querying performance Druid is known for. + +You can also query directly from deep storage. When you query segments that exist only in deep storage, you trade some performance for the ability to query more of your data without necessarily having to scale your Historical services. + +When determining sizing for your storage, keep the following in mind: + +- Deep storage needs to be able to hold all the data that you ingest into Druid. +- On disk storage for Historical services need to be able to accommodate the data you want to load onto them to run queries. The data on Historical services should be data you access frequently and need to run low latency queries for. + +- Deep storage is an important part of Druid's elastic, fault-tolerant design. Druid bootstraps from deep storage even if every single data server is lost and re-provisioned. + +For more details, please see the [Deep storage](https://druid.apache.org/docs/latest/design/deep-storage/) page. + +### Metadata storage +The metadata storage holds various shared system metadata such as segment usage information and task information. In a clustered deployment, this is typically a traditional RDBMS like PostgreSQL or MySQL. In a single-server deployment, it is typically a locally-stored Apache Derby database. + +For more details, please see the [Metadata storage](https://druid.apache.org/docs/latest/design/metadata-storage/) page. + +### ZooKeeper +Used for internal service discovery, coordination, and leader election. + +For more details, please see the [ZooKeeper](https://druid.apache.org/docs/latest/design/zookeeper/) page. + + +## Next Steps + +- [Deploy Druid Cluster](/docs/guides/druid/clustering/overview/index.md) using KubeDB. +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md) diff --git a/docs/guides/druid/concepts/_index.md b/docs/guides/druid/concepts/_index.md index 67c3be7748..a5c61e7e6b 100755 --- a/docs/guides/druid/concepts/_index.md +++ b/docs/guides/druid/concepts/_index.md @@ -7,4 +7,4 @@ menu: parent: guides-druid weight: 20 menu_name: docs_{{ .version }} ---- +--- \ No newline at end of file diff --git a/docs/guides/druid/concepts/appbinding.md b/docs/guides/druid/concepts/appbinding.md index 60f9b5bb4d..02c4750799 100644 --- a/docs/guides/druid/concepts/appbinding.md +++ b/docs/guides/druid/concepts/appbinding.md @@ -22,218 +22,127 @@ If you deploy a database using [KubeDB](https://kubedb.com/docs/latest/welcome/) 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) +## 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 Druid database is shown below, -[//]: # () -[//]: # (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.) +```yaml +apiVersion: appcatalog.appscode.com/v1alpha1 +kind: AppBinding +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubedb.com/v1alpha2","kind":"Druid","metadata":{"annotations":{},"name":"druid-quickstart","namespace":"demo"},"spec":{"deepStorage":{"configSecret":{"name":"deep-storage-config"},"type":"s3"},"topology":{"routers":{"replicas":1}},"version":"28.0.1"}} + creationTimestamp: "2024-10-16T13:28:40Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: druid-quickstart + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: druids.kubedb.com + name: druid-quickstart + namespace: demo + ownerReferences: + - apiVersion: kubedb.com/v1alpha2 + blockOwnerDeletion: true + controller: true + kind: Druid + name: druid-quickstart + uid: 06dc7c5f-65ad-4310-a203-b18c0d33d662 + resourceVersion: "45154" + uid: 58861709-99f9-4c78-8cf9-b5dc6534102e +spec: + appRef: + apiGroup: kubedb.com + kind: Druid + name: druid-quickstart + namespace: demo + clientConfig: + caBundle: dGhpcyBpcyBub3QgYSBjZXJ0 + service: + name: druid-quickstart-pods + port: 8888 + scheme: http + url: http://druid-quickstart-coordinators-0.druid-quickstart-pods.demo.svc.cluster.local:8081,http://druid-quickstart-overlords-0.druid-quickstart-pods.demo.svc.cluster.local:8090,http://druid-quickstart-middlemanagers-0.druid-quickstart-pods.demo.svc.cluster.local:8091,http://druid-quickstart-historicals-0.druid-quickstart-pods.demo.svc.cluster.local:8083,http://druid-quickstart-brokers-0.druid-quickstart-pods.demo.svc.cluster.local:8082,http://druid-quickstart-routers-0.druid-quickstart-pods.demo.svc.cluster.local:8888 + secret: + name: druid-quickstart-admin-cred + tlsSecret: + name: druid-client-cert + type: kubedb.com/druid + version: 28.0.1 +``` +Here, we are going to describe the sections of an `AppBinding` crd. -[//]: # () -[//]: # (An `AppBinding` object created by `KubeDB` for PostgreSQL database is shown below,) +### AppBinding `Spec` -[//]: # () -[//]: # (```yaml) +An `AppBinding` object has the following fields in the `spec` section: -[//]: # (apiVersion: appcatalog.appscode.com/v1alpha1) +#### spec.type -[//]: # (kind: AppBinding) +`spec.type` is an optional field that indicates the type of the app that this `AppBinding` is pointing to. -[//]: # (metadata:) + + -[//]: # ( app.kubernetes.io/instance: quick-postgres) +#### spec.secret -[//]: # ( app.kubernetes.io/managed-by: kubedb.com) +`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`. -[//]: # ( app.kubernetes.io/name: postgres) +This secret must contain the following keys for Druid: -[//]: # ( app.kubernetes.io/version: "10.2"-v2) +| Key | Usage | +| ---------- |------------------------------------------------| +| `username` | Username of the target Druid instance. | +| `password` | Password for the user specified by `username`. | -[//]: # ( app.kubernetes.io/name: postgreses.kubedb.com) -[//]: # ( app.kubernetes.io/instance: quick-postgres) +#### spec.appRef +appRef refers to the underlying application. It has 4 fields named `apiGroup`, `kind`, `name` & `namespace`. -[//]: # (spec:) +#### spec.clientConfig -[//]: # ( type: kubedb.com/postgres) +`spec.clientConfig` defines how to communicate with the target database. You can use either a URL or a Kubernetes service to connect with the database. You don't have to specify both of them. -[//]: # ( secret:) +You can configure following fields in `spec.clientConfig` section: -[//]: # ( name: quick-postgres-auth) +- **spec.clientConfig.url** -[//]: # ( clientConfig:) + `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 the Kubernetes cluster. If your database is running inside the cluster, use `spec.clientConfig.service` section instead. -[//]: # ( service:) +> 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. -[//]: # ( name: quick-postgres) +- **spec.clientConfig.service** -[//]: # ( path: /) + 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. -[//]: # ( port: 5432) + - **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. -[//]: # ( query: sslmode=disable) +- **spec.clientConfig.insecureSkipTLSVerify** -[//]: # ( scheme: postgresql) + `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. -[//]: # ( secretTransforms:) +- **spec.clientConfig.caBundle** -[//]: # ( - renameKey:) + `spec.clientConfig.caBundle` is a PEM encoded CA bundle which will be used to validate the serving certificate of the database. -[//]: # ( from: POSTGRES_USER) +## Next Steps -[//]: # ( to: username) - -[//]: # ( - renameKey:) - -[//]: # ( from: POSTGRES_PASSWORD) - -[//]: # ( to: password) - -[//]: # ( version: "10.2") - -[//]: # (```) - -[//]: # () -[//]: # (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: `postgres`). |) - -[//]: # (| `TARGET_APP_TYPE` | Represents the complete type of the application. It's simply `TARGET_APP_GROUP/TARGET_APP_RESOURCE` (i.e: `kubedb.com/postgres`). |) - -[//]: # () -[//]: # (#### 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:) - -[//]: # () -[//]: # (PostgreSQL :) - -[//]: # () -[//]: # (| Key | Usage |) - -[//]: # (| ------------------- | --------------------------------------------------- |) - -[//]: # (| `POSTGRES_USER` | Username of the target database. |) - -[//]: # (| `POSTGRES_PASSWORD` | Password for the user specified by `POSTGRES_USER`. |) - -[//]: # () -[//]: # (MySQL :) - -[//]: # () -[//]: # (| Key | Usage |) - -[//]: # (| ---------- | ---------------------------------------------- |) - -[//]: # (| `username` | Username of the target database. |) - -[//]: # (| `password` | Password for the user specified by `username`. |) - -[//]: # () -[//]: # (MongoDB :) - -[//]: # () -[//]: # (| Key | Usage |) - -[//]: # (| ---------- | ---------------------------------------------- |) - -[//]: # (| `username` | Username of the target database. |) - -[//]: # (| `password` | Password for the user specified by `username`. |) - -[//]: # () -[//]: # (Elasticsearch:) - -[//]: # () -[//]: # (| Key | Usage |) - -[//]: # (| ---------------- | ----------------------- |) - -[//]: # (| `ADMIN_USERNAME` | Admin username |) - -[//]: # (| `ADMIN_PASSWORD` | Password for admin user |) - -[//]: # () -[//]: # (#### 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).) +- 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). diff --git a/docs/guides/druid/concepts/catalog.md b/docs/guides/druid/concepts/catalog.md deleted file mode 100644 index 57ef475dc8..0000000000 --- a/docs/guides/druid/concepts/catalog.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: DruidVersion CRD -menu: - docs_{{ .version }}: - identifier: guides-druid-concepts-catalog - name: DruidVersion - parent: guides-druid-concepts - weight: 15 -menu_name: docs_{{ .version }} -section_menu_id: guides ---- - -> New to KubeDB? Please start [here](/docs/README.md). - -# DruidVersion - -[//]: # (## What is DruidVersion) - -[//]: # () -[//]: # (`DruidVersion` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration to specify the docker images to be used for [PgBouncer](https://pgbouncer.github.io/) server deployed with KubeDB in a Kubernetes native way.) - -[//]: # () -[//]: # (When you install KubeDB, a `DruidVersion` custom resource will be created automatically for every supported PgBouncer release versions. You have to specify the name of `DruidVersion` crd in `spec.version` field of [PgBouncer](/docs/guides/pgbouncer/concepts/pgbouncer.md) crd. Then, KubeDB will use the docker images specified in the `DruidVersion` crd to create your expected PgBouncer instance.) - -[//]: # () -[//]: # (Using a separate crd for specifying respective docker image names allow us to modify the images independent of KubeDB operator. This will also allow the users to use a custom PgBouncer image for their server. For more details about how to use custom image with PgBouncer in KubeDB, please visit [here](/docs/guides/pgbouncer/custom-versions/setup.md).) - -[//]: # (## DruidVersion Specification) - -[//]: # () -[//]: # (As with all other Kubernetes objects, a DruidVersion needs `apiVersion`, `kind`, and `metadata` fields. It also needs a `.spec` section.) - -[//]: # () -[//]: # (```yaml) - -[//]: # (apiVersion: catalog.kubedb.com/v1alpha1) - -[//]: # (kind: DruidVersion) - -[//]: # (metadata:) - -[//]: # ( name: "1.17.0") - -[//]: # ( labels:) - -[//]: # ( app: kubedb) - -[//]: # (spec:) - -[//]: # ( deprecated: false) - -[//]: # ( version: "1.17.0") - -[//]: # ( pgBouncer:) - -[//]: # ( image: "${KUBEDB_CATALOG_REGISTRY}/pgbouncer:1.17.0") - -[//]: # ( exporter:) - -[//]: # ( image: "${KUBEDB_CATALOG_REGISTRY}/pgbouncer_exporter:v0.1.1") - -[//]: # (```) - -[//]: # () -[//]: # (### metadata.name) - -[//]: # () -[//]: # (`metadata.name` is a required field that specifies the name of the `DruidVersion` crd. You have to specify this name in `spec.version` field of [PgBouncer](/docs/guides/pgbouncer/concepts/pgbouncer.md) crd.) - -[//]: # () -[//]: # (We follow this convention for naming DruidVersion crd:) - -[//]: # () -[//]: # (- Name format: `{Original pgbouncer image version}-{modification tag}`) - -[//]: # () -[//]: # (We plan to modify original PgBouncer docker images to support additional features. Re-tagging the image with v1, v2 etc. modification tag helps separating newer iterations from the older ones. An image with higher modification tag will have more features than the images with lower modification tag. Hence, it is recommended to use DruidVersion crd with highest modification tag to take advantage of the latest features.) - -[//]: # () -[//]: # (### spec.version) - -[//]: # () -[//]: # (`spec.version` is a required field that specifies the original version of PgBouncer that has been used to build the docker image specified in `spec.server.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 `true`, KubeDB operator will not create the server and other respective resources for this version.) - -[//]: # () -[//]: # (### spec.pgBouncer.image) - -[//]: # () -[//]: # (`spec.pgBouncer.image` is a required field that specifies the docker image which will be used to create Petset by KubeDB operator to create expected PgBouncer server.) - -[//]: # () -[//]: # (### spec.exporter.image) - -[//]: # () -[//]: # (`spec.exporter.image` is a required field that specifies the image which will be used to export Prometheus metrics.) - -[//]: # (## Next Steps) - -[//]: # () -[//]: # (- Learn about PgBouncer crd [here](/docs/guides/pgbouncer/concepts/catalog.md).) - -[//]: # (- Deploy your first PgBouncer server with KubeDB by following the guide [here](/docs/guides/pgbouncer/quickstart/quickstart.md).) \ No newline at end of file diff --git a/docs/guides/druid/concepts/druid.md b/docs/guides/druid/concepts/druid.md index 41824e7cfe..5d3ad66d29 100644 --- a/docs/guides/druid/concepts/druid.md +++ b/docs/guides/druid/concepts/druid.md @@ -12,357 +12,518 @@ section_menu_id: guides > New to KubeDB? Please start [here](/docs/README.md). - # Druid -[//]: # () -[//]: # (## What is PgBouncer) - -[//]: # () -[//]: # (`PgBouncer` is a Kubernetes `Custom Resource Definitions` (CRD). It provides declarative configuration for [PgBouncer](https://www.pgbouncer.github.io/) in a Kubernetes native way. You only need to describe the desired configurations in a `PgBouncer` object, and the KubeDB operator will create Kubernetes resources in the desired state for you.) - -[//]: # () -[//]: # (## PgBouncer Spec) - -[//]: # () -[//]: # (Like any official Kubernetes resource, a `PgBouncer` object has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections.) - -[//]: # () -[//]: # (Below is an example PgBouncer object.) - -[//]: # () -[//]: # (```yaml) - -[//]: # (apiVersion: kubedb.com/v1alpha2) - -[//]: # (kind: PgBouncer) - -[//]: # (metadata:) - -[//]: # ( name: pgbouncer-server) - -[//]: # ( namespace: demo) - -[//]: # (spec:) - -[//]: # ( version: "1.18.0") - -[//]: # ( replicas: 2) - -[//]: # ( databases:) - -[//]: # ( - alias: "postgres") - -[//]: # ( databaseName: "postgres") - -[//]: # ( databaseRef:) - -[//]: # ( name: "quick-postgres") - -[//]: # ( namespace: demo) - -[//]: # ( connectionPool:) - -[//]: # ( maxClientConnections: 20) - -[//]: # ( reservePoolSize: 5) - -[//]: # ( monitor:) - -[//]: # ( agent: prometheus.io/operator) - -[//]: # ( prometheus:) - -[//]: # ( serviceMonitor:) - -[//]: # ( labels:) - -[//]: # ( release: prometheus) - -[//]: # ( interval: 10s) - -[//]: # (```) - -[//]: # () -[//]: # (### spec.version) - -[//]: # () -[//]: # (`spec.version` is a required field that specifies the name of the [PgBouncerVersion](/docs/guides/pgbouncer/concepts/catalog.md) crd where the docker images are specified. Currently, when you install KubeDB, it creates the following `PgBouncerVersion` resources,) - -[//]: # () -[//]: # (- `1.18.0`) - -[//]: # () -[//]: # (### spec.replicas) - -[//]: # () -[//]: # (`spec.replicas` specifies the total number of available pgbouncer server nodes for each crd. KubeDB uses `PodDisruptionBudget` to ensure that majority of the replicas are available during [voluntary disruptions](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#voluntary-and-involuntary-disruptions).) - -[//]: # () -[//]: # (### spec.databases) - -[//]: # () -[//]: # (`spec.databases` specifies an array of postgres databases that pgbouncer should add to its connection pool. It contains three `required` fields and two `optional` fields for each database connection.) - -[//]: # () -[//]: # (- `spec.databases.alias`: specifies an alias for the target database located in a postgres server specified by an appbinding.) - -[//]: # (- `spec.databases.databaseName`: specifies the name of the target database.) - -[//]: # (- `spec.databases.databaseRef`: specifies the name and namespace of the AppBinding that contains the path to a PostgreSQL server where the target database can be found.) - -[//]: # () -[//]: # (ConnectionPool is used to configure pgbouncer connection-pool. All the fields here are accompanied by default values and can be left unspecified if no customisation is required by the user.) - -[//]: # () -[//]: # (- `spec.connectionPool.port`: specifies the port on which pgbouncer should listen to connect with clients. The default is 5432.) - -[//]: # () -[//]: # (- `spec.connectionPool.poolMode`: specifies the value of pool_mode. Specifies when a server connection can be reused by other clients.) - -[//]: # () -[//]: # ( - session) - -[//]: # () -[//]: # ( Server is released back to pool after client disconnects. Default.) - -[//]: # () -[//]: # ( - transaction) - -[//]: # () -[//]: # ( Server is released back to pool after transaction finishes.) +## What is Druid + +`Druid` is a Kubernetes `Custom Resource Definitions` (CRD). It provides declarative configuration for [Druid](https://druid.apache.org/) in a Kubernetes native way. You only need to describe the desired database configuration in a `Druid`object, and the KubeDB operator will create Kubernetes objects in the desired state for you. + +## Druid Spec + +As with all other Kubernetes objects, a Druid needs `apiVersion`, `kind`, and `metadata` fields. It also needs a `.spec` section. Below is an example Druid object. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid + namespace: demo +spec: + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + metadataStorage: + type: PostgreSQL + name: pg-demo + namespace: demo + externallyManaged: true + zookeeperRef: + name: zk-demo + namespace: demo + externallyManaged: true + authSecret: + name: druid-admin-cred + configSecret: + name: druid-custom-config + enableSSL: true + healthChecker: + failureThreshold: 3 + periodSeconds: 20 + timeoutSeconds: 10 + keystoreCredSecret: + name: druid-keystore-cred + deletionPolicy: DoNotTerminate + tls: + certificates: + - alias: server + secretName: druid-server-cert + - alias: client + secretName: druid-client-cert + issuerRef: + apiGroup: cert-manager.io + kind: Issuer + name: druid-ca-issuer + topology: + coordinators: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + overlords: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + brokers: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + routers: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + middleManagers: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageClassName: standard + historicals: + podTemplate: + spec: + containers: + - name: druid + resources: + requests: + cpu: 500m + memory: 1024Mi + limits: + cpu: 700m + memory: 2Gi + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageClassName: standard + monitor: + agent: prometheus.io/operator + prometheus: + exporter: + port: 56790 + serviceMonitor: + labels: + release: prometheus + interval: 10s + version: 30.0.0 +``` + +### spec.version + +`spec.version` is a required field specifying the name of the [DruidVersion](/docs/guides/druid/concepts/druidversion.md) crd where the docker images are specified. Currently, when you install KubeDB, it creates the following `Druid` resources, + +- `28.0.1` +- `30.0.0` + +### spec.replicas + +`spec.replicas` the number of members in Druid replicaset. + +If `spec.topology` is set, then `spec.replicas` needs to be empty. Instead use `spec.topology.controller.replicas` and `spec.topology.broker.replicas`. You need to set both of them for topology clustering. + +KubeDB uses `PodDisruptionBudget` to ensure that majority of these replicas are available during [voluntary disruptions](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#voluntary-and-involuntary-disruptions) so that quorum is maintained. + +### spec.authSecret + +`spec.authSecret` is an optional field that points to a Secret used to hold credentials for `druid` admin user. If not set, KubeDB operator creates a new Secret `{druid-object-name}-auth` for storing the password for `admin` user for each Druid object. + +We can use this field in 3 mode. +1. Using an external secret. In this case, You need to create an auth secret first with required fields, then specify the secret name when creating the Druid object using `spec.authSecret.name` & set `spec.authSecret.externallyManaged` to true. +```yaml +authSecret: + name: + externallyManaged: true +``` + +2. Specifying the secret name only. In this case, You need to specify the secret name when creating the Druid object using `spec.authSecret.name`. `externallyManaged` is by default false. +```yaml +authSecret: + name: +``` + +3. Let KubeDB do everything for you. In this case, no work for you. + +AuthSecret contains a `user` key and a `password` key which contains the `username` and `password` respectively for Druid `admin` user. + +Example: + +```bash +$ kubectl create secret generic druid-auth -n demo \ +--from-literal=username=jhon-doe \ +--from-literal=password=6q8u_2jMOW-OOZXk +secret "druid-auth" created +``` -[//]: # () -[//]: # ( - statement) +```yaml +apiVersion: v1 +data: + password: NnE4dV8yak1PVy1PT1pYaw== + username: amhvbi1kb2U= +kind: Secret +metadata: + name: druid-auth + namespace: demo +type: Opaque +``` -[//]: # () -[//]: # ( Server is released back to pool after query finishes. Long transactions spanning multiple statements are disallowed in this mode.) +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). -[//]: # () -[//]: # (- `spec.connectionPool.maxClientConnections`: specifies the value of max_client_conn. When increased then the file descriptor limits should also be increased. Note that actual number of file descriptors used is more than max_client_conn. Theoretical maximum used is:) +### spec.configSecret -[//]: # () -[//]: # ( ```bash) +`spec.configSecret` is an optional field that points to a Secret used to hold custom Druid configuration. If not set, KubeDB operator will use default configuration for Druid. -[//]: # ( max_client_conn + (max pool_size * total databases * total users)) +### spec.topology -[//]: # ( ```) +`spec.topology` represents the topology configuration for Druid cluster in KRaft mode. -[//]: # () -[//]: # ( if each user connects under its own username to server. If a database user is specified in connect string (all users connect under same username), the theoretical maximum is:) +When `spec.topology` is set, the following fields needs to be empty, otherwise validating webhook will throw error. -[//]: # () -[//]: # ( ```bash) +- `spec.replicas` +- `spec.podTemplate` +- `spec.storage` -[//]: # ( max_client_conn + (max pool_size * total databases)) +#### spec.topology.coordinators -[//]: # ( ```) +`coordinators` represents configuration for coordinators node of Druid. It is a mandatory node. So, if not mentioned in the `YAML`, this node will be initialized by `KubeDB` operator. -[//]: # () -[//]: # ( The theoretical maximum should be never reached, unless somebody deliberately crafts special load for it. Still, it means you should set the number of file descriptors to a safely high number.) +Available configurable fields: -[//]: # () -[//]: # ( Search for `ulimit` in your favorite shell man page. Note: `ulimit` does not apply in a Windows environment.) +- `topology.coordinators`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `coordinators` pods. Defaults to `1`. + - `suffix` (`: "coordinators"`) - is an `optional` field that is added as the suffix of the coordinators PetSet name. Defaults to `coordinators`. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `coordinators` pods. -[//]: # () -[//]: # ( Default: 100) +#### spec.topology.overlords -[//]: # () -[//]: # (- `spec.connectionPool.defaultPoolSize`: specifies the value of default_pool_size. Used to determine how many server connections to allow per user/database pair. Can be overridden in the per-database configuration.) +`overlords` represents configuration for overlords node of Druid. It is an optional node. So, it is only going to be deployed by the `KubeDB` operator if explicitly mentioned in the `YAML`. Otherwise, `coordinators` node will act as `overlords`. -[//]: # () -[//]: # ( Default: 20) +Available configurable fields: -[//]: # () -[//]: # (- `spec.connectionPool.minPoolSize`: specifies the value of min_pool_size. PgBouncer adds more server connections to pool if below this number. Improves behavior when usual load comes suddenly back after period of total inactivity.) +- `topology.overlords`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `overlords` pods. Defaults to `1`. + - `suffix` (`: "overlords"`) - is an `optional` field that is added as the suffix of the overlords PetSet name. Defaults to `overlords`. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `overlords` pods. -[//]: # () -[//]: # ( Default: 0 (disabled)) +#### spec.topology.brokers -[//]: # () -[//]: # (- `spec.connectionPool.reservePoolSize`: specifies the value of reserve_pool_size. Used to determine how many additional connections to allow to a pool. 0 disables.) +`brokers` represents configuration for brokers node of Druid. It is a mandatory node. So, if not mentioned in the `YAML`, this node will be initialized by `KubeDB` operator. -[//]: # () -[//]: # ( Default: 0 (disabled)) +Available configurable fields: -[//]: # () -[//]: # (- `spec.connectionPool.reservePoolTimeout`: specifies the value of reserve_pool_timeout. If a client has not been serviced in this many seconds, pgbouncer enables use of additional connections from reserve pool. 0 disables.) +- `topology.brokers`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `brokers` pods. Defaults to `1`. + - `suffix` (`: "brokers"`) - is an `optional` field that is added as the suffix of the brokers PetSet name. Defaults to `brokers`. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `brokers` pods. -[//]: # () -[//]: # ( Default: 5.0) +#### spec.topology.routers -[//]: # () -[//]: # (- `spec.connectionPool.maxDbConnections`: specifies the value of max_db_connections. PgBouncer does not allow more than this many connections per-database (regardless of pool - i.e. user). It should be noted that when you hit the limit, closing a client connection to one pool will not immediately allow a server connection to be established for another pool, because the server connection for the first pool is still open. Once the server connection closes (due to idle timeout), a new server connection will immediately be opened for the waiting pool.) +`routers` represents configuration for routers node of Druid. It is an optional node. So, it is only going to be deployed by the `KubeDB` operator if explicitly mentioned in the `YAML`. Otherwise, `coordinators` node will act as `routers`. -[//]: # () -[//]: # ( Default: unlimited) +Available configurable fields: -[//]: # () -[//]: # (- `spec.connectionPool.maxUserConnections`: specifies the value of max_user_connections. PgBouncer does not allow more than this many connections per-user (regardless of pool - i.e. user). It should be noted that when you hit the limit, closing a client connection to one pool will not immediately allow a server connection to be established for another pool, because the server connection for the first pool is still open. Once the server connection closes (due to idle timeout), a new server connection will immediately be opened for the waiting pool.) +- `topology.routers`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `routers` pods. Defaults to `1`. + - `suffix` (`: "routers"`) - is an `optional` field that is added as the suffix of the routers PetSet name. Defaults to `routers`. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `routers` pods. -[//]: # ( Default: unlimited) +#### spec.topology.historicals -[//]: # () -[//]: # (- `spec.connectionPool.statsPeriod`: sets how often the averages shown in various `SHOW` commands are updated and how often aggregated statistics are written to the log.) +`historicals` represents configuration for historicals node of Druid. It is a mandatory node. So, if not mentioned in the `YAML`, this node will be initialized by `KubeDB` operator. -[//]: # ( Default: 60) +Available configurable fields: -[//]: # () -[//]: # (- `spec.connectionPool.authType`: specifies how to authenticate users. PgBouncer supports several authentication methods including pam, md5, scram-sha-256, trust , or any. However hba, and cert are not supported.) +- `topology.historicals`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `historicals` pods. Defaults to `1`. + - `suffix` (`: "historicals"`) - is an `optional` field that is added as the suffix of the controller PetSet name. Defaults to `historicals`. + - `storage` is a `required` field that specifies how much storage to claim for each of the `historicals` pods. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `historicals` pods. -[//]: # () -[//]: # (- `spec.connectionPool.IgnoreStartupParameters`: specifies comma-separated startup parameters that pgbouncer knows are handled by admin and it can ignore them.) +#### spec.topology.middleManagers -[//]: # () -[//]: # (### spec.monitor) +`middleManagers` represents configuration for middleManagers node of Druid. It is a mandatory node. So, if not mentioned in the `YAML`, this node will be initialized by `KubeDB` operator. -[//]: # () -[//]: # (PgBouncer managed by KubeDB can be monitored with builtin-Prometheus and Prometheus operator out-of-the-box. To learn more,) +Available configurable fields: -[//]: # () -[//]: # (- [Monitor PgBouncer with builtin Prometheus](/docs/guides/pgbouncer/monitoring/using-builtin-prometheus.md)) +- `topology.middleManagers`: + - `replicas` (`: "1"`) - is an `optional` field to specify the number of nodes (ie. pods ) that act as the dedicated Druid `middleManagers` pods. Defaults to `1`. + - `suffix` (`: "middleManagers"`) - is an `optional` field that is added as the suffix of the controller PetSet name. Defaults to `middleManagers`. + - `storage` is a `required` field that specifies how much storage to claim for each of the `middleManagers` pods. + - `resources` (`: "cpu: 500m, memory: 1Gi" `) - is an `optional` field that specifies how much computational resources to request or to limit for each of the `middleManagers` pods. -[//]: # (- [Monitor PgBouncer with Prometheus operator](/docs/guides/pgbouncer/monitoring/using-prometheus-operator.md)) -[//]: # () -[//]: # (### spec.podTemplate) +### spec.enableSSL -[//]: # () -[//]: # (KubeDB allows providing a template for pgbouncer pods through `spec.podTemplate`. KubeDB operator will pass the information provided in `spec.podTemplate` to the PetSet created for PgBouncer server) +`spec.enableSSL` is an `optional` field that specifies whether to enable TLS to HTTP layer. The default value of this field is `false`. -[//]: # () -[//]: # (KubeDB accept following fields to set in `spec.podTemplate:`) +```yaml +spec: + enableSSL: true +``` -[//]: # () -[//]: # (- metadata) +### spec.tls -[//]: # ( - annotations (pod's annotation)) +`spec.tls` specifies the TLS/SSL configurations. The KubeDB operator supports TLS management by using the [cert-manager](https://cert-manager.io/). Currently, the operator only supports the `PKCS#8` encoded certificates. -[//]: # (- controller) +```yaml +spec: + tls: + issuerRef: + apiGroup: "cert-manager.io" + kind: Issuer + name: druid-issuer + certificates: + - alias: server + privateKey: + encoding: PKCS8 + secretName: druid-client-cert + subject: + organizations: + - kubedb + - alias: http + privateKey: + encoding: PKCS8 + secretName: druid-server-cert + subject: + organizations: + - kubedb +``` -[//]: # ( - annotations (petset's annotation)) +The `spec.tls` contains the following fields: -[//]: # (- spec:) +- `tls.issuerRef` - is an `optional` field that references to the `Issuer` or `ClusterIssuer` custom resource object of [cert-manager](https://cert-manager.io/docs/concepts/issuer/). It is used to generate the necessary certificate secrets for Druid. If the `issuerRef` is not specified, the operator creates a self-signed CA and also creates necessary certificate (valid: 365 days) secrets using that CA. + - `apiGroup` - is the group name of the resource that is being referenced. Currently, the only supported value is `cert-manager.io`. + - `kind` - is the type of resource that is being referenced. The supported values are `Issuer` and `ClusterIssuer`. + - `name` - is the name of the resource ( `Issuer` or `ClusterIssuer` ) that is being referenced. -[//]: # ( - env) +- `tls.certificates` - is an `optional` field that specifies a list of certificate configurations used to configure the certificates. It has the following fields: + - `alias` - represents the identifier of the certificate. It has the following possible value: + - `server` - is used for the server certificate configuration. + - `client` - is used for the client certificate configuration. -[//]: # ( - resources) + - `secretName` - ( `string` | `"-alias-cert"` ) - specifies the k8s secret name that holds the certificates. -[//]: # ( - initContainers) + - `subject` - specifies an `X.509` distinguished name (DN). It has the following configurable fields: + - `organizations` ( `[]string` | `nil` ) - is a list of organization names. + - `organizationalUnits` ( `[]string` | `nil` ) - is a list of organization unit names. + - `countries` ( `[]string` | `nil` ) - is a list of country names (ie. Country Codes). + - `localities` ( `[]string` | `nil` ) - is a list of locality names. + - `provinces` ( `[]string` | `nil` ) - is a list of province names. + - `streetAddresses` ( `[]string` | `nil` ) - is a list of street addresses. + - `postalCodes` ( `[]string` | `nil` ) - is a list of postal codes. + - `serialNumber` ( `string` | `""` ) is a serial number. -[//]: # ( - imagePullSecrets) + For more details, visit [here](https://golang.org/pkg/crypto/x509/pkix/#Name). -[//]: # ( - affinity) + - `duration` ( `string` | `""` ) - is the period during which the certificate is valid. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as `"300m"`, `"1.5h"` or `"20h45m"`. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". + - `renewBefore` ( `string` | `""` ) - is a specifiable time before expiration duration. + - `dnsNames` ( `[]string` | `nil` ) - is a list of subject alt names. + - `ipAddresses` ( `[]string` | `nil` ) - is a list of IP addresses. + - `uris` ( `[]string` | `nil` ) - is a list of URI Subject Alternative Names. + - `emailAddresses` ( `[]string` | `nil` ) - is a list of email Subject Alternative Names. -[//]: # ( - tolerations) -[//]: # ( - priorityClassName) +### spec..storageType -[//]: # ( - priority) +`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 Druid cluster using [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) volume. -[//]: # ( - lifecycle) +### spec..storage -[//]: # () -[//]: # (Usage of some fields in `spec.podTemplate` is described below,) +If you set `spec..storageType:` to `Durable`, then `spec..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. -[//]: # () -[//]: # (#### spec.podTemplate.spec.env) +- `spec..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. +- `spec..storage.accessModes` uses the same conventions as Kubernetes PVCs when requesting storage with specific access modes. +- `spec..storage.resources` can be used to request specific quantities of storage. This follows the same resource model used by PVCs. -[//]: # () -[//]: # (`spec.podTemplate.spec.env` is an optional field that specifies the environment variables to pass to the PgBouncer docker image. To know about supported environment variables, please visit [here](https://hub.docker.com/kubedb/pgbouncer/).) +To learn how to configure `spec..storage`, please visit the links below: -[//]: # () -[//]: # (Also, note that KubeDB does not allow updates to the environment variables as updating them does not have any effect once the server is created. If you try to update environment variables, KubeDB operator will reject the request with following error,) +- https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims -[//]: # () -[//]: # (```ini) +### spec.monitor -[//]: # (Error from server (BadRequest): error when applying patch:) +Druid managed by KubeDB can be monitored with Prometheus operator out-of-the-box. To learn more, +- [Monitor Apache Druid with Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md) +- [Monitor Apache Druid with Built-in Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md) -[//]: # (...) +### spec..podTemplate -[//]: # (for: "./pgbouncer.yaml": admission webhook "pgbouncer.validators.kubedb.com" denied the request: precondition failed for:) +KubeDB allows providing a template for database pod through `spec..podTemplate`. KubeDB operator will pass the information provided in `spec..podTemplate` to the PetSet created for Druid cluster. -[//]: # (...) +KubeDB accept following fields to set in `spec..podTemplate:` -[//]: # (At least one of the following was changed:) +- metadata: + - annotations (pod's annotation) + - labels (pod's labels) +- controller: + - annotations (petset's annotation) + - labels (petset's labels) +- spec: + - containers + - volumes + - podPlacementPolicy + - initContainers + - containers + - imagePullSecrets + - nodeSelector + - affinity + - serviceAccountName + - schedulerName + - tolerations + - priorityClassName + - priority + - securityContext + - livenessProbe + - readinessProbe + - lifecycle -[//]: # ( apiVersion) +You can check out the full list [here](https://github.com/kmodules/offshoot-api/blob/master/api/v2/types.go#L26C1-L279C1). +Uses of some field of `spec..podTemplate` is described below, -[//]: # ( kind) +#### spec..podTemplate.spec.tolerations -[//]: # ( name) +The `spec.podTemplate.spec.tolerations` is an optional field. This can be used to specify the pod's tolerations. -[//]: # ( namespace) +#### spec..podTemplate.spec.volumes -[//]: # ( spec.podTemplate.spec.nodeSelector) +The `spec..podTemplate..volumes` is an optional field. This can be used to provide the list of volumes that can be mounted by containers belonging to the pod. -[//]: # (```) +#### spec..podTemplate.spec.podPlacementPolicy -[//]: # () -[//]: # (#### spec.podTemplate.spec.imagePullSecrets) +`spec..podTemplate.spec.podPlacementPolicy` is an optional field. This can be used to provide the reference of the podPlacementPolicy. This will be used by our Petset controller to place the db pods throughout the region, zone & nodes according to the policy. It utilizes kubernetes affinity & podTopologySpreadContraints feature to do so. -[//]: # () -[//]: # (`spec.podTemplate.spec.imagePullSecrets` is an optional field that points to secrets to be used for pulling docker image if you are using a private docker registry. For more details on how to use private docker registry, please visit [here](/docs/guides/pgbouncer/private-registry/using-private-registry.md).) +#### spec..podTemplate.spec.nodeSelector -[//]: # () -[//]: # (#### spec.podTemplate.spec.nodeSelector) +`spec..podTemplate.spec.nodeSelector` is an optional field that specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). To learn more, see [here](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) . -[//]: # () -[//]: # (`spec.podTemplate.spec.nodeSelector` is an optional field that specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). To learn more, see [here](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) .) +### spec.serviceTemplates -[//]: # () -[//]: # (#### spec.podTemplate.spec.resources) +You can also provide template for the services created by KubeDB operator for Druid cluster through `spec.serviceTemplates`. This will allow you to set the type and other properties of the services. -[//]: # () -[//]: # (`spec.podTemplate.spec.resources` is an optional field. This can be used to request compute resources required by the database pods. To learn more, visit [here](http://kubernetes.io/docs/user-guide/compute-resources/).) +KubeDB allows following fields to set in `spec.serviceTemplates`: +- `alias` represents the identifier of the service. It has the following possible value: + - `stats` for is used for the `exporter` service identification. -[//]: # () -[//]: # (### spec.serviceTemplate) +Druid comes with four services for `coordinators`, `overlords`, `routers` and `brokers`. There are two options for providing serviceTemplates: + - To provide `serviceTemplates` for a specific service, the `serviceTemplates.ports.port` should be equal to the port of that service and `serviceTemplate` will be used for that particular service only. + - However, to provide a common `serviceTemplates`, `serviceTemplates.ports.port` should be empty. -[//]: # () -[//]: # (KubeDB creates a service for each PgBouncer instance. The service has the same name as the `pgbouncer.name` and points to pgbouncer pods.) +- metadata: + - labels + - annotations +- spec: + - type + - ports + - clusterIP + - externalIPs + - loadBalancerIP + - loadBalancerSourceRanges + - externalTrafficPolicy + - healthCheckNodePort + - sessionAffinityConfig -[//]: # () -[//]: # (You can provide template for this service using `spec.serviceTemplate`. This will allow you to set the type and other properties of the service. If `spec.serviceTemplate` is not provided, KubeDB will create a service of type `ClusterIP` with minimal settings.) +See [here](https://github.com/kmodules/offshoot-api/blob/kubernetes-1.21.1/api/v1/types.go#L237) to understand these fields in detail. -[//]: # () -[//]: # (KubeDB allows the following fields to set in `spec.serviceTemplate`:) -[//]: # () -[//]: # (- metadata:) +#### spec..podTemplate.spec.containers -[//]: # ( - annotations) +The `spec..podTemplate.spec.containers` can be used to provide the list containers and their configurations for to the database pod. some of the fields are described below, -[//]: # (- spec:) +##### spec..podTemplate.spec.containers[].name +The `spec..podTemplate.spec.containers[].name` field used to specify the name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. -[//]: # ( - type) +##### spec..podTemplate.spec.containers[].args +`spec..podTemplate.spec.containers[].args` is an optional field. This can be used to provide additional arguments to database installation. -[//]: # ( - ports) +##### spec..podTemplate.spec.containers[].env -[//]: # ( - clusterIP) +`spec..podTemplate.spec.containers[].env` is an optional field that specifies the environment variables to pass to the Redis containers. -[//]: # ( - externalIPs) +##### spec..podTemplate.spec.containers[].resources -[//]: # ( - loadBalancerIP) +`spec..podTemplate.spec.containers[].resources` is an optional field. This can be used to request compute resources required by containers of the database pods. To learn more, visit [here](http://kubernetes.io/docs/user-guide/compute-resources/). -[//]: # ( - loadBalancerSourceRanges) +### spec.deletionPolicy -[//]: # ( - externalTrafficPolicy) +`deletionPolicy` gives flexibility whether to `nullify`(reject) the delete operation of `Druid` crd or which resources KubeDB should keep or delete when you delete `Druid` crd. KubeDB provides following four deletion policies: -[//]: # ( - healthCheckNodePort) +- DoNotTerminate +- WipeOut +- Halt +- Delete -[//]: # ( - sessionAffinityConfig) +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`. -[//]: # () -[//]: # (See [here](https://github.com/kmodules/offshoot-api/blob/kubernetes-1.16.3/api/v1/types.go#L163) to understand these fields in detail.) +## 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) +Know details about KubeDB Health checking from this [blog post](https://appscode.com/blog/post/kubedb-health-checker/). -[//]: # () -[//]: # (- Learn how to use KubeDB to run a PostgreSQL database [here](/docs/guides/postgres/README.md).) +## Next Steps -[//]: # (- Learn how to how to get started with PgBouncer [here](/docs/guides/pgbouncer/quickstart/quickstart.md).) +- Learn how to use KubeDB to run Apache Druid cluster [here](/docs/guides/druid/README.md). +- Deploy [dedicated topology cluster](/docs/guides/druid/clustering/guide/index.md) for Apache Druid +- Monitor your Druid cluster with KubeDB using [`out-of-the-box` Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). +- Detail concepts of [DruidVersion object](/docs/guides/druid/concepts/druidversion.md). -[//]: # (- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md).) +[//]: # (- Learn to use KubeDB managed Druid objects using [CLIs](/docs/guides/druid/cli/cli.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/concepts/druidautoscaler.md b/docs/guides/druid/concepts/druidautoscaler.md new file mode 100644 index 0000000000..b22504ce2f --- /dev/null +++ b/docs/guides/druid/concepts/druidautoscaler.md @@ -0,0 +1,132 @@ +--- +title: DruidAutoscaler CRD +menu: + docs_{{ .version }}: + identifier: guides-druid-concepts-druidautoscaler + name: DruidAutoscaler + parent: guides-druid-concepts + weight: 50 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# DruidAutoscaler + +## What is DruidAutoscaler + +`DruidAutoscaler` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration for autoscaling [Druid](https://druid.apache.org/) compute resources and storage of database components in a Kubernetes native way. + +## DruidAutoscaler CRD Specifications + +Like any official Kubernetes resource, a `DruidAutoscaler` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here, some sample `DruidAutoscaler` CROs for autoscaling different components of database is given below: + +**Sample `DruidAutoscaler` for `druid` cluster:** + +```yaml +apiVersion: autoscaling.kubedb.com/v1alpha1 +kind: DruidAutoscaler +metadata: + name: dr-autoscaler + namespace: demo +spec: + databaseRef: + name: druid-prod + opsRequestOptions: + timeout: 3m + apply: IfReady + compute: + coordinators: + trigger: "On" + podLifeTimeThreshold: 24h + minAllowed: + cpu: 200m + memory: 300Mi + maxAllowed: + cpu: 1 + memory: 1Gi + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" + resourceDiffPercentage: 10 + brokers: + trigger: "On" + podLifeTimeThreshold: 24h + minAllowed: + cpu: 200m + memory: 300Mi + maxAllowed: + cpu: 1 + memory: 1Gi + controlledResources: ["cpu", "memory"] + containerControlledValues: "RequestsAndLimits" + resourceDiffPercentage: 10 + storage: + historicals: + expansionMode: "Online" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 50 + middleManagers: + expansionMode: "Online" + trigger: "On" + usageThreshold: 60 + scalingThreshold: 50 +``` + +Here, we are going to describe the various sections of a `DruidAutoscaler` crd. + +A `DruidAutoscaler` object has the following fields in the `spec` section. + +### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [Druid](/docs/guides/druid/concepts/druid.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 [Druid](/docs/guides/druid/concepts/druid.md) object. + +### spec.opsRequestOptions +These are the options to pass in the internally created opsRequest CRO. `opsRequestOptions` has two fields. + +### 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.coordinators` indicates the desired compute autoscaling configuration for coordinators of a topology Druid database. +- `spec.compute.overlords` indicates the desired compute autoscaling configuration for overlords of a topology Druid database. +- `spec.compute.brokers` indicates the desired compute autoscaling configuration for brokers of a topology Druid database. +- `spec.compute.routers` indicates the desired compute autoscaling configuration for routers of a topology Druid database. +- `spec.compute.historicals` indicates the desired compute autoscaling configuration for historicals of a topology Druid database. +- `spec.compute.middleManagers` indicates the desired compute autoscaling configuration for middleManagers of a topology Druid database. + + +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. + +There are two more fields, those are only specifiable for the percona variant inMemory databases. +- `inMemoryStorage.UsageThresholdPercentage` If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased. +- `inMemoryStorage.ScalingFactorPercentage` If db uses more than usageThresholdPercentage of the total memory, memoryStorage should be increased by this given scaling percentage. + +### spec.storage + +`spec.storage` specifies the autoscaling configuration for the storage resources of the database components. This field consists of the following sub-field: + +- `spec.storage.historicals` indicates the desired storage autoscaling configuration for historicals of a topology Druid cluster. +- `spec.storage.middleManagers` indicates the desired storage autoscaling configuration for middleManagers of a topology Druid cluster. + +> `spec.storage` is only supported for druid data nodes i.e. `historicals` and `middleManagers` as they are the only nodes containing volumes. + +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/druid/concepts/druidopsrequest.md b/docs/guides/druid/concepts/druidopsrequest.md new file mode 100644 index 0000000000..6a846814f2 --- /dev/null +++ b/docs/guides/druid/concepts/druidopsrequest.md @@ -0,0 +1,473 @@ +--- +title: DruidOpsRequest CRD +menu: + docs_{{ .version }}: + identifier: guides-druid-concepts-druidopsrequest + name: DruidOpsRequest + parent: guides-druid-concepts + weight: 40 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + + +> New to KubeDB? Please start [here](/docs/README.md). + +# DruidOpsRequest + +## What is DruidOpsRequest + +`DruidOpsRequest` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration for [Druid](https://druid.apache.org/) administrative operations like database version updating, horizontal scaling, vertical scaling etc. in a Kubernetes native way. + +## DruidOpsRequest CRD Specifications + +Like any official Kubernetes resource, a `DruidOpsRequest` has `TypeMeta`, `ObjectMeta`, `Spec` and `Status` sections. + +Here, some sample `DruidOpsRequest` CRs for different administrative operations is given below: + +**Sample `DruidOpsRequest` for updating database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: update-version + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: druid-prod + updateVersion: + targetVersion: 30.0.1 +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +**Sample `DruidOpsRequest` Objects for Horizontal Scaling of different component of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-hscale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: druid-prod + horizontalScaling: + topology: + coordinators: 2 + historicals: 2 +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +**Sample `DruidOpsRequest` Objects for Vertical Scaling of different component of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-vscale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: druid-prod + verticalScaling: + coordinators: + resources: + requests: + memory: "1.5Gi" + cpu: "0.7" + limits: + memory: "2Gi" + cpu: "1" + historicals: + resources: + requests: + memory: "1.5Gi" + cpu: "0.7" + limits: + memory: "2Gi" + cpu: "1" +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +**Sample `DruidOpsRequest` Objects for Reconfiguring different druid mode:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-reconfiugre + namespace: demo +spec: + type: Reconfigure + databaseRef: + name: druid-prod + configuration: + applyConfig: + middleManager.properties: | + druid.worker.capacity=5 +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-reconfiugre + namespace: demo +spec: + type: Reconfigure + databaseRef: + name: druid-prod + configuration: + configSecret: + name: new-configsecret +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +**Sample `DruidOpsRequest` Objects for Volume Expansion of different database components:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-volume-exp + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: druid-prod + volumeExpansion: + mode: "Online" + historicals: 2Gi + middleManagers: 2Gi +status: + conditions: + - lastTransitionTime: "2024-07-25T18:22:38Z" + message: Successfully completed the modification process + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +**Sample `DruidOpsRequest` Objects for Reconfiguring TLS of the database:** + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-add-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-prod + tls: + issuerRef: + name: dr-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + emailAddresses: + - abc@appscode.com +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-rotate + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-dev + tls: + rotateCertificates: true +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-change-issuer + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-prod + tls: + issuerRef: + name: dr-new-issuer + kind: Issuer + apiGroup: "cert-manager.io" +``` + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-remove + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-prod + tls: + remove: true +``` + +Here, we are going to describe the various sections of a `DruidOpsRequest` crd. + +A `DruidOpsRequest` object has the following fields in the `spec` section. + +### spec.databaseRef + +`spec.databaseRef` is a required field that point to the [Druid](/docs/guides/druid/concepts/druid.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 [Druid](/docs/guides/druid/concepts/druid.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 `DruidOpsRequest`. + +- `UpdateVersion` +- `HorizontalScaling` +- `VerticalScaling` +- `VolumeExpansion` +- `Reconfigure` +- `ReconfigureTLS` +- `Restart` + +> You can perform only one type of operation on a single `DruidOpsRequest` CR. For example, if you want to update your database and scale up its replica then you have to create two separate `DruidOpsRequest`. At first, you have to create a `DruidOpsRequest` for updating. Once it is completed, then you can create another `DruidOpsRequest` for scaling. + +### spec.updateVersion + +If you want to update you Druid 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 [DruidVersion](/docs/guides/druid/concepts/druidversion.md) CR that contains the Druid version information where you want to update. + +> You can only update between Druid versions. KubeDB does not support downgrade for Druid. + +### spec.horizontalScaling + +If you want to scale-up or scale-down your Druid cluster or different components of it, you have to specify `spec.horizontalScaling` section. This field consists of the following sub-field: + +- `spec.horizontalScaling.topology` indicates the configuration of topology nodes for Druid topology cluster after scaling. This field consists of the following sub-field: + - `spec.horizontalScaling.topoloy.coordinators` indicates the desired number of coordinators nodes for Druid topology cluster after scaling. + - `spec.horizontalScaling.topology.overlords` indicates the desired number of overlords nodes for Druid topology cluster after scaling. + - `spec.horizontalScaling.topology.brokers` indicates the desired number of brokers nodes for Druid topology cluster after scaling. + - `spec.horizontalScaling.topology.routers` indicates the desired number of routers nodes for Druid topology cluster after scaling. + - `spec.horizontalScaling.topology.historicals` indicates the desired number of historicals nodes for Druid topology cluster after scaling. + - `spec.horizontalScaling.topology.middleManagers` indicates the desired number of middleManagers nodes for Druid topology cluster after scaling. + +### spec.verticalScaling + +`spec.verticalScaling` is a required field specifying the information of `Druid` resources like `cpu`, `memory` etc that will be scaled. This field consists of the following sub-fields: +- `spec.verticalScaling.coordinators` indicates the desired resources for coordinators of Druid topology cluster after scaling. +- `spec.verticalScaling.overlords` indicates the desired resources for overlords of Druid topology cluster after scaling. +- `spec.verticalScaling.brokers` indicates the desired resources for brokers of Druid topology cluster after scaling. +- `spec.verticalScaling.routers` indicates the desired resources for routers of Druid topology cluster after scaling. +- `spec.verticalScaling.historicals` indicates the desired resources for historicals of Druid topology cluster after scaling. +- `spec.verticalScaling.middleManagers` indicates the desired resources for middleManagers of Druid topology cluster after scaling. + +All of them has the below structure: + +```yaml +requests: + memory: "200Mi" + cpu: "0.1" +limits: + memory: "300Mi" + cpu: "0.2" +``` + +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 Druid 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.historicals` indicates the desired size for the persistent volume for historicals of a Druid topology cluster. +- `spec.volumeExpansion.middleManagers` indicates the desired size for the persistent volume for middleManagers of a Druid topology cluster. + +> It is only possible to expand the data servers ie. `historicals` and `middleManagers` as they only comes with persistent volumes. + +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: + node: "2Gi" +``` + +This will expand the volume size of all the combined nodes to 2 GB. + +### spec.configuration + +If you want to reconfigure your Running Druid 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.configSecret` points to a secret in the same namespace of a Druid resource, which contains the new custom configurations. If there are any configSecret set before in the database, this secret will replace it. The value of the field `spec.stringData` of the secret like below: +```yaml +common.runtime.properties: | + druid.storage.archiveBucket="my-druid-archive-bucket" +middleManagers.properties: | + druid.worker.capacity=5 +``` +> Similarly, it is possible to provide configs for `coordinators`, `overlords`, `brokers`, `routers` and `historicals` through `coordinators.properties`, `overlords.properties`, `brokers.properties`, `routers.properties` and `historicals.properties` respectively. + +- `applyConfig` contains the new custom config as a string which will be merged with the previous configuration. + +- `applyConfig` is a map where key supports 3 values, namely `server.properties`, `broker.properties`, `controller.properties`. And value represents the corresponding configurations. + +```yaml + applyConfig: + common.runtime.properties: | + druid.storage.archiveBucket="my-druid-archive-bucket" + middleManagers.properties: | + druid.worker.capacity=5 +``` + +- `removeCustomConfig` is a boolean field. Specify this field to true if you want to remove all the custom configuration from the deployed druid cluster. + +### spec.tls + +If you want to reconfigure the TLS configuration of your Druid 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/druid/concepts/druid.md#spectls). +- `spec.tls.rotateCertificates` specifies that we want to rotate the certificate of this druid. +- `spec.tls.remove` specifies that we want to remove tls from this druid. + +### 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. + +### DruidOpsRequest `Status` + +`.status` describes the current state and progress of a `DruidOpsRequest` operation. It has the following fields: + +### status.phase + +`status.phase` indicates the overall phase of the operation for this `DruidOpsRequest`. It can have the following three values: + +| Phase | Meaning | +|-------------|----------------------------------------------------------------------------------| +| Successful | KubeDB has successfully performed the operation requested in the DruidOpsRequest | +| Progressing | KubeDB has started the execution of the applied DruidOpsRequest | +| Failed | KubeDB has failed the operation requested in the DruidOpsRequest | +| Denied | KubeDB has denied the operation requested in the DruidOpsRequest | +| Skipped | KubeDB has skipped the operation requested in the DruidOpsRequest | + +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 `DruidOpsRequest` controller. + +### status.conditions + +`status.conditions` is an array that specifies the conditions of different steps of `DruidOpsRequest` processing. Each condition entry has the following fields: + +- `types` specifies the type of the condition. DruidOpsRequest 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 | +| `UpdateShardImage` | Specifies such a state that the Shard Images has been updated | +| `UpdateReplicaSetImage` | Specifies such a state that the Replicaset Image has been updated | +| `UpdateConfigServerImage` | Specifies such a state that the ConfigServer Image has been updated | +| `UpdateMongosImage` | Specifies such a state that the Mongos Image has been updated | +| `UpdatePetSetResources` | Specifies such a state that the Petset resources has been updated | +| `UpdateShardResources` | Specifies such a state that the Shard resources has been updated | +| `UpdateReplicaSetResources` | Specifies such a state that the Replicaset resources has been updated | +| `UpdateConfigServerResources` | Specifies such a state that the ConfigServer resources has been updated | +| `UpdateMongosResources` | Specifies such a state that the Mongos resources has been updated | +| `ScaleDownReplicaSet` | Specifies such a state that the scale down operation of replicaset | +| `ScaleUpReplicaSet` | Specifies such a state that the scale up operation of replicaset | +| `ScaleUpShardReplicas` | Specifies such a state that the scale up operation of shard replicas | +| `ScaleDownShardReplicas` | Specifies such a state that the scale down operation of shard replicas | +| `ScaleDownConfigServer` | Specifies such a state that the scale down operation of config server | +| `ScaleUpConfigServer` | Specifies such a state that the scale up operation of config server | +| `ScaleMongos` | Specifies such a state that the scale down operation of replicaset | +| `VolumeExpansion` | Specifies such a state that the volume expansion operaton of the database | +| `ReconfigureReplicaset` | Specifies such a state that the reconfiguration of replicaset nodes | +| `ReconfigureMongos` | Specifies such a state that the reconfiguration of mongos nodes | +| `ReconfigureShard` | Specifies such a state that the reconfiguration of shard nodes | +| `ReconfigureConfigServer` | Specifies such a state that the reconfiguration of config server 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. diff --git a/docs/guides/druid/concepts/druidversion.md b/docs/guides/druid/concepts/druidversion.md new file mode 100644 index 0000000000..74bd7e76f2 --- /dev/null +++ b/docs/guides/druid/concepts/druidversion.md @@ -0,0 +1,102 @@ +--- +title: DruidVersion CRD +menu: + docs_{{ .version }}: + identifier: guides-druid-concepts-druidversion + name: DruidVersion + parent: guides-druid-concepts + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# DruidVersion + +## What is DruidVersion + +`DruidVersion` is a Kubernetes `Custom Resource Definitions` (CRD). It provides a declarative configuration to specify the docker images to be used for [Druid](https://druid.apache.org) database deployed with KubeDB in a Kubernetes native way. + +When you install KubeDB, a `DruidVersion` custom resource will be created automatically for every supported Druid versions. You have to specify the name of `DruidVersion` CR in `spec.version` field of [Druid](/docs/guides/druid/concepts/druid.md) crd. Then, KubeDB will use the docker images specified in the `DruidVersion` CR 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. + +## DruidVersion Spec + +As with all other Kubernetes objects, a DruidVersion needs `apiVersion`, `kind`, and `metadata` fields. It also needs a `.spec` section. + +```yaml +apiVersion: catalog.kubedb.com/v1alpha1 +kind: DruidVersion +metadata: + annotations: + meta.helm.sh/release-name: kubedb + meta.helm.sh/release-namespace: kubedb + creationTimestamp: "2024-10-16T13:10:10Z" + generation: 1 + labels: + app.kubernetes.io/instance: kubedb + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: kubedb-catalog + app.kubernetes.io/version: v2024.9.30 + helm.sh/chart: kubedb-catalog-v2024.9.30 + name: 28.0.1 + resourceVersion: "42125" + uid: e30e23aa-febc-4029-8be7-993afaff1fc6 +spec: + db: + image: ghcr.io/appscode-images/druid:28.0.1 + initContainer: + image: ghcr.io/kubedb/druid-init:28.0.1 + securityContext: + runAsUser: 1000 + version: 28.0.1 +``` + +### metadata.name + +`metadata.name` is a required field that specifies the name of the `DruidVersion` CR. You have to specify this name in `spec.version` field of [Druid](/docs/guides/druid/concepts/druid.md) CR. + +We follow this convention for naming DruidVersion CR: + +- Name format: `{Original Druid image version}-{modification tag}` + +We use official Apache Druid release tar files to build docker images for supporting Druid versions and re-tag the image with v1, v2 etc. modification tag when there's any. An image with higher modification tag will have more features than the images with lower modification tag. Hence, it is recommended to use DruidVersion CR with the highest modification tag to enjoy the latest features. + +### spec.version + +`spec.version` is a required field that specifies the original version of Druid 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 Druid database. + +### spec.initContainer.image + +`spec.initContainer.image` is a required field that specifies the image which will be used to remove `lost+found` directory and mount an `EmptyDir` data volume. + +### 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 global.featureGates.Druid=true --set global.featureGates.ZooKeeper=true \ + --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 Druid CRD [here](/docs/guides/druid/concepts/druid.md). +- Deploy your first Druid database with KubeDB by following the guide [here](/docs/guides/druid/quickstart/guide/index.md). diff --git a/docs/guides/druid/configuration/_index.md b/docs/guides/druid/configuration/_index.md new file mode 100644 index 0000000000..4aaebde0ed --- /dev/null +++ b/docs/guides/druid/configuration/_index.md @@ -0,0 +1,10 @@ +--- +title: Run Druid with Custom Configuration +menu: + docs_{{ .version }}: + identifier: guides-druid-configuration + name: Custom Configuration + parent: guides-druid + weight: 40 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/configuration/config-file/images/druid-updated-ui.png b/docs/guides/druid/configuration/config-file/images/druid-updated-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..4e53f6bb0037a9ed450111f3e3210143009edcd1 GIT binary patch literal 48477 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 New to KubeDB? Please start [here](/docs/README.md). + +> New to KubeDB? Please start [here](/docs/README.md). + +# Configure Druid Cluster + +In Druid cluster, there are six nodes available coordinators, overlords, brokers, routers, historicals, middleManagers. In this tutorial, we will see how to configure each node of a druid 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/). + +- Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. + +- To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. + +```bash +$ kubectl create namespace demo +namespace/demo created + +$ kubectl get namespace +NAME STATUS AGE +demo Active 9s +``` + +> Note: YAML files used in this tutorial are stored in [here](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/druid/configuration/yamls) in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Find Available StorageClass + +We will have to provide `StorageClass` in Druid CR specification. Check available `StorageClass` in your cluster using the following command, + +```bash +$ kubectl get storageclass +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +standard (default) rancher.io/local-path Delete WaitForFirstConsumer false 1h +``` + +Here, we have `standard` StorageClass in our cluster from [Local Path Provisioner](https://github.com/rancher/local-path-provisioner). + +Before deploying `Druid` cluster, we need to prepare the external dependencies. + +## Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/backup/application-level/examples/deep-storage-config.yaml +secret/deep-storage-config created +``` + +## Use Custom Configuration + +Say we want to change the default maximum number of tasks the MiddleManager can accept. Let's create the `middleManagers.properties` file with our desire configurations. + +**middleManagers.properties:** + +```properties +druid.worker.capacity=5 +``` + +and we also want to change the number of processing threads to have available for parallel processing of segments of the historicals nodes. Let's create the `historicals.properties` file with our desire configurations. + +**historicals.properties:** + +```properties +druid.processing.numThreads=3 +``` + +Let's create a k8s secret containing the above configuration where the file name will be the key and the file-content as the value: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: configsecret + namespace: demo +stringData: + middleManagers.properties: |- + druid.worker.capacity=5 + historicals.properties: |- + druid.processing.numThreads=3 +``` + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/config-file/yamls/config-secret.yaml +secret/config-secret created +``` + +> To provide custom configuration for other nodes add values for the following `key` under `stringData`: +> - Use `common.runtime.properties` for common configurations +> - Use `coordinators.properties` for configurations of coordinators +> - Use `overlords.properties` for configurations of overlords +> - Use `brokers.properties` for configurations of brokers +> - Use `routers.properties` for configurations of routers + +Now that the config secret is created, it needs to be mentioned in the [Druid](/docs/guides/druid/concepts/druid.md) object's yaml: + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-config + namespace: demo +spec: + version: 28.0.1 + configSecret: + name: config-secret + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: WipeOut +``` + +Now, create the Druid object by the following command: + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/config-file/yamls/druid-with-monitoring.yaml +druid.kubedb.com/druid-with-config created +``` + +Now, wait for the Druid to become ready: + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-with-config kubedb.com/v1 3.6.1 Provisioning 5s +druid-with-config kubedb.com/v1 3.6.1 Provisioning 7s +. +. +druid-with-config kubedb.com/v1 3.6.1 Ready 2m +``` + +## Verify Configuration + +Lets exec into one of the druid middleManagers pod that we have created and check the configurations are applied or not: + +Exec into the Druid middleManagers: + +```bash +$ kubectl exec -it -n demo druid-with-config-middleManagers-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the configurations: +```bash +bash-5.1$ cat conf/druid/cluster/data/middleManager/runtime.properties | grep druid.worker.capacity +druid.worker.capacity=5 +``` +Here, we can see that our given configuration is applied to the Druid cluster for all brokers. + +Now, lets exec into one of the druid historicals pod that we have created and check the configurations are applied or not: + +Exec into the Druid historicals: + +```bash +$ kubectl exec -it -n demo druid-with-config-historicals-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the metadata storage directory: +```bash +bash-5.1$ cat conf/druid/cluster/data/historical/runtime.properties | grep druid.processing.numThreads +druid.processing.numThreads=3 +``` + +Here, we can see that our given configuration is applied to the historicals. + +### Verify Configuration Change from Druid UI +You can also see the configuration changes from the druid ui. For that, follow the following steps: + +First port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-with-config-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-with-config-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-with-config-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  druid-ui +

    + + +You can see that there are 5 task slots reflecting with our provided custom configuration of `druid.worker.capacity=5`. + +## Cleanup + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +$ kubectl delete dr -n demo druid-dev + +$ kubectl delete secret -n demo configsecret-combined + +$ kubectl delete namespace demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). + diff --git a/docs/guides/druid/configuration/config-file/yamls/config-secret.yaml b/docs/guides/druid/configuration/config-file/yamls/config-secret.yaml new file mode 100644 index 0000000000..6067ee7dd2 --- /dev/null +++ b/docs/guides/druid/configuration/config-file/yamls/config-secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Secret +metadata: + name: new-config + namespace: demo +stringData: + middleManagers.properties: |- + druid.worker.capacity=5 + historicals.properties: |- + druid.processing.numThreads=3 diff --git a/docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml b/docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml b/docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml new file mode 100644 index 0000000000..b2225f22b1 --- /dev/null +++ b/docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml @@ -0,0 +1,17 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-config + namespace: demo +spec: + version: 28.0.1 + configSecret: + name: config-secret + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: WipeOut diff --git a/docs/guides/druid/configuration/podtemplating/index.md b/docs/guides/druid/configuration/podtemplating/index.md new file mode 100644 index 0000000000..89c4ae2c68 --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/index.md @@ -0,0 +1,618 @@ +--- +title: Run Druid with Custom PodTemplate +menu: + docs_{{ .version }}: + identifier: guides-druid-configuration-podtemplating + name: Customize PodTemplate + parent: guides-druid-configuration + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Run Druid with Custom PodTemplate + +KubeDB supports providing custom configuration for Druid via [PodTemplate](/docs/guides/druid/concepts/druid.md#spec.topology). This tutorial will show you how to use KubeDB to run a Druid 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/druid/configuration/podtemplating/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/druid/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 Druid database. +KubeDB allows providing a template for all the druid pods through `spec.topology..podTemplate`. KubeDB operator will pass the information provided in `spec.topology..podTemplate` to the corresponding PetSet created for Druid 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/druid/concepts/druid.md#spectopology), + + +## Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/backup/application-level/examples/deep-storage-config.yaml +secret/deep-storage-config created +``` + +## CRD Configuration + +Below is the YAML for the Druid 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: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + configSecret: + name: config-secret + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + coordinators: + replicas: 1 + podTemplate: + spec: + containers: + - name: druid + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + brokers: + replicas: 1 + podTemplate: + spec: + containers: + - name: druid + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + routers: + replicas: 1 + deletionPolicy: WipeOut +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/podtemplating/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait a few minutes. KubeDB operator will create necessary PVC, petset, services, secret etc. If everything goes well, we will see that `druid-cluster` is in `Ready` state. +```bash +$ kubectl get druid -n demo +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1alpha2 28.0.1 Ready 6m5s +``` + +Check that the petset's pod is running + +```bash +$ kubectl get pods -n demo -l app.kubernetes.io/instance=druid-cluster +NAME READY STATUS RESTARTS AGE +druid-cluster-brokers-0 1/1 Running 0 7m2s +druid-cluster-coordinators-0 1/1 Running 0 7m9s +druid-cluster-historicals-0 1/1 Running 0 7m7s +druid-cluster-middlemanagers-0 1/1 Running 0 7m5s +druid-cluster-routers-0 1/1 Running 0 7m +``` + +Now, we will check if the database has started with the custom configuration we have provided. + +```bash +$ kubectl get pod -n demo druid-cluster-coordinators-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "600m", + "memory": "2Gi" + }, + "requests": { + "cpu": "600m", + "memory": "2Gi" + } +} + +$ kubectl get pod -n demo druid-cluster-brokers-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "600m", + "memory": "2Gi" + }, + "requests": { + "cpu": "600m", + "memory": "2Gi" + } +} +``` + +Here we can see the containers of the both `coordinators` and `brokers` have the resources we have specified in the manifest. + +## 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 druid 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 druid with this new label as nodeSelector. Below is the yaml we are going to apply: +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-node-selector + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + coordinators: + podTemplate: + spec: + nodeSelector: + disktype: ssd + deletionPolicy: Delete +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/podtemplating/yamls/druid-node-selector.yaml +druid.kubedb.com/druid-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 the `druid-node-selector` instance is in `Ready` state. + +```bash +$ kubectl get druid -n demo +NAME TYPE VERSION STATUS AGE +druid-node-selector kubedb.com/v1alpha2 28.0.1 Ready 54m +``` +You can verify that by running `kubectl get pods -n demo druid-node-selector-0 -o wide` and looking at the “NODE” to which the Pod was assigned. +```bash +$ kubectl get pods -n demo druid-node-selector-cooridnators-0 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +druid-node-selector-cooridnators-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 druid 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 druid without proper tolerations. Here is the yaml of druid we are going to create. +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-without-tolerations + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/podtemplating/yamls/druid-without-tolerations.yaml +druid.kubedb.com/druid-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 `druid-without-tolerations-0` has been created and running. + +Check that the petset's pod is running or not, +```bash +$ kubectl get pods -n demo -l app.kubernetes.io/instance=druid-without-tolerations +NAME READY STATUS RESTARTS AGE +druid-without-tolerations-brokers-0 0/1 Pending 0 3m35s +druid-without-tolerations-cooridnators-0 0/1 Pending 0 3m35s +druid-without-tolerations-historicals-0 0/1 Pending 0 3m35s +druid-without-tolerations-middlemanager-0 0/1 Pending 0 3m35s +druid-without-tolerations-routers-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 druid-without-tolerations-coordinators-0 +Name: druid-without-tolerations-coordinators-0 +Namespace: demo +Priority: 0 +Service Account: default +Node: kind-control-plane/172.18.0.2 +Start Time: Wed, 13 Nov 2024 11:59:06 +0600 +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-without-tolerations + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com + apps.kubernetes.io/pod-index=0 + controller-revision-hash=druid-without-tolerations-coordinators-65c8c99fc7 + kubedb.com/role=coordinators + statefulset.kubernetes.io/pod-name=druid-without-tolerations-coordinators-0 +Annotations: +Status: Running +IP: 10.244.0.53 +IPs: + IP: 10.244.0.53 +Controlled By: PetSet/druid-without-tolerations-coordinators +Init Containers: + init-druid: + Container ID: containerd://62c9a2053d619dded2085e354cd2c0dfa238761033cc0483c824c1ed8ee4c002 + Image: ghcr.io/kubedb/druid-init:28.0.1@sha256:ed87835bc0f89dea923fa8e3cf1ef209e3e41cb93944a915289322035dcd8a91 + Image ID: ghcr.io/kubedb/druid-init@sha256:ed87835bc0f89dea923fa8e3cf1ef209e3e41cb93944a915289322035dcd8a91 + Port: + Host Port: + State: Terminated + Reason: Completed + Exit Code: 0 + Started: Wed, 13 Nov 2024 11:59:07 +0600 + Finished: Wed, 13 Nov 2024 11:59:07 +0600 + Ready: True + Restart Count: 0 + Limits: + memory: 512Mi + Requests: + cpu: 200m + memory: 512Mi + Environment: + DRUID_METADATA_TLS_ENABLE: false + DRUID_METADATA_STORAGE_TYPE: MySQL + Mounts: + /opt/druid/conf from main-config-volume (rw) + /opt/druid/extensions/mysql-metadata-storage from mysql-metadata-storage (rw) + /tmp/config/custom-config from custom-config (rw) + /tmp/config/operator-config from operator-config-volume (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9t5kp (ro) +Containers: + druid: + Container ID: containerd://3a52f120ca09f90fcdc062c94bf404964add7a5b6ded4a372400267a9d0fd598 + Image: ghcr.io/appscode-images/druid:28.0.1@sha256:d86e424233ec5a120c1e072cf506fa169868fd9572bbb9800a85400f0c879dec + Image ID: ghcr.io/appscode-images/druid@sha256:d86e424233ec5a120c1e072cf506fa169868fd9572bbb9800a85400f0c879dec + Port: 8081/TCP + Host Port: 0/TCP + Command: + /druid.sh + coordinator + State: Running + Started: Wed, 13 Nov 2024 11:59:09 +0600 + Ready: True + Restart Count: 0 + Limits: + cpu: 600m + memory: 2Gi + Requests: + cpu: 600m + memory: 2Gi + Environment: + DRUID_ADMIN_PASSWORD: Optional: false + DRUID_METADATA_STORAGE_PASSWORD: VHJ6!hFuT8WDjcyy + DRUID_ZK_SERVICE_PASSWORD: VHJ6!hFuT8WDjcyy + Mounts: + /opt/druid/conf from main-config-volume (rw) + /opt/druid/extensions/mysql-metadata-storage from mysql-metadata-storage (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9t5kp (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-druid-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=druid-without-tolerations,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=druids.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=druid-without-tolerations,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=druids.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 druid. Here is the yaml we are going to apply, +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + coordinators: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + brokers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + historicals: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + middleManagers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + deletionPolicy: Delete +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/podtemplating/yamls/druid-with-tolerations.yaml +druid.kubedb.com/druid-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 `druid-with-tolerations-0` has been created. + +Check that the petset's pod is running + +```bash +$ $ kubectl get pods -n demo -l app.kubernetes.io/instance=druid-cluster + +NAME READY STATUS RESTARTS AGE +druid-with-tolerations-brokers-0 1/1 Running 0 164m +druid-with-tolerations-coordinators-0 1/1 Running 0 164m +druid-with-tolerations-historicals-0 1/1 Running 0 164m +druid-with-tolerations-middlemanagers-0 1/1 Running 0 164m +druid-with-tolerations-routers-0 1/1 Running 0 164m +``` +As we see the pod is running, you can verify that by running `kubectl get pods -n demo druid-with-tolerations-0 -o wide` and looking at the “NODE” to which the Pod was assigned. +```bash +$ kubectl get pods -n demo druid-with-tolerations-coordinators-0 -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +druid-with-tolerations-coordinators-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 druid -n demo druid-with-tolerations + +kubectl delete ns demo +``` + +If you would like to uninstall KubeDB operator, please follow the steps [here](/docs/setup/README.md). + +## Next Steps + +- [Quickstart Druid](/docs/guides/druid/quickstart/guide/index.md) with KubeDB Operator. +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/configuration/podtemplating/yamls/deep-storage-config.yaml b/docs/guides/druid/configuration/podtemplating/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/configuration/podtemplating/yamls/druid-cluster.yaml b/docs/guides/druid/configuration/podtemplating/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..2004002096 --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/yamls/druid-cluster.yaml @@ -0,0 +1,43 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + configSecret: + name: config-secret + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + coordinators: + replicas: 1 + podTemplate: + spec: + containers: + - name: druid + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + brokers: + replicas: 1 + podTemplate: + spec: + containers: + - name: druid + resources: + limits: + memory: "2Gi" + cpu: "600m" + requests: + memory: "2Gi" + cpu: "600m" + routers: + replicas: 1 + deletionPolicy: WipeOut diff --git a/docs/guides/druid/configuration/podtemplating/yamls/druid-node-selector.yaml b/docs/guides/druid/configuration/podtemplating/yamls/druid-node-selector.yaml new file mode 100644 index 0000000000..7ad2eae717 --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/yamls/druid-node-selector.yaml @@ -0,0 +1,20 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-node-selector + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + coordinators: + podTemplate: + spec: + nodeSelector: + disktype: ssd + deletionPolicy: Delete \ No newline at end of file diff --git a/docs/guides/druid/configuration/podtemplating/yamls/druid-with-tolerations.yaml b/docs/guides/druid/configuration/podtemplating/yamls/druid-with-tolerations.yaml new file mode 100644 index 0000000000..4ef158f85a --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/yamls/druid-with-tolerations.yaml @@ -0,0 +1,58 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + coordinators: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + brokers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + historicals: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + middleManagers: + podTemplate: + spec: + tolerations: + - key: "key1" + operator: "Equal" + value: "node1" + effect: "NoSchedule" + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/configuration/podtemplating/yamls/druid-without-tolerations.yaml b/docs/guides/druid/configuration/podtemplating/yamls/druid-without-tolerations.yaml new file mode 100644 index 0000000000..1098f3d70d --- /dev/null +++ b/docs/guides/druid/configuration/podtemplating/yamls/druid-without-tolerations.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-without-tolerations + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/monitoring/_index.md b/docs/guides/druid/monitoring/_index.md new file mode 100755 index 0000000000..dd0ffbb60c --- /dev/null +++ b/docs/guides/druid/monitoring/_index.md @@ -0,0 +1,10 @@ +--- +title: Monitor Druid with Prometheus & Grafana +menu: + docs_{{ .version }}: + identifier: guides-druid-monitoring + name: Monitoring + parent: guides-druid + weight: 140 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/monitoring/images/druid-monitoring.png b/docs/guides/druid/monitoring/images/druid-monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..2c609a2b98bb32a5086422495c2c363743710580 GIT binary patch literal 68080 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 z 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
    jctF>}CWK}we`&!#?%4qF6BB9!0` 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 New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring Apache Druid 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 Prometheus metrics for respective databases. As KubeDB supports Druid versions in KRaft mode, and the officially recognized exporter image doesn't expose metrics for them yet - KubeDB managed Druid instances use [JMX Exporter](https://github.com/prometheus/jmx_exporter) instead. This exporter is intended to be run as a Java Agent inside Druid container, exposing a HTTP server and serving metrics of the local JVM. To Following diagram shows the logical flow of database monitoring with KubeDB. + +

    +  Database Monitoring Flow +

    + +When a user creates a Druid crd with `spec.monitor` section configured, KubeDB operator provisions the respective Druid cluster while running the exporter as a Java agent inside the druid containers. 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 TLS secured Druid 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: Druid +metadata: + name: druid-with-monitoring + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut +``` + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/monitoring/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Let's deploy the above druid example by the following command: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/monitoring/yamls/druid-with-monitoring.yaml +druid.kubedb.com/druid created +``` + +Here, we have specified that we are going to monitor this server using Prometheus operator through `spec.monitor.agent: prometheus.io/operator`. KubeDB will create a `ServiceMonitor` crd in databases namespace and this `ServiceMonitor` will have `release: prometheus` label. + +## Next Steps + +- Learn how to use KubeDB to run a Apache Druid cluster [here](/docs/guides/druid/README.md). +- Deploy [dedicated topology cluster](/docs/guides/druid/clustering/overview/index.md) for Apache Druid +- Detail concepts of [DruidVersion object](/docs/guides/druid/concepts/druidversion.md). + +[//]: # (- Learn to use KubeDB managed Druid objects using [CLIs](/docs/guides/druid/cli/cli.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/druid/monitoring/using-builtin-prometheus.md b/docs/guides/druid/monitoring/using-builtin-prometheus.md new file mode 100644 index 0000000000..69ec2aa62e --- /dev/null +++ b/docs/guides/druid/monitoring/using-builtin-prometheus.md @@ -0,0 +1,372 @@ +--- +title: Monitor Druid using Builtin Prometheus Discovery +menu: + docs_{{ .version }}: + identifier: guides-druid-monitoring-builtin-monitoring + name: Builtin Prometheus + parent: guides-druid-monitoring + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring Druid with builtin Prometheus + +This tutorial will show you how to monitor Druid cluster 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/druid/monitoring/overview.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/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Deploy Druid with Monitoring Enabled + +At first, let's deploy a Druid cluster with monitoring enabled. Below is the Druid object that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-monitoring + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + monitor: + agent: prometheus.io/builtin + prometheus: + exporter: + port: 56790 + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut +``` + +Here, + +- `spec.monitor.agent: prometheus.io/builtin` specifies that we are going to monitor this server using builtin Prometheus scraper. +- `spec.monitor.prometheus.exporter.port: 56790` specifies the port where the exporter is running. + +Let's create the Druid crd we have shown above. + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/monitoring/yamls/druid-builtin-monitoring.yaml +druid.kubedb.com/druid-with-monitoring created +``` + +Now, wait for the cluster to go into `Ready` state. + +```bash +NAME TYPE VERSION STATUS AGE +druid-with-monitoring kubedb.com/v1alpha2 28.0.1 Ready 31s +``` + +KubeDB will create a separate stats service with name `{Druid crd name}-stats` for monitoring purpose. + +```bash +$ kubectl get svc -n demo --selector="app.kubernetes.io/instance=druid-with-monitoring" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +druid-with-monitoring-brokers ClusterIP 10.96.28.252 8082/TCP 2m13s +druid-with-monitoring-coordinators ClusterIP 10.96.52.186 8081/TCP 2m13s +druid-with-monitoring-pods ClusterIP None 8081/TCP,8090/TCP,8083/TCP,8091/TCP,8082/TCP,8888/TCP 2m13s +druid-with-monitoring-routers ClusterIP 10.96.134.202 8888/TCP 2m13s +druid-with-monitoring-stats ClusterIP 10.96.222.96 56790/TCP 2m13s +``` + +Here, `druid-with-monitoring-stats` service has been created for monitoring purpose. Let's describe the service. + +```bash +$ kubectl describe svc -n druid-demo builtin-prom-stats +Name: druid-with-monitoring-stats +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-with-monitoring + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com + kubedb.com/role=stats +Annotations: monitoring.appscode.com/agent: prometheus.io/builtin + prometheus.io/path: /metrics + prometheus.io/port: 56790 + prometheus.io/scrape: true +Selector: app.kubernetes.io/instance=druid-with-monitoring,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=druids.kubedb.com +Type: ClusterIP +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.96.222.96 +IPs: 10.96.222.96 +Port: metrics 56790/TCP +TargetPort: metrics/TCP +Endpoints: 10.244.0.31:56790,10.244.0.33:56790 +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" 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_(.+) +``` + +### 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/examples/monitoring/builtin-prometheus/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-7bd56c6865-8dlpv 1/1 Running 0 28s +``` + +Now, run following command on a separate terminal to forward 9090 port of `prometheus-7bd56c6865-8dlpv` pod, + +```bash +$ kubectl port-forward -n monitoring prometheus-7bd56c6865-8dlpv 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 `druid-with-monitoring-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 `Druid` cluster `druid-with-monitoring` through stats service `druid-with-monitoring-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 druid/druid-with-monitoring + +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 + +- Learn how to configure [Druid Topology](/docs/guides/druid/clustering/overview/index.md). +- Monitor your Druid database with KubeDB using [`out-of-the-box` Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/monitoring/using-prometheus-operator.md b/docs/guides/druid/monitoring/using-prometheus-operator.md new file mode 100644 index 0000000000..abd4bb1ee6 --- /dev/null +++ b/docs/guides/druid/monitoring/using-prometheus-operator.md @@ -0,0 +1,343 @@ +--- +title: Monitor Druid using Prometheus Operator +menu: + docs_{{ .version }}: + identifier: guides-druid-monitoring-operator-monitoring + name: Prometheus Operator + parent: guides-druid-monitoring + weight: 15 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Monitoring Druid 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 Druid database deployed with KubeDB. + +## 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 locally 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/druid/monitoring/overview.md). + +- We need a [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator) instance running. If you don't already have a running instance, you can deploy one using this helm chart [here](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack). + +- To keep Prometheus resources isolated, we are going to use a separate namespace called `monitoring` to deploy the prometheus operator helm chart. Alternatively, you can use `--create-namespace` flag while deploying prometheus. 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/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) 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.serviceMonitor.labels` field of Druid 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 DESIRED READY RECONCILED AVAILABLE AGE +monitoring prometheus-kube-prometheus-prometheus v2.42.0 1 1 True True 2d23h +``` + +> 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 `monitoring` namespace. + +```bash +$ kubectl get prometheus -n monitoring prometheus-kube-prometheus-prometheus -o yaml +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + annotations: + meta.helm.sh/release-name: prometheus + meta.helm.sh/release-namespace: monitoring + creationTimestamp: "2023-03-27T07:56:04Z" + generation: 1 + labels: + app: kube-prometheus-stack-prometheus + app.kubernetes.io/instance: prometheus + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: kube-prometheus-stack + app.kubernetes.io/version: 45.7.1 + chart: kube-prometheus-stack-45.7.1 + heritage: Helm + release: prometheus + name: prometheus-kube-prometheus-prometheus + namespace: monitoring + resourceVersion: "638797" + uid: 0d1e7b8a-44ae-4794-ab45-95a5d7ae7f91 +spec: + alerting: + alertmanagers: + - apiVersion: v2 + name: prometheus-kube-prometheus-alertmanager + namespace: monitoring + pathPrefix: / + port: http-web + enableAdminAPI: false + evaluationInterval: 30s + externalUrl: http://prometheus-kube-prometheus-prometheus.monitoring:9090 + hostNetwork: false + image: quay.io/prometheus/prometheus:v2.42.0 + listenLocal: false + logFormat: logfmt + logLevel: info + paused: false + podMonitorNamespaceSelector: {} + podMonitorSelector: + matchLabels: + release: prometheus + portName: http-web + probeNamespaceSelector: {} + probeSelector: + matchLabels: + release: prometheus + replicas: 1 + retention: 10d + routePrefix: / + ruleNamespaceSelector: {} + ruleSelector: + matchLabels: + release: prometheus + scrapeInterval: 30s + securityContext: + fsGroup: 2000 + runAsGroup: 2000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: prometheus-kube-prometheus-prometheus + serviceMonitorNamespaceSelector: {} + serviceMonitorSelector: + matchLabels: + release: prometheus + shards: 1 + version: v2.42.0 + walCompression: true +status: + availableReplicas: 1 + conditions: + - lastTransitionTime: "2023-03-27T07:56:23Z" + observedGeneration: 1 + status: "True" + type: Available + - lastTransitionTime: "2023-03-30T03:39:18Z" + observedGeneration: 1 + status: "True" + type: Reconciled + paused: false + replicas: 1 + shardStatuses: + - availableReplicas: 1 + replicas: 1 + shardID: "0" + unavailableReplicas: 0 + updatedReplicas: 1 + unavailableReplicas: 0 + updatedReplicas: 1 +``` + +Notice the `spec.serviceMonitorSelector` section. Here, `release: prometheus` label is used to select `ServiceMonitor` crd. So, we are going to use this label in `spec.monitor.prometheus.serviceMonitor.labels` field of Druid crd. + +## Deploy Druid with Monitoring Enabled + +At first, let's deploy a Druid database with monitoring enabled. Below is the Druid object that we are going to create. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-monitoring + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut +``` + +Here, + +- `monitor.agent: prometheus.io/operator` indicates that we are going to monitor this server using Prometheus operator. +- `monitor.prometheus.serviceMonitor.labels` specifies that KubeDB should create `ServiceMonitor` with these labels. +- `monitor.prometheus.interval` indicates that the Prometheus server should scrape metrics from this database with 10 seconds interval. + +Let's create the druid object that we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/monitoring/yamls/druid-with-monirtoring.yaml +druids.kubedb.com/druid-with-monitoring created +``` + +Now, wait for the database to go into `Running` state. + +```bash +$ kubectl get dr -n demo druid +NAME TYPE VERSION STATUS AGE +druid-with-monitoring kubedb.com/v1alpha2 3.6.1 Ready 2m24s +``` + +KubeDB will create a separate stats service with name `{Druid crd name}-stats` for monitoring purpose. + +```bash +$ kubectl get svc -n demo --selector="app.kubernetes.io/instance=druid-with-monitoring" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +druid-with-monitoring-brokers ClusterIP 10.96.28.252 8082/TCP 2m13s +druid-with-monitoring-coordinators ClusterIP 10.96.52.186 8081/TCP 2m13s +druid-with-monitoring-pods ClusterIP None 8081/TCP,8090/TCP,8083/TCP,8091/TCP,8082/TCP,8888/TCP 2m13s +druid-with-monitoring-routers ClusterIP 10.96.134.202 8888/TCP 2m13s +druid-with-monitoring-stats ClusterIP 10.96.222.96 56790/TCP 2m13s +``` + +Here, `druid-with-monitoring-stats` service has been created for monitoring purpose. + +Let's describe this stats service. + +```bash +$ kubectl describe svc -n demo druid-with-monitoring-stats +Name: druid-with-monitoring-stats +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-with-monitoring + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com + kubedb.com/role=stats +Annotations: monitoring.appscode.com/agent: prometheus.io/operator +Selector: app.kubernetes.io/instance=druid-with-monitoring,app.kubernetes.io/managed-by=kubedb.com,app.kubernetes.io/name=druids.kubedb.com +Type: ClusterIP +IP Family Policy: SingleStack +IP Families: IPv4 +IP: 10.96.29.174 +IPs: 10.96.29.174 +Port: metrics 9104/TCP +TargetPort: metrics/TCP +Endpoints: 10.244.0.68:9104,10.244.0.71:9104,10.244.0.72:9104 + 2 more... +Session Affinity: None +Events: +``` + +Notice the `Labels` and `Port` fields. `ServiceMonitor` will use this information to target its endpoints. + +KubeDB will also create a `ServiceMonitor` crd in `demo` namespace that select the endpoints of `druid-with-monitoring-stats` service. Verify that the `ServiceMonitor` crd has been created. + +```bash +$ kubectl get servicemonitor -n demo +NAME AGE +druid-with-monitoring-stats 4m49s +``` + +Let's verify that the `ServiceMonitor` has the label that we had specified in `spec.monitor` section of Druid crd. + +```bash +$ kubectl get servicemonitor -n demo druid-with-monitoring-stats -o yaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + creationTimestamp: "2024-11-01T10:25:14Z" + generation: 1 + labels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: druid-with-monitoring + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: druids.kubedb.com + release: prometheus + name: druid-with-monitoring-stats + namespace: demo + ownerReferences: + - apiVersion: v1 + blockOwnerDeletion: true + controller: true + kind: Service + name: druid-with-monitoring-stats + uid: b3ae48f3-476e-4cec-95f6-f8e28538b605 + resourceVersion: "597152" + uid: ff385538-eba5-48a3-91c1-1a4b15f3018a +spec: + endpoints: + - honorLabels: true + interval: 10s + path: /metrics + port: metrics + namespaceSelector: + matchNames: + - demo + selector: + matchLabels: + app.kubernetes.io/component: database + app.kubernetes.io/instance: druid-with-monitoring + app.kubernetes.io/managed-by: kubedb.com + app.kubernetes.io/name: druids.kubedb.com + kubedb.com/role: stats +``` + +Notice that the `ServiceMonitor` has label `release: prometheus` that we had specified in Druid crd. + +Also notice that the `ServiceMonitor` has selector which match the labels we have seen in the `druid-with-monitoring-stats` service. It also, target the `metrics` 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 monitoring -l=app.kubernetes.io/name=prometheus +NAME READY STATUS RESTARTS AGE +prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 8 (4h27m ago) 3d +``` + +Prometheus server is listening to port `9090` of `prometheus-prometheus-kube-prometheus-prometheus-0` pod. We are going to use [port forwarding](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to access Prometheus dashboard. + +Run following command on a separate terminal to forward the port 9090 of `prometheus-kube-prometheus-prometheus` service which is pointing to the prometheus pod, + +```bash +$ kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-prometheus 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 `metrics` endpoint of `druid-with-monitoring-stats` service as one of the targets. + +

    +  Prometheus Target +

    + +Check the `endpoint` and `service` labels. 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 a beautiful dashboard with collected metrics. + +## Cleaning up + +To clean up the Kubernetes resources created by this tutorial, run following commands + +```bash +kubectl delete -n demo dr/druid-with-monitoring +kubectl delete ns demo +``` + +## Next Steps + +- Learn how to use KubeDB to run Apache Druid cluster [here](/docs/guides/druid/README.md). +- Deploy [dedicated cluster](/docs/guides/druid/clustering/overview/index.md) for Apache Druid +[//]: # (- Deploy [combined cluster](/docs/guides/druid/clustering/combined-cluster/index.md) for Apache Druid) +- Detail concepts of [DruidVersion object](/docs/guides/druid/concepts/druidversion.md). +[//]: # (- Learn to use KubeDB managed Druid objects using [CLIs](/docs/guides/druid/cli/cli.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). \ No newline at end of file diff --git a/docs/guides/druid/monitoring/yamls/deep-storage-config.yaml b/docs/guides/druid/monitoring/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/monitoring/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/monitoring/yamls/druid-monitoring-builtin.yaml b/docs/guides/druid/monitoring/yamls/druid-monitoring-builtin.yaml new file mode 100644 index 0000000000..4962c3c536 --- /dev/null +++ b/docs/guides/druid/monitoring/yamls/druid-monitoring-builtin.yaml @@ -0,0 +1,24 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-monitoring + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + monitor: + agent: prometheus.io/builtin + prometheus: + exporter: + port: 56790 + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut diff --git a/docs/guides/druid/monitoring/yamls/druid-with-monitoring.yaml b/docs/guides/druid/monitoring/yamls/druid-with-monitoring.yaml new file mode 100644 index 0000000000..aa91054f8f --- /dev/null +++ b/docs/guides/druid/monitoring/yamls/druid-with-monitoring.yaml @@ -0,0 +1,23 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-with-monitoring + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + monitor: + agent: prometheus.io/operator + prometheus: + serviceMonitor: + labels: + release: prometheus + interval: 10s + deletionPolicy: WipeOut + diff --git a/docs/guides/druid/quickstart/_index.md b/docs/guides/druid/quickstart/_index.md index c99d5aad28..1be2a3045b 100644 --- a/docs/guides/druid/quickstart/_index.md +++ b/docs/guides/druid/quickstart/_index.md @@ -5,6 +5,6 @@ menu: identifier: guides-druid-quickstart name: Quickstart parent: guides-druid - weight: 15 + weight: 10 menu_name: docs_{{ .version }} --- diff --git a/docs/guides/druid/quickstart/overview/index.md b/docs/guides/druid/quickstart/guide/index.md similarity index 97% rename from docs/guides/druid/quickstart/overview/index.md rename to docs/guides/druid/quickstart/guide/index.md index ee080604c8..4318742d55 100644 --- a/docs/guides/druid/quickstart/overview/index.md +++ b/docs/guides/druid/quickstart/guide/index.md @@ -2,8 +2,8 @@ title: Druid Quickstart menu: docs_{{ .version }}: - identifier: guides-druid-quickstart-overview - name: Overview + identifier: guides-druid-quickstart-guide + name: Druid Quickstart parent: guides-druid-quickstart weight: 10 menu_name: docs_{{ .version }} @@ -24,7 +24,7 @@ This tutorial will show you how to use KubeDB to run an [Apache Druid](https://d 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) and make sure install with helm command including the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency. +Now, install KubeDB cli on your workstation and KubeDB operator in your cluster following the steps [here](/docs/setup/README.md) and make sure to include the flags `--set global.featureGates.Druid=true` to ensure **Druid CRD** and `--set global.featureGates.ZooKeeper=true` to ensure **ZooKeeper CRD** as Druid depends on ZooKeeper for external dependency with helm command. To keep things isolated, this tutorial uses a separate namespace called `demo` throughout this tutorial. @@ -39,7 +39,7 @@ demo Active 9s > Note: YAML files used in this tutorial are stored in [guides/druid/quickstart/overview/yamls](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/guides/druid/quickstart/overview/yamls) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). -> We have designed this tutorial to demonstrate a production setup of KubeDB managed Apache Druid. If you just want to try out KubeDB, you can bypass some safety features following the tips [here](/docs/guides/druid/quickstart/overview/index.md#tips-for-testing). +> We have designed this tutorial to demonstrate a production setup of KubeDB managed Apache Druid. If you just want to try out KubeDB, you can bypass some safety features following the tips [here](/docs/guides/druid/quickstart/guide/index.md#tips-for-testing). ## Find Available StorageClass @@ -55,7 +55,7 @@ Here, we have `standard` StorageClass in our cluster from [Local Path Provisione ## Find Available DruidVersion -When you install the KubeDB operator, it registers a CRD named [DruidVersion](/docs/guides/druid/concepts/catalog.md). The installation process comes with a set of tested DruidVersion objects. Let's check available DruidVersions by, +When you install the KubeDB operator, it registers a CRD named [DruidVersion](/docs/guides/druid/concepts/druidversion.md). The installation process comes with a set of tested DruidVersion objects. Let's check available DruidVersions by, ```bash $ kubectl get druidversion @@ -194,7 +194,7 @@ Here, Let's create the Druid CR that is shown above: ```bash -$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/quickstart/druid-quickstart.yaml +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/quickstart/druid-with-monitoring.yaml druid.kubedb.com/druid-quickstart created ``` diff --git a/docs/guides/druid/reconfigure-tls/_index.md b/docs/guides/druid/reconfigure-tls/_index.md new file mode 100644 index 0000000000..f82762bb13 --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/_index.md @@ -0,0 +1,10 @@ +--- +title: Reconfigure TLS/SSL +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure-tls + name: Reconfigure TLS/SSL + parent: guides-druid + weight: 120 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/reconfigure-tls/guide.md b/docs/guides/druid/reconfigure-tls/guide.md new file mode 100644 index 0000000000..5cd0080298 --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/guide.md @@ -0,0 +1,1539 @@ +--- +title: Reconfigure Druid TLS/SSL Encryption +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure-tls-guide + name: Reconfigure Druid TLS/SSL Encryption + parent: guides-druid-reconfigure-tls + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfigure Druid TLS/SSL (Transport Encryption) + +KubeDB supports reconfigure i.e. add, remove, update and rotation of TLS/SSL certificates for existing Druid database via a DruidOpsRequest. 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.0.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 + ``` + +> Note: YAML files used in this tutorial are stored in [docs/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Add TLS to a Druid database + +Here, We are going to create a Druid without TLS and then reconfigure the database to use TLS. + +### Deploy Druid without TLS + +In this section, we are going to deploy a Druid topology cluster without TLS. In the next few sections we will reconfigure TLS using `DruidOpsRequest` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 15s +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 37s +. +. +druid-cluster kubedb.com/v1alpha2 28.0.1 Ready 2m27s +``` + +Now, we can exec one druid broker pod and verify configuration that the TLS is disabled. + +```bash +$ kubectl exec -it -n demo druid-cluster-coordinators-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ cat conf/druid/cluster/_common/common.runtime.properties +druid.auth.authenticator.basic.authorizerName=basic +druid.auth.authenticator.basic.credentialsValidator.type=metadata +druid.auth.authenticator.basic.initialAdminPassword={"type": "environment", "variable": "DRUID_ADMIN_PASSWORD"} +druid.auth.authenticator.basic.initialInternalClientPassword=***** +druid.auth.authenticator.basic.skipOnFailure=false +druid.auth.authenticator.basic.type=basic +druid.auth.authenticatorChain=["basic"] +druid.auth.authorizer.basic.type=basic +druid.auth.authorizers=["basic"] +druid.emitter.logging.logLevel=info +druid.emitter=noop +druid.escalator.authorizerName=basic +druid.escalator.internalClientPassword=****** +druid.escalator.internalClientUsername=druid_system +druid.escalator.type=basic +druid.expressions.useStrictBooleans=true +druid.extensions.loadList=["druid-avro-extensions", "druid-kafka-indexing-service", "druid-kafka-indexing-service", "druid-datasketches", "druid-multi-stage-query", "druid-basic-security", "mysql-metadata-storage", "druid-s3-extensions"] +druid.global.http.eagerInitialization=false +druid.host=localhost +druid.indexer.logs.directory=var/druid/indexing-logs +druid.indexer.logs.type=file +druid.indexing.doubleStorage=double +druid.lookup.enableLookupSyncOnStartup=false +druid.metadata.storage.connector.connectURI=jdbc:mysql://druid-cluster-mysql-metadata.demo.svc:3306/druid +druid.metadata.storage.connector.createTables=true +druid.metadata.storage.connector.host=localhost +druid.metadata.storage.connector.password={"type": "environment", "variable": "DRUID_METADATA_STORAGE_PASSWORD"} +druid.metadata.storage.connector.port=1527 +druid.metadata.storage.connector.user=root +druid.metadata.storage.type=mysql +druid.monitoring.monitors=["org.apache.druid.java.util.metrics.JvmMonitor", "org.apache.druid.server.metrics.ServiceStatusMonitor"] +druid.s3.accessKey=minio +druid.s3.enablePathStyleAccess=true +druid.s3.endpoint.signingRegion=us-east-1 +druid.s3.endpoint.url=http://myminio-hl.demo.svc.cluster.local:9000/ +druid.s3.protocol=http +druid.s3.secretKey=minio123 +druid.selectors.coordinator.serviceName=druid/coordinator +druid.selectors.indexing.serviceName=druid/overlord +druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.metadata.storage.connector.password", "password", "key", "token", "pwd"] +druid.sql.enable=true +druid.sql.planner.useGroupingSetForExactDistinct=true +druid.startup.logging.logProperties=true +druid.storage.baseKey=druid/segments +druid.storage.bucket=druid +druid.storage.storageDirectory=var/druid/segments +druid.storage.type=s3 +druid.zk.paths.base=/druid +druid.zk.service.host=druid-cluster-zk.demo.svc:2181 +druid.zk.service.pwd={"type": "environment", "variable": "DRUID_ZK_SERVICE_PASSWORD"} +druid.zk.service.user=super +``` + +We can verify from the above output that TLS is disabled for this cluster as there is no TLS/SSL related configs provided for it. + +#### Verify TLS/SSL is disabled using Druid UI + +First port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + +From the above screenshot, we can see that the connection is not secure now. In other words, TLS/SSL is disabled for this druid cluster. + +### Create Issuer/ ClusterIssuer + +Now, We are going to create an example `Issuer` that will be used to enable SSL/TLS in Druid. Alternatively, you can follow this [cert-manager tutorial](https://cert-manager.io/docs/configuration/ca/) to create your own `Issuer`. + +- Start off by generating a ca certificates using openssl. + +```bash +$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key -out ./ca.crt -subj "/CN=ca/O=kubedb" +Generating a RSA private key +................+++++ +........................+++++ +writing new private key to './ca.key' +----- +``` + +- Now we are going to create a ca-secret using the certificate files that we have just generated. + +```bash +$ kubectl create secret tls druid-ca \ + --cert=ca.crt \ + --key=ca.key \ + --namespace=demo +secret/druid-ca created +``` + +Now, Let's create an `Issuer` using the `druid-ca` secret that we have just created. The `YAML` file looks like this: + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: druid-ca-issuer + namespace: demo +spec: + ca: + secretName: druid-ca +``` + +Let's apply the `YAML` file: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/druid-issuer.yaml +issuer.cert-manager.io/druid-ca-issuer created +``` + +### Create DruidOpsRequest + +In order to add TLS to the druid, we have to create a `DruidOpsRequest` CRO with our created issuer. Below is the YAML of the `DruidOpsRequest` CRO that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-add-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + issuerRef: + name: druid-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + subject: + organizations: + - druid + organizationalUnits: + - client + timeout: 5m + apply: IfReady +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `ReconfigureTLS` on druid. +- `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/druid/concepts/druid.md#spectls). + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/drops-add-tls.yaml +druidopsrequest.ops.kubedb.com/drops-add-tls created +``` + +#### Verify TLS Enabled Successfully + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CRO, + +```bash +$ kubectl get drops -n demo -w +NAME TYPE STATUS AGE +drops-add-tls ReconfigureTLS Progressing 39s +drops-add-tls ReconfigureTLS Progressing 44s +... +... +drops-add-tls ReconfigureTLS Successful 79s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed. + +```bash +$ kubectl describe druidopsrequest -n demo drops-add-tls +Name: drops-add-tls +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-28T09:43:13Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:timeout: + f:tls: + .: + f:certificates: + f:issuerRef: + f:type: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-28T09:43:13Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-28T09:44:32Z + Resource Version: 409889 + UID: b7f563c4-4773-49e9-aba2-17497e66f5f8 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Timeout: 5m + Tls: + Certificates: + Alias: client + Subject: + Organizational Units: + client + Organizations: + druid + Issuer Ref: + API Group: cert-manager.io + Kind: Issuer + Name: druid-ca-issuer + Type: ReconfigureTLS +Status: + Conditions: + Last Transition Time: 2024-10-28T09:43:13Z + Message: Druid ops-request has started to reconfigure tls for druid nodes + Observed Generation: 1 + Reason: ReconfigureTLS + Status: True + Type: ReconfigureTLS + Last Transition Time: 2024-10-28T09:43:26Z + Message: Successfully synced all certificates + Observed Generation: 1 + Reason: CertificateSynced + Status: True + Type: CertificateSynced + Last Transition Time: 2024-10-28T09:43:21Z + Message: get certificate; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetCertificate + Last Transition Time: 2024-10-28T09:43:21Z + Message: check ready condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CheckReadyCondition + Last Transition Time: 2024-10-28T09:43:21Z + Message: issuing condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IssuingCondition + Last Transition Time: 2024-10-28T09:43:31Z + Message: successfully reconciled the Druid with tls configuration + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-28T09:44:32Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-10-28T09:43:37Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T09:43:37Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T09:43:47Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T09:43:52Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T09:43:52Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T09:43:57Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T09:44:02Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T09:44:02Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T09:44:07Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T09:44:12Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T09:44:12Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T09:44:17Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T09:44:22Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T09:44:22Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T09:44:27Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T09:44:32Z + Message: Successfully completed reconfigureTLS for druid. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 103s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-add-tls + Normal Starting 103s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 103s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-add-tls + Warning get certificate; ConditionStatus:True 95s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 95s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 95s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 95s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 95s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 95s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 95s KubeDB Ops-manager Operator Successfully synced all certificates + Warning get certificate; ConditionStatus:True 90s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 90s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 90s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 90s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 90s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 90s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 90s KubeDB Ops-manager Operator Successfully synced all certificates + Normal UpdatePetSets 85s KubeDB Ops-manager Operator successfully reconciled the Druid with tls configuration + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 79s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 79s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:False; PodName:druid-cluster-historicals-0 74s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 69s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 64s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 64s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 59s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 54s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 54s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 49s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 44s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 44s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 39s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 34s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 34s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 29s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartNodes 24s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 24s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 24s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-add-tls +``` + +Now, Lets exec into a druid coordinators pod and verify the configuration that the TLS is enabled. + +```bash +$ kubectl exec -it -n demo druid-cluster-coordinators-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ cat conf/druid/cluster/_common/common.runtime.properties +druid.auth.authenticator.basic.authorizerName=basic +druid.auth.authenticator.basic.credentialsValidator.type=metadata +druid.auth.authenticator.basic.initialAdminPassword={"type": "environment", "variable": "DRUID_ADMIN_PASSWORD"} +druid.auth.authenticator.basic.initialInternalClientPassword=password2 +druid.auth.authenticator.basic.skipOnFailure=false +druid.auth.authenticator.basic.type=basic +druid.auth.authenticatorChain=["basic"] +druid.auth.authorizer.basic.type=basic +druid.auth.authorizers=["basic"] +druid.client.https.trustStorePassword={"type": "environment", "variable": "DRUID_KEY_STORE_PASSWORD"} +druid.client.https.trustStorePath=/opt/druid/ssl/truststore.jks +druid.client.https.trustStoreType=jks +druid.client.https.validateHostnames=false +druid.emitter.logging.logLevel=info +druid.emitter=noop +druid.enablePlaintextPort=false +druid.enableTlsPort=true +druid.escalator.authorizerName=basic +druid.escalator.internalClientPassword=password2 +druid.escalator.internalClientUsername=druid_system +druid.escalator.type=basic +druid.expressions.useStrictBooleans=true +druid.extensions.loadList=["druid-avro-extensions", "druid-kafka-indexing-service", "druid-kafka-indexing-service", "druid-datasketches", "druid-multi-stage-query", "druid-basic-security", "simple-client-sslcontext", "mysql-metadata-storage", "druid-s3-extensions"] +druid.global.http.eagerInitialization=false +druid.host=localhost +druid.indexer.logs.directory=var/druid/indexing-logs +druid.indexer.logs.type=file +druid.indexing.doubleStorage=double +druid.lookup.enableLookupSyncOnStartup=false +druid.metadata.storage.connector.connectURI=jdbc:mysql://druid-cluster-mysql-metadata.demo.svc:3306/druid +druid.metadata.storage.connector.createTables=true +druid.metadata.storage.connector.host=localhost +druid.metadata.storage.connector.password={"type": "environment", "variable": "DRUID_METADATA_STORAGE_PASSWORD"} +druid.metadata.storage.connector.port=1527 +druid.metadata.storage.connector.user=root +druid.metadata.storage.type=mysql +druid.monitoring.monitors=["org.apache.druid.java.util.metrics.JvmMonitor", "org.apache.druid.server.metrics.ServiceStatusMonitor"] +druid.s3.accessKey=minio +druid.s3.enablePathStyleAccess=true +druid.s3.endpoint.signingRegion=us-east-1 +druid.s3.endpoint.url=http://myminio-hl.demo.svc.cluster.local:9000/ +druid.s3.protocol=http +druid.s3.secretKey=minio123 +druid.selectors.coordinator.serviceName=druid/coordinator +druid.selectors.indexing.serviceName=druid/overlord +druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.metadata.storage.connector.password", "password", "key", "token", "pwd"] +druid.server.https.certAlias=druid +druid.server.https.keyStorePassword={"type": "environment", "variable": "DRUID_KEY_STORE_PASSWORD"} +druid.server.https.keyStorePath=/opt/druid/ssl/keystore.jks +druid.server.https.keyStoreType=jks +druid.sql.enable=true +druid.sql.planner.useGroupingSetForExactDistinct=true +druid.startup.logging.logProperties=true +druid.storage.baseKey=druid/segments +druid.storage.bucket=druid +druid.storage.storageDirectory=var/druid/segments +druid.storage.type=s3 +druid.zk.paths.base=/druid +druid.zk.service.host=druid-cluster-zk.demo.svc:2181 +druid.zk.service.pwd={"type": "environment", "variable": "DRUID_ZK_SERVICE_PASSWORD"} +druid.zk.service.user=super + +``` + +We can see from the output above that all TLS related configs are added in the configuration file of the druid database. + +#### Verify TLS/SSL using Druid UI + +To check follow the following steps: + +Druid uses separate ports for TLS/SSL. While the plaintext port for `routers` node is `8888`. For TLS, it is `9088`. Hence, we will use that port to access the UI. + +First port-forward the port `9088` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-tls-routers 9088 +Forwarding from 127.0.0.1:9088 -> 9088 +Forwarding from [::1]:9088 -> 9088 +``` + + +Now hit the `https://localhost:9088/` from any browser. Here you may select `Advance` and then `Proceed to localhost (unsafe)` or you can add the `ca.crt` from the secret `druid-cluster-tls-client-cert` to your browser's Authorities. + +After that you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-tls-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-tls-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + +From the above screenshot, we can see that the connection is secure. + + +## Rotate Certificate + +Now we are going to rotate the certificate of this cluster. First let's check the current expiration date of the certificate. + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 9088 +Forwarding from 127.0.0.1:9088 -> 9088 +Forwarding from [::1]:9088 -> 9088 +Handling connection for 9088 +... + +$ openssl s_client -connect localhost:9088 2>/dev/null | openssl x509 -noout -enddate +notAfter=Jan 26 09:43:16 2025 GMT +``` + +So, the certificate will expire on this time `Jan 26 09:43:16 2025 GMT`. + +### Create DruidOpsRequest + +Now we are going to increase it using a DruidOpsRequest. Below is the yaml of the ops request that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-recon-tls-rotate + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + rotateCertificates: true +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `druid-cluster`. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our cluster. +- `spec.tls.rotateCertificates` specifies that we want to rotate the certificate of this druid cluster. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/drops-rotate.yaml +druidopsrequest.ops.kubedb.com/drops-rotate created +``` + +#### Verify Certificate Rotated Successfully + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CRO, + +```bash +$ kubectl get druidopsrequests -n demo drops-rotate -w +NAME TYPE STATUS AGE +drops-rotate ReconfigureTLS Successful 4m4s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed. + +```bash +$ kubectl describe druidopsrequest -n demo drops-rotate +Name: drops-rotate +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-28T14:14:50Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:tls: + .: + f:rotateCertificates: + f:type: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-28T14:14:50Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-28T14:16:04Z + Resource Version: 440897 + UID: ca3532fc-6e11-4962-bddb-f9cf946d3954 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Tls: + Rotate Certificates: true + Type: ReconfigureTLS +Status: + Conditions: + Last Transition Time: 2024-10-28T14:14:50Z + Message: Druid ops-request has started to reconfigure tls for druid nodes + Observed Generation: 1 + Reason: ReconfigureTLS + Status: True + Type: ReconfigureTLS + Last Transition Time: 2024-10-28T14:15:04Z + Message: Successfully synced all certificates + Observed Generation: 1 + Reason: CertificateSynced + Status: True + Type: CertificateSynced + Last Transition Time: 2024-10-28T14:14:58Z + Message: get certificate; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetCertificate + Last Transition Time: 2024-10-28T14:14:58Z + Message: check ready condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CheckReadyCondition + Last Transition Time: 2024-10-28T14:14:58Z + Message: issuing condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IssuingCondition + Last Transition Time: 2024-10-28T14:15:09Z + Message: successfully reconciled the Druid with tls configuration + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-28T14:16:04Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-10-28T14:15:14Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:15:14Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:15:19Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:15:24Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:15:24Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:15:29Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:15:34Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:15:34Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:15:39Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:15:44Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:15:44Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:15:49Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:15:54Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:15:54Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:15:59Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:16:04Z + Message: Successfully completed reconfigureTLS for druid. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 101s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-rotate + Normal Starting 101s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 101s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-rotate + Warning get certificate; ConditionStatus:True 93s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 93s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 93s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 93s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 93s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 93s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 93s KubeDB Ops-manager Operator Successfully synced all certificates + Warning get certificate; ConditionStatus:True 88s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 88s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 88s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 88s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 88s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 88s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 87s KubeDB Ops-manager Operator Successfully synced all certificates + Normal UpdatePetSets 82s KubeDB Ops-manager Operator successfully reconciled the Druid with tls configuration + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 77s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 77s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 72s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 67s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 67s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 62s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 57s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 57s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 52s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 47s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 47s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 42s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 37s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 37s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 32s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartNodes 27s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 27s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 27s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-rotate +``` + +Now, let's check the expiration date of the certificate. + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 9088 +Forwarding from 127.0.0.1:9088 -> 9088 +Forwarding from [::1]:9088 -> 9088 +Handling connection for 9088 +... + +$ openssl s_client -connect localhost:9088 2>/dev/null | openssl x509 -noout -enddate +notAfter=Jan 26 14:15:46 2025 GMT +``` + +As we can see from the above output, the certificate has been rotated successfully. + +## Change Issuer/ClusterIssuer + +Now, we are going to change the issuer of this database. + +- Let's create a new ca certificate and key using a different subject `CN=ca-update,O=kubedb-updated`. + +```bash +$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key -out ./ca.crt -subj "/CN=ca-updated/O=kubedb-updated" +Generating a RSA private key +..............................................................+++++ +......................................................................................+++++ +writing new private key to './ca.key' +----- +``` + +- Now we are going to create a new ca-secret using the certificate files that we have just generated. + +```bash +$ kubectl create secret tls druid-new-ca \ + --cert=ca.crt \ + --key=ca.key \ + --namespace=demo +secret/druid-new-ca created +``` + +Now, Let's create a new `Issuer` using the `mongo-new-ca` secret that we have just created. The `YAML` file looks like this: + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: dr-new-issuer + namespace: demo +spec: + ca: + secretName: druid-new-ca +``` + +Let's apply the `YAML` file: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/druid-new-issuer.yaml +issuer.cert-manager.io/dr-new-issuer created +``` + +### Create DruidOpsRequest + +In order to use the new issuer to issue new certificates, we have to create a `DruidOpsRequest` CRO with the newly created issuer. Below is the YAML of the `DruidOpsRequest` CRO that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-update-issuer + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + issuerRef: + name: dr-new-issuer + kind: Issuer + apiGroup: "cert-manager.io" +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `ReconfigureTLS` on our druid. +- `spec.tls.issuerRef` specifies the issuer name, kind and api group. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/druid-update-tls-issuer.yaml +druidpsrequest.ops.kubedb.com/drops-update-issuer created +``` + +#### Verify Issuer is changed successfully + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CRO, + +```bash +$ kubectl get druidopsrequests -n demo drops-update-issuer -w +NAME TYPE STATUS AGE +drops-update-issuer ReconfigureTLS Progressing 14s +drops-update-issuer ReconfigureTLS Progressing 18s +... +... +drops-update-issuer ReconfigureTLS Successful 73s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed. + +```bash +$ kubectl describe druidopsrequest -n demo drops-update-issuer +Name: drops-update-issuer +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-28T14:24:22Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:tls: + .: + f:issuerRef: + f:type: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-28T14:24:22Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-28T14:25:35Z + Resource Version: 442332 + UID: 5089e358-2dc2-4d62-8c13-92828de7c557 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Tls: + Issuer Ref: + API Group: cert-manager.io + Kind: Issuer + Name: dr-new-issuer + Type: ReconfigureTLS +Status: + Conditions: + Last Transition Time: 2024-10-28T14:24:22Z + Message: Druid ops-request has started to reconfigure tls for druid nodes + Observed Generation: 1 + Reason: ReconfigureTLS + Status: True + Type: ReconfigureTLS + Last Transition Time: 2024-10-28T14:24:35Z + Message: Successfully synced all certificates + Observed Generation: 1 + Reason: CertificateSynced + Status: True + Type: CertificateSynced + Last Transition Time: 2024-10-28T14:24:30Z + Message: get certificate; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetCertificate + Last Transition Time: 2024-10-28T14:24:30Z + Message: check ready condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CheckReadyCondition + Last Transition Time: 2024-10-28T14:24:30Z + Message: issuing condition; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IssuingCondition + Last Transition Time: 2024-10-28T14:24:40Z + Message: successfully reconciled the Druid with tls configuration + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-28T14:25:35Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-10-28T14:24:45Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:24:45Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:24:50Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:24:55Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:24:55Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:25:00Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:25:05Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:25:05Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:25:10Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:25:15Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:25:15Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:25:20Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:25:25Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:25:25Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:25:30Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:25:35Z + Message: Successfully completed reconfigureTLS for druid. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 92s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-update-issuer + Normal Starting 92s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 92s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-update-issuer + Warning get certificate; ConditionStatus:True 84s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 84s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 84s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 84s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 84s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 84s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 84s KubeDB Ops-manager Operator Successfully synced all certificates + Warning get certificate; ConditionStatus:True 79s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 79s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 79s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Warning get certificate; ConditionStatus:True 79s KubeDB Ops-manager Operator get certificate; ConditionStatus:True + Warning check ready condition; ConditionStatus:True 79s KubeDB Ops-manager Operator check ready condition; ConditionStatus:True + Warning issuing condition; ConditionStatus:True 79s KubeDB Ops-manager Operator issuing condition; ConditionStatus:True + Normal CertificateSynced 79s KubeDB Ops-manager Operator Successfully synced all certificates + Normal UpdatePetSets 74s KubeDB Ops-manager Operator successfully reconciled the Druid with tls configuration + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 69s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 69s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 64s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 59s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 59s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 54s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 49s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 49s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 44s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 39s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 39s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 34s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 29s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 29s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 24s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartNodes 19s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 19s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 19s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-update-issuer +``` + +Now, Lets exec into a druid node and find out the ca subject to see if it matches the one we have provided. + +```bash +$ kubectl exec -it druid-cluster-broker-0 -- bash +druid@druid-cluster-broker-0:~$ keytool -list -v -keystore /var/private/ssl/server.keystore.jks -storepass wt6f5pwxpg84 | grep 'Issuer' +Issuer: O=kubedb-updated, CN=ca-updated +Issuer: O=kubedb-updated, CN=ca-updated + +$ kubectl port-forward -n demo svc/druid-cluster-routers 9088 +Forwarding from 127.0.0.1:9088 -> 9088 +Forwarding from [::1]:9088 -> 9088 +Handling connection for 9088 +... + +$ openssl s_client -connect localhost:9088 2>/dev/null | openssl x509 -noout -issuer +issuer=CN = ca-updated, O = kubedb-updated +``` + +We can see from the above output that, the subject name matches the subject name of 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 DruidOpsRequest. + +### Create DruidOpsRequest + +Below is the YAML of the `DruidOpsRequest` CRO that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-remove + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + remove: true +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing reconfigure TLS operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `ReconfigureTLS` on Druid. +- `spec.tls.remove` specifies that we want to remove tls from this cluster. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure-tls/yamls/drops-remove.yaml +druidopsrequest.ops.kubedb.com/drops-remove created +``` + +#### Verify TLS Removed Successfully + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CRO, + +```bash +$ kubectl get druidopsrequest -n demo drops-remove -w +NAME TYPE STATUS AGE +drops-remove ReconfigureTLS Progressing 25s +drops-remove ReconfigureTLS Progressing 29s +... +... +drops-remove ReconfigureTLS Successful 114s + +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed. + +```bash +$ kubectl describe druidopsrequest -n demo drops-remove +Name: drops-remove +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-28T14:31:07Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:tls: + .: + f:remove: + f:type: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-28T14:31:07Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-28T14:33:01Z + Resource Version: 443725 + UID: 27234241-c72e-471c-8dd4-16fd485956cc +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Tls: + Remove: true + Type: ReconfigureTLS +Status: + Conditions: + Last Transition Time: 2024-10-28T14:31:07Z + Message: Druid ops-request has started to reconfigure tls for druid nodes + Observed Generation: 1 + Reason: ReconfigureTLS + Status: True + Type: ReconfigureTLS + Last Transition Time: 2024-10-28T14:31:16Z + Message: successfully reconciled the Druid with tls configuration + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-28T14:33:01Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-10-28T14:31:21Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:31:21Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:31:26Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-28T14:31:31Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:31:31Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:31:36Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-28T14:31:41Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:31:41Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:31:46Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-brokers-0 + Last Transition Time: 2024-10-28T14:31:51Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:31:51Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:31:56Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-routers-0 + Last Transition Time: 2024-10-28T14:32:01Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:32:01Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:32:06Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-28T14:33:01Z + Message: Successfully completed reconfigureTLS for druid. + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m12s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/drops-remove + Normal Starting 2m12s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 2m12s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: drops-remove + Normal UpdatePetSets 2m3s KubeDB Ops-manager Operator successfully reconciled the Druid with tls configuration + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 118s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 118s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 113s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 108s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 108s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 103s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 98s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 98s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 93s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 88s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 88s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 83s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 78s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 78s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 73s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 68s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 68s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 63s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 58s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 58s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 53s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 48s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 48s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 43s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 38s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 38s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 33s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 28s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 28s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 23s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartNodes 18s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 18s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 18s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: drops-remove +``` + +Now, Let's exec into one of the broker node and find out that TLS is disabled or not. + +```bash +$$ kubectl exec -it -n demo druid-cluster-broker-0 -- druid-configs.sh --bootstrap-server localhost:9092 --command-config /opt/druid/config/clientauth.properties --describe --entity-type brokers --all | grep 'ssl.keystore' + ssl.keystore.certificate.chain=null sensitive=true synonyms={} + ssl.keystore.key=null sensitive=true synonyms={} + ssl.keystore.location=null sensitive=false synonyms={} + ssl.keystore.password=null sensitive=true synonyms={} + ssl.keystore.type=JKS sensitive=false synonyms={DEFAULT_CONFIG:ssl.keystore.type=JKS} + ssl.keystore.certificate.chain=null sensitive=true synonyms={} + ssl.keystore.key=null sensitive=true synonyms={} + ssl.keystore.location=null sensitive=false synonyms={} + ssl.keystore.password=null sensitive=true synonyms={} +``` + +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 opsrequest drops-add-tls drops-remove drops-rotate drops-update-issuer +kubectl delete druid -n demo druid-cluster +kubectl delete issuer -n demo druid-ca-issuer dr-new-issuer +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). + diff --git a/docs/guides/druid/reconfigure-tls/images/druid-ui.png b/docs/guides/druid/reconfigure-tls/images/druid-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f81925c59cb7bf238315c7de992eaf0092caeb9c GIT binary patch literal 46148 zcma%?Wmp_R^WYbPYw+M9xVviz?(P!YA-G#`53bANF2QYqKyY_=cXz$b``-UP-E+^) zr{0h7A}o~r6!M<^*sq9PF>0RRA0X(=%k0N}$P005c@0UC0rQCNuq00;m`i+xq| zFgRJg*Cd?p5PrF)7Px=bS8N%-f39#0u!+I$6BV7W9_rd|vK+)xDbZ ze|&f_gY&0Aj z8#~bC_!x6{*5)skPi%eeb1=NY8!z%;$u)_kfF$%gI0JLZ25F7tav`6+6ISa9&;>8#{X)N&AF12Tbp9d%lp@>)9#7 z1iUvd50B5o=Gl>u+lepc;N05Unh~|6!#mDvXuRzj|6RxJ9Z&GY&zCjp&;MHf<1pvF z40W#D>}^-Q?h-)dP`o4jb{Pajc@1-q^L?O(4*kOZRx9qH1eW+v$qo0f3V>(l?c$6y z;?tqy@_~)d>)Zzpuf?Us_V>3ieqY`Ti52&?Z|CkJ?g;;61IXcfTin;ZK_WdT>mpuM z-vZV=7nk{8B1C-77oPn+?icu%@d^G(0*H9eUp5!o&R;KI?}aHA7r+sX`#?OH1CT+Z zo7<;Q-v_eIS9Bq)A~DUvIP8p^Z>xo>#wWl>-Trtp3j$1|Gg)C?EXIge$6yU zhW+0g7i^zJKK!Tn8~tO>f29`S5hnio^yCAK<$p_eP|zIzEjm_5 zoSbF7@n^?8sjt=vVQD)9EBrYB6_uQ$hqW}8p)|5jWN|RNgLZsCsWF2YuA)Xnq0kJx zt)C;xT4bX6p^NHIQkMDWO#3ivk4cQwOz^&3>P4JR7%jIhWxl> z@oQRBd1}S7^!_FcNxQtQSyi&|V5H2j@fTZ|8rw9+j_^2>t$s6oEq>_fR#NC0-k~FO zqDddBA$j9+-utEJK~X=$T;mrDQ_H@5r@gNX2*`&z?c~43;2wnfa)o?bcA8aAokL-7%kcph4 z5kr|`RO9JEEuz`A+*kkzXd3o|<{&2;wh@&QB_Gs}PLKSZG-MIQ+~;yw0KhT$z{eKh zN*$hPLqXb`jV@+1KP!tlFagU}&*5%l|JB!~|D#Nw{hCTy`RBCKYgDz|=;K3r|COxh zwPtVGNuGlk#Qs)J3PVBMXF^WPN;82=1L!FOP-@r2dj8Aad4QivImE6dhi!o%Rp@Xn*gt zNiDzm1&(DZi$w}Sz8+L&1VCz>+iJ;j5Dz~AnAx`zzoVu1|NhiDXhz2VdqA$@ znL;`_n0rnq?qXmJmT1J>-I^#$zbB2AAW7V z0ZbR2@rs5y-7I>#-p2UGjJ~EMO>Ne+{LGVZ`AEm;ATP&cWlu;`X_@aGUS`vFLRyHA z1k}`;IyoaR^o}e)ZY9p*jpeBN!cbEWu59ovX{{PIWdi%|f2GlVXXD)Kg67z~?xcQs z^%q9JyrF!-+?h^Xm=;3`RHk4jBWlbzxw*c+%gFuk!x-Q1hnGP4`a6G()h7o#-#KNZ zLMY+v$>Er~Y81O~Sk9h&)I)1ZTezR_cbHeOm~CkU2z>oP?{e_y6Etj3^fd>zTO-
    {yjnPE+`Z}Fi1=a*gChoeRmxdp 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

    *(5D{^Y!StGY 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 IeD)vz3tjT>3;+NC literal 0 HcmV?d00001 diff --git a/docs/guides/druid/reconfigure-tls/images/druid-without-tls.png b/docs/guides/druid/reconfigure-tls/images/druid-without-tls.png new file mode 100644 index 0000000000000000000000000000000000000000..07aacd32a0fae485d1d55a8151eaaedab9c368e0 GIT binary patch literal 114409 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∋iINQ2Um)1sc|nrv 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

    D3m?9b7o~O5+4UuIpuXy)k%!I#% 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/reconfigure-tls/images/reconfigure-tls.png b/docs/guides/druid/reconfigure-tls/images/reconfigure-tls.png new file mode 100644 index 0000000000000000000000000000000000000000..316d1a0aa5205216be4643b758eaa68cf96ec07c GIT binary patch literal 37055 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 U~!XWbt|Jej-R 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/reconfigure-tls/overview.md b/docs/guides/druid/reconfigure-tls/overview.md new file mode 100644 index 0000000000..5b55da583f --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/overview.md @@ -0,0 +1,54 @@ +--- +title: Reconfiguring TLS/SSL +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure-tls-overview + name: Overview + parent: guides-druid-reconfigure-tls + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfiguring TLS of Druid + +This guide will give an overview on how KubeDB Ops-manager operator reconfigures TLS configuration i.e. add TLS, remove TLS, update issuer/cluster issuer or Certificates and rotate the certificates of `Druid`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How Reconfiguring Druid TLS Configuration Process Works + +The following diagram shows how KubeDB Ops-manager operator reconfigures TLS of a `Druid`. Open the image in a new tab to see the enlarged version. + +

    +  Reconfiguring TLS process of Druid +
    Fig: Reconfiguring TLS process of Druid
    +
    + +The Reconfiguring Druid TLS process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource Object (CRO). + +2. `KubeDB` Provisioner operator watches the `Druid` CRO. + +3. When the operator finds a `Druid` 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 `Druid` database the user creates a `DruidOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +6. When it finds a `DruidOpsRequest` CR, it pauses the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` object during the reconfiguring TLS process. + +7. Then the `KubeDB` Ops-manager operator will add, remove, update or rotate TLS configuration based on the Ops Request yaml. + +8. Then the `KubeDB` Ops-manager operator will restart all the Pods of the database so that they restart with the new TLS configuration defined in the `DruidOpsRequest` CR. + +9. After the successful reconfiguring of the `Druid` TLS, the `KubeDB` Ops-manager operator resumes the `Druid` object so that the `KubeDB` Provisioner operator resumes its usual operations. + +In the next docs, we are going to show a step by step guide on reconfiguring TLS configuration of a Druid database using `DruidOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/druid/reconfigure-tls/yamls/deep-storage-config.yaml b/docs/guides/druid/reconfigure-tls/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/reconfigure-tls/yamls/drops-add-tls.yaml b/docs/guides/druid/reconfigure-tls/yamls/drops-add-tls.yaml new file mode 100644 index 0000000000..dd3654967b --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/drops-add-tls.yaml @@ -0,0 +1,23 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-add-tls + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + issuerRef: + name: druid-ca-issuer + kind: Issuer + apiGroup: "cert-manager.io" + certificates: + - alias: client + subject: + organizations: + - druid + organizationalUnits: + - client + timeout: 5m + apply: IfReady diff --git a/docs/guides/druid/reconfigure-tls/yamls/drops-remove.yaml b/docs/guides/druid/reconfigure-tls/yamls/drops-remove.yaml new file mode 100644 index 0000000000..af42b8d00d --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/drops-remove.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-remove + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + remove: true diff --git a/docs/guides/druid/reconfigure-tls/yamls/drops-rotate.yaml b/docs/guides/druid/reconfigure-tls/yamls/drops-rotate.yaml new file mode 100644 index 0000000000..f0be918f6f --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/drops-rotate.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-recon-tls-rotate + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + rotateCertificates: true diff --git a/docs/guides/druid/reconfigure-tls/yamls/druid-ca-issuer.yaml b/docs/guides/druid/reconfigure-tls/yamls/druid-ca-issuer.yaml new file mode 100644 index 0000000000..d6298c972c --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/druid-ca-issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: druid-ca-issuer + namespace: demo +spec: + ca: + secretName: druid-ca diff --git a/docs/guides/druid/reconfigure-tls/yamls/druid-cluster.yaml b/docs/guides/druid/reconfigure-tls/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..6351c2ddda --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/druid-cluster.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete + diff --git a/docs/guides/druid/reconfigure-tls/yamls/druid-new-issuer.yaml b/docs/guides/druid/reconfigure-tls/yamls/druid-new-issuer.yaml new file mode 100644 index 0000000000..ede5d5177c --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/druid-new-issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: dr-new-issuer + namespace: demo +spec: + ca: + secretName: druid-new-ca \ No newline at end of file diff --git a/docs/guides/druid/reconfigure-tls/yamls/druid-update-tls-issuer.yaml b/docs/guides/druid/reconfigure-tls/yamls/druid-update-tls-issuer.yaml new file mode 100644 index 0000000000..e876f4c3b8 --- /dev/null +++ b/docs/guides/druid/reconfigure-tls/yamls/druid-update-tls-issuer.yaml @@ -0,0 +1,14 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: drops-update-issuer + namespace: demo +spec: + type: ReconfigureTLS + databaseRef: + name: druid-cluster + tls: + issuerRef: + name: dr-new-issuer + kind: Issuer + apiGroup: "cert-manager.io" diff --git a/docs/guides/druid/reconfigure/_index.md b/docs/guides/druid/reconfigure/_index.md new file mode 100644 index 0000000000..4c3cfdfe58 --- /dev/null +++ b/docs/guides/druid/reconfigure/_index.md @@ -0,0 +1,10 @@ +--- +title: Reconfigure +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure + name: Reconfigure + parent: guides-druid + weight: 110 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/reconfigure/guide.md b/docs/guides/druid/reconfigure/guide.md new file mode 100644 index 0000000000..cf85960a9c --- /dev/null +++ b/docs/guides/druid/reconfigure/guide.md @@ -0,0 +1,704 @@ +--- +title: Reconfigure Druid Topology +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure-guide + name: Reconfigure Druid + parent: guides-druid-reconfigure + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfigure Druid Cluster + +This guide will show you how to use `KubeDB` Ops-manager operator to reconfigure a Druid Topology 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [Topology](/docs/guides/druid/clustering/overview/index.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Reconfigure Overview](/docs/guides/druid/reconfigure/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/guides/druid/reconfigure/yamls](/docs/guides/druid/reconfigure/yamls) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +Now, we are going to deploy a `Druid` cluster using a supported version by `KubeDB` operator. Then we are going to apply `DruidOpsRequest` to reconfigure its configuration. + +### Prepare Druid Cluster + +Now, we are going to deploy a `Druid` topology cluster with version `28.0.1`. + +#### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/restart/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Now, lets go ahead and create a druid database. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +### Reconfigure using config secret + +Say we want to change the default maximum number of tasks the MiddleManager can accept. Let's create the `middleManagers.properties` file with our desire configurations. + +**middleManagers.properties:** + +```properties +druid.worker.capacity=5 +``` + +**historicals.properties:** + +```properties +druid.processing.numThreads=3 +``` + +Then, we will create a new secret with this configuration file. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: config-secret + namespace: demo +stringData: + middleManagers.properties: |- + druid.worker.capacity=5 + historicals.properties: |- + druid.processing.numThreads=3 +``` + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/config-secret.yaml +secret/new-config created +``` + +### Check Current Configuration + +Before creating the druidOpsRequest, first +Lets exec into one of the druid middleManagers pod that we have created and check the default configuration: + +Exec into the Druid middleManagers: + +```bash +$ kubectl exec -it -n demo druid-cluster-middleManagers-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the configurations: +```bash +bash-5.1$ cat conf/druid/cluster/data/middleManager/runtime.properties | grep druid.worker.capacity +druid.worker.capacity=2 +``` +Here, we can see that our given configuration is applied to the Druid cluster for all brokers. + +Now, lets exec into one of the druid historicals pod that we have created and check the configurations are applied or not: + +Exec into the Druid historicals: + +```bash +$ kubectl exec -it -n demo druid-cluster-historicals-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the metadata storage directory: +```bash +bash-5.1$ cat conf/druid/cluster/data/historical/runtime.properties | grep druid.processing.numThreads +druid.processing.numThreads=2 +``` + +Here, we can see that our given configuration is applied to the historicals. + +### Check Configuration from Druid UI + +You can also see the configuration changes from the druid ui. For that, follow the following steps: + +First port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-auth -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-auth -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + +You can see that there are 2 task slots reflecting with the configuration `druid.worker.capacity=2`. + + +#### Create DruidOpsRequest + +Now, we will use this secret to replace the previous secret using a `DruidOpsRequest` CR. The `DruidOpsRequest` yaml is given below, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: reconfigure-drops + namespace: demo +spec: + type: Reconfigure + databaseRef: + name: druid-cluster + configuration: + configSecret: + name: new-config +``` + +Here, + +- `spec.databaseRef.name` specifies that we are reconfiguring `druid-prod` database. +- `spec.type` specifies that we are performing `Reconfigure` on our database. +- `spec.configSecret.name` specifies the name of the new secret. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/reconfigure/yamls/reconfigure-druid-ops.yaml +druidopsrequest.ops.kubedb.com/reconfigure-drops created +``` + +#### Check new configuration + +If everything goes well, `KubeDB` Ops-manager operator will update the `configSecret` of `Druid` object. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ kubectl get druidopsrequests -n demo +NAME TYPE STATUS AGE +reconfigure-drops Reconfigure Successful 4m55s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to reconfigure the database. + +```bash +$ kubectl describe druidopsrequest -n demo reconfigure-drops +Name: reconfigure-drops +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-08-02T05:08:37Z + Generation: 1 + Resource Version: 332491 + UID: b6e8cb1b-d29f-445e-bb01-60d29012c7eb +Spec: + Apply: IfReady + Configuration: + Config Secret: + Name: new-kf-topology-custom-config + Database Ref: + Name: druid-prod + Timeout: 5m + Type: Reconfigure +Status: + Conditions: + Last Transition Time: 2024-08-02T05:08:37Z + Message: Druid ops-request has started to reconfigure druid nodes + Observed Generation: 1 + Reason: Reconfigure + Status: True + Type: Reconfigure + Last Transition Time: 2024-08-02T05:08:45Z + Message: check reconcile; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: CheckReconcile + Last Transition Time: 2024-08-02T05:09:42Z + Message: successfully reconciled the Druid with new configure + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-08-02T05:09:47Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:09:47Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:10:02Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:10:07Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:10:07Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:10:22Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:10:27Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:10:27Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:11:12Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:11:17Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:11:17Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:11:32Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:11:37Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-08-02T05:11:39Z + Message: Successfully completed reconfigure druid + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 3m7s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/reconfigure-drops + Normal Starting 3m7s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-prod + Normal Successful 3m7s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-prod for DruidOpsRequest: reconfigure-drops + Warning check reconcile; ConditionStatus:False 2m59s KubeDB Ops-manager Operator check reconcile; ConditionStatus:False + Normal UpdatePetSets 2m2s KubeDB Ops-manager Operator successfully reconciled the Druid with new configure + Warning get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 117s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 117s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-historicals-0 112s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 102s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 97s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 97s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-historicals-1 92s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-historicals-1 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 82s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 77s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 77s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-0 72s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 32s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 27s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 27s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-1 22s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-1 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 12s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Normal RestartNodes 7s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 5s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-prod + Normal Successful 5s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-prod for DruidOpsRequest: reconfigure-drops +``` + +Now let's exec one of the instance and run a druid-configs.sh command to check the new configuration we have provided. + +```bash +$ kubectl exec -it -n demo druid-prod-middleManagers-0 -- druid-configs.sh --bootstrap-server localhost:9092 --command-config /opt/druid/config/clientauth.properties --describe --entity-type middleManagerss --all | grep 'log.retention.hours' + log.retention.hours=125 sensitive=false synonyms={STATIC_BROKER_CONFIG:log.retention.hours=125, DEFAULT_CONFIG:log.retention.hours=168} + log.retention.hours=125 sensitive=false synonyms={STATIC_BROKER_CONFIG:log.retention.hours=125, DEFAULT_CONFIG:log.retention.hours=168} +``` + +As we can see from the configuration of ready druid, the value of `log.retention.hours` has been changed from `100` to `125`. So the reconfiguration of the cluster is successful. + + +### Reconfigure using apply config + +Now we will reconfigure this cluster again to set `log.retention.hours` to `150`. This time we won't use a new secret. We will use the `applyConfig` field of the `DruidOpsRequest`. This will merge the new config in the existing secret. + +#### Create DruidOpsRequest + +Now, we will use the new configuration in the `applyConfig` field in the `DruidOpsRequest` CR. The `DruidOpsRequest` yaml is given below, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: kfops-reconfigure-apply-topology + namespace: demo +spec: + type: Reconfigure + databaseRef: + name: druid-prod + configuration: + applyConfig: + middleManagers.properties: |- + log.retention.hours=150 + historicals.properties: |- + historicals.quorum.election.timeout.ms=4000 + historicals.quorum.fetch.timeout.ms=5000 + timeout: 5m + apply: IfReady +``` + +Here, + +- `spec.databaseRef.name` specifies that we are reconfiguring `druid-prod` cluster. +- `spec.type` specifies that we are performing `Reconfigure` on druid. +- `spec.configuration.applyConfig` specifies the new configuration that will be merged in the existing secret. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/reconfigure/druid-reconfigure-apply-topology.yaml +druidopsrequest.ops.kubedb.com/kfops-reconfigure-apply-topology created +``` + +#### Verify new configuration + +If everything goes well, `KubeDB` Ops-manager operator will merge this new config with the existing configuration. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ kubectl get druidopsrequests -n demo kfops-reconfigure-apply-topology +NAME TYPE STATUS AGE +kfops-reconfigure-apply-topology Reconfigure Successful 55s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to reconfigure the cluster. + +```bash +$ kubectl describe druidopsrequest -n demo kfops-reconfigure-apply-topology +Name: kfops-reconfigure-apply-topology +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-08-02T05:14:42Z + Generation: 1 + Resource Version: 332996 + UID: 551d2c92-9431-47a7-a699-8f8115131b49 +Spec: + Apply: IfReady + Configuration: + Apply Config: + middleManagers.properties: log.retention.hours=150 + historicals.properties: historicals.quorum.election.timeout.ms=4000 +historicals.quorum.fetch.timeout.ms=5000 + Database Ref: + Name: druid-prod + Timeout: 5m + Type: Reconfigure +Status: + Conditions: + Last Transition Time: 2024-08-02T05:14:42Z + Message: Druid ops-request has started to reconfigure druid nodes + Observed Generation: 1 + Reason: Reconfigure + Status: True + Type: Reconfigure + Last Transition Time: 2024-08-02T05:14:45Z + Message: Successfully prepared user provided custom config secret + Observed Generation: 1 + Reason: PrepareCustomConfig + Status: True + Type: PrepareCustomConfig + Last Transition Time: 2024-08-02T05:14:52Z + Message: successfully reconciled the Druid with new configure + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-08-02T05:14:57Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:14:57Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:15:07Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-historicals-0 + Last Transition Time: 2024-08-02T05:15:12Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:15:12Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:15:27Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-historicals-1 + Last Transition Time: 2024-08-02T05:15:32Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:15:32Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:16:07Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-middleManagers-0 + Last Transition Time: 2024-08-02T05:16:12Z + Message: get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: GetPod--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:16:12Z + Message: evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:16:27Z + Message: check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-prod-middleManagers-1 + Last Transition Time: 2024-08-02T05:16:32Z + Message: Successfully restarted all nodes + Observed Generation: 1 + Reason: RestartNodes + Status: True + Type: RestartNodes + Last Transition Time: 2024-08-02T05:16:35Z + Message: Successfully completed reconfigure druid + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 2m6s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/kfops-reconfigure-apply-topology + Normal Starting 2m6s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-prod + Normal Successful 2m6s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-prod for DruidOpsRequest: kfops-reconfigure-apply-topology + Normal UpdatePetSets 116s KubeDB Ops-manager Operator successfully reconciled the Druid with new configure + Warning get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 111s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 111s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-historicals-0 106s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 101s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 96s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 96s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-historicals-1 91s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-historicals-1 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 81s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-historicals-1 + Warning get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 76s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 76s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-0 71s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 41s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 36s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Warning evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 36s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Warning check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-1 31s KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-prod-middleManagers-1 + Warning check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 21s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-prod-middleManagers-1 + Normal RestartNodes 15s KubeDB Ops-manager Operator Successfully restarted all nodes + Normal Starting 14s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-prod + Normal Successful 14s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-prod for DruidOpsRequest: kfops-reconfigure-apply-topology +``` + +Lets exec into one of the druid middleManagers pod that have updated and check the new configurations are applied or not: + +Exec into the Druid middleManagers: + +```bash +$ kubectl exec -it -n demo druid-with-config-middleManagers-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the configurations: +```bash +bash-5.1$ cat conf/druid/cluster/data/middleManager/runtime.properties | grep druid.worker.capacity +druid.worker.capacity=5 +``` +Here, we can see that our given configuration is applied to the Druid cluster for all brokers. + +Now, lets exec into one of the druid historicals pod that have updated and check the new configurations are applied or not: + +Exec into the Druid historicals: + +```bash +$ kubectl exec -it -n demo druid-with-config-historicals-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ +``` + +Now, execute the following commands to see the metadata storage directory: +```bash +bash-5.1$ cat conf/druid/cluster/data/historical/runtime.properties | grep druid.processing.numThreads +druid.processing.numThreads=3 +``` + +Here, we can see that our given configuration is applied to the historicals. + +### Verify Configuration Change from Druid UI + +You can access the UI similarly by doing port-forward as mentioned in [Check Configuration from Druid UI](/docs/guides/druid/reconfigure/#CheckConfigurationfromDruidUI) + +You should be able to see the following changes in the UI: + +

    +  lifecycle +

    + +You can see that there are 5 task slots reflecting with our provided custom configuration of `druid.worker.capacity=5`. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete kf -n demo druid-cluster +kubectl delete druidopsrequest -n demo reconfigure-drops +kubectl delete secret -n demo new-config +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/reconfigure/images/druid-ui.png b/docs/guides/druid/reconfigure/images/druid-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..af798ee7b4500b849f698decb06b9abde3dfba0e GIT binary patch literal 47241 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� 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guides/druid/reconfigure/overview.md b/docs/guides/druid/reconfigure/overview.md new file mode 100644 index 0000000000..e2ea2b268e --- /dev/null +++ b/docs/guides/druid/reconfigure/overview.md @@ -0,0 +1,54 @@ +--- +title: Reconfiguring Druid +menu: + docs_{{ .version }}: + identifier: guides-druid-reconfigure-overview + name: Overview + parent: guides-druid-reconfigure + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Reconfiguring Druid + +This guide will give an overview on how KubeDB Ops-manager operator reconfigures `Druid` components such as Combined, Broker, Controller, etc. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/kafka/concepts/kafka.md) + - [DruidOpsRequest](/docs/guides/kafka/concepts/kafkaopsrequest.md) + +## How Reconfiguring Druid Process Works + +The following diagram shows how KubeDB Ops-manager operator reconfigures `Druid` components. Open the image in a new tab to see the enlarged version. + +

    +  Reconfiguring process of Druid +
    Fig: Reconfiguring process of Druid
    +
    + +The Reconfiguring Druid process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to reconfigure the various components (ie. Coordinators, Overlords, Historicals, MiddleManagers, Brokers, Routers) of the `Druid`, the user creates a `DruidOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +6. When it finds a `DruidOpsRequest` CR, it halts the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` 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 `MogoDBOpsRequest` 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 `DruidOpsRequest` CR. + +9. After the successful reconfiguring of the `Druid` components, the `KubeDB` Ops-manager operator resumes the `Druid` 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 Druid components using `DruidOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/druid/reconfigure/yamls/config-secret.yaml b/docs/guides/druid/reconfigure/yamls/config-secret.yaml new file mode 100644 index 0000000000..6067ee7dd2 --- /dev/null +++ b/docs/guides/druid/reconfigure/yamls/config-secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Secret +metadata: + name: new-config + namespace: demo +stringData: + middleManagers.properties: |- + druid.worker.capacity=5 + historicals.properties: |- + druid.processing.numThreads=3 diff --git a/docs/guides/druid/reconfigure/yamls/deep-storage-config.yaml b/docs/guides/druid/reconfigure/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/reconfigure/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/reconfigure/yamls/druid-cluster.yaml b/docs/guides/druid/reconfigure/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..f7a695b062 --- /dev/null +++ b/docs/guides/druid/reconfigure/yamls/druid-cluster.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: WipeOut diff --git a/docs/guides/druid/reconfigure/yamls/reconfigure-druid-ops.yaml b/docs/guides/druid/reconfigure/yamls/reconfigure-druid-ops.yaml new file mode 100644 index 0000000000..cc5f789a54 --- /dev/null +++ b/docs/guides/druid/reconfigure/yamls/reconfigure-druid-ops.yaml @@ -0,0 +1,12 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: reconfigure-drops + namespace: demo +spec: + type: Reconfigure + databaseRef: + name: druid-cluster + configuration: + configSecret: + name: new-config \ No newline at end of file diff --git a/docs/guides/druid/restart/_index.md b/docs/guides/druid/restart/_index.md new file mode 100644 index 0000000000..7d23da5218 --- /dev/null +++ b/docs/guides/druid/restart/_index.md @@ -0,0 +1,10 @@ +--- +title: Restart Druid +menu: + docs_{{ .version }}: + identifier: guides-druid-restart + name: Restart + parent: guides-druid + weight: 130 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/restart/guide.md b/docs/guides/druid/restart/guide.md new file mode 100644 index 0000000000..b172825913 --- /dev/null +++ b/docs/guides/druid/restart/guide.md @@ -0,0 +1,283 @@ +--- +title: Restart Druid +menu: + docs_{{ .version }}: + identifier: guides-druid-restart-guide + name: Restart Druid + parent: guides-druid-restart + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Restart Druid + +KubeDB supports restarting the Druid database via a DruidOpsRequest. 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/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Deploy Druid + +In this section, we are going to deploy a Druid database using KubeDB. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/restart/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Now, lets go ahead and create a druid database. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +## Apply Restart opsRequest + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: restart + namespace: demo +spec: + type: Restart + databaseRef: + name: druid-cluster + timeout: 5m + apply: Always +``` + +- `spec.type` specifies the Type of the ops Request +- `spec.databaseRef` holds the name of the Druid CR. It should be available in the same namespace as the opsRequest +- The meaning of `spec.timeout` & `spec.apply` fields will be found [here](/docs/guides/druid/concepts/druidopsrequest.md#spectimeout) + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/restart/restart.yaml +druidopsrequest.ops.kubedb.com/restart created +``` + +Now the Ops-manager operator will first restart the controller pods, then broker of the referenced druid. + +```shell +$ kubectl get drops -n demo +NAME TYPE STATUS AGE +restart Restart Successful 2m11s + +$ kubectl get drops -n demo restart -oyaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"ops.kubedb.com/v1alpha1","kind":"DruidOpsRequest","metadata":{"annotations":{},"name":"restart","namespace":"demo"},"spec":{"apply":"Always","databaseRef":{"name":"druid-cluster"},"timeout":"5m","type":"Restart"}} + creationTimestamp: "2024-10-21T10:30:53Z" + generation: 1 + name: restart + namespace: demo + resourceVersion: "83200" + uid: 0fcbc7d4-593f-45f7-8631-7483805efe1e +spec: + apply: Always + databaseRef: + name: druid-cluster + timeout: 5m + type: Restart +status: + conditions: + - lastTransitionTime: "2024-10-21T10:30:53Z" + message: Druid ops-request has started to restart druid nodes + observedGeneration: 1 + reason: Restart + status: "True" + type: Restart + - lastTransitionTime: "2024-10-21T10:31:51Z" + message: Successfully Restarted Druid nodes + observedGeneration: 1 + reason: RestartNodes + status: "True" + type: RestartNodes + - lastTransitionTime: "2024-10-21T10:31:01Z" + message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + observedGeneration: 1 + status: "True" + type: GetPod--druid-cluster-historicals-0 + - lastTransitionTime: "2024-10-21T10:31:01Z" + message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + observedGeneration: 1 + status: "True" + type: EvictPod--druid-cluster-historicals-0 + - lastTransitionTime: "2024-10-21T10:31:06Z" + message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--druid-cluster-historicals-0 + - lastTransitionTime: "2024-10-21T10:31:11Z" + message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + observedGeneration: 1 + status: "True" + type: GetPod--druid-cluster-middlemanagers-0 + - lastTransitionTime: "2024-10-21T10:31:11Z" + message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + observedGeneration: 1 + status: "True" + type: EvictPod--druid-cluster-middlemanagers-0 + - lastTransitionTime: "2024-10-21T10:31:16Z" + message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--druid-cluster-middlemanagers-0 + - lastTransitionTime: "2024-10-21T10:31:21Z" + message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + observedGeneration: 1 + status: "True" + type: GetPod--druid-cluster-brokers-0 + - lastTransitionTime: "2024-10-21T10:31:21Z" + message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + observedGeneration: 1 + status: "True" + type: EvictPod--druid-cluster-brokers-0 + - lastTransitionTime: "2024-10-21T10:31:26Z" + message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--druid-cluster-brokers-0 + - lastTransitionTime: "2024-10-21T10:31:31Z" + message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + observedGeneration: 1 + status: "True" + type: GetPod--druid-cluster-routers-0 + - lastTransitionTime: "2024-10-21T10:31:31Z" + message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + observedGeneration: 1 + status: "True" + type: EvictPod--druid-cluster-routers-0 + - lastTransitionTime: "2024-10-21T10:31:36Z" + message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--druid-cluster-routers-0 + - lastTransitionTime: "2024-10-21T10:31:41Z" + message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + observedGeneration: 1 + status: "True" + type: GetPod--druid-cluster-coordinators-0 + - lastTransitionTime: "2024-10-21T10:31:41Z" + message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + observedGeneration: 1 + status: "True" + type: EvictPod--druid-cluster-coordinators-0 + - lastTransitionTime: "2024-10-21T10:31:46Z" + message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + observedGeneration: 1 + status: "True" + type: CheckPodRunning--druid-cluster-coordinators-0 + - lastTransitionTime: "2024-10-21T10:31:51Z" + message: Controller has successfully restart the Druid 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 druidopsrequest -n demo restart +kubectl delete druid -n demo druid-cluster +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/restart/yamls/deep-storage-config.yaml b/docs/guides/druid/restart/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/restart/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/restart/yamls/druid-cluster.yaml b/docs/guides/druid/restart/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..6351c2ddda --- /dev/null +++ b/docs/guides/druid/restart/yamls/druid-cluster.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete + diff --git a/docs/guides/druid/restart/yamls/restart.yaml b/docs/guides/druid/restart/yamls/restart.yaml new file mode 100644 index 0000000000..7130c4c865 --- /dev/null +++ b/docs/guides/druid/restart/yamls/restart.yaml @@ -0,0 +1,11 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: restart + namespace: demo +spec: + type: Restart + databaseRef: + name: druid-cluster + timeout: 5m + apply: Always diff --git a/docs/guides/druid/scaling/_index.md b/docs/guides/druid/scaling/_index.md new file mode 100644 index 0000000000..b5da417adc --- /dev/null +++ b/docs/guides/druid/scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Scaling Druid +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling + name: Scaling + parent: guides-druid + weight: 70 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/scaling/horizontal-scaling/_index.md b/docs/guides/druid/scaling/horizontal-scaling/_index.md new file mode 100644 index 0000000000..73d3017f6d --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Horizontal Scaling +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling-horizontal-scaling + name: Horizontal Scaling + parent: guides-druid-scaling + weight: 10 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/scaling/horizontal-scaling/guide.md b/docs/guides/druid/scaling/horizontal-scaling/guide.md new file mode 100644 index 0000000000..6e6648b4f8 --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/guide.md @@ -0,0 +1,603 @@ +--- +title: Horizontal Scaling Druid Cluster +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling-horizontal-scaling-guide + name: Druid Horizontal Scaling + parent: guides-druid-scaling-horizontal-scaling + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Horizontal Scale Druid Topology Cluster + +This guide will show you how to use `KubeDB` Ops-manager operator to scale the Druid topology 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` 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [Topology](/docs/guides/druid/clustering/overview/index.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Horizontal Scaling Overview](/docs/guides/druid/scaling/horizontal-scaling/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/druid](/docs/examples/druid) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Apply Horizontal Scaling on Druid Cluster + +Here, we are going to deploy a `Druid` cluster using a supported version by `KubeDB` operator. Then we are going to apply horizontal scaling on it. + +### Prepare Druid Topology cluster + +Now, we are going to deploy a `Druid` topology cluster with version `28.0.1`. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/scaling/horizontal-scaling/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +### Deploy Druid topology cluster + +In this section, we are going to deploy a Druid topology cluster. Then, in the next section we will scale the cluster using `DruidOpsRequest` CRD. Below is the YAML of the `Druid` CR that we are going to create, + + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/scaling/horizontal-scaling/yamls/druid-topology.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 24s +. +. +druid-cluster kubedb.com/v1aplha2 28.0.1 Ready 92s +``` + +Let's check the number of replicas has from druid object, number of pods the petset have, + +**Coordinators Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.coordinators.replicas' +1 + +$ kubectl get petset -n demo druid-cluster-coordinators -o json | jq '.spec.replicas' +1 +``` + +**Historicals Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.historicals.replicas' +1 + +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.replicas' +1 +``` + +We can see from commands that the cluster has 1 replicas for both coordinators and historicals. + +### Check Replica Count from Druid UI + +You can also see the replica count of each node from the druid ui. For that, follow the following steps: + +First port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + + +Here, we can see that there is 1 replica of each node including `coordinators` and `historicals`. + +We are now ready to apply the `DruidOpsRequest` CR to scale this cluster. + +## Scale Up Replicas + +Here, we are going to scale up the replicas of the topology cluster to meet the desired number of replicas after scaling. + +### Create DruidOpsRequest + +In order to scale up the replicas of the topology cluster, we have to create a `DruidOpsRequest` CR with our desired replicas. Below is the YAML of the `DruidOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-hscale-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: druid-cluster + horizontalScaling: + topology: + coordinators: 2 + historicals: 2 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing horizontal scaling operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `HorizontalScaling` on druid. +- `spec.horizontalScaling.topology.coordinators` specifies the desired replicas after scaling for coordinators. +- `spec.horizontalScaling.topology.historicals` specifies the desired replicas after scaling for historicals. + +> **Note:** Similarly you can scale other druid nodes horizontally by specifying the following fields: + > - For `overlords` use `spec.horizontalScaling.topology.overlords`. + > - For `brokers` use `spec.horizontalScaling.topology.brokers`. + > - For `middleManagers` use `spec.horizontalScaling.topology.middleManagers`. + > - For `routers` use `spec.horizontalScaling.topology.routers`. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-up.yaml +druidopsrequest.ops.kubedb.com/druid-hscale-up created +``` + +### Verify Topology cluster replicas scaled up successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the replicas of `Druid` object and related `PetSets` and `Pods`. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ watch kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druid-hscale-up HorizontalScaling Successful 106s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to scale the cluster. + +```bash +$ kubectl describe druidopsrequests -n demo druid-hscale-up +Name: druid-hscale-up +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-21T11:32:51Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:horizontalScaling: + .: + f:topology: + .: + f:coordinators: + f:historicals: + f:type: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-21T11:32:51Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-21T11:34:02Z + Resource Version: 91877 + UID: 824356ca-eafc-4266-8af1-c372b27f6ce7 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Horizontal Scaling: + Topology: + Coordinators: 2 + Historicals: 2 + Type: HorizontalScaling +Status: + Conditions: + Last Transition Time: 2024-10-21T11:32:51Z + Message: Druid ops-request has started to horizontally scaling the nodes + Observed Generation: 1 + Reason: HorizontalScaling + Status: True + Type: HorizontalScaling + Last Transition Time: 2024-10-21T11:33:17Z + Message: Successfully Scaled Up Broker + Observed Generation: 1 + Reason: ScaleUpCoordinators + Status: True + Type: ScaleUpCoordinators + Last Transition Time: 2024-10-21T11:33:02Z + Message: patch pet setdruid-cluster-coordinators; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: PatchPetSetdruid-cluster-coordinators + Last Transition Time: 2024-10-21T11:33:57Z + Message: node in cluster; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: NodeInCluster + Last Transition Time: 2024-10-21T11:34:02Z + Message: Successfully Scaled Up Broker + Observed Generation: 1 + Reason: ScaleUpHistoricals + Status: True + Type: ScaleUpHistoricals + Last Transition Time: 2024-10-21T11:33:22Z + Message: patch pet setdruid-cluster-historicals; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: PatchPetSetdruid-cluster-historicals + Last Transition Time: 2024-10-21T11:34:02Z + Message: Successfully completed horizontally scale druid cluster + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 95s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/druid-hscale-up + Normal Starting 95s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 95s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: druid-hscale-up + Warning patch pet setdruid-cluster-coordinators; ConditionStatus:True 84s KubeDB Ops-manager Operator patch pet setdruid-cluster-coordinators; ConditionStatus:True + Warning node in cluster; ConditionStatus:False 76s KubeDB Ops-manager Operator node in cluster; ConditionStatus:False + Warning node in cluster; ConditionStatus:True 74s KubeDB Ops-manager Operator node in cluster; ConditionStatus:True + Normal ScaleUpCoordinators 69s KubeDB Ops-manager Operator Successfully Scaled Up Broker + Warning patch pet setdruid-cluster-historicals; ConditionStatus:True 64s KubeDB Ops-manager Operator patch pet setdruid-cluster-historicals; ConditionStatus:True + Warning node in cluster; ConditionStatus:False 56s KubeDB Ops-manager Operator node in cluster; ConditionStatus:False + Warning node in cluster; ConditionStatus:True 29s KubeDB Ops-manager Operator node in cluster; ConditionStatus:True + Normal ScaleUpHistoricals 24s KubeDB Ops-manager Operator Successfully Scaled Up Broker + Normal Starting 24s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 24s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: druid-hscale-up +``` + + +Now, we are going to verify the number of replicas this cluster has from the Druid object, number of pods the petset have, + +**Coordinators Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.coordinators.replicas' +2 + +$ kubectl get petset -n demo druid-cluster-coordinators -o json | jq '.spec.replicas' +2 +``` + +**Historicals Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.historicals.replicas' +2 + +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.replicas' +2 +``` + +Now, we are going to verify the number of replicas this cluster has from the Druid UI. + +### Verify Replica Count from Druid UI + +Verify the scaled replica count of nodes from the druid ui. To access the UI follow the steps described in the first part of this guide. [(Check Replica Count from Druid UI)](/docs/guides/druid/scaling/horizontal-scaling/#Check-Replica-Count-from-Druid-UI) + +If you follow the steps properly, you should be able to see that the replica count of both `coordinators` and `historicals` has become 2. Also as the `coordinators` is serving as the `overlords`, the count of `overlords` has also become 2. + +

    +  lifecycle +

    + +## Scale Down Replicas + +Here, we are going to scale down the replicas of the druid topology cluster to meet the desired number of replicas after scaling. + +### Create DruidOpsRequest + +In order to scale down the replicas of the druid topology cluster, we have to create a `DruidOpsRequest` CR with our desired replicas. Below is the YAML of the `DruidOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-hscale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: druid-cluster + horizontalScaling: + topology: + coordinators: 1 + historicals: 1 +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing horizontal scaling down operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `HorizontalScaling` on druid. +- `spec.horizontalScaling.topology.coordinators` specifies the desired replicas after scaling for the coordinators nodes. +- `spec.horizontalScaling.topology.historicals` specifies the desired replicas after scaling for the historicals nodes. + +> **Note:** Similarly you can scale other druid nodes by specifying the following fields: +> - For `overlords` use `spec.horizontalScaling.topology.overlords`. +> - For `brokers` use `spec.horizontalScaling.topology.brokers`. +> - For `middleManagers` use `spec.horizontalScaling.topology.middleManagers`. +> - For `routers` use `spec.horizontalScaling.topology.routers`. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/scaling/horizontal-scaling/druid-hscale-down-topology.yaml +druidopsrequest.ops.kubedb.com/druid-hscale-down created +``` + +#### Verify Topology cluster replicas scaled down successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the replicas of `Druid` object and related `PetSets` and `Pods`. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ watch kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druid-hscale-down HorizontalScaling Successful 2m32s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to scale the cluster. + +```bash +$ kubectl get druidopsrequest -n demo druid-hscale-down -oyaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"ops.kubedb.com/v1alpha1","kind":"DruidOpsRequest","metadata":{"annotations":{},"name":"druid-hscale-down","namespace":"demo"},"spec":{"databaseRef":{"name":"druid-cluster"},"horizontalScaling":{"topology":{"coordinators":1,"historicals":1}},"type":"HorizontalScaling"}} + creationTimestamp: "2024-10-21T12:42:09Z" + generation: 1 + name: druid-hscale-down + namespace: demo + resourceVersion: "99500" + uid: b3a81d07-be44-4adf-a8a7-36bb825f26a8 +spec: + apply: IfReady + databaseRef: + name: druid-cluster + horizontalScaling: + topology: + coordinators: 1 + historicals: 1 + type: HorizontalScaling +status: + conditions: + - lastTransitionTime: "2024-10-21T12:42:09Z" + message: Druid ops-request has started to horizontally scaling the nodes + observedGeneration: 1 + reason: HorizontalScaling + status: "True" + type: HorizontalScaling + - lastTransitionTime: "2024-10-21T12:42:33Z" + message: Successfully Scaled Down Broker + observedGeneration: 1 + reason: ScaleDownCoordinators + status: "True" + type: ScaleDownCoordinators + - lastTransitionTime: "2024-10-21T12:42:23Z" + message: reassign partitions; ConditionStatus:True + observedGeneration: 1 + status: "True" + type: ReassignPartitions + - lastTransitionTime: "2024-10-21T12:42:23Z" + message: is pet set patched; ConditionStatus:True + observedGeneration: 1 + status: "True" + type: IsPetSetPatched + - lastTransitionTime: "2024-10-21T12:42:28Z" + message: get pod; ConditionStatus:True + observedGeneration: 1 + status: "True" + type: GetPod + - lastTransitionTime: "2024-10-21T12:42:53Z" + message: Successfully Scaled Down Broker + observedGeneration: 1 + reason: ScaleDownHistoricals + status: "True" + type: ScaleDownHistoricals + - lastTransitionTime: "2024-10-21T12:42:43Z" + message: delete pvc; ConditionStatus:True + observedGeneration: 1 + status: "True" + type: DeletePvc + - lastTransitionTime: "2024-10-21T12:42:43Z" + message: get pvc; ConditionStatus:False + observedGeneration: 1 + status: "False" + type: GetPvc + - lastTransitionTime: "2024-10-21T12:42:53Z" + message: Successfully completed horizontally scale druid cluster + observedGeneration: 1 + reason: Successful + status: "True" + type: Successful + observedGeneration: 1 + phase: Successful +``` + +Now, we are going to verify the number of replicas this cluster has from the Druid object, number of pods the petset have, + +**Coordinators Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.coordinators.replicas' +1 + +$ kubectl get petset -n demo druid-cluster-coordinators -o json | jq '.spec.replicas' +1 +``` + +**Historicals Replicas** + +```bash +$ kubectl get druid -n demo druid-cluster -o json | jq '.spec.topology.historicals.replicas' +1 + +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.replicas' +1 +``` + +Now, we are going to verify the number of replicas this cluster has from the Druid UI. + +### Verify Replica Count from Druid UI + +Verify the scaled replica count of nodes from the druid ui. To access the UI follow the steps described in the first part of this guide. [(Check Replica Count from Druid UI)](/docs/guides/druid/scaling/horizontal-scaling/#Check-Replica-Count-from-Druid-UI) + +If you follow the steps properly, you should be able to see that the replica count of both `coordinators` and `historicals` has become 1. Also as the `coordinators` is serving as the `overlords`, the count of `overlords` has also become 1. + +

    +  lifecycle +

    + + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete dr -n demo druid-cluster +kubectl delete druidopsrequest -n demo druid-hscale-up druid-hscale-down +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/scaling/horizontal-scaling/images/dr-horizontal-scaling.png b/docs/guides/druid/scaling/horizontal-scaling/images/dr-horizontal-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..83615ee58fc221744b151c07b9f3425af22ee216 GIT binary patch literal 68725 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�jH|Z3$pd8M$zdt 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
    k>&P5tRU0$hn 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 TFW3WU@`B1M&6gDlZ{Gh8E0sSm literal 0 HcmV?d00001 diff --git a/docs/guides/druid/scaling/horizontal-scaling/images/druid-ui.png b/docs/guides/druid/scaling/horizontal-scaling/images/druid-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f81925c59cb7bf238315c7de992eaf0092caeb9c GIT binary patch literal 46148 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 New to KubeDB? Please start [here](/docs/README.md). + +# Druid Horizontal Scaling + +This guide will give an overview on how KubeDB Ops-manager operator scales up or down `Druid` cluster replicas of various component such as Coordinators, Overlords, Historicals, MiddleManager, Brokers and Routers. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How Horizontal Scaling Process Works + +The following diagram shows how KubeDB Ops-manager operator scales up or down `Druid` database components. Open the image in a new tab to see the enlarged version. + +
    + Horizontal scaling process of Druid +
    Fig: Horizontal scaling process of Druid
    +
    + +The Horizontal scaling process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Then, in order to scale the various components (i.e. Coordinators, Overlords, Historicals, MiddleManagers, Brokers, Routers) of the `Druid` cluster, the user creates a `DruidOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +6. When it finds a `DruidOpsRequest` CR, it halts the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` 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 `DruidOpsRequest` CR. + +8. After the successfully scaling the replicas of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the number of replicas in the `Druid` object to reflect the updated state. + +9. After the successful scaling of the `Druid` replicas, the `KubeDB` Ops-manager operator resumes the `Druid` 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 Druid cluster using `DruidOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/druid/scaling/horizontal-scaling/yamls/deep-storage-config.yaml b/docs/guides/druid/scaling/horizontal-scaling/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-cluster.yaml b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..6351c2ddda --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-cluster.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete + diff --git a/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-down.yaml b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-down.yaml new file mode 100644 index 0000000000..4cfa3f715d --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-down.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-hscale-down + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: druid-cluster + horizontalScaling: + topology: + coordinators: 1 + historicals: 1 \ No newline at end of file diff --git a/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-up.yaml b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-up.yaml new file mode 100644 index 0000000000..8063b37fb1 --- /dev/null +++ b/docs/guides/druid/scaling/horizontal-scaling/yamls/druid-hscale-up.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-hscale-up + namespace: demo +spec: + type: HorizontalScaling + databaseRef: + name: druid-cluster + horizontalScaling: + topology: + coordinators: 2 + historicals: 2 \ No newline at end of file diff --git a/docs/guides/druid/scaling/vertical-scaling/_index.md b/docs/guides/druid/scaling/vertical-scaling/_index.md new file mode 100644 index 0000000000..8a9a5727c0 --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/_index.md @@ -0,0 +1,10 @@ +--- +title: Vertical Scaling +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling-vertical-scaling + name: Vertical Scaling + parent: guides-druid-scaling + weight: 20 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/scaling/vertical-scaling/guide.md b/docs/guides/druid/scaling/vertical-scaling/guide.md new file mode 100644 index 0000000000..cedf35b076 --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/guide.md @@ -0,0 +1,454 @@ +--- +title: Vertical Scaling Druid Cluster +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling-vertical-scaling-guide + name: Druid Vertical Scaling + parent: guides-druid-scaling-vertical-scaling + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Vertical Scale Druid Topology Cluster + +This guide will show you how to use `KubeDB` Ops-manager operator to update the resources of a Druid topology 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` 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [Topology](/docs/guides/druid/clustering/overview/index.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Vertical Scaling Overview](/docs/guides/druid/scaling/vertical-scaling/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/druid](/docs/examples/druid) directory of [kubedb/docs](https://github.com/kubedb/docs) repository. + +## Apply Vertical Scaling on Topology Cluster + +Here, we are going to deploy a `Druid` topology cluster using a supported version by `KubeDB` operator. Then we are going to apply vertical scaling on it. + +### Prepare Druid Topology Cluster + +Now, we are going to deploy a `Druid` topology cluster database with version `28.0.1`. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/scaling/vertical-scaling/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +### Deploy Druid Cluster + +In this section, we are going to deploy a Druid topology cluster. Then, in the next section we will update the resources of the database using `DruidOpsRequest` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/examples/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 24s +. +. +druid-cluster kubedb.com/v1aplha2 28.0.1 Ready 92s +``` + +Let's check the Pod containers resources for both `coordinators` and `historicals` of the Druid topology cluster. Run the following command to get the resources of the `coordinators` and `historicals` containers of the Druid topology cluster + +```bash +$ kubectl get pod -n demo druid-cluster-coordinators-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} +``` + +```bash +$ kubectl get pod -n demo druid-cluster-historicals-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "memory": "1Gi" + }, + "requests": { + "cpu": "500m", + "memory": "1Gi" + } +} +``` +This is the default resources of the Druid topology cluster set by the `KubeDB` operator. + +We are now ready to apply the `DruidOpsRequest` CR to update the resources of this database. + +### Vertical Scaling + +Here, we are going to update the resources of the topology cluster to meet the desired resources after scaling. + +#### Create DruidOpsRequest + +In order to update the resources of the database, we have to create a `DruidOpsRequest` CR with our desired resources. Below is the YAML of the `DruidOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-vscale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: druid-cluster + verticalScaling: + coordinators: + resources: + requests: + memory: "1.2Gi" + cpu: "0.6" + limits: + memory: "1.2Gi" + cpu: "0.6" + historicals: + resources: + requests: + memory: "1.1Gi" + cpu: "0.6" + limits: + memory: "1.1Gi" + cpu: "0.6" + timeout: 5m + apply: IfReady +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing vertical scaling operation on `druid-cluster` cluster. +- `spec.type` specifies that we are performing `VerticalScaling` on druid. +- `spec.VerticalScaling.coordinators` specifies the desired resources of `coordinators` node after scaling. +- `spec.VerticalScaling.historicals` specifies the desired resources of `historicals` node after scaling. + +> **Note:** Similarly you can scale other druid nodes vertically by specifying the following fields: +> - For `overlords` use `spec.verticalScaling.overlords`. +> - For `brokers` use `spec.verticalScaling.brokers`. +> - For `middleManagers` use `spec.verticalScaling.middleManagers`. +> - For `routers` use `spec.verticalScaling.routers`. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/scaling/vertical-scaling/yamls/druid-vscale.yaml +druidopsrequest.ops.kubedb.com/druid-vscale created +``` + +#### Verify Druid cluster resources have been updated successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the resources of `Druid` object and related `PetSets` and `Pods`. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druid-vscale VerticalScaling Successful 3m56s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to scale the cluster. + +```bash +$ kubectl describe druidopsrequest -n demo druid-vscale +Name: druid-vscale +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-21T12:53:55Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:timeout: + f:type: + f:verticalScaling: + .: + f:coordinators: + .: + f:resources: + .: + f:limits: + .: + f:cpu: + f:memory: + f:requests: + .: + f:cpu: + f:memory: + f:historicals: + .: + f:resources: + .: + f:limits: + .: + f:cpu: + f:memory: + f:requests: + .: + f:cpu: + f:memory: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-21T12:53:55Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-21T12:54:23Z + Resource Version: 102002 + UID: fe8bb22f-02e8-4a10-9a78-fc211371d581 +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Timeout: 5m + Type: VerticalScaling + Vertical Scaling: + Coordinators: + Resources: + Limits: + Cpu: 0.6 + Memory: 1.2Gi + Requests: + Cpu: 0.6 + Memory: 1.2Gi + Historicals: + Resources: + Limits: + Cpu: 0.6 + Memory: 1.1Gi + Requests: + Cpu: 0.6 + Memory: 1.1Gi +Status: + Conditions: + Last Transition Time: 2024-10-21T12:53:55Z + Message: Druid ops-request has started to vertically scale the Druid nodes + Observed Generation: 1 + Reason: VerticalScaling + Status: True + Type: VerticalScaling + Last Transition Time: 2024-10-21T12:53:58Z + Message: Successfully updated PetSets Resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-21T12:54:23Z + Message: Successfully Restarted Pods With Resources + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-21T12:54:03Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T12:54:03Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T12:54:08Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T12:54:13Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T12:54:13Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T12:54:18Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T12:54:23Z + Message: Successfully completed the vertical scaling for RabbitMQ + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 67s KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/druid-vscale + Normal Starting 67s KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 67s KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: druid-vscale + Normal UpdatePetSets 64s KubeDB Ops-manager Operator Successfully updated PetSets Resources + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 59s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 59s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 54s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 49s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 49s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 44s KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Normal RestartPods 39s KubeDB Ops-manager Operator Successfully Restarted Pods With Resources + Normal Starting 39s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 39s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: druid-vscale +``` +Now, we are going to verify from one of the Pod yaml whether the resources of the topology cluster has updated to meet up the desired state, Let's check, + +```bash +$ kubectl get pod -n demo druid-cluster-coordinators-0 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "600m", + "memory": "1288490188800m" + }, + "requests": { + "cpu": "600m", + "memory": "1288490188800m" + } +} +$ kubectl get pod -n demo druid-cluster-historicals-1 -o json | jq '.spec.containers[].resources' +{ + "limits": { + "cpu": "600m", + "memory": "1181116006400m" + }, + "requests": { + "cpu": "600m", + "memory": "1181116006400m" + } +} +``` + +The above output verifies that we have successfully scaled up the resources of the Druid topology cluster. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete dr -n demo druid-cluster +kubectl delete druidopsrequest -n demo druid-vscale +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/scaling/vertical-scaling/images/dr-vertical-scaling.png b/docs/guides/druid/scaling/vertical-scaling/images/dr-vertical-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..552bb0fb3028df843939c1b6f5512f09022c1812 GIT binary patch literal 73609 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 FzX40LUPJ%@ literal 0 HcmV?d00001 diff --git a/docs/guides/druid/scaling/vertical-scaling/overview.md b/docs/guides/druid/scaling/vertical-scaling/overview.md new file mode 100644 index 0000000000..2ddd690601 --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/overview.md @@ -0,0 +1,54 @@ +--- +title: Druid Vertical Scaling Overview +menu: + docs_{{ .version }}: + identifier: guides-druid-scaling-vertical-scaling-overview + name: Overview + parent: guides-druid-scaling-vertical-scaling + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid Vertical Scaling + +This guide will give an overview on how KubeDB Ops-manager operator updates the resources(for example CPU and Memory etc.) of the `Druid`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/kafka/concepts/kafka.md) + - [DruidOpsRequest](/docs/guides/kafka/concepts/kafkaopsrequest.md) + +## How Vertical Scaling Process Works + +The following diagram shows how KubeDB Ops-manager operator updates the resources of the `Druid`. Open the image in a new tab to see the enlarged version. + +

    +  Vertical scaling process of Druid +
    Fig: Vertical scaling process of Druid
    +
    + +The vertical scaling process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` 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 `Druid` cluster, the user creates a `DruidOpsRequest` CR with desired information. + +5. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +6. When it finds a `DruidOpsRequest` CR, it halts the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` 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 `Druid` object to reflect the updated state. + +9. After the successful update of the `Druid` resources, the `KubeDB` Ops-manager operator resumes the `Druid` 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 Druid database using `DruidOpsRequest` CRD. \ No newline at end of file diff --git a/docs/guides/druid/scaling/vertical-scaling/yamls/deep-storage-config.yaml b/docs/guides/druid/scaling/vertical-scaling/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..7a89d0dc91 --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/scaling/vertical-scaling/yamls/druid-vscale.yaml b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-vscale.yaml new file mode 100644 index 0000000000..38cf25d3ca --- /dev/null +++ b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-vscale.yaml @@ -0,0 +1,28 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-vscale + namespace: demo +spec: + type: VerticalScaling + databaseRef: + name: druid-cluster + verticalScaling: + coordinators: + resources: + requests: + memory: "1.2Gi" + cpu: "0.6" + limits: + memory: "1.2Gi" + cpu: "0.6" + historicals: + resources: + requests: + memory: "1.1Gi" + cpu: "0.6" + limits: + memory: "1.1Gi" + cpu: "0.6" + timeout: 5m + apply: IfReady diff --git a/docs/guides/druid/tls/_index.md b/docs/guides/druid/tls/_index.md new file mode 100755 index 0000000000..2bf445ceea --- /dev/null +++ b/docs/guides/druid/tls/_index.md @@ -0,0 +1,10 @@ +--- +title: Run Druid with TLS +menu: + docs_{{ .version }}: + identifier: guides-druid-tls + name: TLS/SSL Encryption + parent: guides-druid + weight: 90 +menu_name: docs_{{ .version }} +--- diff --git a/docs/guides/druid/tls/guide.md b/docs/guides/druid/tls/guide.md new file mode 100644 index 0000000000..ead99ecbd5 --- /dev/null +++ b/docs/guides/druid/tls/guide.md @@ -0,0 +1,307 @@ +--- +title: Druid Combined TLS/SSL Encryption +menu: + docs_{{ .version }}: + identifier: guides-druid-tls-guide + name: Druid TLS/SSL + parent: guides-druid-tls + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Run Druid with TLS/SSL (Transport Encryption) + +KubeDB supports providing TLS/SSL encryption for Druid. This tutorial will show you how to use KubeDB to run a Druid cluster with 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.0.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 + ``` + +> Note: YAML files used in this tutorial are stored in [docs/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Overview + +KubeDB uses following crd fields to enable SSL/TLS encryption in Druid. + +- `spec:` + - `enableSSL` + - `tls:` + - `issuerRef` + - `certificate` + +Read about the fields in details in [druid concept](/docs/guides/druid/concepts/druid.md), + +`tls` is applicable for all types of Druid (i.e., `combined` and `topology`). + +Users must specify the `tls.issuerRef` field. KubeDB uses the `issuer` or `clusterIssuer` referenced in the `tls.issuerRef` field, and the certificate specs provided in `tls.certificate` to generate certificate secrets. These certificate secrets are then used to generate required certificates including `ca.crt`, `tls.crt`, `tls.key`, `keystore.jks` and `truststore.jks`. + +## Create Issuer/ ClusterIssuer + +We are going to create an example `Issuer` that will be used throughout the duration of this tutorial to enable SSL/TLS in Druid. Alternatively, you can follow this [cert-manager tutorial](https://cert-manager.io/docs/configuration/ca/) to create your own `Issuer`. + +- Start off by generating you ca certificates using openssl. + +```bash +openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key -out ./ca.crt -subj "/CN=druid/O=kubedb" +``` + +- Now create a ca-secret using the certificate files you have just generated. + +```bash +kubectl create secret tls druid-ca \ + --cert=ca.crt \ + --key=ca.key \ + --namespace=demo +``` + +Now, create an `Issuer` using the `ca-secret` you have just created. The `YAML` file looks like this: + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: druid-ca-issuer + namespace: demo +spec: + ca: + secretName: druid-ca +``` + +Apply the `YAML` file: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/tls/yamls/druid-ca-issuer.yaml +issuer.cert-manager.io/druid-ca-issuer created +``` + +## TLS/SSL encryption in Druid Cluster + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/tls/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Now, lets go ahead and create a druid database. + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster-tls + namespace: demo +spec: + version: 28.0.1 + enableSSL: true + tls: + issuerRef: + apiGroup: "cert-manager.io" + kind: Issuer + name: druid-ca-issuer + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +### Deploy Druid Topology Cluster with TLS/SSL + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/tls/yamls/druid-cluster-tls.yaml +druid.kubedb.com/druid-cluster-tls created +``` + +Now, wait until `druid-cluster-tls created` has status `Ready`. i.e, + +```bash +$ kubectl get druid -n demo -w + +Every 2.0s: kubectl get druid -n demo aadee: Fri Sep 6 12:34:51 2024 +NAME TYPE VERSION STATUS AGE +druid-cluster-tls kubedb.com/v1alpha2 28.0.1 Ready 20s +druid-cluster-tls kubedb.com/v1alpha2 28.0.1 Provisioning 1m +... +... +druid-cluster-tls kubedb.com/v1alpha2 28.0.1 Ready 38m +``` + +### Verify TLS/SSL in Druid Cluster + +```bash +$ kubectl describe secret druid-cluster-tls-client-cert -n demo +Name: druid-cluster-tls-client-cert +Namespace: demo +Labels: app.kubernetes.io/component=database + app.kubernetes.io/instance=druid-cluster-tls + app.kubernetes.io/managed-by=kubedb.com + app.kubernetes.io/name=druids.kubedb.com + controller.cert-manager.io/fao=true +Annotations: cert-manager.io/alt-names: + *.druid-cluster-tls-pods.demo.svc.cluster.local,druid-cluster-tls-brokers-0.druid-cluster-tls-pods.demo.svc.cluster.local:8282,druid-clust... + cert-manager.io/certificate-name: druid-cluster-tls-client-cert + cert-manager.io/common-name: druid-cluster-tls-pods.demo.svc + cert-manager.io/ip-sans: 127.0.0.1 + cert-manager.io/issuer-group: cert-manager.io + cert-manager.io/issuer-kind: Issuer + cert-manager.io/issuer-name: druid-ca-issuer + cert-manager.io/uri-sans: + +Type: kubernetes.io/tls + +Data +==== +ca.crt: 1147 bytes +keystore.jks: 3720 bytes +tls-combined.pem: 3835 bytes +tls.crt: 2126 bytes +tls.key: 1708 bytes +truststore.jks: 865 bytes +``` + +Now, Lets exec into a druid coordinators pod and verify the configuration that the TLS is enabled. + +```bash +$ kubectl exec -it -n demo druid-cluster-tls-coordinators-0 -- bash +Defaulted container "druid" out of: druid, init-druid (init) +bash-5.1$ cat conf/druid/cluster/_common/common.runtime.properties +druid.client.https.trustStorePassword={"type": "environment", "variable": "DRUID_KEY_STORE_PASSWORD"} +druid.client.https.trustStorePath=/opt/druid/ssl/truststore.jks +druid.client.https.trustStoreType=jks +druid.emitter=noop +druid.enablePlaintextPort=false +druid.enableTlsPort=true +druid.metadata.mysql.ssl.clientCertificateKeyStorePassword=password +druid.metadata.mysql.ssl.clientCertificateKeyStoreType=JKS +druid.metadata.mysql.ssl.clientCertificateKeyStoreUrl=/opt/druid/ssl/metadata/keystore.jks +druid.metadata.mysql.ssl.useSSL=true +druid.server.https.certAlias=druid +druid.server.https.keyStorePassword={"type": "environment", "variable": "DRUID_KEY_STORE_PASSWORD"} +druid.server.https.keyStorePath=/opt/druid/ssl/keystore.jks +druid.server.https.keyStoreType=jks +``` + +We can see from the above output that, all the TLS related configuration is added. Here the `MySQL` and `ZooKeeper` deployed with Druid is also TLS secure and their connection configs are added as well. + +#### Verify TLS/SSL using Druid UI + +To check follow the following steps: + +Druid uses separate ports for TLS/SSL. While the plaintext port for `routers` node is `8888`. For TLS, it is `9088`. Hence, we will use that port to access the UI. + +First port-forward the port `9088` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-tls-routers 9088 +Forwarding from 127.0.0.1:9088 -> 9088 +Forwarding from [::1]:9088 -> 9088 +``` + + +Now hit the `https://localhost:9088/` from any browser. Here you may select `Advance` and then `Proceed to localhost (unsafe)` or you can add the `ca.crt` from the secret `druid-cluster-tls-client-cert` to your browser's Authorities. + +After that you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-tls-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-tls-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + +From the above output, we can see that the connection is secure. + +## Cleaning up + +To cleanup the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete druid -n demo druid-cluster-tls +kubectl delete issuer -n demo druid-ca-issuer +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Monitor your Druid cluster with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). +- Monitor your Druid cluster with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md). + +[//]: # (- Use [kubedb cli](/docs/guides/druid/cli/cli.md) to manage databases like kubectl for Kubernetes.) +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/tls/images/druid-ui.png b/docs/guides/druid/tls/images/druid-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..9f173c38c2d03c2ebe86cb9453506478e86eb9bd GIT binary patch literal 99499 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

    OARi)?=J8#vuzjj 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

    *(5D{^Y!StGY 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 IeD)vz3tjT>3;+NC literal 0 HcmV?d00001 diff --git a/docs/guides/druid/tls/images/tls.png b/docs/guides/druid/tls/images/tls.png new file mode 100644 index 0000000000000000000000000000000000000000..7f21589742423303355ef6edc0755a7c24459cc8 GIT binary patch literal 41254 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
    Fp?PS5iRix@K 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/tls/overview.md b/docs/guides/druid/tls/overview.md new file mode 100644 index 0000000000..2022e51955 --- /dev/null +++ b/docs/guides/druid/tls/overview.md @@ -0,0 +1,70 @@ +--- +title: Druid TLS/SSL Encryption Overview +menu: + docs_{{ .version }}: + identifier: guides-druid-tls-overview + name: Overview + parent: guides-druid-tls + weight: 10 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid TLS/SSL Encryption + +**Prerequisite :** To configure TLS/SSL in `Druid`, `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 crd 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 a 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/). + +**Druid CRD Specification :** + +KubeDB uses following crd fields to enable SSL/TLS encryption in `Druid`. + +- `spec:` + - `enableSSL` + - `tls:` + - `issuerRef` + - `certificates` + +Read about the fields in details from [druid concept](/docs/guides/druid/concepts/druid.md), + +When, `enableSSL` is set to `true`, the users must specify the `tls.issuerRef` field. `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 `druid` server and clients. + +## How TLS/SSL configures in Druid + +The following figure shows how `KubeDB` enterprise used to configure TLS/SSL in Druid. Open the image in a new tab to see the enlarged version. + +
    +Deploy Druid with TLS/SSL +
    Fig: Deploy Druid with TLS/SSL
    +
    + +Deploying Druid with TLS/SSL configuration process consists of the following steps: + +1. At first, a user creates a `Issuer/ClusterIssuer` cr. + +2. Then the user creates a `Druid` CR which refers to the `Issuer/ClusterIssuer` CR that the user created in the previous step. + +3. `KubeDB` Provisioner operator watches for the `Druid` cr. + +4. When it finds one, it creates `Secret`, `Service`, etc. for the `Druid` cluster. + +5. `KubeDB` Ops-manager operator watches for `Druid`(5c), `Issuer/ClusterIssuer`(5b), `Secret` and `Service`(5a). + +6. When it finds all the resources(`Druid`, `Issuer/ClusterIssuer`, `Secret`, `Service`), it creates `Certificates` by using `tls.issuerRef` and `tls.certificates` field specification from `Druid` cr. + +7. `cert-manager` watches for certificates. + +8. When it finds one, it creates certificate secrets `tls-secrets`(server, client, exporter secrets etc.) that holds the actual certificate signed by the CA. + +9. `KubeDB` Provisioner operator watches for the Certificate secrets `tls-secrets`. + +10. When it finds all the tls-secret, it creates the related `PetSets` so that Druid database can be configured with TLS/SSL. + +In the next doc, we are going to show a step-by-step guide on how to configure a `Druid` cluster with TLS/SSL. \ No newline at end of file diff --git a/docs/guides/druid/tls/yamls/deep-storage-config.yaml b/docs/guides/druid/tls/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/tls/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/tls/yamls/druid-ca-issuer.yaml b/docs/guides/druid/tls/yamls/druid-ca-issuer.yaml new file mode 100644 index 0000000000..d6298c972c --- /dev/null +++ b/docs/guides/druid/tls/yamls/druid-ca-issuer.yaml @@ -0,0 +1,8 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: druid-ca-issuer + namespace: demo +spec: + ca: + secretName: druid-ca diff --git a/docs/guides/druid/tls/yamls/druid-cluster-tls.yaml b/docs/guides/druid/tls/yamls/druid-cluster-tls.yaml new file mode 100644 index 0000000000..902b5b36d4 --- /dev/null +++ b/docs/guides/druid/tls/yamls/druid-cluster-tls.yaml @@ -0,0 +1,21 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster-tls + namespace: demo +spec: + version: 28.0.1 + enableSSL: true + tls: + issuerRef: + apiGroup: "cert-manager.io" + kind: Issuer + name: druid-ca-issuer + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/update-version/_index.md b/docs/guides/druid/update-version/_index.md new file mode 100644 index 0000000000..26c6ab4da1 --- /dev/null +++ b/docs/guides/druid/update-version/_index.md @@ -0,0 +1,10 @@ +--- +title: Update Version +menu: + docs_{{ .version }}: + identifier: guides-druid-update-version + name: Update Version + parent: guides-druid + weight: 60 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/update-version/guide.md b/docs/guides/druid/update-version/guide.md new file mode 100644 index 0000000000..f5c31ca64d --- /dev/null +++ b/docs/guides/druid/update-version/guide.md @@ -0,0 +1,448 @@ +--- +title: Update Version of Druid +menu: + docs_{{ .version }}: + identifier: guides-druid-update-version-guide + name: Update Druid Version + parent: guides-druid-update-version + weight: 20 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- +> New to KubeDB? Please start [here](/docs/README.md). + +# Update version of Druid + +This guide will show you how to use `KubeDB` Ops-manager operator to update the version of `Druid` Combined or Topology. + +## 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` 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Updating Overview](/docs/guides/druid/update-version/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/druid](/docs/examples/druid) directory of [kubedb/docs](https://github.com/kube/docs) repository. + +## Prepare Druid + +Now, we are going to deploy a `Druid` cluster with version `28.0.1`. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash + +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +### Deploy Druid + +In this section, we are going to deploy a Druid topology cluster. Then, in the next section we will update the version using `DruidOpsRequest` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-quickstart + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/druid-cluster.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` created has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1aplha2 28.0.1 Provisioning 55s +. +. +druid-cluster kubedb.com/v1aplha2 28.0.1 Ready 119s +``` + +We are now ready to apply the `DruidOpsRequest` CR to update. + +#### Check Druid Version from UI: + +You can also see the version of druid cluster from the druid ui. For that, follow the following steps: + +First, port-forward the port `8888` to local machine: + +```bash +$ kubectl port-forward -n demo svc/druid-cluster-routers 8888 +Forwarding from 127.0.0.1:8888 -> 8888 +Forwarding from [::1]:8888 -> 8888 +``` + +Now hit the `http://localhost:8888` from any browser, and you will be prompted to provide the credential of the druid database. By following the steps discussed below, you can get the credential generated by the KubeDB operator for your Druid database. + +**Connection information:** + +- Username: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.username}' | base64 -d + admin + ``` + +- Password: + + ```bash + $ kubectl get secret -n demo druid-cluster-admin-cred -o jsonpath='{.data.password}' | base64 -d + LzJtVRX5E8MorFaf + ``` + +After providing the credentials correctly, you should be able to access the web console like shown below. + +

    +  lifecycle +

    + + +Here, we can see that the version of the druid cluster is `28.0.1`. + +### Update Druid Version + +Here, we are going to update `Druid` from `28.0.1` to `30.0.0`. + +#### Create DruidOpsRequest: + +In order to update the version, we have to create a `DruidOpsRequest` CR with your desired version that is supported by `KubeDB`. Below is the YAML of the `DruidOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-update-version + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: druid-cluster + updateVersion: + targetVersion: 30.0.0 + timeout: 5m + apply: IfReady +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing operation on `druid-cluster` Druid. +- `spec.type` specifies that we are going to perform `UpdateVersion` on our database. +- `spec.updateVersion.targetVersion` specifies the expected version of the database `30.0.0`. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/update-version/yamls/druid-hscale-up.yaml +druidopsrequest.ops.kubedb.com/druid-update-version created +``` + +#### Verify Druid version updated successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the image of `Druid` object and related `PetSets` and `Pods`. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ watch kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +druid-update-version UpdateVersion Successful 2m6s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to update the database version. + +```bash +$ kubectl describe druidopsrequest -n demo druid-update-version +Name: druid-update-version +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-21T13:04:51Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:timeout: + f:type: + f:updateVersion: + .: + f:targetVersion: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-21T13:04:51Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-21T13:08:46Z + Resource Version: 103855 + UID: 5d470e24-37fd-4e16-b7a3-33040dcefe3d +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Timeout: 5m + Type: UpdateVersion + Update Version: + Target Version: 30.0.0 +Status: + Conditions: + Last Transition Time: 2024-10-21T13:04:51Z + Message: Druid ops-request has started to update version + Observed Generation: 1 + Reason: UpdateVersion + Status: True + Type: UpdateVersion + Last Transition Time: 2024-10-21T13:04:56Z + Message: successfully reconciled the Druid with updated version + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-21T13:08:46Z + Message: Successfully Restarted Druid nodes + Observed Generation: 1 + Reason: RestartPods + Status: True + Type: RestartPods + Last Transition Time: 2024-10-21T13:05:01Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T13:05:01Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T13:08:01Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-historicals-0 + Last Transition Time: 2024-10-21T13:08:06Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-21T13:08:06Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-21T13:08:11Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-middlemanagers-0 + Last Transition Time: 2024-10-21T13:08:16Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-21T13:08:16Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-brokers-0 + Last Transition Time: 2024-10-21T13:08:21Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-brokers-0 + Last Transition Time: 2024-10-21T13:08:26Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-21T13:08:26Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-routers-0 + Last Transition Time: 2024-10-21T13:08:31Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-routers-0 + Last Transition Time: 2024-10-21T13:08:36Z + Message: get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: GetPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T13:08:36Z + Message: evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: EvictPod--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T13:08:41Z + Message: check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Observed Generation: 1 + Status: True + Type: CheckPodRunning--druid-cluster-coordinators-0 + Last Transition Time: 2024-10-21T13:08:46Z + Message: Successfully completed update druid version + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 21m KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/druid-update-version + Normal UpdatePetSets 21m KubeDB Ops-manager Operator successfully reconciled the Druid with updated version + Warning get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 21m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 21m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:False; PodName:druid-cluster-historicals-0 21m KubeDB Ops-manager Operator check pod running; ConditionStatus:False; PodName:druid-cluster-historicals-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 18m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-historicals-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 18m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 18m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 18m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-middlemanagers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 17m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 17m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 17m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-brokers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 17m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 17m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 17m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-routers-0 + Warning get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 17m KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 17m KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Warning check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 17m KubeDB Ops-manager Operator check pod running; ConditionStatus:True; PodName:druid-cluster-coordinators-0 + Normal RestartPods 17m KubeDB Ops-manager Operator Successfully Restarted Druid nodes + Normal Starting 17m KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 17m KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: druid-update-version +``` + +Now, we are going to verify whether the `Druid` and the related `PetSets` and their `Pods` have the new version image. Let's check, + +```bash +$ kubectl get dr -n demo druid-cluster -o=jsonpath='{.spec.version}{"\n"}' +30.0.0 + +$ kubectl get petset -n demo druid-cluster-brokers -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/druid:30.0.0@sha256:4cd60a1dc6a124e27e91ec52ca39e2b9ca6809df915ae2dd712a2dd7462626d7 + +$ kubectl get pods -n demo druid-cluster-brokers-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}' +ghcr.io/appscode-images/druid:30.0.0 +``` + +You can see from above, our `Druid` has been updated with the new version. So, the updateVersion process is successfully completed. + +#### Verify updated Druid Version from UI: + +You can also see the version of druid cluster from the druid ui by following the steps described previously in this tutorial. [Check Druid Version from UI](/docs/guides/druid/update-version/guide.md/#Check-Druid-Version-from-UI) + +If you follow the steps properly, you should be able to see that the version is upgraded to `30.0.0` from the druid console as shown below. + +

    +  lifecycle +

    + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete druidopsrequest -n demo druid-update-version +kubectl delete dr -n demo druid-cluster +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). + +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/update-version/images/dr-update-version.png b/docs/guides/druid/update-version/images/dr-update-version.png new file mode 100644 index 0000000000000000000000000000000000000000..b61db35bc0c38e7510cca5058116418082965f47 GIT binary patch literal 73376 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≪2QOj{~2U`McDf#V2Ow=sqAb5r_~t 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 KMb*U{N&f*F)3GA} literal 0 HcmV?d00001 diff --git a/docs/guides/druid/update-version/images/druid-ui-28.png b/docs/guides/druid/update-version/images/druid-ui-28.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c74a4ad26a8775f6325261da016fc7b6115e8b GIT binary patch literal 46732 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 literal 0 HcmV?d00001 diff --git a/docs/guides/druid/update-version/images/druid-ui-30.png b/docs/guides/druid/update-version/images/druid-ui-30.png new file mode 100644 index 0000000000000000000000000000000000000000..f1da2d8ef12c591105765e6520d0ac532d62f52d GIT binary patch literal 48517 zcmb@tWmH^S(=JNTAdLnHPSD`)?%GIj58k-DrGrE80KwheEkJM!*0{U7JDlG8eZPCo zxMSRL{@nSiyQ-$HT2(cxo)xa5Bm+PpM1g^U0m#Wpeu063`vU_5OZ*-dN@)~PVT6JC z1|ugartWEY+-|8(w2)f8wAQI}wfCBm!euktdeva}y+(r?>nBW{q!PAx7j#;5dCj=jGrd?KeS!L0q*U;o(ith{s_=@{;mHbtPcm1efv zXdR>lJT(P8?FGDA5)YJM{_mC*;qdyh_D0gfx-j{_shC84Jj27owOg;OIXO9Eg(|G+ zirtRTWkZ`NB3h4AdU;_Xjg4x+@qLIQ%}DeUTu^H2V~#{V9MaF*6Rl_Wtbg_hZPf&W z$v=Op51K`Ugp{kjux$~c1XBo{-jROL&_F;if9QVqA30k@$i76VEFt-1fGAi~Lqi}t zn~Dhu>BCP|KG7Mv4fQjx*ZQ{wD?>-Pu>MpR#wKvVe$7v-oAV;eZuhFoYps+rG(0?9 zn=$&w58s!^o6F1Eva+(ey1K^3M%&dVQT|7=w+pgbQ=W+2+}!MJ@`V~Aged8&TSq=_ z6}KzNo|K{fo$$t%oYvVq9VOVbhV+WIJo299zpo;nCK&M;goHAbibj;~)z2TEncNe6 zs~3)+pPxHAI-qA@WMp(LW6r^iLX$v%gX400yzuzwEg>PXFhqv5C>0SQdByR?z-oyD za{A-PkEA3#P9HV3gp7;~&MQ`AJtKMTS+U>?lLrVT+|=J9&Y4K#W8L&)1`#&^uKvhy zP{Zxo3kv-QH^Sf_lsS?(L%pnCozK;ahpeem1aq$IDMKs|dfhf$T|$4e|E!h>HYcxue_DQdKMzajoqNwnzP z+~^4vE))Lum;>M)YYD#?Yj7QM`=qmT=`1X?q@*k$AV@J&geyL+TYRQ3+1|m`)^XXP ztq4_Il_y_XTnq^fU0PZa(1Hb!N8R4tC6D@$eGGY-5_w5Do{usCfj%=a0ik+gY-8$n z^!&F>fVQJe=-l z*gM^z<9cO;cvS}n2Oto*fJ}t&C;O zj;5xjHZ?VcKL1*|BXJE4ySI0_e@ck?8A%f2E8;1H=I4G7kt;<@ie@g%bq*7so19dmHRVrV@AnNzDhSZB3mF@x`sw~l zT&C`8sQN7fajx~DwUzau9{e3=eocMD&qQ@}5{eo|5=n8|@X(@YM4csw;qkNoyg2`H zfdaKn3M$o@k_iTj5Pc~+J^LuJEwCQr)4_68vGd2JPNM_XO6i~Pl@Qp*2N%f{emVLK|me)=Cir~<^sm!^WvEm$^d)@*qGRTH9bw!Az%B0@qOw6t?c zEc4M4v{W?6@aSOhr`=u6mKHB{LJ46@K>eRUdMdO$ZEfA;WGx!%0!)v$9^Ol# zX@(FMNl)%R;YIrS`ZjJ&KwsP9!td;pm10jjU4cl&wG?So_*ht2D=RClt*szt*RLj~ zraWcTvT$}K^TtRsVYqPqb*q_}yw}`dH99UBF!O2EK2hrqBF!uf{pJ6uOT4Bn z8TD-a6Hqz40`h5eqS#T7sIri4txI3oU~X{~$arx%Qdn4n1DBh^Sa`z=I4D$&M;cxK_k_zJIi-dhK zz@RVw1lAPHx7gYwI@~+N`fxDJAyECL>0f{MRpLubz5p*u;CJ!z@)o`pFQ*G+Ha4fQ z_1NmsRy{Kd^S0Jj4|n&zKI;6!!h?On!M$?uF&{sFV`XJWd3kqtH@~oOP3a*>N-8m> zrNEb6Tux4EwtiO1+WPSNnlrLbmnb1QnTL(d*w*$p^O1zDOm>`xg}HfDR21%q59(T4 zF1*AGKips|dLSLY1@GtPEdBjEu5T|cx)|S%+-f||nDyIuu=I@%a5`)7MuHL&rlJva zDdL__90CMfcK>!i$;!#a0pn3^Y>p=Gut-TWGcrbZoXr!qVN-0Bl%icf(lw`~q^Nv; z<~0u#?N3iji)>_KXNRnPNVpom-U*L|_$s^Xe!>MthgO7#|4}fr2`A(4bwZt`BooY5 zM7_k9Ls(p7>RvNA-Xz$ji*={Vxqk|uDCE0GEMb_0^$SJ`!b^DZ?Td&QK7Hqpl!(6Q zg$Vh{6@~{wFb67F3g93rZ|1c?0;OKJ;r}sgqVk4@9kNs@>FE)X3a*Zr(vp%0@bD?W zQZ3DQKsHCidz9VXl)czImXrkJ;fz6B8>fdwHB-vX{ZL%Zq0hxkaICp`<;EmZDUhZNC>upa?mzlyqd%iGdV zfEu9@Xjhk5J?ck>nvBee`a5v^%JQO8((2Glv`<(YbU@wx3xP#hFh`j(r%gysT{ za}U|uE8s3|uzQizIm?!Owm625;#V+;RlcZjSf3oZa5hvN9p6gB8esl_Z!KXp5$VgW zX_woMTa7<(StqZ^H~%v!8)Z&oOGX%lE`Q1xv)Fk_#Qc=#2<{D367R4(`)X`Ldtny) z)2bg*4%AHJW&0K zi*EDjLJHQdUqv-P#RvKCEt!h(zFzQs1YczrV(IV`2K#q7{dw7J0{Yo_6$PdliO?aW zL=^*AJFHI=Pqz&7UI?nVCGTE06Wz_lv!TZjd;dhDuCm#R!1^AH$3R;67&71;(W~lI zqa=8RJCh{D_pecljgO7prigF$@l4Uv-ogLy@PL$*ti>-7$rBp=rlsgnfLC*u>T54GnI;|{9-u+aQQIf-5%JohqNWQO z)9h^1UAo%Z*>Cn2fbc}T{Z}$WMj>C;p3|%5=h#x(@;3w3fS)VC-Y8DPL@s>;fypoX(<;q>$r z8umiAN=sWy7r#sc(q#~JqX0~Yk2JJ2Mb@u+pwtCTv~l}OAO{ZIEq9|(9c>%YNCnzxdypWUO->bb z*3K+u4UIKtH|?0xLd%1C_TwsLwW$Wz>#K{4i#wjL6U`LLc9&x69QAkaq2UJx;5Ofu zX=1n4jOpr6HYSFL2h9%o7$@?3w98wJE=E(YbAnf<=&#G>k3Z@yN zdLI|b749x@mq>F7v5~=D7K{J@9Jp%Y88eaOBk|$EPTv(_XA|hgJW(8RwJU>5wYU7ZNn;vR?V&cqHk#YgB9vvNh&}Q;mOUuJZG7FC$d7zks z1Ec5NrK_q~SaKTETIN9G75e)RMxE@QcZ({T!;KwV8)s)R*I(R^-MayM2<9wjpVCL2L?)5xdI>39kl$FB^E!q*MY39TOBvL zFI$`4Pg0ADilBGY`+U((pS#NP^78undg$SbN=WoX;iS<4gq^2%5t@$$u-1=n~;Ns%C`4U6l zZzm_G+L9yKlF!MOw#LI>>sTurqC46cXCJg_}u)vko%0fw{M%XqvLIn6;bJ3Us-odP$`oU zok4`aKsl|ssT}s}C<0eEAdTss-EX2^9(EDSmo|+0c8Jl{Yf`Z;-KQ*J#ctV;{`;76 zau4LbsQ*d0eC2?qUwT>fXDj`QE~tAS{Cw*g&fb_MfWQ}y02HEsXI_u#e}_PQQ1qAl zH4HXN+&}`ZXGmTiNz3qe0u$N45-{I>`aR*|e)y?@PNJ#tQhatq#`l^H%LH(91E_!a z`~fB9-**}Y#ug?xm;S|!off0a#C;aco z?lABFlOuwGIsUeS$~ns`o+`wGF)I+d!@Zt)VaC+)tp8up^E3;nbw{#Xmnr2YuX=Zs z*@stUEHvQQA(Ap2m*pYEZ<`aU47;Od_2nL2j1i7DC9agSvMC@QF@ZLVC6F*GGJazps5A+YyUY-u2w-W~~iI`c!j? zoK|fIwm`l3!zsv{VarH!#J6c*)9ka17)Ie#$&=DWNto$IT-}9GUYqtioVaW=^CT8AVwf}-EF#ne`-Tid!s3IxSCwND6Z`IlpiN?klpHVoB;kyB=QWCxzM9 zjQk-EXoUF6m4A}#V^7;@gx)v~h6ErL$@9ku%d~RbI505lTJU^1!2%Ga^3u@jXIjD5 zZ+~lPmxdeb?a>kg1%kf9q2?bc%P9v?8F+`4C)#c?q%|Th;ezzBqcU29Gui_OaJR-b z_PZl8TH4=Pp2aJz^_Tj@n&EKphbGtyCR+hC3Y^lZ`^tx~o(TYke zkjBX!?;_Z!HtB?pCx(O3HEwtTf1QrN2>L(=(1z9M6&t7Xmx5vDbA0&3z#weMQD@xh z3(LWZh^)g~sOtmUf+S;FBZ|yGZ{k=iSts2GpbsS_AE4keYBb$k#vj?8Wde^>drgqr z-#c+DS&qe@LeFO?--@Ws>E53>6Ju%cqKveV1(n|aQAv{M6aNO2P*_Bn?-6!^Y){@!By^wIJo|F)vFUxeX$hI3 z_0(>(EksmBpS%g`x#Hr$x0%>3w1){bXIz-PL4tw#D&bfq3E7d+_NQ!g48GnHsm|2N zrN%NSC;q;ZV7})TNxkAP<^90H{X0y{)#NH!w(2b+DMTP-n0BPj08FDB=SK4WS0h=- z4jX2Cu?ai5BTdd4$8)%jM^i^=en;wV=b)u>obn?d=(r;`BBTGPgTL zaw2!9C`NiKc{v7yw1Re*X&%56xZD*EGF>H$N5%lN zBnm0o)y?$-S(%Dw}xhE~AC`VZXh|xIp%DGQM2M1Y$`eZ5F`5`Uf-OBjk=u_|zC<}%l zv@rGl-Uo5m{@5^Zs3(x4W=l)f!zjVNoodA!%oT-A!<1EGY_}7~!OI(MT`HrX&>+&* zon2^^WuOgAAbL~y#%$;LmGEE_P91kZ$#5;3wW?>D?NevH)#h}@rB5;B�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

      4k2>!W!f;5D~QsAVr%81sqC+j*6n6WJQdo)6y&K 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 New to KubeDB? Please start [here](/docs/README.md). + +# Druid Update Version Overview + +This guide will give you an overview on how KubeDB Ops-manager operator update the version of `Druid`. + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How update version Process Works + +The following diagram shows how KubeDB Ops-manager operator used to update the version of `Druid`. Open the image in a new tab to see the enlarged version. + +
      +  updating Process of Druid +
      Fig: updating Process of Druid
      +
      + +The updating process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` 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 `Druid` database the user creates a `DruidOpsRequest` CR with the desired version. + +5. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +6. When it finds a `DruidOpsRequest` CR, it halts the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` object during the updating process. + +7. By looking at the target version from `DruidOpsRequest` CR, `KubeDB` Ops-manager operator updates the images of all the `PetSets`. + +8. After successfully updating the `PetSets` and their `Pods` images, the `KubeDB` Ops-manager operator updates the image of the `Druid` object to reflect the updated state of the database. + +9. After successfully updating of `Druid` object, the `KubeDB` Ops-manager operator resumes the `Druid` 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 Druid database using updateVersion operation. \ No newline at end of file diff --git a/docs/guides/druid/update-version/yamls/deep-storage-config.yaml b/docs/guides/druid/update-version/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/update-version/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/update-version/yamls/druid-cluster.yaml b/docs/guides/druid/update-version/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..7a89d0dc91 --- /dev/null +++ b/docs/guides/druid/update-version/yamls/druid-cluster.yaml @@ -0,0 +1,15 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + routers: + replicas: 1 + deletionPolicy: Delete diff --git a/docs/guides/druid/update-version/yamls/update-version-ops.yaml b/docs/guides/druid/update-version/yamls/update-version-ops.yaml new file mode 100644 index 0000000000..a6aaa91063 --- /dev/null +++ b/docs/guides/druid/update-version/yamls/update-version-ops.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: druid-update-version + namespace: demo +spec: + type: UpdateVersion + databaseRef: + name: druid-cluster + updateVersion: + targetVersion: 30.0.0 + timeout: 5m + apply: IfReady \ No newline at end of file diff --git a/docs/guides/druid/volume-expansion/_index.md b/docs/guides/druid/volume-expansion/_index.md new file mode 100644 index 0000000000..50632cd875 --- /dev/null +++ b/docs/guides/druid/volume-expansion/_index.md @@ -0,0 +1,10 @@ +--- +title: Volume Expansion +menu: + docs_{{ .version }}: + identifier: guides-druid-volume-expansion + name: Volume Expansion + parent: guides-druid + weight: 80 +menu_name: docs_{{ .version }} +--- \ No newline at end of file diff --git a/docs/guides/druid/volume-expansion/guide.md b/docs/guides/druid/volume-expansion/guide.md new file mode 100644 index 0000000000..d9a110aa18 --- /dev/null +++ b/docs/guides/druid/volume-expansion/guide.md @@ -0,0 +1,498 @@ +--- +title: Druid Topology Volume Expansion +menu: + docs_{{ .version }}: + identifier: guides-druid-volume-expansion-guide + name: Druid Volume Expansion + parent: guides-druid-volume-expansion + weight: 30 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +# Druid Topology Volume Expansion + +This guide will show you how to use `KubeDB` Ops-manager operator to expand the volume of a Druid Topology 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. + +- 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: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [Topology](/docs/guides/druid/clustering/overview/index.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + - [Volume Expansion Overview](/docs/guides/druid/volume-expansion/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: The yaml files used in this tutorial are stored in [docs/examples/druid](https://github.com/kubedb/docs/tree/{{< param "info.version" >}}/docs/examples/druid) folder in GitHub repository [kubedb/docs](https://github.com/kubedb/docs). + +## Expand Volume of Topology Druid Cluster + +Here, we are going to deploy a `Druid` topology using a supported version by `KubeDB` operator. Then we are going to apply `DruidOpsRequest` to expand its volume. + +### Prepare Druid Topology 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 +local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 28h +longhorn (default) driver.longhorn.io Delete Immediate true 27h +longhorn-static driver.longhorn.io Delete Immediate true 27h +``` + +We can see from the output the `longhorn` storage class has `ALLOWVOLUMEEXPANSION` field as true. So, this storage class supports volume expansion. We can use it. + +### Create External Dependency (Deep Storage) + +Before proceeding further, we need to prepare deep storage, which is one of the external dependency of Druid and used for storing the segments. It is a storage mechanism that Apache Druid does not provide. **Amazon S3**, **Google Cloud Storage**, or **Azure Blob Storage**, **S3-compatible storage** (like **Minio**), or **HDFS** are generally convenient options for deep storage. + +In this tutorial, we will run a `minio-server` as deep storage in our local `kind` cluster using `minio-operator` and create a bucket named `druid` in it, which the deployed druid database will use. + +```bash +$ helm repo add minio https://operator.min.io/ +$ helm repo update minio +$ helm upgrade --install --namespace "minio-operator" --create-namespace "minio-operator" minio/operator --set operator.replicaCount=1 + +$ helm upgrade --install --namespace "demo" --create-namespace druid-minio minio/tenant \ +--set tenant.pools[0].servers=1 \ +--set tenant.pools[0].volumesPerServer=1 \ +--set tenant.pools[0].size=1Gi \ +--set tenant.certificate.requestAutoCert=false \ +--set tenant.buckets[0].name="druid" \ +--set tenant.pools[0].name="default" + +``` + +Now we need to create a `Secret` named `deep-storage-config`. It contains the necessary connection information using which the druid database will connect to the deep storage. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" +``` + +Let’s create the `deep-storage-config` Secret shown above: + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/volume-expansion/yamls/deep-storage-config.yaml +secret/deep-storage-config created +``` + +Now, we are going to deploy a `Druid` combined cluster with version `28.0.1`. + +### Deploy Druid + +In this section, we are going to deploy a Druid topology cluster for historicals and middleManagers with 1GB volume. Then, in the next section we will expand its volume to 2GB using `DruidOpsRequest` CRD. Below is the YAML of the `Druid` CR that we are going to create, + +```yaml +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + historicals: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + middleManagers: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + routers: + replicas: 1 + deletionPolicy: Delete +``` + +Let's create the `Druid` CR we have shown above, + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/volume-expansion/yamls/druid-topology.yaml +druid.kubedb.com/druid-cluster created +``` + +Now, wait until `druid-cluster` has status `Ready`. i.e, + +```bash +$ kubectl get dr -n demo -w +NAME TYPE VERSION STATUS AGE +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 0s +druid-cluster kubedb.com/v1alpha2 28.0.1 Provisioning 9s +. +. +druid-cluster kubedb.com/v1alpha2 28.0.1 Ready 3m26s +``` + +Let's check volume size from petset, and from the persistent volume, + +```bash +$ kubectl get petset -n demo druid-cluster-historicals -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" + +$ kubectl get petset -n demo druid-cluster-middleManagers -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"1Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-0bf49077-1c7a-4943-bb17-1dffd1626dcd 1Gi RWO Delete Bound demo/druid-cluster-segment-cache-druid-cluster-historicals-0 longhorn 10m +pvc-59ed4914-53b3-4f18-a6aa-7699c2b738e2 1Gi RWO Delete Bound demo/druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 longhorn 10m +``` + +You can see the petsets have 1GB storage, and the capacity of all the persistent volumes are also 1GB. + +We are now ready to apply the `DruidOpsRequest` CR to expand the volume of this database. + +### Volume Expansion + +Here, we are going to expand the volume of the druid topology cluster. + +#### Create DruidOpsRequest + +In order to expand the volume of the database, we have to create a `DruidOpsRequest` CR with our desired volume size. Below is the YAML of the `DruidOpsRequest` CR that we are going to create, + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: dr-volume-exp + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: druid-cluster + volumeExpansion: + historicals: 2Gi + middleManagers: 2Gi + mode: Offline +``` + +Here, + +- `spec.databaseRef.name` specifies that we are performing volume expansion operation on `druid-cluster`. +- `spec.type` specifies that we are performing `VolumeExpansion` on our database. +- `spec.volumeExpansion.historicals` specifies the desired volume size for historicals node. +- `spec.volumeExpansion.middleManagers` specifies the desired volume size for middleManagers node. +- `spec.volumeExpansion.mode` specifies the desired volume expansion mode(`Online` or `Offline`). + +During `Online` VolumeExpansion KubeDB expands volume without pausing database object, it directly updates the underlying PVC. And for `Offline` volume expansion, the database is paused. The Pods are deleted and PVC is updated. Then the database Pods are recreated with updated PVC. + +> If you want to expand the volume of only one node, you can specify the desired volume size for that node only. + +Let's create the `DruidOpsRequest` CR we have shown above, + +```bash +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/volume-expansion/yamls/druid-volume-expansion-topology.yaml +druidopsrequest.ops.kubedb.com/dr-volume-exp created +``` + +#### Verify Druid Topology volume expanded successfully + +If everything goes well, `KubeDB` Ops-manager operator will update the volume size of `Druid` object and related `PetSets` and `Persistent Volumes`. + +Let's wait for `DruidOpsRequest` to be `Successful`. Run the following command to watch `DruidOpsRequest` CR, + +```bash +$ kubectl get druidopsrequest -n demo +NAME TYPE STATUS AGE +dr-volume-exp VolumeExpansion Successful 3m1s +``` + +We can see from the above output that the `DruidOpsRequest` has succeeded. If we describe the `DruidOpsRequest` we will get an overview of the steps that were followed to expand the volume of druid. + +```bash +$ kubectl describe druidopsrequest -n demo dr-volume-exp +Name: dr-volume-exp +Namespace: demo +Labels: +Annotations: +API Version: ops.kubedb.com/v1alpha1 +Kind: DruidOpsRequest +Metadata: + Creation Timestamp: 2024-10-25T09:22:02Z + Generation: 1 + Managed Fields: + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: + f:kubectl.kubernetes.io/last-applied-configuration: + f:spec: + .: + f:apply: + f:databaseRef: + f:type: + f:volumeExpansion: + .: + f:historicals: + f:middleManagers: + f:mode: + Manager: kubectl-client-side-apply + Operation: Update + Time: 2024-10-25T09:22:02Z + API Version: ops.kubedb.com/v1alpha1 + Fields Type: FieldsV1 + fieldsV1: + f:status: + .: + f:conditions: + f:observedGeneration: + f:phase: + Manager: kubedb-ops-manager + Operation: Update + Subresource: status + Time: 2024-10-25T09:24:35Z + Resource Version: 221378 + UID: 2407cfa7-8d3b-463e-abf7-1910249009bd +Spec: + Apply: IfReady + Database Ref: + Name: druid-cluster + Type: VolumeExpansion + Volume Expansion: + Historicals: 2Gi + Middle Managers: 2Gi + Mode: Offline +Status: + Conditions: + Last Transition Time: 2024-10-25T09:22:02Z + Message: Druid ops-request has started to expand volume of druid nodes. + Observed Generation: 1 + Reason: VolumeExpansion + Status: True + Type: VolumeExpansion + Last Transition Time: 2024-10-25T09:22:10Z + Message: get pet set; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPetSet + Last Transition Time: 2024-10-25T09:22:10Z + Message: is pet set deleted; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPetSetDeleted + Last Transition Time: 2024-10-25T09:22:30Z + Message: successfully deleted the petSets with orphan propagation policy + Observed Generation: 1 + Reason: OrphanPetSetPods + Status: True + Type: OrphanPetSetPods + Last Transition Time: 2024-10-25T09:22:35Z + Message: get pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPod + Last Transition Time: 2024-10-25T09:22:35Z + Message: is ops req patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsOpsReqPatched + Last Transition Time: 2024-10-25T09:22:35Z + Message: create pod; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CreatePod + Last Transition Time: 2024-10-25T09:22:40Z + Message: get pvc; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: GetPvc + Last Transition Time: 2024-10-25T09:22:40Z + Message: is pvc patched; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: IsPvcPatched + Last Transition Time: 2024-10-25T09:23:50Z + Message: compare storage; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: CompareStorage + Last Transition Time: 2024-10-25T09:23:00Z + Message: create; ConditionStatus:True + Observed Generation: 1 + Status: True + Type: Create + Last Transition Time: 2024-10-25T09:23:08Z + Message: is druid running; ConditionStatus:False + Observed Generation: 1 + Status: False + Type: IsDruidRunning + Last Transition Time: 2024-10-25T09:23:20Z + Message: successfully updated middleManagers node PVC sizes + Observed Generation: 1 + Reason: UpdateMiddleManagersNodePVCs + Status: True + Type: UpdateMiddleManagersNodePVCs + Last Transition Time: 2024-10-25T09:24:15Z + Message: successfully updated historicals node PVC sizes + Observed Generation: 1 + Reason: UpdateHistoricalsNodePVCs + Status: True + Type: UpdateHistoricalsNodePVCs + Last Transition Time: 2024-10-25T09:24:30Z + Message: successfully reconciled the Druid resources + Observed Generation: 1 + Reason: UpdatePetSets + Status: True + Type: UpdatePetSets + Last Transition Time: 2024-10-25T09:24:35Z + Message: PetSet is recreated + Observed Generation: 1 + Reason: ReadyPetSets + Status: True + Type: ReadyPetSets + Last Transition Time: 2024-10-25T09:24:35Z + Message: Successfully completed volumeExpansion for Druid + Observed Generation: 1 + Reason: Successful + Status: True + Type: Successful + Observed Generation: 1 + Phase: Successful +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Starting 10m KubeDB Ops-manager Operator Start processing for DruidOpsRequest: demo/dr-volume-exp + Normal Starting 10m KubeDB Ops-manager Operator Pausing Druid databse: demo/druid-cluster + Normal Successful 10m KubeDB Ops-manager Operator Successfully paused Druid database: demo/druid-cluster for DruidOpsRequest: dr-volume-exp + Warning get pet set; ConditionStatus:True 10m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning is pet set deleted; ConditionStatus:True 10m KubeDB Ops-manager Operator is pet set deleted; ConditionStatus:True + Warning get pet set; ConditionStatus:True 10m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 10m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning is pet set deleted; ConditionStatus:True 10m KubeDB Ops-manager Operator is pet set deleted; ConditionStatus:True + Warning get pet set; ConditionStatus:True 10m KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal OrphanPetSetPods 9m59s KubeDB Ops-manager Operator successfully deleted the petSets with orphan propagation policy + Warning get pod; ConditionStatus:True 9m54s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 9m54s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning create pod; ConditionStatus:True 9m54s KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m49s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m49s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 9m49s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning compare storage; ConditionStatus:False 9m49s KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 9m44s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m44s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m39s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m39s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m34s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m34s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m29s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 9m29s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 9m29s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create; ConditionStatus:True 9m29s KubeDB Ops-manager Operator create; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 9m29s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m24s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is druid running; ConditionStatus:False 9m21s KubeDB Ops-manager Operator is druid running; ConditionStatus:False + Warning get pod; ConditionStatus:True 9m19s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 9m14s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateMiddleManagersNodePVCs 9m9s KubeDB Ops-manager Operator successfully updated middleManagers node PVC sizes + Warning get pod; ConditionStatus:True 9m4s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 9m4s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning create pod; ConditionStatus:True 9m4s KubeDB Ops-manager Operator create pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m59s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m59s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning is pvc patched; ConditionStatus:True 8m59s KubeDB Ops-manager Operator is pvc patched; ConditionStatus:True + Warning compare storage; ConditionStatus:False 8m59s KubeDB Ops-manager Operator compare storage; ConditionStatus:False + Warning get pod; ConditionStatus:True 8m54s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m54s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m49s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m49s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m44s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m44s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m39s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pvc; ConditionStatus:True 8m39s KubeDB Ops-manager Operator get pvc; ConditionStatus:True + Warning compare storage; ConditionStatus:True 8m39s KubeDB Ops-manager Operator compare storage; ConditionStatus:True + Warning create; ConditionStatus:True 8m39s KubeDB Ops-manager Operator create; ConditionStatus:True + Warning is ops req patched; ConditionStatus:True 8m39s KubeDB Ops-manager Operator is ops req patched; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m34s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning is druid running; ConditionStatus:False 8m31s KubeDB Ops-manager Operator is druid running; ConditionStatus:False + Warning get pod; ConditionStatus:True 8m29s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m24s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Warning get pod; ConditionStatus:True 8m19s KubeDB Ops-manager Operator get pod; ConditionStatus:True + Normal UpdateHistoricalsNodePVCs 8m14s KubeDB Ops-manager Operator successfully updated historicals node PVC sizes + Normal UpdatePetSets 7m59s KubeDB Ops-manager Operator successfully reconciled the Druid resources + Warning get pet set; ConditionStatus:True 7m54s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Warning get pet set; ConditionStatus:True 7m54s KubeDB Ops-manager Operator get pet set; ConditionStatus:True + Normal ReadyPetSets 7m54s KubeDB Ops-manager Operator PetSet is recreated + Normal Starting 7m54s KubeDB Ops-manager Operator Resuming Druid database: demo/druid-cluster + Normal Successful 7m54s KubeDB Ops-manager Operator Successfully resumed Druid database: demo/druid-cluster for DruidOpsRequest: dr-volume-exp +``` + +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 druid-cluster-historicals -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"3Gi" + +$ kubectl get petset -n demo druid-cluster-middleManagers -o json | jq '.spec.volumeClaimTemplates[].spec.resources.requests.storage' +"2Gi" + +$ kubectl get pv -n demo +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE +pvc-0bf49077-1c7a-4943-bb17-1dffd1626dcd 2Gi RWO Delete Bound demo/druid-cluster-segment-cache-druid-cluster-historicals-0 longhorn 23m +pvc-59ed4914-53b3-4f18-a6aa-7699c2b738e2 2Gi RWO Delete Bound demo/druid-cluster-base-task-dir-druid-cluster-middlemanagers-0 longhorn 23m +``` + +The above output verifies that we have successfully expanded the volume of the Druid. + +## Cleaning Up + +To clean up the Kubernetes resources created by this tutorial, run: + +```bash +kubectl delete druidopsrequest -n demo dr-volume-exp +kubectl delete dr -n demo druid-cluster +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [Druid object](/docs/guides/druid/concepts/druid.md). +- Different Druid topology clustering modes [here](/docs/guides/druid/clustering/_index.md). +- Monitor your Druid database with KubeDB using [out-of-the-box Prometheus operator](/docs/guides/druid/monitoring/using-prometheus-operator.md). +- +[//]: # (- Monitor your Druid database with KubeDB using [out-of-the-box builtin-Prometheus](/docs/guides/druid/monitoring/using-builtin-prometheus.md).) +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md). diff --git a/docs/guides/druid/volume-expansion/images/druid-volume-expansion.png b/docs/guides/druid/volume-expansion/images/druid-volume-expansion.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2b77d6cd9edc45ff038b11937d7807c2191418 GIT binary patch literal 76116 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�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
      Aeq1&&aX8EBqZF8#lcr=guT|4A*D%dkG zi#77{(_{f&&HUr@;;W}3IBFmHD-z@={|5HnY#L47bZB}l_velY5iDa2Dl`fLpjyQD z_J*NhKgUPB_mX8@PeY~rvCJQhPXZn-v|RrFd#|r%#Ij%Ds4{S4!+4?yn-&Z2d?q3! zT^L(+X*IzcM%vncA*glldY5tU;Jx0ip;uEv4!X^Ih0jATMk+K(Z@NHPx?9@*lmj`bX#-iCx&5@Hfm`B1$=@YTCt7*aM1s;el}2|hm9%bVb-^4iBVq@dFr+&B`um}?|dPuZfKQOV?L*=qvFWVs0o|#xyAx2)+&f7Fg#CMhn z)D}pzZl&EufN9(lz7JRQ`1BRV!9LezS+3ipbolQU{5eNJIZc;ew^P%Pxg`*d9#8NpK z1G=7UFWxz;Gj@Kw+8W=*sCq4fa^jN+O1Mzi>t704l<+r>p&Y3CF)Kxxw=8;V!fN%6 zTnFFwVSCqJ$o(kSvT$(`5q)u!T3g~2&SxH29NQO1qb5?hSADAoBF=Mnv@4BcJwn15 zf$0A@cDqjtx7t~6a{ZOR$% z)G*f9E`81jH&6Ss$==h+M{y!iW|JB|nCZ(W-j5|v4nJpEIyA@!YPz#mTDA{QQu(x} zcRNL<$0Ad@upd5N!?KLcf#n%GIaOw;@uX|=sOBh9OnHXCR+WwM+5gUJBwaz>1-yKg z*wyglV|<9spZ^m`D(_f%)C=q~XlC{_-Y9m6tNjh1jE+Q&(t2%c*iXXJ2c!3|u0ONI zjOSi`%hRpNVB1Vw0B>kKKF2BUVLR^WWM7BdzGW8uY8~GJ%eg-!LB#+37x|^bwZl?? zkf=>o3|s2;uE3?sIfL)vdT|l+J7szEBp})&oA)n_QM};w@K36dg22Me$*0YT%Guh7 z6}{GjSUp_QV0xdsvIn=u6Ws0p2vH@$rx1$kE1Vyz=Dd*pEu7d9Ab2IjfJt zqg_qi)ww4>St@DJz8XI|Jgn~(tx`L-_`ALBF}nJ?Af8%0D%!C6>PIq%Ldwpx`1wY- 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 JDlv3?^* New to KubeDB? Please start [here](/docs/README.md). + +# Druid Volume Expansion + +This guide will give an overview on how KubeDB Ops-manager operator expand the volume of various component of `Druid` like:. (Combined and Topology). + +## Before You Begin + +- You should be familiar with the following `KubeDB` concepts: + - [Druid](/docs/guides/druid/concepts/druid.md) + - [DruidOpsRequest](/docs/guides/druid/concepts/druidopsrequest.md) + +## How Volume Expansion Process Works + +The following diagram shows how KubeDB Ops-manager operator expand the volumes of `Druid` database components. Open the image in a new tab to see the enlarged version. + +
      +  Volume Expansion process of Druid +
      Fig: Volume Expansion process of Druid
      +
      + +The Volume Expansion process consists of the following steps: + +1. At first, a user creates a `Druid` Custom Resource (CR). + +2. `KubeDB` Provisioner operator watches the `Druid` CR. + +3. When the operator finds a `Druid` CR, it creates required number of `PetSets` and related necessary stuff like secrets, services, etc. + +4. Each PetSet creates a Persistent Volume 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 druid data components (ie. Historicals, MiddleManagers) of the `Druid`, the user creates a `DruidOpsRequest` CR with desired information. + +6. `KubeDB` Ops-manager operator watches the `DruidOpsRequest` CR. + +7. When it finds a `DruidOpsRequest` CR, it halts the `Druid` object which is referred from the `DruidOpsRequest`. So, the `KubeDB` Provisioner operator doesn't perform any operations on the `Druid` 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 `DruidOpsRequest` CR. + +9. After the successful Volume Expansion of the related PetSet Pods, the `KubeDB` Ops-manager operator updates the new volume size in the `Druid` object to reflect the updated state. + +10. After the successful Volume Expansion of the `Druid` components, the `KubeDB` Ops-manager operator resumes the `Druid` 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 Druid database components using `DruidOpsRequest` CRD. diff --git a/docs/guides/druid/volume-expansion/yamls/deep-storage-config.yaml b/docs/guides/druid/volume-expansion/yamls/deep-storage-config.yaml new file mode 100644 index 0000000000..3612595828 --- /dev/null +++ b/docs/guides/druid/volume-expansion/yamls/deep-storage-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: deep-storage-config + namespace: demo +stringData: + druid.storage.type: "s3" + druid.storage.bucket: "druid" + druid.storage.baseKey: "druid/segments" + druid.s3.accessKey: "minio" + druid.s3.secretKey: "minio123" + druid.s3.protocol: "http" + druid.s3.enablePathStyleAccess: "true" + druid.s3.endpoint.signingRegion: "us-east-1" + druid.s3.endpoint.url: "http://myminio-hl.demo.svc.cluster.local:9000/" + diff --git a/docs/guides/druid/volume-expansion/yamls/druid-cluster.yaml b/docs/guides/druid/volume-expansion/yamls/druid-cluster.yaml new file mode 100644 index 0000000000..cb8e321237 --- /dev/null +++ b/docs/guides/druid/volume-expansion/yamls/druid-cluster.yaml @@ -0,0 +1,34 @@ +apiVersion: kubedb.com/v1alpha2 +kind: Druid +metadata: + name: druid-cluster + namespace: demo +spec: + version: 28.0.1 + deepStorage: + type: s3 + configSecret: + name: deep-storage-config + topology: + historicals: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + middleManagers: + replicas: 1 + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageType: Durable + routers: + replicas: 1 + deletionPolicy: Delete + diff --git a/docs/guides/druid/volume-expansion/yamls/volume-expansion-ops.yaml b/docs/guides/druid/volume-expansion/yamls/volume-expansion-ops.yaml new file mode 100644 index 0000000000..b5ad80546b --- /dev/null +++ b/docs/guides/druid/volume-expansion/yamls/volume-expansion-ops.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: DruidOpsRequest +metadata: + name: dr-volume-exp + namespace: demo +spec: + type: VolumeExpansion + databaseRef: + name: druid-cluster + volumeExpansion: + historicals: 2Gi + middleManagers: 2Gi + mode: Offline \ No newline at end of file From afc8706c06e65d54d0b76606e02ed37337700d25 Mon Sep 17 00:00:00 2001 From: Neaj Morshad Date: Fri, 15 Nov 2024 11:13:03 +0600 Subject: [PATCH 12/12] Update SQL Server yamls and doc (#710) Signed-off-by: Neaj Morshad --- .../ag-cluster/mssqlserver-ag-cluster.yaml | 15 +++-- .../compute/mssqlserver-ag-cluster.yaml | 11 ++-- .../storage/mssqlserver-ag-cluster.yaml | 11 ++-- .../custom-config-podtemplate.yaml | 2 + .../configuration/mssql-custom-config.yaml | 9 +++ .../monitoring/mssql-monitoring.yaml | 9 +++ .../quickstart/mssqlserver-quickstart.yaml | 9 +++ .../restart/mssqlserver-ag-cluster.yaml | 15 +++-- .../horizontal-scaling/mssql-ag-cluster.yaml | 11 ++-- .../vertical-scaling/mssql-ag-cluster.yaml | 11 ++-- .../vertical-scaling/mssql-standalone.yaml | 9 +++ .../standalone/mssqlserver-standalone.yaml | 9 +++ .../mssqlserver/tls/mssql-ag-tls.yaml | 15 +++-- .../mssqlserver/tls/mssql-standalone-tls.yaml | 9 +++ .../mssqlserver-ag-cluster.yaml | 15 +++-- .../mssqlserver/autoscaler/compute/cluster.md | 11 ++-- .../mssqlserver/autoscaler/storage/cluster.md | 11 ++-- .../backup/application-level/index.md | 9 +++ .../examples/sample-mssqlserver-2.yaml | 15 +++-- .../mssqlserver/backup/auto-backup/index.md | 24 ++++++-- .../common/sample-mssqlserver.yaml | 15 +++-- .../mssqlserver/backup/logical/index.md | 18 ++++++ .../mssqlserver/clustering/ag_cluster.md | 52 +++++++---------- .../mssqlserver/clustering/standalone.md | 26 ++++++--- .../mssqlserver/concepts/mssqlserver.md | 56 +++++++++---------- .../configuration/using-config-file.md | 9 +++ .../configuration/using-podtemplate.md | 2 + .../monitoring/using-prometheus-operator.md | 9 +++ docs/guides/mssqlserver/pitr/archiver.md | 30 ++++++---- .../examples/restored-mssqlserver-ag.yaml | 15 +++-- .../pitr/examples/sample-mssqlserver-ag.yaml | 15 +++-- .../mssqlserver/quickstart/quickstart.md | 26 ++++++--- docs/guides/mssqlserver/restart/restart.md | 15 +++-- .../scaling/horizontal-scaling/mssqlserver.md | 11 ++-- .../scaling/vertical-scaling/ag_cluster.md | 13 ++--- .../scaling/vertical-scaling/standalone.md | 11 +++- docs/guides/mssqlserver/tls/ag_cluster.md | 16 ++++-- docs/guides/mssqlserver/tls/standalone.md | 9 +++ .../volume-expansion/volume-expansion.md | 15 +++-- .../redis/reconfigure-tls/standalone.md | 2 +- 40 files changed, 384 insertions(+), 211 deletions(-) diff --git a/docs/examples/mssqlserver/ag-cluster/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/ag-cluster/mssqlserver-ag-cluster.yaml index 12c229439e..2c8703c773 100644 --- a/docs/examples/mssqlserver/ag-cluster/mssqlserver-ag-cluster.yaml +++ b/docs/examples/mssqlserver/ag-cluster/mssqlserver-ag-cluster.yaml @@ -12,18 +12,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml index c43e3b77d1..831359f858 100644 --- a/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml +++ b/docs/examples/mssqlserver/autoscaler/compute/mssqlserver-ag-cluster.yaml @@ -12,12 +12,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -28,6 +22,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml index c43e3b77d1..831359f858 100644 --- a/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml +++ b/docs/examples/mssqlserver/autoscaler/storage/mssqlserver-ag-cluster.yaml @@ -12,12 +12,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -28,6 +22,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/examples/mssqlserver/configuration/custom-config-podtemplate.yaml b/docs/examples/mssqlserver/configuration/custom-config-podtemplate.yaml index 1edd1eec5e..42eb51783c 100644 --- a/docs/examples/mssqlserver/configuration/custom-config-podtemplate.yaml +++ b/docs/examples/mssqlserver/configuration/custom-config-podtemplate.yaml @@ -18,6 +18,8 @@ spec: containers: - name: mssql env: + - name: ACCEPT_EULA + value: "Y" - name: MSSQL_PID value: "Evaluation" - name: MSSQL_MEMORY_LIMIT_MB diff --git a/docs/examples/mssqlserver/configuration/mssql-custom-config.yaml b/docs/examples/mssqlserver/configuration/mssql-custom-config.yaml index 27c3dfc3be..2cf006c072 100644 --- a/docs/examples/mssqlserver/configuration/mssql-custom-config.yaml +++ b/docs/examples/mssqlserver/configuration/mssql-custom-config.yaml @@ -14,6 +14,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml b/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml index da1027aa74..33bb444649 100644 --- a/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml +++ b/docs/examples/mssqlserver/monitoring/mssql-monitoring.yaml @@ -12,6 +12,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it monitor: agent: prometheus.io/operator prometheus: diff --git a/docs/examples/mssqlserver/quickstart/mssqlserver-quickstart.yaml b/docs/examples/mssqlserver/quickstart/mssqlserver-quickstart.yaml index 85bd21d1ae..1168922974 100644 --- a/docs/examples/mssqlserver/quickstart/mssqlserver-quickstart.yaml +++ b/docs/examples/mssqlserver/quickstart/mssqlserver-quickstart.yaml @@ -13,6 +13,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: diff --git a/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml index 12c229439e..2c8703c773 100644 --- a/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml +++ b/docs/examples/mssqlserver/restart/mssqlserver-ag-cluster.yaml @@ -12,18 +12,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml b/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml index 449e0edf60..1dd21530bf 100644 --- a/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml +++ b/docs/examples/mssqlserver/scaling/horizontal-scaling/mssql-ag-cluster.yaml @@ -12,12 +12,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -28,6 +22,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml index 1102b8f4fd..be70206cbc 100644 --- a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-ag-cluster.yaml @@ -12,12 +12,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -28,6 +22,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml index 29629d28a1..0773f860ff 100644 --- a/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml +++ b/docs/examples/mssqlserver/scaling/vertical-scaling/mssql-standalone.yaml @@ -13,6 +13,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: diff --git a/docs/examples/mssqlserver/standalone/mssqlserver-standalone.yaml b/docs/examples/mssqlserver/standalone/mssqlserver-standalone.yaml index aed2f4a6ac..091495232f 100644 --- a/docs/examples/mssqlserver/standalone/mssqlserver-standalone.yaml +++ b/docs/examples/mssqlserver/standalone/mssqlserver-standalone.yaml @@ -13,6 +13,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: diff --git a/docs/examples/mssqlserver/tls/mssql-ag-tls.yaml b/docs/examples/mssqlserver/tls/mssql-ag-tls.yaml index 013eb80a30..1ff273b8c8 100644 --- a/docs/examples/mssqlserver/tls/mssql-ag-tls.yaml +++ b/docs/examples/mssqlserver/tls/mssql-ag-tls.yaml @@ -12,18 +12,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: true + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/examples/mssqlserver/tls/mssql-standalone-tls.yaml b/docs/examples/mssqlserver/tls/mssql-standalone-tls.yaml index 50bf7f7b2a..5f115cb414 100644 --- a/docs/examples/mssqlserver/tls/mssql-standalone-tls.yaml +++ b/docs/examples/mssqlserver/tls/mssql-standalone-tls.yaml @@ -13,6 +13,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: true + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: diff --git a/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml b/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml index c3f849b482..e3f32586c1 100644 --- a/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml +++ b/docs/examples/mssqlserver/volume-expansion/mssqlserver-ag-cluster.yaml @@ -12,18 +12,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "longhorn" diff --git a/docs/guides/mssqlserver/autoscaler/compute/cluster.md b/docs/guides/mssqlserver/autoscaler/compute/cluster.md index 14bc5ddf97..bfc19f8c4f 100644 --- a/docs/guides/mssqlserver/autoscaler/compute/cluster.md +++ b/docs/guides/mssqlserver/autoscaler/compute/cluster.md @@ -96,12 +96,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -112,6 +106,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/guides/mssqlserver/autoscaler/storage/cluster.md b/docs/guides/mssqlserver/autoscaler/storage/cluster.md index f95cf858f8..b48551aa4f 100644 --- a/docs/guides/mssqlserver/autoscaler/storage/cluster.md +++ b/docs/guides/mssqlserver/autoscaler/storage/cluster.md @@ -114,12 +114,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -130,6 +124,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/guides/mssqlserver/backup/application-level/index.md b/docs/guides/mssqlserver/backup/application-level/index.md index 4bc211b149..b5c9c4f0b3 100644 --- a/docs/guides/mssqlserver/backup/application-level/index.md +++ b/docs/guides/mssqlserver/backup/application-level/index.md @@ -115,6 +115,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: accessModes: - ReadWriteOnce diff --git a/docs/guides/mssqlserver/backup/auto-backup/examples/sample-mssqlserver-2.yaml b/docs/guides/mssqlserver/backup/auto-backup/examples/sample-mssqlserver-2.yaml index 08b6ee8e4d..6d55c8cbfb 100644 --- a/docs/guides/mssqlserver/backup/auto-backup/examples/sample-mssqlserver-2.yaml +++ b/docs/guides/mssqlserver/backup/auto-backup/examples/sample-mssqlserver-2.yaml @@ -20,18 +20,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: cert-manager.io clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: diff --git a/docs/guides/mssqlserver/backup/auto-backup/index.md b/docs/guides/mssqlserver/backup/auto-backup/index.md index a279524f59..168f4a9145 100644 --- a/docs/guides/mssqlserver/backup/auto-backup/index.md +++ b/docs/guides/mssqlserver/backup/auto-backup/index.md @@ -257,6 +257,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: accessModes: - ReadWriteOnce @@ -614,18 +623,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: cert-manager.io clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: diff --git a/docs/guides/mssqlserver/backup/customization/common/sample-mssqlserver.yaml b/docs/guides/mssqlserver/backup/customization/common/sample-mssqlserver.yaml index 7d219df8a0..4d472cc70e 100644 --- a/docs/guides/mssqlserver/backup/customization/common/sample-mssqlserver.yaml +++ b/docs/guides/mssqlserver/backup/customization/common/sample-mssqlserver.yaml @@ -12,18 +12,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: cert-manager.io clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: diff --git a/docs/guides/mssqlserver/backup/logical/index.md b/docs/guides/mssqlserver/backup/logical/index.md index 8d1d7c5622..c9e124c6a2 100644 --- a/docs/guides/mssqlserver/backup/logical/index.md +++ b/docs/guides/mssqlserver/backup/logical/index.md @@ -113,6 +113,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: accessModes: - ReadWriteOnce @@ -619,6 +628,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: accessModes: - ReadWriteOnce diff --git a/docs/guides/mssqlserver/clustering/ag_cluster.md b/docs/guides/mssqlserver/clustering/ag_cluster.md index 5d699968d0..e12581060a 100644 --- a/docs/guides/mssqlserver/clustering/ag_cluster.md +++ b/docs/guides/mssqlserver/clustering/ag_cluster.md @@ -92,6 +92,7 @@ issuer.cert-manager.io/mssqlserver-ca-issuer created ``` ### Configuring Environment Variables for SQL Server on Linux +You can use environment variables to configure SQL Server on Linux containers. When deploying `Microsoft SQL Server` on Linux using `containers`, you need to specify the `product edition` through the [MSSQL_PID](https://mcr.microsoft.com/en-us/product/mssql/server/about#configuration:~:text=MSSQL_PID%20is%20the,documentation%20here.) environment variable. This variable determines which `SQL Server edition` will run inside the container. The acceptable values for `MSSQL_PID` are: `Developer`: This will run the container using the Developer Edition (this is the default if no MSSQL_PID environment variable is supplied) `Express`: This will run the container using the Express Edition @@ -100,9 +101,11 @@ When deploying `Microsoft SQL Server` on Linux using `containers`, you need to s `EnterpriseCore`: This will run the container using the Enterprise Edition Core ``: This will run the container with the edition that is associated with the PID +`ACCEPT_EULA` confirms your acceptance of the [End-User Licensing Agreement](https://go.microsoft.com/fwlink/?linkid=857698). + For a complete list of environment variables that can be used, refer to the documentation [here](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-2017). -Below is an example of how to configure the `MSSQL_PID` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): +Below is an example of how to configure the `MSSQL_PID` and `ACCEPT_EULA` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): ```bash metadata: name: mssqlserver @@ -111,10 +114,12 @@ spec: podTemplate: spec: containers: - - name: mssql - env: - - name: MSSQL_PID - value: Enterprise + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Enterprise ``` In this example, the SQL Server container will run the Enterprise Edition. @@ -139,18 +144,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" @@ -242,33 +250,11 @@ metadata: spec: authSecret: name: mssqlserver-ag-cluster-auth - coordinator: - resources: {} deletionPolicy: WipeOut healthChecker: failureThreshold: 1 periodSeconds: 10 timeoutSeconds: 10 - internalAuth: - endpointCert: - certificates: - - alias: endpoint - secretName: mssqlserver-ag-cluster-endpoint-cert - subject: - organizationalUnits: - - endpoint - organizations: - - kubedb - issuerRef: - apiGroup: cert-manager.io - kind: Issuer - name: mssqlserver-ca-issuer - leaderElection: - electionTick: 10 - heartbeatTick: 1 - period: 300ms - transferLeadershipInterval: 1s - transferLeadershipTimeout: 1m0s podTemplate: controller: {} metadata: {} diff --git a/docs/guides/mssqlserver/clustering/standalone.md b/docs/guides/mssqlserver/clustering/standalone.md index 0506eacfe0..daed13436e 100644 --- a/docs/guides/mssqlserver/clustering/standalone.md +++ b/docs/guides/mssqlserver/clustering/standalone.md @@ -94,6 +94,7 @@ issuer.cert-manager.io/mssqlserver-ca-issuer created ``` ### Configuring Environment Variables for SQL Server on Linux +You can use environment variables to configure SQL Server on Linux containers. When deploying `Microsoft SQL Server` on Linux using `containers`, you need to specify the `product edition` through the [MSSQL_PID](https://mcr.microsoft.com/en-us/product/mssql/server/about#configuration:~:text=MSSQL_PID%20is%20the,documentation%20here.) environment variable. This variable determines which `SQL Server edition` will run inside the container. The acceptable values for `MSSQL_PID` are: `Developer`: This will run the container using the Developer Edition (this is the default if no MSSQL_PID environment variable is supplied) `Express`: This will run the container using the Express Edition @@ -102,9 +103,11 @@ When deploying `Microsoft SQL Server` on Linux using `containers`, you need to s `EnterpriseCore`: This will run the container using the Enterprise Edition Core ``: This will run the container with the edition that is associated with the PID +`ACCEPT_EULA` confirms your acceptance of the [End-User Licensing Agreement](https://go.microsoft.com/fwlink/?linkid=857698). + For a complete list of environment variables that can be used, refer to the documentation [here](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-2017). -Below is an example of how to configure the `MSSQL_PID` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): +Below is an example of how to configure the `MSSQL_PID` and `ACCEPT_EULA` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): ```bash metadata: name: mssqlserver @@ -113,10 +116,12 @@ spec: podTemplate: spec: containers: - - name: mssql - env: - - name: MSSQL_PID - value: Enterprise + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Enterprise ``` In this example, the SQL Server container will run the Enterprise Edition. @@ -142,6 +147,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: @@ -216,8 +230,6 @@ metadata: spec: authSecret: name: mssqlserver-standalone-auth - coordinator: - resources: {} deletionPolicy: WipeOut healthChecker: failureThreshold: 1 diff --git a/docs/guides/mssqlserver/concepts/mssqlserver.md b/docs/guides/mssqlserver/concepts/mssqlserver.md index 0b8d9beddd..549b569087 100644 --- a/docs/guides/mssqlserver/concepts/mssqlserver.md +++ b/docs/guides/mssqlserver/concepts/mssqlserver.md @@ -40,27 +40,13 @@ spec: databases: - agdb1 - agdb2 + leaderElection: + electionTick: 10 + heartbeatTick: 1 + period: 300ms + transferLeadershipInterval: 1s + transferLeadershipTimeout: 1m0s mode: AvailabilityGroup - internalAuth: - endpointCert: - certificates: - - alias: endpoint - secretName: mssqlserver-endpoint-cert - subject: - organizationalUnits: - - endpoint - organizations: - - kubedb - issuerRef: - apiGroup: cert-manager.io - kind: Issuer - name: mssqlserver-ca-issuer - leaderElection: - electionTick: 10 - heartbeatTick: 1 - period: 300ms - transferLeadershipInterval: 1s - transferLeadershipTimeout: 1m0s podTemplate: metadata: annotations: @@ -151,23 +137,30 @@ spec: tls: certificates: - alias: server + emailAddresses: + - dev@appscode.com secretName: mssqlserver-server-cert subject: organizationalUnits: - server organizations: - kubedb - emailAddresses: - - dev@appscode.com - alias: client + emailAddresses: + - abc@appscode.com secretName: mssqlserver-client-cert subject: organizationalUnits: - client organizations: - kubedb - emailAddresses: - - abc@appscode.com + - alias: endpoint + secretName: mssqlserver-endpoint-cert + subject: + organizationalUnits: + - endpoint + organizations: + - kubedb clientTLS: true issuerRef: apiGroup: cert-manager.io @@ -491,6 +484,7 @@ If you don't specify `spec.deletionPolicy` KubeDB uses `Delete` termination poli Indicates that the database is halted and all offshoot Kubernetes resources except PVCs are deleted. ### Configuring Environment Variables for SQL Server on Linux +You can use environment variables to configure SQL Server on Linux containers. When deploying `Microsoft SQL Server` on Linux using `containers`, you need to specify the `product edition` through the [MSSQL_PID](https://mcr.microsoft.com/en-us/product/mssql/server/about#configuration:~:text=MSSQL_PID%20is%20the,documentation%20here.) environment variable. This variable determines which `SQL Server edition` will run inside the container. The acceptable values for `MSSQL_PID` are: `Developer`: This will run the container using the Developer Edition (this is the default if no MSSQL_PID environment variable is supplied) `Express`: This will run the container using the Express Edition @@ -499,9 +493,11 @@ When deploying `Microsoft SQL Server` on Linux using `containers`, you need to s `EnterpriseCore`: This will run the container using the Enterprise Edition Core ``: This will run the container with the edition that is associated with the PID +`ACCEPT_EULA` confirms your acceptance of the [End-User Licensing Agreement](https://go.microsoft.com/fwlink/?linkid=857698). + For a complete list of environment variables that can be used, refer to the documentation [here](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-2017). -Below is an example of how to configure the `MSSQL_PID` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): +Below is an example of how to configure the `MSSQL_PID` and `ACCEPT_EULA` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): ```bash metadata: name: mssqlserver @@ -510,10 +506,12 @@ spec: podTemplate: spec: containers: - - name: mssql - env: - - name: MSSQL_PID - value: Enterprise + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Enterprise ``` In this example, the SQL Server container will run the Enterprise Edition. diff --git a/docs/guides/mssqlserver/configuration/using-config-file.md b/docs/guides/mssqlserver/configuration/using-config-file.md index 42e5b58327..e4d0158891 100644 --- a/docs/guides/mssqlserver/configuration/using-config-file.md +++ b/docs/guides/mssqlserver/configuration/using-config-file.md @@ -153,6 +153,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/guides/mssqlserver/configuration/using-podtemplate.md b/docs/guides/mssqlserver/configuration/using-podtemplate.md index 6e57a99f91..851bad2fea 100644 --- a/docs/guides/mssqlserver/configuration/using-podtemplate.md +++ b/docs/guides/mssqlserver/configuration/using-podtemplate.md @@ -141,6 +141,8 @@ spec: containers: - name: mssql env: + - name: ACCEPT_EULA + value: "Y" - name: MSSQL_PID value: "Evaluation" - name: MSSQL_MEMORY_LIMIT_MB diff --git a/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md b/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md index d19fac6b82..a11033e690 100644 --- a/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md +++ b/docs/guides/mssqlserver/monitoring/using-prometheus-operator.md @@ -222,6 +222,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it monitor: agent: prometheus.io/operator prometheus: diff --git a/docs/guides/mssqlserver/pitr/archiver.md b/docs/guides/mssqlserver/pitr/archiver.md index 5df20f4170..abe560df34 100644 --- a/docs/guides/mssqlserver/pitr/archiver.md +++ b/docs/guides/mssqlserver/pitr/archiver.md @@ -261,18 +261,21 @@ spec: availabilityGroup: databases: - demo - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - kind: Issuer - name: mssqlserver-ca-issuer tls: issuerRef: apiGroup: cert-manager.io kind: Issuer name: mssqlserver-ca-issuer clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: @@ -476,18 +479,21 @@ spec: replicas: 2 topology: mode: AvailabilityGroup - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: cert-manager.io clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: diff --git a/docs/guides/mssqlserver/pitr/examples/restored-mssqlserver-ag.yaml b/docs/guides/mssqlserver/pitr/examples/restored-mssqlserver-ag.yaml index 266de6e349..5439c7e1bb 100644 --- a/docs/guides/mssqlserver/pitr/examples/restored-mssqlserver-ag.yaml +++ b/docs/guides/mssqlserver/pitr/examples/restored-mssqlserver-ag.yaml @@ -19,12 +19,6 @@ spec: replicas: 2 topology: mode: AvailabilityGroup - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -32,6 +26,15 @@ spec: apiGroup: cert-manager.io clientTLS: false storageType: Durable + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: accessModes: - ReadWriteOnce diff --git a/docs/guides/mssqlserver/pitr/examples/sample-mssqlserver-ag.yaml b/docs/guides/mssqlserver/pitr/examples/sample-mssqlserver-ag.yaml index 006e21f008..8af7bffa95 100644 --- a/docs/guides/mssqlserver/pitr/examples/sample-mssqlserver-ag.yaml +++ b/docs/guides/mssqlserver/pitr/examples/sample-mssqlserver-ag.yaml @@ -19,18 +19,21 @@ spec: availabilityGroup: databases: - demo - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - kind: Issuer - name: mssqlserver-ca-issuer tls: issuerRef: apiGroup: cert-manager.io kind: Issuer name: mssqlserver-ca-issuer clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: accessModes: diff --git a/docs/guides/mssqlserver/quickstart/quickstart.md b/docs/guides/mssqlserver/quickstart/quickstart.md index 1ce678b8cd..85fcbfb5f7 100644 --- a/docs/guides/mssqlserver/quickstart/quickstart.md +++ b/docs/guides/mssqlserver/quickstart/quickstart.md @@ -97,6 +97,7 @@ issuer.cert-manager.io/mssqlserver-ca-issuer created ``` ### Configuring Environment Variables for SQL Server on Linux +You can use environment variables to configure SQL Server on Linux containers. When deploying `Microsoft SQL Server` on Linux using `containers`, you need to specify the `product edition` through the [MSSQL_PID](https://mcr.microsoft.com/en-us/product/mssql/server/about#configuration:~:text=MSSQL_PID%20is%20the,documentation%20here.) environment variable. This variable determines which `SQL Server edition` will run inside the container. The acceptable values for `MSSQL_PID` are: `Developer`: This will run the container using the Developer Edition (this is the default if no MSSQL_PID environment variable is supplied) `Express`: This will run the container using the Express Edition @@ -105,9 +106,11 @@ When deploying `Microsoft SQL Server` on Linux using `containers`, you need to s `EnterpriseCore`: This will run the container using the Enterprise Edition Core ``: This will run the container with the edition that is associated with the PID +`ACCEPT_EULA` confirms your acceptance of the [End-User Licensing Agreement](https://go.microsoft.com/fwlink/?linkid=857698). + For a complete list of environment variables that can be used, refer to the documentation [here](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-2017). -Below is an example of how to configure the `MSSQL_PID` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): +Below is an example of how to configure the `MSSQL_PID` and `ACCEPT_EULA` environment variable in the KubeDB MSSQLServer Custom Resource Definition (CRD): ```bash metadata: name: mssqlserver @@ -116,10 +119,12 @@ spec: podTemplate: spec: containers: - - name: mssql - env: - - name: MSSQL_PID - value: Enterprise + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Enterprise ``` In this example, the SQL Server container will run the Enterprise Edition. @@ -146,6 +151,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: @@ -220,8 +234,6 @@ metadata: spec: authSecret: name: mssqlserver-quickstart-auth - coordinator: - resources: {} deletionPolicy: WipeOut healthChecker: failureThreshold: 1 diff --git a/docs/guides/mssqlserver/restart/restart.md b/docs/guides/mssqlserver/restart/restart.md index 3f4832e76b..3912fa9c49 100644 --- a/docs/guides/mssqlserver/restart/restart.md +++ b/docs/guides/mssqlserver/restart/restart.md @@ -86,18 +86,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" diff --git a/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md b/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md index d60e364ec6..a1f996f54d 100644 --- a/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md +++ b/docs/guides/mssqlserver/scaling/horizontal-scaling/mssqlserver.md @@ -113,12 +113,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -129,6 +123,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md b/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md index 8867b49748..e0cec80c92 100644 --- a/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/ag_cluster.md @@ -5,7 +5,7 @@ menu: identifier: ms-scaling-vertical-ag-cluster name: Availability Group (HA Cluster) parent: ms-scaling-vertical - weight: 20 + weight: 30 menu_name: docs_{{ .version }} section_menu_id: guides --- @@ -106,12 +106,6 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer @@ -122,6 +116,11 @@ spec: spec: containers: - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it resources: requests: cpu: "500m" diff --git a/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md b/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md index 72d97a6d9d..fd48803af2 100644 --- a/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md +++ b/docs/guides/mssqlserver/scaling/vertical-scaling/standalone.md @@ -107,6 +107,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: @@ -320,13 +329,13 @@ Now, we are going to verify whether the resources of the mssqlserver instance ha $ kubectl get pod -n demo mssql-standalone-0 -o json | jq '.spec.containers[0].resources' { "limits": { - "cpu": "2", "memory": "5Gi" }, "requests": { "cpu": "1", "memory": "5Gi" } +} ``` The above output verifies that we have successfully scaled up the resources of the MSSQLServer. diff --git a/docs/guides/mssqlserver/tls/ag_cluster.md b/docs/guides/mssqlserver/tls/ag_cluster.md index f419b5ef49..394e42dbac 100644 --- a/docs/guides/mssqlserver/tls/ag_cluster.md +++ b/docs/guides/mssqlserver/tls/ag_cluster.md @@ -118,18 +118,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: true + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "standard" @@ -204,6 +207,7 @@ Ng1DaJSNjZkgXXFX ```bash $ kubectl exec -it -n demo mssql-ag-tls-0 -c mssql -- bash +mssql@mssql-ag-tls-0:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Ng1DaJSNjZkgXXFX -N 1> select name from sys.databases 2> go name diff --git a/docs/guides/mssqlserver/tls/standalone.md b/docs/guides/mssqlserver/tls/standalone.md index 234364d9ec..536c15f37e 100644 --- a/docs/guides/mssqlserver/tls/standalone.md +++ b/docs/guides/mssqlserver/tls/standalone.md @@ -120,6 +120,15 @@ spec: kind: Issuer apiGroup: "cert-manager.io" clientTLS: true + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storage: storageClassName: "standard" accessModes: diff --git a/docs/guides/mssqlserver/volume-expansion/volume-expansion.md b/docs/guides/mssqlserver/volume-expansion/volume-expansion.md index cc2983f534..4bf7d105e2 100644 --- a/docs/guides/mssqlserver/volume-expansion/volume-expansion.md +++ b/docs/guides/mssqlserver/volume-expansion/volume-expansion.md @@ -112,18 +112,21 @@ spec: databases: - agdb1 - agdb2 - internalAuth: - endpointCert: - issuerRef: - apiGroup: cert-manager.io - name: mssqlserver-ca-issuer - kind: Issuer tls: issuerRef: name: mssqlserver-ca-issuer kind: Issuer apiGroup: "cert-manager.io" clientTLS: false + podTemplate: + spec: + containers: + - name: mssql + env: + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_PID + value: Evaluation # Change it storageType: Durable storage: storageClassName: "longhorn" diff --git a/docs/guides/redis/reconfigure-tls/standalone.md b/docs/guides/redis/reconfigure-tls/standalone.md index d67247f2a3..590165ee46 100644 --- a/docs/guides/redis/reconfigure-tls/standalone.md +++ b/docs/guides/redis/reconfigure-tls/standalone.md @@ -94,7 +94,7 @@ root@rd-sample-0:/data# We can verify from the above output that TLS is disabled for this database. -### Create Issuer/ StandaloneIssuer +### Create Issuer/ClusterIssuer Now, We are going to create an example `Issuer` that will be used to enable SSL/TLS in Redis. Alternatively, you can follow this [cert-manager tutorial](https://cert-manager.io/docs/configuration/ca/) to create your own `Issuer`.

    OARi)?=J8#vuzjj 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

  • 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 FRg(2295 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