Client Deployment Guide¶
This guide walks through deploying the Kysira platform into a client's own Kubernetes cluster.
This guide covers the
kysira-platformumbrella chart (proxy + dashboard + inference). That chart, its example values files, and its Helm source are maintained in the kysira-demo repo — clone it for thedeploy/files referenced below. If you only needkysira-ext-procorkysira-inference, see the Kubernetes deployment guide instead.
Step 0 — Get your pull credentials¶
Log in to app.kysira.ai and navigate to Image Access → Add access → Kubernetes / Docker. Give it a name (e.g. production), and copy the JSON key — it is shown only once. You will use it to create a Kubernetes imagePullSecret in Step 1.
Prerequisites¶
| Requirement | Notes |
|---|---|
| Kubernetes cluster | k3s, EKS, GKE, AKS, or any CNCF-conformant cluster |
kubectl access | kubectl get nodes should return Ready |
helm ≥ 3.12 | helm version |
| cert-manager | Installed with a working ClusterIssuer |
| Ingress controller | Traefik (k3s default) or nginx |
| DNS control | Ability to add A records for two subdomains |
| GAR pull credentials | Provided by Kysira (see Step 0) |
| License credentials | A license key + agent certificate from the console — see Licensing |
cert-manager¶
If cert-manager is not already installed:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.2/cert-manager.yaml
kubectl rollout status deployment/cert-manager-webhook -n cert-manager --timeout=120s
Create a letsencrypt-prod ClusterIssuer:
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik # or nginx
EOF
Step 1 — Image pull secret¶
Kysira images are hosted on Google Artifact Registry (us-central1-docker.pkg.dev). You need a pull secret in the namespace where Kysira will run.
kubectl create namespace kysira
kubectl create secret docker-registry kysira-pull \
--docker-server=us-central1-docker.pkg.dev \
--docker-username=_json_key \
--docker-password='<paste your JSON key from Step 0>' \
--namespace kysira
Step 2 — Configure values¶
Clone kysira-demo, which owns the deploy/ values files for this chart, then copy the example values file and fill in your settings:
git clone https://github.com/kysira/kysira-demo
cp kysira-demo/deploy/values-example.yaml my-values.yaml
Minimum required changes:
kysira-proxy:
config:
targetURL: "http://your-app:3000" # in-cluster URL of the app to protect
ingress:
hosts:
- host: your-app.example.com # domain end-users hit
tls:
- secretName: kysira-proxy-tls
hosts: [your-app.example.com]
kysira-dashboard:
ingress:
hosts:
- host: dashboard.example.com # domain for the monitoring dashboard
tls:
- secretName: kysira-dashboard-tls
hosts: [dashboard.example.com]
If you use a different ingress class or ClusterIssuer name, update ingress.className and the cert-manager.io/cluster-issuer annotation in each section.
If you're running a licensed model, add your license credentials (see Licensing for how to create and package them):
kysira-inference:
licensing:
enabled: true
secretName: kysira-license
enforcement: permissive # switch to "enforce" once you're comfortable
Resource sizing: layer a resource preset on top of your values file:
# small = CX11 (2 vCPU, 4 GB RAM)
# medium = CX22 (4 vCPU, 8 GB RAM)
# large = CX33+ (4 vCPU, 8 GB RAM, autoscaling enabled)
--values kysira-demo/deploy/values-resources-medium.yaml
Step 3 — Deploy¶
helm upgrade --install kysira oci://us-central1-docker.pkg.dev/cs-poc-uv5os9gxrjsncireus36uzd/kysira-agent-releases/charts/kysira-platform \
--namespace kysira --create-namespace \
--values my-values.yaml \
--wait --timeout 20m
The first deploy takes longer (~5 min) as the inference container loads ML models.
Step 4 — DNS¶
Point two A records at your cluster's ingress IP:
Find the ingress IP:
kubectl get svc -n kube-system | grep traefik # k3s / Traefik
kubectl get svc -n ingress-nginx # nginx ingress
cert-manager will issue TLS certificates automatically once DNS propagates (usually within a few minutes).
Step 5 — Smoke test¶
# Proxy health
curl https://your-app.example.com/_kysira/health
# Dashboard API
curl https://dashboard.example.com/api/events
# Fire a test SQL injection (shadow mode — passes through, appears in dashboard)
curl "https://your-app.example.com/search?q=1'+OR+'1'='1"
Open https://dashboard.example.com — the test request should appear in the live feed with a high SQLi score.
Configuration reference¶
Proxy modes¶
| Mode | Behaviour |
|---|---|
shadow | All traffic passes. Threats are logged and surfaced in the dashboard. Safe default for initial rollout. |
active | Requests scoring above scoreThreshold are killed with a TCP RST before reaching your app. |
Switch modes from the dashboard UI or via Helm:
helm upgrade kysira oci://us-central1-docker.pkg.dev/cs-poc-uv5os9gxrjsncireus36uzd/kysira-agent-releases/charts/kysira-platform \
--namespace kysira --reuse-values \
--set "kysira-proxy.config.mode=active"
Key proxy settings¶
| Value | Default | Description |
|---|---|---|
kysira-proxy.config.targetURL | — | Required. In-cluster URL of your application |
kysira-proxy.config.mode | shadow | shadow or active |
kysira-proxy.config.scoreThreshold | 0.95 | Kill threshold [0–1] |
kysira-proxy.config.sinks | file,stdout | Event sinks: file, stdout, http |
kysira-proxy.config.httpSinkURL | — | SIEM/webhook endpoint for the http sink |
Upgrading¶
helm upgrade kysira oci://us-central1-docker.pkg.dev/cs-poc-uv5os9gxrjsncireus36uzd/kysira-agent-releases/charts/kysira-platform \
--namespace kysira \
--values my-values.yaml \
--wait --timeout 20m