Run Tachyon on Kubernetes
A StatefulSet, Service, and PVC for running Tachyon on Kubernetes — Tachyon has no clustering, so this runs exactly one pod.
Tachyon has no first-party Helm chart or manifest — see Deployment → Orchestration for why, and the Roadmap for what's planned. What follows is a manifest you can adapt, applying Tachyon's own image and flags to plain Kubernetes primitives.
Tachyon has no clustering or replication — see the Roadmap. Running more than one replica does not give you a distributed Tachyon; each pod would be an independent, separately- indexed instance. This manifest deliberately runs exactly one.
Why a StatefulSet, not a Deployment
A Deployment assumes replicas are interchangeable and disposable. Tachyon
is a single stateful instance with its own persistent volume — a
StatefulSet with replicas: 1 gives it a stable identity and a
volumeClaimTemplate that survives pod restarts, which is what a single
persistent search index actually needs.
Secret for API keys
kubectl create secret generic tachyon-keys \
--from-literal=admin-key=change-me-before-anything-shared \
--from-literal=search-key=a-different-read-only-keyManifest
# tachyon.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: tachyon
spec:
serviceName: tachyon
replicas: 1
selector:
matchLabels:
app: tachyon
template:
metadata:
labels:
app: tachyon
spec:
containers:
- name: tachyon
image: adikeshri/tachyon:latest
ports:
- containerPort: 8108
name: http
env:
- name: TACHYON_ADMIN_KEY
valueFrom:
secretKeyRef:
name: tachyon-keys
key: admin-key
- name: TACHYON_SEARCH_KEY
valueFrom:
secretKeyRef:
name: tachyon-keys
key: search-key
- name: TACHYON_DATA_DIR
value: /data
volumeMounts:
- name: data
mountPath: /data
readinessProbe:
httpGet:
path: /health
port: 8108
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8108
initialDelaySeconds: 15
periodSeconds: 20
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
name: tachyon
spec:
selector:
app: tachyon
ports:
- port: 8108
targetPort: 8108/health is documented as always public regardless of auth configuration —
see Configuration → Authentication —
which is exactly what makes it usable for both probes without also handing
the kubelet an API key.
Sizing the volume
storage: 20Gi above is a placeholder, not a recommendation. Segment disk
usage scales with corpus size — see Persistence and
the disk-size figures in the preliminary benchmark for a
starting point, then size for headroom: segment merges briefly need space
for both the old and new segment simultaneously.
Applying it
kubectl apply -f tachyon.yaml
kubectl get pods -wFrom inside the cluster, other workloads reach Tachyon at
http://tachyon:8108 (or tachyon.<namespace>.svc.cluster.local from a
different namespace). Nothing above exposes it outside the cluster — add an
Ingress only for routes you actually intend to expose, and only ever with
TACHYON_SEARCH_KEY, never the admin key, reachable from outside.