From 6a115362526f7fe821b5fb6c856e789f990bcc80 Mon Sep 17 00:00:00 2001 From: Tapajit Chandra Paul Date: Wed, 13 Nov 2024 14:45:28 +0600 Subject: [PATCH] Add custom podTemplate docs Signed-off-by: Tapajit Chandra Paul --- docs/guides/druid/README.md | 4 + .../config-file}/images/druid-updated-ui.png | Bin .../{guide.md => config-file/index.md} | 8 +- .../yamls/config-secret.yaml | 0 .../yamls/deep-storage-config.yaml | 0 .../yamls/druid-with-config.yaml | 0 .../druid/configuration/images/druid-ui.png | Bin 47241 -> 0 bytes .../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/reconfigure/guide.md | 2 +- .../vertical-scaling/yamls/druid-cluster.yaml | 1 - 15 files changed, 779 insertions(+), 6 deletions(-) rename docs/guides/druid/{reconfigure => configuration/config-file}/images/druid-updated-ui.png (100%) rename docs/guides/druid/configuration/{guide.md => config-file/index.md} (96%) rename docs/guides/druid/configuration/{ => config-file}/yamls/config-secret.yaml (100%) rename docs/guides/druid/configuration/{ => config-file}/yamls/deep-storage-config.yaml (100%) rename docs/guides/druid/configuration/{ => config-file}/yamls/druid-with-config.yaml (100%) delete mode 100644 docs/guides/druid/configuration/images/druid-ui.png 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 diff --git a/docs/guides/druid/README.md b/docs/guides/druid/README.md index fc7a1c97e9..e1f9c98d61 100644 --- a/docs/guides/druid/README.md +++ b/docs/guides/druid/README.md @@ -15,6 +15,10 @@ 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 diff --git a/docs/guides/druid/reconfigure/images/druid-updated-ui.png b/docs/guides/druid/configuration/config-file/images/druid-updated-ui.png similarity index 100% rename from docs/guides/druid/reconfigure/images/druid-updated-ui.png rename to docs/guides/druid/configuration/config-file/images/druid-updated-ui.png diff --git a/docs/guides/druid/configuration/guide.md b/docs/guides/druid/configuration/config-file/index.md similarity index 96% rename from docs/guides/druid/configuration/guide.md rename to docs/guides/druid/configuration/config-file/index.md index a7baf0c727..dca8653758 100644 --- a/docs/guides/druid/configuration/guide.md +++ b/docs/guides/druid/configuration/config-file/index.md @@ -2,7 +2,7 @@ title: Configuring Druid Cluster menu: docs_{{ .version }}: - identifier: guides-druid-configuration-druid-cluster + identifier: guides-druid-configuration-config-file name: Configuration File parent: guides-druid-configuration weight: 10 @@ -134,7 +134,7 @@ stringData: ``` ```bash -$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/druid/configuration/yamls/config-secret.yaml +$ 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 ``` @@ -170,7 +170,7 @@ spec: 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/yamls/druid-with-monitoring.yaml +$ 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 ``` @@ -256,7 +256,7 @@ Now hit the `http://localhost:8888` from any browser, and you will be prompted t After providing the credentials correctly, you should be able to access the web console like shown below.

-  lifecycle +  druid-ui

diff --git a/docs/guides/druid/configuration/yamls/config-secret.yaml b/docs/guides/druid/configuration/config-file/yamls/config-secret.yaml similarity index 100% rename from docs/guides/druid/configuration/yamls/config-secret.yaml rename to docs/guides/druid/configuration/config-file/yamls/config-secret.yaml diff --git a/docs/guides/druid/configuration/yamls/deep-storage-config.yaml b/docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml similarity index 100% rename from docs/guides/druid/configuration/yamls/deep-storage-config.yaml rename to docs/guides/druid/configuration/config-file/yamls/deep-storage-config.yaml diff --git a/docs/guides/druid/configuration/yamls/druid-with-config.yaml b/docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml similarity index 100% rename from docs/guides/druid/configuration/yamls/druid-with-config.yaml rename to docs/guides/druid/configuration/config-file/yamls/druid-with-config.yaml diff --git a/docs/guides/druid/configuration/images/druid-ui.png b/docs/guides/druid/configuration/images/druid-ui.png deleted file mode 100644 index af798ee7b4500b849f698decb06b9abde3dfba0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47241 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� 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 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/reconfigure/guide.md b/docs/guides/druid/reconfigure/guide.md index 0c8767a8b0..cf85960a9c 100644 --- a/docs/guides/druid/reconfigure/guide.md +++ b/docs/guides/druid/reconfigure/guide.md @@ -678,7 +678,7 @@ You can access the UI similarly by doing port-forward as mentioned in [Check Con You should be able to see the following changes in the UI:

-  lifecycle +  lifecycle

You can see that there are 5 task slots reflecting with our provided custom configuration of `druid.worker.capacity=5`. diff --git a/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml index 6351c2ddda..7a89d0dc91 100644 --- a/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml +++ b/docs/guides/druid/scaling/vertical-scaling/yamls/druid-cluster.yaml @@ -13,4 +13,3 @@ spec: routers: replicas: 1 deletionPolicy: Delete -