Was this page helpful?
Reference deployment: EKS¶
This guide deploys a production-ready ScyllaDB cluster on Amazon Elastic Kubernetes Service (EKS). By the end, you will have a 3-node ScyllaDB cluster spread across 3 availability zones, with performance tuning and local NVMe storage configured.
Prerequisites¶
An EKS cluster provisioned with a dedicated ScyllaDB node group with local NVMe SSDs. If you do not have one yet, follow Set up an EKS cluster for ScyllaDB.
Dedicated nodes labeled and tainted per Set up dedicated node pools. The EKS 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 EKS cluster setup guide exported in your shell (at minimum
AWS_REGION,EKS_AZ_1,EKS_AZ_2,EKS_AZ_3).
Work around the ScyllaDB utils image issue¶
The default ScyllaDB utils image used by the operator for node tuning jobs contains a broken systemctl binary that fails on EKS nodes running irqbalance.
Until this is fixed upstream, override the utils image with an older version that includes a working systemctl:
kubectl apply --server-side -f=- <<EOF
apiVersion: scylla.scylladb.com/v1alpha1
kind: ScyllaOperatorConfig
metadata:
name: cluster
spec:
scyllaUtilsImage: "docker.io/scylladb/scylla:2025.1"
EOF
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 EKS 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 i4i.2xlarge (8 vCPU, 64 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 instance 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: ${AWS_REGION}
racks:
- name: ${EKS_AZ_1}
members: 1
storage:
capacity: 1500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 6
memory: 50Gi
limits:
cpu: 6
memory: 50Gi
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:
- ${EKS_AZ_1}
tolerations:
- key: scylla-operator.scylladb.com/dedicated
operator: Equal
value: scyllaclusters
effect: NoSchedule
- name: ${EKS_AZ_2}
members: 1
storage:
capacity: 1500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 6
memory: 50Gi
limits:
cpu: 6
memory: 50Gi
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:
- ${EKS_AZ_2}
tolerations:
- key: scylla-operator.scylladb.com/dedicated
operator: Equal
value: scyllaclusters
effect: NoSchedule
- name: ${EKS_AZ_3}
members: 1
storage:
capacity: 1500Gi
storageClassName: scylladb-local-xfs
resources:
requests:
cpu: 6
memory: 50Gi
limits:
cpu: 6
memory: 50Gi
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:
- ${EKS_AZ_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 EKS infrastructure, follow the Clean up section of the EKS 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.