Skip to content
v0.3.3Logs, profiles, eBPF network, agents.Release notes

Release notes. Plain English. Dated. Immutable.

Versions follow semver. Every release says what changed and who will feel it — operators, dashboard users, Helm installers, CLI users. Fixes say what was wrong. Nothing gets edited after it ships.

Subscribe: GitHub releases feed (Atom)

v0.3.3

latest

eBPF profiles on your laptop's cluster

eBPF CPU profiling now works on kind, k3d and Docker Desktop. No API, schema or chart-values changes.

eBPF

  • CPU profiling on kind, k3d and Docker Desktop. There, every Kubernetes node is a container sharing one kernel, so the collector never saw the kernel's top-level PIDs and switched the profiler off. It now maps each container cgroup it can see to its PID namespace, has the kernel record each sample's PID inside the process's own namespace, and maps it back per container. Each node profiles only its own pods: samples from other nodes are dropped before a stack is taken (samples_foreign in the collector's metrics). No BTF needed; Linux 5.7+. Behaviour on regular nodes is unchanged.

Tests

  • The kind e2e requires eBPF CPU profiles (its nodes are containers, so this is the nested path), and a kernel test covers it (make ebpf-test-nested in services/collector).

Upgrade notes

  • Upgrade in place: helm upgrade to chart 0.3.3 with the values you installed with.

v0.3.2

The advisor checks who's asking

A security patch. Upgrade if you run the advisor without network policies (the default): it answered unauthenticated callers. No API, schema or chart-values changes.

Security

  • The advisor authenticates its callers (GHSA-w8qv-6r23-wjjc). It reads the control plane with its own service token but did not check who was asking, so any pod that could reach it could read briefings and investigations over cost, logs and alerts, and with an Anthropic key configured, run up the operator's Claude bill. Every advisor RPC now needs a bearer token the control plane accepts, with the viewer role or above; cluster enrollment tokens are refused. A call without a token passes only when the control plane itself accepts anonymous requests. The dashboard, the CLI and kubehero mcp already send the signed-in user's token.
  • kubehero mcp --http refuses cross-origin browser requests, so a web page can't drive a local MCP server that holds your token (DNS rebinding was already refused).

Tests

  • The end-to-end suite on GitHub's runners now covers every product path: the Loki, OTLP, OpenCost and FOCUS APIs, alert rules firing, the operator's guarded rightsizing from recommend through armed apply to kubehero undo, the advisor, the CLI and its MCP server, and the dashboard. A second job upgrades the latest release in place with live data and checks that nothing is lost. eBPF flows are required.

Upgrade notes

  • Upgrade in place: helm upgrade to chart 0.3.2 with the values you installed with. Anything that calls the advisor directly needs a KubeHero token (the same one it uses for the control plane).

v0.3.1

The dashboard fits your phone

A patch release: the dashboard no longer scrolls sideways on phones. No API, schema or chart-values changes.

Fixes

  • Dashboard on phones. Six pages (allocation, chargeback, ceiling log, logs, profiles, network) were wider than a phone screen and scrolled sideways. Time charts' screen-reader data tables no longer widen the page, segmented pickers scroll within themselves, and on narrow screens the top bar shows the cluster switcher and account menu as icons (both keep their accessible names), with the cluster picker opening as a full-width sheet. Desktop layouts are unchanged.

Upgrade notes

  • Upgrade in place: helm upgrade to chart 0.3.1 with the values you installed with.

v0.3.0

Every signal, every dollar, one agent

v0.3 turns KubeHero from a cost tool into one install for the signals teams usually spread across five: cost allocation, logs, continuous profiling, eBPF network cost and alerting — with rightsizing that actually adjusts and read-only agents that connect it all. It also fixes the bugs that inflated spend on multi-node clusters. Upgrade notes are at the end.

Cost allocation — OpenCost-compatible

  • Allocation by any dimension — cluster, namespace, workload, controller, pod, container, node, nodepool, team, cost center, zone or label:<key> — with idle rows, idle sharing (weighted or even) and shared-namespace redistribution.
  • Per-resource cost: CPU, RAM and GPU split by the cost model (GPU nodes attribute a documented share of the price to accelerators), plus network cost from eBPF flows and log volume per row.
  • OpenCost-compatible /allocation/compute and /allocation: OpenCost and Kubecost API consumers — and the dashboards built on them — work unchanged.
  • FinOps FOCUS 1.2 CSV export at /api/v1/export/focus, with allocated estimates labelled as such.
  • Cost time series with a month-end forecast, chargeback by team and cost center, and a fleet efficiency score.

Logs — Loki-class

  • The collector tails /var/log/pods on every node — CRI and docker json-file, partial lines reassembled, rotation- and truncation-safe checkpoints, level and trace-id detection, per-container rate limits — into ClickHouse.
  • LogQL: stream selectors, line filters, json / logfmt / regexp parsers, label filters, line_format, drop / keep, and metric queries (count_over_time, rate, bytes_over_time, bytes_rate, absent_over_time with sum / avg / min / max / count / topk / bottomk by or without), compiled to parameterised ClickHouse SQL.
  • Live tail, Drain pattern mining, and log-volume cost per team.
  • Drop-in Loki push (JSON and protobuf+snappy) and query APIs — Promtail, Grafana Alloy, Fluent Bit and Grafana's Loki datasource work unchanged — plus OTLP/HTTP logs at /v1/logs.

Continuous profiling — Pyroscope-class

  • eBPF whole-node CPU profiling at 49 Hz: kernel and user stacks for every container, symbolised from ELF symbol tables and Go's pclntab. No code changes, no restarts.
  • pprof scraping for pods annotated the Pyroscope/Alloy way (profiles.grafana.com/*) or with kubehero.io/profile*.
  • A Pyroscope-compatible /ingest endpoint for SDK pushes (pprof and folded).
  • Flamegraphs, diff flamegraphs against a baseline window, top functions, and $/month per function from the workload's CPU spend.

eBPF network

  • cgroup_skb ingress and egress programs account bytes and packets per endpoint pair; TCP retransmits come from the tcp:tcp_retransmit_skb tracepoint. The programs only observe — traffic is never dropped or altered.
  • A workload service map with bytes, retransmits and cost per edge, and per-workload network spend.
  • Cross-zone and internet egress priced per GB, with per-cloud defaults you can override.

Rightsizing that adjusts

  • Per-container p50 / p95 / p99 / max from 5-minute usage rollups. CPU is sized to a percentile plus headroom; memory never below the observed max and never down after an OOM kill; confidence comes from sample coverage; savings are priced from the workload's own cost.
  • RightsizingPolicy now acts. recommend writes recommendations to status; shadow records and audits what it would change; apply patches requests only after a human arms the policy — bounded steps, maxChangePerDay, a confidence floor, and never mid-rollout or on a container a VPA owns.
  • The previous resources are recorded so kubehero undo restores them.

Alerting

  • One evaluator over logs (LogQL metric queries), spend rate, budget burn, anomalies, network spend and cluster events — OOM kills, crash loops, unschedulable pods.
  • pending → firing → resolved with templated annotations, silences and re-notification; test a rule before you save it.
  • Channels: Slack, PagerDuty, Opsgenie, Microsoft Teams, Discord, generic webhooks and Alertmanager.
  • A default rule set on first boot: error spikes, OOM kills, spend anomalies, budget burn and egress.

Agents

  • Ask KubeHero: investigations run a bounded, read-only tool loop over allocation, anomalies, logs and patterns, profiles, the service map, network costs, alerts and rightsizing — and answer with cited evidence, deep links and guarded proposals.
  • Claude as the brain with your own Anthropic API key (Claude Opus 5 by default, configurable), and a deterministic rules brain as the offline default and the fallback on any error. Without a key, nothing leaves the cluster.
  • kubehero mcp: an MCP server (stdio or streamable HTTP) exposing the same read-only tools to Claude and other agents.
  • Every proposal from any brain is validated against the CRD whitelist; anything else is downgraded to investigate-only. The advisor holds no Kubernetes credentials.

CLI, dashboard and chart

  • CLI: kubehero cost, logs (-f live tail, --patterns), profile top | flame, network, rightsize, alerts, ask and mcp.
  • Dashboard on Next.js 16: logs, profiles, network, allocation, rightsizing, alerts and Ask explorers, plus a per-workload correlation page; token sign-in with per-user roles.
  • Helm chart: embedded single-replica Postgres 18 and ClickHouse 26.8 LTS by default (managed stores via a DSN Secret for production), generated and persisted tokens with auth required by default, network policies and restricted security contexts throughout.

Fixes

  • Per-node collector attribution. Every collector pod listed all pods in the cluster and fetched every node's kubelet summary, so an N-node cluster reported N× its real cost (and made N² kubelet calls). Each collector now reports only its own node; cluster-scoped scans run on an elected leader.
  • Spend priced as rate × interval. Samples arrive every few seconds, but rollups summed per-second rates as if every row covered one second. Rollups and the burn rate now use cost_usd_sec × interval_sec.
  • A ClickHouse schema that actually applies: versioned migrations, applied once and recorded, and a control plane that waits for its stores instead of quietly serving demo data.
  • AWS prices without the memory spike. The pricing engine decoded AWS's whole regional EC2 offer file (about 460 MB for us-east-1) into memory on every cache miss, far past its 256 MiB limit. It now streams each region once every 12 hours, keeping only on-demand Linux rates (a few MB of memory), downloads in the background, and answers from its cache or the static table in the meantime.
  • Enrollment tokens are verified: a cluster token authenticates its own cluster only and can't write telemetry for another.
  • Public images and chart: images publish to ghcr.io/kubehero-io and the chart to oci://ghcr.io/kubehero-io/charts/kubehero, tagged to the app version — and a Helm install now wires the stores into the control plane, so it runs on real data instead of demo fixtures.

Upgrade notes

  • Migrations run automatically on control-plane start (ClickHouse 0002_signals and 0003_logs_exact_volume, and the new Postgres migrations); control-plane migrate runs them on their own.
  • The collector DaemonSet gains host mounts (/var/log/pods read-only, /var/lib/kubehero, the cgroup v2 filesystem) and, with eBPF on, runs privileged with hostPID. Set collector.ebpf.enabled=false to run it unprivileged without the kernel signals.
  • Auth is required by default: read the admin token from the kubehero-control-plane Secret.
  • The Bitnami Postgres / ClickHouse subcharts are gone: use the embedded stores, or point postgresql.external / clickhouse.external at your own.
  • Coming from 0.1.x: v0.2.0 was a source milestone and never shipped images or a chart. Everything in it, the advisor image included, ships here.

v0.2.0

  • New advisor service (seventh image: advisor). Agentic briefings — headline, full markdown, and a spoken script you can play from the dashboard — generated by Claude when you bring an Anthropic API key, by a deterministic rules engine when you don't. Every proposed action is validated against the CRD schema; anything that isn't a legal BudgetPolicy, CeilingPolicy, or RightsizingPolicy is downgraded to investigate-only. The advisor holds no write credentials.
  • Dashboard: new Advisor page with voice playback, source badge (demo / rules / generated), and guarded-CRD action cards with copy-to-apply manifests. Session cookies are now HMAC-signed and httpOnly (set KUBEHERO_SESSION_SECRET).
  • Collector: measured utilization via the kubelet Summary API (CPU usage and working-set memory per pod), blended with requests for attribution — no longer requests-only estimation. Falls back per-node when kubelet stats are unavailable.
  • Pricing engine: live AWS, GCP, and Azure catalogs now serve the Quote RPC with a TTL cache, request coalescing, and stale-then-static fallback — a provider outage can't fail a quote the static table can answer.
  • Control plane: real spend-anomaly detection (rolling z-scores over pod_cost_1s per workload). New KUBEHERO_DEMO_MODE=false hard-disables demo fixtures so an unwired install fails loudly instead of showing plausible fake data.
  • Toolchain: Go 1.26.5 across all modules — govulncheck clean; regenerated protobuf code with a descriptor-integrity test; dependency skew between operator and collector resolved.
  • Deploy: reference Terraform for GKE (regional cluster, Workload Identity, private Cloud SQL, dedicated ClickHouse pool). Helm chart gains the advisor Deployment with an existingSecret reference for the API key.

v0.1.0

  • Initial public release. Six container images on ghcr.io/kubehero (control-plane, operator, collector, pricing-engine, cli, dashboard) — multi-arch (amd64 + arm64), Cosign-signed, Syft SBOM attested, Trivy CVE-gated.
  • Helm chart published to oci://ghcr.io/kubehero/charts. Eight optional subcharts (postgresql, clickhouse, valkey, dex, trivy-operator, tetragon, external-secrets, kube-prometheus-stack); cert-manager Certificate template; PriorityClass; production overlay.
  • Eleven Connect-RPC methods between dashboard and control-plane; live-wired UI for fleet, clusters, waste, budgets, ceilings, chargeback, posture, and per-workload drill-in.
  • Operator with three-condition reconciler (Ready / Armed / Tripped); ClickHouse-backed burn-rate provider; Trivy VulnerabilityReport ingest; real K8s actuator (HPA cap, pod evict, node cordon) with envtest coverage.
  • API-key + OIDC-with-JWKS auth interceptor; member/admin RBAC on mutating RPCs.
  • CLI: cluster add (one-time enrollment token), cluster list, scan, rightsize, apply, cap --arm, undo, quote, auth login.