{"id":27436688,"url":"https://github.com/trikimiki/k8ssandra-test-deploy","last_synced_at":"2026-01-23T14:46:00.793Z","repository":{"id":287198087,"uuid":"963811907","full_name":"trikimiki/k8ssandra-test-deploy","owner":"trikimiki","description":"single-cluster k8ssandra with thingsboard on EKS","archived":false,"fork":false,"pushed_at":"2025-08-06T08:13:19.000Z","size":1171,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-06T09:29:05.714Z","etag":null,"topics":["cassandra","eks","k8ssandra","kubernetes","thingsboard"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trikimiki.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-10T08:43:27.000Z","updated_at":"2025-08-06T08:13:21.000Z","dependencies_parsed_at":"2025-06-26T16:32:20.624Z","dependency_job_id":"425a9f11-21a4-4bb2-9e0d-b35b50e074ad","html_url":"https://github.com/trikimiki/k8ssandra-test-deploy","commit_stats":null,"previous_names":["trikimiki/k8ssandra-test-deploy"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/trikimiki/k8ssandra-test-deploy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trikimiki%2Fk8ssandra-test-deploy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trikimiki%2Fk8ssandra-test-deploy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trikimiki%2Fk8ssandra-test-deploy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trikimiki%2Fk8ssandra-test-deploy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trikimiki","download_url":"https://codeload.github.com/trikimiki/k8ssandra-test-deploy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trikimiki%2Fk8ssandra-test-deploy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28694457,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T14:15:13.573Z","status":"ssl_error","status_checked_at":"2026-01-23T14:09:05.534Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cassandra","eks","k8ssandra","kubernetes","thingsboard"],"created_at":"2025-04-14T19:45:10.098Z","updated_at":"2026-01-23T14:46:00.781Z","avatar_url":"https://github.com/trikimiki.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"my first shot at deploying single-cluster k8ssandra on EKS\n\nwill use [thingsboard ce](https://thingsboard.io/docs/faq/) as a platfrom to test the database\n\n# INSTALLATION\n\n## prerequisites\n- setup [an AWS account](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started-account-iam.html)\n- install:\n  - [kubectl](https://kubernetes.io/docs/tasks/tools/)\n  - [eksctl](https://docs.aws.amazon.com/eks/latest/userguide/setting-up.html)\n  - [awscli](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)\n- configure environment:\n  ```\n  aws configure --profile k8ssandra-test-triki\n  ```\n\n\n## step 1 - create EKS cluster and get access with kubectl\n\n```\neksctl --profile k8ssandra-test-triki create cluster -f eks/cluster.yml \\\n  --set-kubeconfig-context=false \\\n  --auto-kubeconfig=false \\\n  --write-kubeconfig=false\n```\n```\naws eks --profile k8ssandra-test-triki update-kubeconfig --region ap-south-1 --name k8ssandra-test-triki --alias k8ssandra-test-triki\n```\n\n## step 2 - create gp3 storage class, make it default\n\n```\nkubectl apply -f eks/gp3-sc.yml\nkubectl patch storageclass gp2 -p '{\"metadata\": {\"annotations\":{\"storageclass.kubernetes.io/is-default-class\":\"false\"}}}'\n```\n\n## step 3 - install cluster dependencies\nALB controller - needed for thingsboard\n\ncert manager - needed for cass-operator\n```\nhelm repo add eks https://aws.github.io/eks-charts\nhelm repo update eks\nhelm install aws-load-balancer-controller eks/aws-load-balancer-controller \\\n  -n kube-system \\\n  --set clusterName=k8ssandra-test-triki \\\n  --set serviceAccount.create=false \\\n  --set serviceAccount.name=aws-load-balancer-controller\n```\n```\nhelm repo add jetstack https://charts.jetstack.io\nhelm repo update jetstack\nhelm install --version 1.17.2 cert-manager jetstack/cert-manager \\\n  -n cert-manager \\\n  --create-namespace \\\n  --set crds.enabled=true \\\n  --set serviceAccount.create=false \\\n  --set cainjector.serviceAccount.create=false\n```\n\n## step 4 - install k8ssandra-operator in cluster scoped mode\nsince thingsboard will need to access cassandra db, we will deploy them both in the separate namespace - need to use cluster scope\n```\nhelm repo add k8ssandra https://helm.k8ssandra.io/stable\nhelm repo update k8ssandra\nhelm install k8ssandra-operator --version 1.24.0 k8ssandra/k8ssandra-operator \\\n  -n k8ssandra-operator \\\n  --create-namespace \\\n  --set global.clusterScoped=true\n```\n\n## step 5 - create namespace for thingsboard and cassandra\n\n```\nkubectl apply -f thingsboard/namespace.yml\n```\n\n## step 6 - deploy k8ssandra cluster\n\n```\nkubectl apply -f cassandra/k8ssandra-cluster.yml\n```\n\n## step 7 - create AWS RDS (Postgres) instance for thingsboard\nAWS Console -\u003e Aurora and RDS -\u003e Create database\n\nsee [rds-params.png](rds-params.png) - crucial parameters are highlighted\n\n__IMPORTANT__ - save master user password somewhere! you cannot read it after DB creation; we will put it inside kubernetes secret in the next step\n\nalternatively, you can use AWS secret manager for this\n\n## step 8 - deploy thingsboard\n\n### 8.1 create secret with RDS creds\n\n```\nRDS_SOURCE=\"jdbc:postgresql://$(aws --profile k8ssandra-test-triki rds describe-db-instances --region ap-south-1 | jq -r '.DBInstances[] | select(.DBInstanceIdentifier == \"rds-for-k8ssandra-test-triki\") | .Endpoint.Address'):5432/thingsboard\"\n```\n```\nRDS_USER=$(aws rds --profile k8ssandra-test-triki describe-db-instances --region ap-south-1 | jq -r '.DBInstances[] | select(.DBInstanceIdentifier == \"rds-for-k8ssandra-test-triki\") | .MasterUsername')\n```\n```\nRDS_PASS=\u003cpaste master password here\u003e\n```\n```\nkubectl create -n thingsboard secret generic tb-rds-secret \\\n  --from-literal=rds-datasource=\"$RDS_SOURCE\" \\\n  --from-literal=rds-username=\"$RDS_USER\" \\\n  --from-literal=rds-password=\"$RDS_PASS\"\n```\n\n### 8.2 create cassandra keyspace\nby default thingsboard installs keyspace with RF=1 - so we need to pre-install keyspace with proper RF=3\n\nto get cassandra creds:\n```\nkubectl -n thingsboard get secret cassandra-superuser -o json | jq -r '.data.username' | base64 --decode\nkubectl -n thingsboard get secret cassandra-superuser -o json | jq -r '.data.password' | base64 --decode\n```\n\nrun query:\n```\nkubectl -n thingsboard exec -it cassandra-ap-south-1-r1a-sts-0 -c cassandra -- cqlsh \\\n              -u cassandra-superuser \\\n              -e \\\n                \"CREATE KEYSPACE IF NOT EXISTS thingsboard \\\n                WITH replication = { \\\n                  'class' : 'NetworkTopologyStrategy', \\\n                  'ap-south-1' : '3' \\\n                };\"\n```\n\n### 8.3 create thingsboard configmap\n\n```\nkubectl apply -f thingsboard/tb-node-configmap.yml\n```\n\n### 8.4 install postgres and cassandra data\n\n```\ncd thingsboard/install\nsudo chmod +x install-tb.sh\n```\n\n```\n./install-tb.sh\n```\n\n```\ncd ../..\n```\n\n### 8.5 create and start thingsboard app\n\n```\nkubectl apply -f thingsboard/tb-node-sts.yml\n```\n\n## step 9 - create AWS load-balancer\n\n```\nkubectl apply -f thingsboard/tb-nlb.yml\n```\n\n## step 10 - access thingsboard\n\nyou can access web UI from browser via `EXTERNAL-IP` link from:\n```\nkubectl -n thingsboard get svc tb-nlb\n```\ndefault credentials are:\n\n\u003e System Administrator: sysadmin@thingsboard.org / sysadmin\n\n\u003e Tenant Administrator: tenant@thingsboard.org / tenant\n\n\u003e Customer User: customer@thingsboard.org / customer\n\n# K8SSANDRA MAINTENANCE\n\n## TBC\n\nmedusa s3 secret snippet:\n```\nAWS_KEY_ID=demo12345\nAWS_KEY_SECRET=demo12345\n\nkubectl apply -f - \u003c\u003cEOF\napiVersion: v1\nkind: Secret\nmetadata:\n  name: medusa-s3-secret\n  namespace: thingsboard\ntype: Opaque\nstringData:\n  credentials: |\n    [default]\n    aws_access_key_id = ${AWS_KEY_ID}\n    aws_secret_access_key = ${AWS_KEY_SECRET}\nEOF\n```\n\nTODO - check if backups arent persisted locally\nTODO - instrucions for dedicated ami for medusa s3\n\nreaper ui:\n```\nkubectl port-forward svc/cassandra-ap-south-1-reaper-service 8085:8080\n\nlocalhost:8085/webui\n\nkubectl get secret cassandra-reaper-ui -o jsonpath='{.data.username}' | base64 --decode\nkubectl get secret cassandra-reaper-ui -o jsonpath='{.data.password}' | base64 --decode\n```\n\nmanual backup:\n```\nDATE=$(date +%Y%m%d-%H%M) envsubst \u003c cassandra/backup/manual.template.yml | kubectl apply -f -\n```\n\nTODO - Prometheus\n\n\nthingsboard data generators:\n```\nlogin as tenant@thingsboard.org\n\nentities -\u003e devices -\u003e \"+\" -\u003e import device -\u003e use \"devices.csv\"\n\nrule chains -\u003e \"+\" -\u003e import rule chain -\u003e use \"rule-chain.json\"\n\nthis will generate 440 key-values saved to cassandra per second (40 integers and 400 strings) - totalling to ~2.6gb of data written daily, with per-row TTL applied for 7, 10, 14 and 30 days (equally) - total DB size (after 1 month TTL \"kicks in\") should be about 40gb\n```\n\n^^^ explain medusa/reaper/cassandra resources limits/request were done per this dataload\n\ntroubleshooting: https://docs.k8ssandra.io/tasks/troubleshoot/\n\nmonitoring - i will do mcac (or vector?) expose + separate prometheus deployment; k8ssandra could also deploy prometheus as part of k8ssandracluster, see https://docs.k8ssandra.io/components/metrics-collector/\n\n# retainable PVs - via patching:\n\nhttps://forum.k8ssandra.io/t/how-to-reuse-the-same-pv-pvc-when-we-restart-the-cluster-or-cassandra-datacenter/532\n\nk8ssandra automatically deletes PVC with cluster resource deletion\n\nthere is no delete policy available from k8ssandra side, so we need to ensure volumes are persisted via reclaim policy patch:\n\n  `kubectl patch pv \u003cpv-name\u003e -p '{\"spec\":{\"persistentVolumeReclaimPolicy\":\"Retain\"}}'`\n\nif you need to re-bound PVs to PVCs after k8ssandra was deleted:\n  - check that PVs have same names, labels and size as desribed in k8ssandra CRDs\n  - patch your PVs: `kubectl -n thingsboard patch pv pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -p '{\"spec\":{\"claimRef\": null}}'`\n  - after you re-deploy k8ssandra cluster - old PVs should automatically bound to new PVCs\n\n`helm repo add prometheus-community https://prometheus-community.github.io/helm-charts` - migrate monitoring to helm chart (thats also dependency for k8c`telemetry.prometheus`)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrikimiki%2Fk8ssandra-test-deploy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrikimiki%2Fk8ssandra-test-deploy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrikimiki%2Fk8ssandra-test-deploy/lists"}