Deploy to Kubernetes
Production deployment of Baker Street using Helm and Kustomize.
Deploy to Kubernetes
This guide covers deploying Baker Street to a production Kubernetes cluster. Baker Street uses Kustomize for manifest management and ships with sensible defaults that you can override.
Namespace Setup
Create a dedicated namespace with appropriate labels:
kubectl create namespace baker-street
kubectl label namespace baker-street app.kubernetes.io/part-of=baker-street
Configure Secrets
Baker Street uses three separate Kubernetes secrets, each scoped to the services that need them. This ensures the Gateway never sees API keys and Workers never see messaging tokens.
# k8s/secrets/brain-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: brain-secrets
namespace: baker-street
type: Opaque
stringData:
ANTHROPIC_API_KEY: "sk-ant-..."
VOYAGEAI_API_KEY: "pa-..."
JWT_SECRET: "your-jwt-secret"
# k8s/secrets/gateway-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: gateway-secrets
namespace: baker-street
type: Opaque
stringData:
TELEGRAM_BOT_TOKEN: "123456:ABC..."
DISCORD_BOT_TOKEN: "MTk..."
# k8s/secrets/worker-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: worker-secrets
namespace: baker-street
type: Opaque
stringData:
ANTHROPIC_API_KEY: "sk-ant-..."
Apply the secrets:
kubectl apply -f k8s/secrets/
Deploy with Kustomize
Baker Street organizes manifests with Kustomize overlays for different environments:
# Development (single worker, minimal resources)
kubectl apply -k k8s/overlays/dev
# Production (multiple workers, resource limits, network policies)
kubectl apply -k k8s/overlays/prod
The base configuration includes deployments for the Brain, Worker, Gateway, UI, NATS, and Qdrant. The production overlay adds:
- Resource requests and limits for all pods
- Network policies enforcing default-deny ingress
- Pod disruption budgets for high availability
- Multiple worker replicas for parallel job processing
- Anti-affinity rules to spread pods across nodes
Customize with Values
Key configuration lives in ConfigMaps. Override values for your environment:
# k8s/config/brain-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: brain-config
namespace: baker-street
data:
DEFAULT_MODEL: "claude-sonnet-4-20250514"
MAX_TOOL_ITERATIONS: "10"
NATS_URL: "nats://nats:4222"
QDRANT_URL: "http://qdrant:6333"
MEMORY_SIMILARITY_THRESHOLD: "0.92"
Personality Files
The agent's behavior is shaped by Markdown personality files mounted as ConfigMaps:
kubectl create configmap personality \
--from-file=SOUL.md=operating_system/SOUL.md \
--from-file=BRAIN.md=operating_system/BRAIN.md \
--from-file=WORKER.md=operating_system/WORKER.md \
-n baker-street
Edit these files to change the agent's identity, response style, and decision-making guidelines.
Verify Deployment
kubectl get pods -n baker-street
kubectl logs -n baker-street deployment/baker-brain --tail=50
All pods should reach Running status. The Brain logs will show successful connections to NATS and Qdrant.
Zero-Downtime Upgrades
Baker Street supports blue-green deployments with a NATS-based handoff protocol. The old Brain drains active requests, writes a handoff note (active conversations, enabled schedules), and the new Brain picks up seamlessly. See the upgrade script at scripts/upgrade.sh.