Skip to main content
Version: v1.0.0

On k3d (Locally)

Install the Agent Manager on a local Kubernetes cluster using k3d — a lightweight tool that runs Kubernetes inside Docker.

Just want it running?

Use the Run One Command tab under Install: one script creates the cluster and installs everything. Use the Guided Install tab when you want to understand the full setup or need to customize it. The Quick Start Guide runs the same installer inside a dev container, if you'd rather not install k3d, kubectl and Helm on your machine.

WSO2 subscription

With a WSO2 subscription or evaluation, you install the WSO2-supported build from registry.wso2.com. Select the WSO2 Subscription tab wherever this guide shows one, and see Install with a WSO2 Subscription for your credentials and registry project.

Stronger agent isolation tiers

Agents run sandboxed under the standard runc runtime by default. Agent Manager also supports stronger per-environment isolation tiers — gVisor (userspace kernel) and Kata Containers (per-agent VM) — but they have hardware/OS requirements and need a dedicated node. For more information, see the gVisor and Kata Containers setup guides.

What You Will Get​

Agent Manager is a two-layer system installed in two phases:

  • Phase 1 — OpenChoreo (base layer): OpenChoreo is an open-source platform that provides the Kubernetes infrastructure Agent Manager runs on. It consists of four planes: a Control Plane for API and configuration, a Data Plane for running workloads and gateways, a Workflow Plane for builds and CI pipelines, and an Observability Plane for traces, logs, and metrics via OpenSearch.

  • Phase 2 — Agent Manager : The AI agent management platform installed on top of OpenChoreo. It includes Thunder (identity provider — installed with OpenChoreo since it provides JWT validation for all planes), the Console (web UI), AMP API (backend), AI Gateway, PostgreSQL (database), Secrets Extension (OpenBao for runtime secret injection), Agent Manager Observer (traces, logs, and metrics), and Evaluation Engine (automated agent evaluations).

This guide installs both layers on a single-node k3d cluster on your local machine.

info

This setup is for development and exploration. For production deployments, see the Production Considerations section.

Prerequisites​

Hardware​

ResourceMinimum
RAM8 GB
CPU4 cores
Disk~10 GB free

Required Tools​

ToolVersionPurpose
Dockerv26.0+Container runtime
kubectlv1.32+Kubernetes CLI
Helmv3.12+Kubernetes package manager
k3dv5.8+Local Kubernetes clusters

Verify all tools:

docker --version && kubectl version --client && helm version && k3d version
macOS with Colima

If you use Colima instead of Docker Desktop, start a dedicated agent-manager profile so the install does not interfere with your default Colima instance:

colima start --profile agent-manager \
--vm-type=vz --vz-rosetta --network-address \
--cpu 4 --memory 8

--network-address assigns the VM a stable IP so the cluster keeps working after network changes.

Choose --cpu and --memory now rather than adjusting them later. Changing either requires restarting the VM, which can leave an already-created k3d cluster unable to start. Troubleshooting covers the recovery if you hit this.

On Apple silicon, install Rosetta 2 first (softwareupdate --install-rosetta). Without it, Colima runs amd64 images, including the images built for platform-hosted agents, under QEMU emulation, and a Python agent can take longer to start than its startup probe allows.

For the guided install, prefix the cluster creation command in Step 1 with K3D_FIX_DNS=0. The one-command installer sets it for you.

Required Ports​

The following host ports must be free before installation. The Agent Manager services do not need host ports of their own: the Console and API are served through the Control Plane gateway (8080), the Agent Manager Observer through the Observability Plane gateway (11080), and trace ingestion through the Data Plane gateway (19080).

PortPurpose
6550Kubernetes API
8080Control Plane Gateway (HTTP) — Console, API, Thunder, OpenChoreo API, external AI gateway control plane
8443Control Plane Gateway (HTTPS)
19080Data Plane Gateway (HTTP) — deployed agents, OTLP /otel ingest
19443Data Plane Gateway (HTTPS)
10082Container Registry (Workflow Plane)
11080Observability Plane Gateway (HTTP) — Agent Manager Observer, Observer API
11082OpenSearch API
11085OpenSearch HTTPS

Install​

Pick how you want to install it:

One script creates the cluster and installs every plane, plus Agent Manager:

curl -fsSL https://github.com/wso2/agent-manager/releases/download/amp/v1.0.0/k3d-install.sh | bash

The script:

  1. Checks that Docker is running and that k3d, kubectl, Helm, curl and lsof are installed.
  2. Downloads the 1.0.0 release bundle into ~/.wso2-agent-manager/1.0.0/.
  3. Creates the amp-local k3d cluster and installs the four OpenChoreo planes and Agent Manager. These are the same steps as the Guided Install tab.
  4. Prints the console URL and the admin login when it finishes.

The install takes about 15-20 minutes, and it is safe to rerun if it stops part way. On Colima, the script sets K3D_FIX_DNS=0 for you.

When it completes, continue with Verify and Access the Platform.


Verify and Access the Platform​

Run a full status check to confirm everything is running:

# All pods across key namespaces
kubectl get pods -n openchoreo-control-plane
kubectl get pods -n openchoreo-data-plane
kubectl get pods -n openchoreo-workflow-plane
kubectl get pods -n openchoreo-observability-plane
kubectl get pods -n wso2-amp
kubectl get pods -n amp-thunder
# Helm releases
helm list -A | grep -E 'openchoreo|amp|gateway'
ServiceURL
Agent Manager Consolehttp://console.amp.localhost:8080
Agent Manager APIhttp://api.amp.localhost:8080
Agent Manager Observerhttp://traces.amp.localhost:11080
OTLP trace ingest (HTTP)http://default-default.gateway.localhost:19080/otel

Console login: the username is admin; the password was generated at install time. Retrieve it with:

kubectl get secret amp-admin-credentials -n amp-thunder -o jsonpath='{.data.password}' | base64 -d
HTTPS ingest is disabled by default on this setup, and enabling it doesn't cover the documented hosts

values-dp.yaml, installed in Step 8 of the guided install (the one-command installer applies the same file), sets gateway.tls.enabled: false even though it already configures httpsPort: 19443 and a certificateRefs entry pointing at the gateway-tls Secret (created earlier by cert-manager). With TLS disabled, the Data Plane's gateway-default Gateway/Service only get an http listener — there is no 19443 listener to connect to, so an HTTPS OTLP endpoint is not reachable on a default install.

Turning gateway.tls.enabled on would not make the OTLP host above reachable over HTTPS anyway: gateway-tls's certificate only covers *.agentmanager.localhost and *.am-gateway.localhost (its configured hostname and SANs), not *.gateway.localhost — the domain default-default.gateway.localhost above actually uses. Reaching HTTPS on that specific host would additionally require reissuing the certificate with *.gateway.localhost in its dnsNames and pointing gateway.tls.hostname at it.

Given that, this setup keeps TLS disabled and uses the HTTP endpoint above for trace ingestion.


Cleanup​

Delete the entire k3d cluster and all resources:

k3d cluster delete amp-local

If you used the one-command installer and want to remove Agent Manager and OpenChoreo but keep the cluster, run the uninstall script it left behind instead:

bash ~/.wso2-agent-manager/1.0.0/deployments/quick-start/uninstall.sh

Production Considerations​

This installation is designed for development and exploration. For production:

  1. Identity provider — Replace Thunder dev mode with a proper IdP (Asgardeo, Auth0, Okta)
  2. JWT authentication — Set IS_LOCAL_DEV_ENV=false and configure KEY_MANAGER_JWKS_URL for agent-manager-service and agent-manager-observer before exposing either service; when unset, JWT signature verification is skipped and only the token payload is decoded
  3. TLS — Replace self-signed certificates with CA-signed certificates
  4. Secrets backend — Disable OpenBao dev mode; configure persistent storage and proper auth
  5. Observability storage — Configure persistent volumes for OpenSearch
  6. Resource sizing — Adjust requests/limits based on workload
  7. High availability — Deploy multiple replicas of critical components
  8. Security hardening — Apply network policies, RBAC, pod security standards

Troubleshooting​

Pods stuck in Pending

Usually a resource constraint. Check node capacity:

kubectl describe pod <pod-name> -n <namespace>
kubectl top nodes

Increase Colima/Docker Desktop resources if needed.

On Colima, resizing is not a free action

Changing --cpu or --memory requires stopping and restarting the VM, which rebuilds Docker's networks underneath the cluster. An already-created k3d cluster may not come back. Read the next entry before you resize.

k3d server container crash-loops after restarting or resizing Colima

This does not present as a Kubernetes error. kubectl stops responding altogether, because the API server never starts:

kubectl cluster-info --context k3d-amp-local
# Hangs, or reports the connection was refused

docker ps -a --filter name=k3d-amp-local
# k3d-amp-local-server-0 shows STATUS "Restarting", or repeated "Exited"

docker logs k3d-amp-local-server-0

The server node's log ends with:

level=fatal msg="Failed to start networking: unable to initialize network policy controller: error getting node subnet: failed to find interface with specified node ip"

Stopping and starting the Colima VM recreates the k3d-amp-local bridge network, and the containers rejoin it in a different order than before. The load balancer can take the address the server node previously held. k3s still has the old address in its persisted node record, so its network policy controller finds no interface matching it and the process exits. Restarting again does not help, because the mismatch is stored in the node's own state rather than recalculated at boot.

Recreate the cluster. Nothing in this install is persistent across a cluster delete, so recovery is the same work as a fresh install:

k3d cluster delete amp-local
docker network rm k3d-amp-local 2>/dev/null || true

colima stop --profile agent-manager
colima start --profile agent-manager \
--vm-type=vz --vz-rosetta --network-address \
--cpu <cpus> --memory <gb>

Then rerun the one-command installer, or the guided install from Step 1: Create k3d Cluster onward.

Gateway not becoming Programmed
kubectl logs -n openchoreo-data-plane -l app.kubernetes.io/name=gateway-operator
kubectl describe apigateway api-platform-default-default -n openchoreo-data-plane
Plane registration issues
kubectl get clusterdataplane default -n default -o yaml
kubectl logs -n openchoreo-control-plane -l app.kubernetes.io/name=openchoreo-control-plane
OpenSearch connectivity issues
kubectl get pods -n openchoreo-observability-plane -l app=opensearch
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- \
curl -v http://opensearch.openchoreo-observability-plane.svc.cluster.local:9200
Port already in use

Find the process occupying the port and stop it:

lsof -i :<port>

Reference: Configuration Files​

All Agent Manager-specific configuration files used in this guide:

FilePurpose
k3d-config.yamlk3d cluster with all required port mappings
coredns-amp-custom.yamlCoreDNS rewrites for *.openchoreo.localhost, *.amp.localhost, *.agentmanager.localhost, *.am-gateway.localhost, *.gateway.localhost
add-environment-thunder.shProvisions the per-environment Thunder identity provider
values-cp.yamlControl Plane — Backstage disabled, AMP Thunder OIDC
values-dp.yamlData Plane — gateway ports, Fluent Bit config
values-op.yamlObservability Plane — standalone OpenSearch, AMP Thunder OIDC
values-openbao.yamlOpenBao — dev mode, Kubernetes auth, pre-seeded secrets
oc-collector-configmap.yamlCustom OTel Collector ConfigMap for trace ingestion
wso2-amp-api-platform-gateway-extensionAPI Platform Gateway Helm chart (includes gateway config, bootstrap, CR)
otel-collector-rest-api.yamlOTel Collector REST API resource