Install Veirox Connect on Kubernetes
This is the router page. Pick the guide that matches your cluster:
| Your cluster | Guide | What's covered |
|---|---|---|
| Google Kubernetes Engine (GKE) — Standard or Autopilot | INSTALL-helm-gke.md | Workload Identity, Cloud NAT, Gatekeeper/Config Connector, Autopilot PSA compatibility |
| Amazon EKS | INSTALL-helm-eks.md | IRSA, VPC CNI, Security Groups for Pods, private API endpoint |
| Azure AKS | INSTALL-helm-aks.md | Workload Identity, ACR, Azure Policy exemptions |
| Self-managed k8s (kubeadm, RKE2, k3s, OpenShift) | INSTALL-helm-onprem.md | Private registry mirror, MITM CA, Pod Security Admission, NetworkPolicy CIDR pinning, airgap |
| Any — just want the minimum | Quickstart below | Generic flow, no cloud specifics |
Before you install:
- [ ] You have an Veirox project and can mint an enrollment token at
<veirox>/console/settings/connectors. - [ ] You have
kubectlaccess to the target cluster (kubectl auth can-i create namespace→yes). - [ ] You have
helm3.9+. - [ ] Egress to your Veirox backend on 443/TCP is reachable from the cluster pod network.
After you install — verify the signature of the image + chart before trusting them:
→ docs/connect/cosign-verify.md
Quickstart
This is the minimum viable install. For anything production-grade, use
the cloud-specific guide above.
1. Create a namespace and the enrollment-token Secret
kubectl create namespace veirox kubectl -n veirox create secret generic veirox-connector-token \ --from-literal=token=veirox_enr_REPLACE_ME
Never pass
--set token=...on thehelm installcommand line
—helm get valuesleaks it. Use a Secret.
2. Install the chart
helm install veirox-connector \ oci://ghcr.io/msrashed2018/charts/veirox-connector \ --namespace veirox \ --set backendUrl=https://www.veirox.com \ --set rbacPreset=readOnly
3. Verify the pod is up
kubectl -n veirox get pods -l app.kubernetes.io/name=veirox-connector kubectl -n veirox logs -f deploy/veirox-connector --tail=30
Expect:
INFO agent_connecting url=wss://veirox.com/api/connectors/ws INFO connector_authenticated INFO tunnel_broker_registered connector_id=...
4. Confirm the connector appeared in Veirox
Open <veirox>/console/settings/connectors. A new row with online=true
and type=k8s_pod should appear within ~30 seconds.
5. Walk the verification checklist
→ docs/connect/verification-checklist.md
This step is important — it confirms the Claude agent can actually
execute commands through the connector, not just that the pod is
running.
Configuration reference
All values below are --set key=value flags or entries in a
values.yaml override file (-f my-values.yaml).
| Value | Default | What it does |
|---|---|---|
image.tag |
0.2.0-k8s |
Image tier — -minimal (shell only), -k8s (kubectl+helm), -cloud (aws+gcloud+az). |
backendUrl |
https://www.veirox.com |
Full Veirox backend URL. Must be https:// in release builds. |
runtimeMode |
k8s_pod |
Self-reported runtime mode. |
rbacPreset |
readOnly |
readOnly / nsAdmin / clusterAdmin. See below. |
enrollment.tokenSecretName |
veirox-connector-token |
Name of the Secret holding the enrollment token. |
enrollment.tokenSecretKey |
token |
Key inside the Secret. |
extraCaBundle.enabled |
false |
Set true to mount a corporate CA bundle (MITM-TLS proxy case). |
extraCaBundle.secretName |
veirox-corp-ca |
Secret holding the PEM bundle. |
networkPolicy.enabled |
true |
Pin egress to 443 + DNS. |
networkPolicy.allowedEgressCidrs |
[0.0.0.0/0] |
CIDR allowlist for 443 egress. Pin to your Veirox backend CIDR in hardened environments. |
resources.limits.memory |
512Mi |
Pod memory cap. |
resources.requests.memory |
128Mi |
Pod memory request. |
RBAC presets
readOnly—get/list/watchon core + apps + batch +
networking. Backed by a ClusterRole (cluster-wide read, including
Secrets metadata via configmaps/events). The agent can
kubectl get pods -A, describe, stream logs, but cannot mutate
anything. Safe default.nsAdmin— full verbs on core + apps + batch + networking +
autoscaling + policy, limited to the release namespace. Uses a
Role, not aClusterRole, so the blast radius is one namespace.clusterAdmin— binds the agent's ServiceAccount to the
built-incluster-adminClusterRole. Only pick this when you
explicitly want Veirox to be able to mutate any resource anywhere.
The per-connector approval policy in the Veirox UI is your last
line of defence — review it before granting this.
Upgrade
helm upgrade veirox-connector \ oci://ghcr.io/msrashed2018/charts/veirox-connector \ --namespace veirox \ --set image.tag=<new-version>-k8s
The chart uses strategy: Recreate because the agent is a stateful
WS client — running two instances would collide. Expect ~10 s of
downtime during the upgrade. Running commands are re-queued to the
new pod when it reconnects.
→ Full upgrade guide: docs/connect/upgrade.md
Uninstall
helm uninstall veirox-connector --namespace veirox kubectl delete namespace veirox
Then delete the connector record in Veirox UI →
<veirox>/console/settings/connectors → (select) → Delete.
Troubleshooting
| Symptom | Fix |
|---|---|
.Values.token is not supported |
You set --set token=.... Use a Secret instead (see Quickstart step 1). |
Pod stuck CrashLoopBackOff, log says enrollment failed: HTTP 401 |
Token expired or was burned. Mint a new token, kubectl delete secret veirox-connector-token, recreate it, kubectl rollout restart deploy/veirox-connector. |
Pod stuck CrashLoopBackOff, log says enrollment failed: HTTP 409 |
Another pod enrolled with this token already (tokens are one-time). Mint a new one. |
refusing to run as root |
Your cluster's PSP/PSA is forcing root, or a mutating webhook is rewriting the securityContext. The image already runs as UID 65532; investigate the webhook. |
tls handshake failed in egress |
Set extraCaBundle.enabled=true and supply your corporate CA Secret. See INSTALL-helm-onprem.md. |
UI shows the connector offline after rollout |
The Recreate strategy briefly runs zero pods. Wait ~30 seconds for the next heartbeat. |
ImagePullBackOff |
Check image.repository / image.tag. Pull anonymously: docker pull docker.io/msrashed/veirox-connector:0.2.0-k8s. If your cluster has no egress, use the airgap guide: INSTALL-helm-onprem.md § no Internet. |
AdmissionReview ... violates PodSecurity "restricted" (Autopilot / PSA-enforced cluster) |
The chart already satisfies restricted, but a custom webhook may be altering the spec. Dry-run: kubectl apply --dry-run=server -f <(helm template ...). See INSTALL-helm-gke.md § Autopilot. |