- EKS 1.26 or later.
- A CNI that enforces NetworkPolicy, with enforcement turned on. The EKS VPC CNI ships with it off. PACER's security model depends on it; see security.md.
- A bucket. The default is an S3 Express One Zone directory bucket in the same AZ (by AZ
ID) as the cache nodes, with a
com.amazonaws.<region>.s3expressGateway VPC endpoint. PrivateLink is not supported for Express. For S3 Standard, setconfig.backendType: standard. Whichever backend, give the bucket anAbortIncompleteMultipartUploadlifecycle rule before writing through PACER: the write scatter (Standard only, on by default — see features.md) creates multipart uploads the client never sees an ID for, so only this rule or a surviving coordinator can clean one up after a crash. write-scatter.md has the rule's form for both backends. - EKS Pod Identity for the chart's ServiceAccount, with permission for the bucket's
operations (
s3express:CreateSessionfor Express). - Cache nodes, ideally in one AZ, with instance-store NVMe (RAID0), and Nitro v4 or later
for EFA. Set
karpenter.enabledto have the chart create a Karpenter NodePool, or label your own nodes to matchnodeSelector(defaultpacer.io/nodepool: cache).
# From a tagged release. The chart defaults to the matching GHCR image.
helm install pacer oci://ghcr.io/aws-samples/sample-pacer/charts/pacer --version 0.1.0 \
--namespace pacer --create-namespace \
--set 'config.bucketMap.cache=<your-bucket>--use1-az4--x-s3' \
--set config.s3Endpoint=https://s3express-use1-az4.us-east-1.amazonaws.com \
--set config.awsRegion=us-east-1
# Or from source, with the same flags.
helm install pacer deploy/helm/pacer --namespace pacer --create-namespace ...
# Give the daemon its IAM role. This needs the EKS Pod Identity Agent add-on.
aws eks create-pod-identity-association --cluster-name <cluster> \
--namespace pacer --service-account pacer \
--role-arn arn:aws:iam::<acct>:role/pacer-daemonRelease images and charts are published to GHCR when a vX.Y.Z tag is pushed. See
Releases. If no release is listed
yet, install from source.
To declare rings as Kubernetes objects instead of one Helm release each, install the
operator and create a CacheRing per ring; the ring's spec.values take the same values
as above. See helm/operator.md.
Then, before sending traffic:
- Lock down access as described in security.md.
- Point your clients at the daemon as described in clients.md.
Every setting is documented in values.yaml, and the chart validates values against a schema, so a misspelled key fails the install. values-example.yaml is a complete example. docs/helm/ explains why each default was chosen.
Before raising config.memCapacity, read memory-model.md. If a
daemon is being OOM-killed, see the OOM runbook.
For hugepages, EFA RDMA, delivery into client memory and write scatter, see features.md.
Port 9090 serves /healthz, /readyz and Prometheus /metrics. A Grafana dashboard is in
deploy/grafana/. Set monitoring.prometheusRule to add memory
alerts; it needs the Prometheus Operator CRDs. See monitoring.md.