Deploy to Cluster
Deploy the operator to a Kubernetes cluster and run your first agent in production mode.
Prerequisites:
- Kubernetes 1.31+,
kubectlconfigured helm3+- An LLM provider: Ollama (local), OpenAI, Anthropic, or any OpenAI-compatible endpoint
Local development cluster (Docker Desktop)
The fastest path for local testing uses Docker Desktop with Kubernetes enabled.
Enable Kubernetes: Settings → Kubernetes → Enable Kubernetes → Apply & Restart
Verify:
kubectl get nodes
# NAME STATUS ROLES AGE
# docker-desktop Ready control-plane 1m
Or use make dev to create a kind cluster and set everything up in one step:
git clone https://github.com/arkonis-dev/ark-operator.git
cd ark-operator
make dev OPENAI_BASE_URL=http://host.docker.internal:11434/v1
1. Deploy Redis
ark-operator uses Redis Streams as the task queue between the operator and agent pods.
kubectl apply -f https://raw.githubusercontent.com/arkonis-dev/ark-operator/main/config/prereqs/redis.yaml
kubectl rollout status statefulset/redis -n ark-system
2. Install the operator
Option A — Helm (recommended)
With Ollama (no API key needed):
helm repo add arkonis https://charts.arkonis.dev
helm repo update
helm install ark-operator arkonis/ark-operator \
--namespace ark-system \
--create-namespace \
--set taskQueueURL=redis.ark-system.svc.cluster.local:6379 \
--set triggerWebhook.url=http://ark-operator.ark-system.svc.cluster.local:8092 \
--set agentExtraEnv[0].name=AGENT_PROVIDER,agentExtraEnv[0].value=openai \
--set agentExtraEnv[1].name=OPENAI_BASE_URL,agentExtraEnv[1].value=http://ollama.ollama.svc.cluster.local:11434/v1 \
--set agentExtraEnv[2].name=OPENAI_API_KEY,agentExtraEnv[2].value=ollama
With OpenAI:
helm install ark-operator arkonis/ark-operator \
--namespace ark-system \
--create-namespace \
--set taskQueueURL=redis.ark-system.svc.cluster.local:6379 \
--set triggerWebhook.url=http://ark-operator.ark-system.svc.cluster.local:8092 \
--set apiKeys.openaiApiKey=sk-...
With an existing secret (recommended for production):
helm install ark-operator arkonis/ark-operator \
--namespace ark-system \
--create-namespace \
--set taskQueueURL=redis.ark-system.svc.cluster.local:6379 \
--set apiKeys.existingSecret=my-ark-secrets
Full list of values: helm show values arkonis/ark-operator or see the Helm Values reference.
Option B — kubectl apply
kubectl apply -f https://github.com/arkonis-dev/ark-operator/releases/latest/download/install.yaml
Installs CRDs, RBAC, and the operator deployment in ark-system.
3. Verify the operator is ready
kubectl rollout status deployment/ark-operator -n ark-system
# deployment "ark-operator" successfully rolled out
4. Deploy your first agent
kubectl apply -f https://raw.githubusercontent.com/arkonis-dev/ark-operator/main/config/samples/arkonis_v1alpha1_arkagent.yaml
Check status:
kubectl get arkagents
# NAME MODEL REPLICAS READY AGE
# research-agent llama3.2 2 2 30s
kubectl get pods -l app.kubernetes.io/instance=research-agent,app.kubernetes.io/name=agent
# NAME READY STATUS RESTARTS AGE
# research-agent-agent-7d9f-xk2p8 1/1 Running 0 30s
# research-agent-agent-7d9f-mn4q1 1/1 Running 0 30s
5. Deploy a team pipeline
Save this as my-team.yaml and apply it:
apiVersion: arkonis.dev/v1alpha1
kind: ArkTeam
metadata:
name: research-team
namespace: ark-system
spec:
output: ""
roles:
- name: research
model: llama3.2
systemPrompt: "You are a research assistant. Answer thoroughly."
- name: summarize
model: llama3.2
systemPrompt: "You are a summarizer. Write 3 concise bullet points."
pipeline:
- role: research
inputs:
prompt: ""
- role: summarize
dependsOn: [research]
inputs:
content: ""
kubectl apply -f my-team.yaml
kubectl get arkteam research-team -n ark-system -w
Trigger a run:
ark trigger research-team -n ark-system --input '{"topic": "transformer architecture"}'
Teardown
helm uninstall ark-operator -n ark-system
kubectl delete namespace ark-system
Next steps
- How It Works — understand the operator reconcile loop
- Building a Pipeline — more complex pipeline patterns
- Triggering Pipelines — webhooks, cron, and
ark trigger - Helm Values reference — full configuration options