Skip this guide if you already have an EKS cluster with sufficient CPU/memory and the ability to create LoadBalancer services. Proceed directly to PrivateLink or Hybrid deployment.
Prerequisites
- AWS CLI v2 configured with appropriate credentials
- kubectl installed
- Helm v3 installed
- An AWS account with permissions to create EKS clusters, VPCs, and IAM roles
1. Create a VPC
Create a VPC with public and private subnets across two availability zones.2. Create Internet Gateway and NAT Gateway
Air-Gapped installs skip this step. A sealed VPC has no internet or NAT gateways; the cluster reaches AWS services through VPC endpoints instead, at minimum
ecr.api, ecr.dkr, and the S3 gateway endpoint (image pulls when your mirror is ECR), ec2 and sts, plus eks-auth if any add-on uses EKS Pod Identity (the EBS CSI setup below does). Add bedrock-runtime when using Bedrock over PrivateLink, and the ssm/ssmmessages/ec2messages trio if operators connect through Session Manager. Keyless Bedrock on any private-subnet cluster (Hybrid included) also needs sts, eks-auth (Pod Identity) and bedrock-runtime endpoints.3. Route Tables
4. IAM Roles
EKS Cluster Role
EKS Cluster Role
Node Role
Node Role
5. Create EKS Cluster
6. Create Node Group
Minimum requirements:- Recommended minimum: 3 ×
m5.xlargenodes (or 2 ×t3.xlargefor evaluation) - xpander xpander pod requests: ~5 vCPU / ~10 GiB memory at single-replica defaults
- Add ~2 vCPU / 2.5 GiB per additional
agent-workerreplica, plus capacity for active agent workspaces - Plan additional headroom for Kubernetes system pods, DaemonSets, upgrades, and burst capacity
- See Sizing & Resource Requirements for per-service numbers and a calculator that sizes the cluster for your user count.
7. Configure kubectl
EKS Add-Ons
Install these EKS add-ons for networking, DNS, storage, and pod identity:vpc-cni, coredns, kube-proxy, aws-ebs-csi-driver, eks-pod-identity-agent, and metrics-server.
EBS CSI IAM Setup (Pod Identity)
The EBS CSI driver needs IAM permissions to provision volumes.Create Default StorageClass
Encrypt every volume. xpander’s PVCs hold customer data (agent workspaces, the data tier, Supabase storage, knowledge-base content), so the StorageClass above enables EBS encryption at rest (
encrypted: "true", using the account’s default aws/ebs KMS key). To use a customer-managed key instead, add kmsKeyId: "<key-arn>" to parameters and grant the EBS CSI driver’s role kms:CreateGrant/kms:Decrypt/kms:GenerateDataKey* on it. Compliance-sensitive deployments should treat an encrypted StorageClass as a hard requirement, not an option.EKS Auto Mode
On an EKS Auto Mode cluster AWS runs the storage, load-balancing and node capabilities for you, and three things in this guide change. A reference customer install runs on Auto Mode with these settings.-
Storage provisioner. Skip the
aws-ebs-csi-driveradd-on and its Pod Identity role. Auto Mode’s block storage capability provisions throughebs.csi.eks.amazonaws.com; the classicebs.csi.aws.comdriver object may exist on the cluster but has no controller behind it, so a StorageClass on it never binds. Use the Auto Mode provisioner in the default StorageClass above and in the chart’s fleet class: -
IngressClass. Auto Mode ships the load balancer controller but no IngressClass, and it ignores the
alb.ingress.kubernetes.io/group.nameannotation: without grouping in the class it creates one ALB per Ingress. Create anIngressClassParamsthat carries the scheme and group, and anIngressClassthat references it; the chart’s Ingresses then setclassNameto that class. Repeat the pair withscheme: internalfor hosts that only the cluster and operators should reach (deployment-manager, an internal IdP entry). -
IAM for pods. Bind AWS permissions (Bedrock, S3 for Supabase Storage) to xpander’s service accounts with EKS Pod Identity associations. Use
aws eks create-pod-identity-association, as in the EBS CSI example above, against thedefaultandagent-controllerservice accounts in the release namespace. Keep theeks-pod-identity-agentadd-on installed.
Four more things an Auto Mode cluster needs before an xpander install, learned on a reference installation:
-
Cluster access for the installer’s identity. A cluster created with
authenticationMode=APIgrants nothing to IAM roles by default. Create an access entry for the role that runskubectland Helm, and associateAmazonEKSClusterAdminPolicywith it, before the first install: -
Node consolidation during the install. Auto Mode’s built-in
general-purposeNodePool consolidates after thirty seconds and reverts any patch you make to it, so a full xpander install can have nodes removed under pods that are still scheduling. Add a higher-weight NodePool of your own for xpander’s namespaces: -
Ingress grouping. Auto Mode ships the load balancer controller but no
IngressClass. Create one, and put the ALB group name in anIngressClassParamsobject: Auto Mode ignores thealb.ingress.kubernetes.io/group.nameannotation and would otherwise create one load balancer per Ingress. Use a second class withscheme: internalfor hosts that must stay private. -
Fresh nodes refuse
kubectl execfor a moment. Until a new node’s kubelet serving certificate is signed,kubectl execandkubectl run -ion it fail withtls: internal error. Retry after a few seconds; a pipeline should wrap such steps in a short retry.
Next Steps
Your EKS cluster is ready. Continue with:- PrivateLink: if your security policy requires traffic to stay within the AWS network
- Hybrid deployment: the installer wizard, plus SSL, ingress, DNS, and verification

