Note: This guide covers deploying Radar as a pod in your cluster. If you’re running Radar locally but need to understand cluster connection behavior (e.g., using KUBECONFIG to override in-cluster detection), see the Configuration Guide.
Quick Start
Exposing with Ingress
Basic (No Authentication)
With Basic Authentication
-
Create the auth secret:
-
Configure ingress:
-
Deploy:
With TLS (HTTPS)
Requires cert-manager installed in your cluster.DNS Setup
-
Get your ingress IP:
- Create a DNS A record pointing your domain to the ingress IP.
radar.prod-us-east1.example.com
RBAC
Radar uses its ServiceAccount to access the Kubernetes API. The Helm chart creates a ClusterRole with read-only access to common resources by default:- Pods, Services, ConfigMaps, Events, Namespaces, Nodes, ServiceAccounts, Endpoints
- Deployments, DaemonSets, StatefulSets, ReplicaSets
- Ingresses, NetworkPolicies, Jobs, CronJobs, HPAs, PVCs
- Pod logs (enabled by default)
Opt-in Permissions
Some features require additional permissions. Most are disabled by default for security:| Feature | Value | Default | Description |
|---|---|---|---|
| Secrets | rbac.secrets: true | false | Show secrets in resource list |
| Terminal | rbac.podExec: true | false | Shell access to pods |
| Port Forward | rbac.portForward: true | false | Port forwarding to pods/services |
| Logs | rbac.podLogs: true | true | View pod logs |
| Helm Write | rbac.helm: true | false | Install/upgrade/rollback/uninstall Helm releases (grants broad write access; auto-enables secrets). When auth or cloud is on, also emits a split helm add-on: radar-helm (CRDs/storage/PDBs/namespaces, bound to owner+member) and radar-helm-admin (RBAC/webhooks/APIServices, owner-only) - see authentication.md |
| RBAC view | rbac.viewRBAC: true | false | Show ClusterRoles, ClusterRoleBindings, Roles, RoleBindings in the resource browser. Off by default: cache-served reads bypass per-user RBAC, so granting this exposes the cluster’s authorization graph to every authenticated Radar user |
| Traffic TLS | rbac.traffic: true | true | Read Hubble relay TLS certs for Cilium traffic observation |
Node management (cordon, uncordon, drain) is available via the MCP server and API. These operations requireEnable features as needed:patchon nodes,liston pods, andcreateonpods/eviction, which are not included in the default ClusterRole. Add them viarbac.additionalRulesor use per-user authentication so each user’s own RBAC governs node operations.
busybox:latest by default. In air-gapped or private-registry clusters where that image can’t be pulled, point it at a reachable mirror:
default namespace’s ServiceAccount / node registry config - so the image must be pullable without Radar supplying credentials.
CRD Permissions
Radar reads CRDs from many popular tools. Each CRD group can be toggled individually:Graceful RBAC Degradation
You see what you have access to - Radar doesn’t require cluster-admin. Whatever your ServiceAccount (or the impersonated user, when auth is enabled) can list, Radar shows. Resource types you can’t list show an “Access Restricted” message; namespaces you can’t access don’t appear. A namespace-scoped ServiceAccount (RoleBinding without a ClusterRole) is fully supported - Radar detects this at startup and works within the permitted namespace. RBAC granularity (auth enabled):- Namespaced resources (Pods, Deployments, Services, …) are filtered by namespace: read access is granted in any namespace where the user has list-pods or list-deployments. Per-resource gating within a namespace is currently coarse - if a user has any namespace-level read access, they can see all namespaced resources Radar’s pod ServiceAccount caches in that namespace. Where you need finer control (e.g. denying Secrets in a shared namespace), enforce it via the pod ServiceAccount’s RBAC instead.
- Cluster-scoped resources (Nodes, PVs, StorageClasses, ClusterRoles, cluster-scoped CRDs, …) are gated per-kind via SubjectAccessReview. Cluster-wide pod visibility does NOT imply Node visibility - every cluster-scoped read goes through its own RBAC check, with results cached per user.
rbac.create: false in the Helm values and apply the custom Role/RoleBinding above. Radar will detect the namespace-scoped permissions and work within my-team only.
Authentication
For shared team access, enable authentication so each user gets per-user permissions via Kubernetes RBAC. See the Authentication & Authorization Guide for full setup instructions. Quick start with proxy auth:Security Considerations
When deploying Radar in-cluster:- Authentication: Always enable authentication when exposing via ingress. Use built-in auth (proxy or OIDC mode) or basic auth (shown above) at minimum.
-
RBAC scope: The default ClusterRole grants cluster-wide read access. For namespace-restricted access, set
rbac.create: falseand create a custom Role/RoleBinding. Radar will gracefully adapt to the available permissions. -
Privileged features: Terminal (
podExec) and port forwarding grant significant access. Only enable these in trusted environments or when using per-user authentication. - Network access: Consider using NetworkPolicies to restrict which pods can reach Radar.
Timeline Storage: memory vs sqlite
Radar’s timeline records every cluster change. Two backends:memory(default): events live in-process, lost on pod restart. Lowest footprint; pick this if you only need recent activity (last few hours).sqlite: events persist to a PVC across restarts. Multi-day audit trail; pick this for long-running in-cluster deployments where you care about history surviving pod cycles.
timeline.retention (Go duration; 0 disables cleanup - not recommended) and persistence.size together.
Cleanup runs hourly + once at startup. Confirm it’s keeping up via /api/diagnostics - the timeline.lastCleanupAt, timeline.lastCleanupDeletedRows, timeline.lastCleanupError, and timeline.storageBytes fields surface the state without requiring kubectl logs.
Configuration Reference
See Helm Chart README for all available values.| Parameter | Description | Default |
|---|---|---|
image.repository | Container image | ghcr.io/skyhook-io/radar |
image.tag | Image tag | Chart appVersion |
ingress.enabled | Enable ingress | false |
ingress.className | Ingress class | "" |
service.port | Service port | 9280 |
mcp.enabled | Enable MCP server for AI tools | true |
debug.image | Image for ephemeral debug containers and node debug pods (point at a mirror for air-gapped / private-registry clusters) | "" (busybox:latest) |
timeline.storage | Event storage (memory/sqlite) | memory |
timeline.dbPath | SQLite database path | /data/timeline.db |
timeline.historyLimit | Max events to retain (memory only) | 10000 |
timeline.retention | SQLite retention (Go duration; 0 disables) | 168h |
traffic.prometheusUrl | Manual Prometheus/VictoriaMetrics URL | "" (auto-discover) |
persistence.enabled | Enable PVC for SQLite storage | false |
persistence.size | PVC size | 1Gi |
rbac.podLogs | Enable log viewer | true |
rbac.podExec | Enable terminal feature | false |
rbac.portForward | Enable port forwarding | false |
rbac.secrets | Show secrets in resource list | false |
rbac.helm | Enable Helm write operations | false |
rbac.viewRBAC | Show RBAC objects in resource browser | false |
rbac.traffic | Read Hubble TLS certs | true |
rbac.crdGroups.all | Wildcard CRD read access | false |