Was this page helpful?
Reference deployment: GKE¶
This guide deploys a production-ready ScyllaDB cluster on Google Kubernetes Engine (GKE). By the end, you will have a 3-node ScyllaDB cluster spread across 3 zones, with performance tuning and local NVMe storage configured.
Prerequisites¶
A regional GKE cluster provisioned with a dedicated ScyllaDB node pool with local NVMe SSDs, spread across 3 zones. If you do not have one yet, follow Set up a GKE cluster for ScyllaDB.
Dedicated nodes labeled and tainted per Set up dedicated node pools. The GKE cluster setup guide handles this automatically.
ScyllaDB Operator installed. Follow Install ScyllaDB Operator if you have not done so yet.
kubectlconfigured and pointed at the cluster.The environment variables from the GKE cluster setup guide exported in your shell (at minimum
GCP_REGION,GKE_ZONE_1,GKE_ZONE_2,GKE_ZONE_3).
Set up nodes¶
Before deploying a ScyllaCluster, the dedicated nodes must be prepared with local disk setup and kernel tuning via NodeConfig, and the Local CSI Driver must be installed to provision PersistentVolumes from the local NVMe storage.
Follow Configure nodes, selecting the GKE tab where applicable, then return here to deploy the cluster.
Deploy a ScyllaDB cluster¶
Tip
You can run your ScyllaDB cluster in the Kubernetes namespace of your choice (you can change the namespace used in this guide to your preference). It is a best practice (but not strictly required) to run your ScyllaDB cluster in a namespace separate from other applications.
Create a ScyllaDB cluster with one rack per availability zone.
The resource requests are sized for n2-highmem-16 (16 vCPU, 128 GiB RAM), leaving headroom for the OS, kubelet, and DaemonSets.
See the ScyllaDB system requirements for general sizing guidance.
Adjust if you use a different machine type.
kubectl apply --server-side -f=- <<EOF
apiVersion: scylla.scylladb.com/v1
kind: ScyllaCluster
metadata:
name: scylladb
spec:
repository: docker.io/scylladb/scylla
version: 2026.1.3
agentVersion: 3.10.1
automaticOrphanedNodeCleanup: true
datacenter:
name: ${GCP_REGION}
racks:
- name: ${GKE_ZONE_1}
members: 1
storage:
capacity: 500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 14
memory: 110Gi
limits:
cpu: 14
memory: 110Gi
agentResources:
requests:
cpu: 100m
memory: 20Mi
limits:
cpu: 100m
memory: 20Mi
placement:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: scylla.scylladb.com/node-type
operator: In
values:
- scylla
- key: topology.kubernetes.io/zone
operator: In
values:
- ${GKE_ZONE_1}
tolerations:
- key: scylla-operator.scylladb.com/dedicated
operator: Equal
value: scyllaclusters
effect: NoSchedule
- name: ${GKE_ZONE_2}
members: 1
storage:
capacity: 500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 14
memory: 110Gi
limits:
cpu: 14
memory: 110Gi
agentResources:
requests:
cpu: 100m
memory: 20Mi
limits:
cpu: 100m
memory: 20Mi
placement:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: scylla.scylladb.com/node-type
operator: In
values:
- scylla
- key: topology.kubernetes.io/zone
operator: In
values:
- ${GKE_ZONE_2}
tolerations:
- key: scylla-operator.scylladb.com/dedicated
operator: Equal
value: scyllaclusters
effect: NoSchedule
- name: ${GKE_ZONE_3}
members: 1
storage:
capacity: 500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 14
memory: 110Gi
limits:
cpu: 14
memory: 110Gi
agentResources:
requests:
cpu: 100m
memory: 20Mi
limits:
cpu: 100m
memory: 20Mi
placement:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: scylla.scylladb.com/node-type
operator: In
values:
- scylla
- key: topology.kubernetes.io/zone
operator: In
values:
- ${GKE_ZONE_3}
tolerations:
- key: scylla-operator.scylladb.com/dedicated
operator: Equal
value: scyllaclusters
effect: NoSchedule
EOF
Verify the deployment¶
Wait for the cluster to become ready:
kubectl wait --for='condition=Progressing=False' scyllacluster.scylla.scylladb.com/scylladb
kubectl wait --for='condition=Degraded=False' scyllacluster.scylla.scylladb.com/scylladb
kubectl wait --for='condition=Available=True' scyllacluster.scylla.scylladb.com/scylladb
Verify the cluster status:
kubectl get scyllaclusters.scylla.scylladb.com/scylladb
Expected output:
NAME READY MEMBERS RACKS AVAILABLE PROGRESSING DEGRADED AGE
scylladb 3 3 3 True False False 5m
Clean up¶
Delete the ScyllaDB cluster first so the underlying PersistentVolumes are released cleanly:
kubectl delete scyllaclusters.scylla.scylladb.com/scylladb
To tear down the GKE infrastructure, follow the Clean up section of the GKE cluster setup guide.
Next steps¶
Set up monitoring with Prometheus and Grafana dashboards.
Review the production checklist before going live.
Learn how to connect your application to ScyllaDB.