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 kubectl access to the target cluster (kubectl auth can-i create namespaceyes).
  • [ ] You have helm 3.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 the helm install command line
helm get values leaks 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

  • readOnlyget/list/watch on 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 a ClusterRole, so the blast radius is one namespace.
  • clusterAdmin — binds the agent's ServiceAccount to the
    built-in cluster-admin ClusterRole. 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.