|
| 1 | +## [1.2.12](https://github.com/Cloudzero/cloudzero-agent/compare/v1.2.11...v1.2.12) (2026-06-18) |
| 2 | + |
| 3 | +Release 1.2.12 is a maintenance release focused on deployment flexibility and reliability. Highlights include improved monitoring support, Secrets Store CSI Driver support for API key delivery, chart-wide environment variable injection (enabling egress proxy support), aggregator self-healing for persistent error states, and the ability to disable the webhook server when the experimental KubeState plugin is enabled. |
| 4 | + |
| 5 | +### Key Features |
| 6 | + |
| 7 | +- **Selectable Monitoring Discovery (ServiceMonitors or Annotations)**: When monitoring is enabled, the chart now advertises the agent's metrics via _either_ Prometheus Operator `ServiceMonitor` resources _or_ `prometheus.io/*` annotations, rather than emitting both at once. This refines the monitoring integration introduced in validation in 1.2.11. `components.monitoring.discovery.method` (`auto` | `serviceMonitors` | `annotations`, default `auto`) selects the mechanism: `serviceMonitors` renders the `ServiceMonitor` + `PrometheusRule` bundle (requires the Prometheus Operator CRDs), while `annotations` emits `prometheus.io/*` annotations only. Monitoring itself is gated behind `components.monitoring.enabled` (default `false`). See `helm/docs/monitoring-infrastructure.md` for the full reference. **Note:** the default install now emits nothing monitoring-related — see Upgrade Steps below. |
| 8 | + |
| 9 | +- **Secrets Store CSI Driver for API Key**: New `components.apiKey.secretProviderClass` value mounts the CloudZero API key via the Secrets Store CSI Driver instead of a Kubernetes Secret, allowing the key to be sourced directly from an external vault (validated against AWS Secrets Manager and Azure Key Vault). The existing `apiKey` and `existingSecretName` values continue to work and take priority. This replaces the broader `extraVolumes`/`extraVolumeMounts` mechanism from community PR #772 with a focused, single-purpose option. |
| 10 | + |
| 11 | +- **Chart-Wide Environment Injection**: New `defaults.env` value injects a list of environment variables into every container the chart manages. The most common use case is `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` for clusters behind a corporate egress proxy — every bundled binary honors `http.ProxyFromEnvironment` — but the field covers any chart-wide binary configuration. Chart-emitted entries (e.g. `SERVER_PORT`, `NODE_NAME`) always win on name collision, and component-specific env (e.g. `server.env`) overrides `defaults.env`. |
| 12 | + |
| 13 | +- **Optional Webhook Server**: The admission webhook server can now be disabled via `components.webhookServer.enabled` (`true` | `false` | `"auto"`, default `"auto"`, which maps to enabled today). When disabled, the entire webhook surface (Deployment, Service, ConfigMap, HPA, PDB, `ValidatingWebhookConfiguration`, certificate/issuer/secret, init-cert RBAC, and the backfill job) is removed cleanly with no dangling objects. This is primarily groundwork for future deployment topologies — disabling the webhook server is only appropriate for clusters already relying on the experimental KubeState-based collection path, and is **not recommended for general use**. Default behavior is unchanged. The legacy `insightsController.enabled` value still takes precedence when explicitly set and is now marked deprecated. |
| 14 | + |
| 15 | +### Reliability Improvements |
| 16 | + |
| 17 | +- **Aggregator Self-Healing**: The aggregator now detects and recovers from a pod stuck in a persistent 5xx state. `/healthz` returns 503 when the `/collector` 5xx rate exceeds 20% (with at least 3 failures in the last 60s), so readiness pulls the pod from the Service within ~30s. A new `/livez` endpoint applies a 5-minute sticky latch to trigger a pod restart if the broken state persists. Every 5xx response now sets `Connection: close` so clients reconnect and re-balance immediately. The chart adds `aggregator.readinessProbe`/`aggregator.livenessProbe` defaults with per-container override slots. |
| 18 | + |
| 19 | +- **Backfill Memory Footprint**: The backfill job no longer reuses the webhook server's in-memory SQLite store. It now uses a streaming store that batches records (500 at a time) directly to the collector via remote_write, holding memory flat at ~53 MiB regardless of cluster size (previously ~597 MiB at 1M resources). The unnecessary pusher, housekeeper, and secret monitor no longer run during backfill. |
| 20 | + |
| 21 | +- **GC-Induced OOM Prevention**: All agent binaries now set `GOMEMLIMIT` to 90% of the detected cgroup memory limit via `automemlimit`, so the Go garbage collector reclaims aggressively before RSS reaches the pod limit. This fixes customer-reported OOM kills of the backfill job under allocation churn. |
| 22 | + |
| 23 | +### Security Improvements |
| 24 | + |
| 25 | +- **Webhook Server Credential Surface**: As part of ongoing security hardening, the webhook server no longer mounts the CloudZero API key. It now pushes metrics exclusively to the in-cluster aggregator, so the key mount, the `Authorization` header, and the in-process secret-rotation monitor have been dropped from its code path. This is an incremental reduction of the credential mount surface — the API key secret itself is unchanged, and other components that need it (the aggregator's shipper, the agent init containers, the config-loader job) are unaffected. |
| 26 | + |
| 27 | +### Build and Infrastructure |
| 28 | + |
| 29 | +- Fixed KUTTL end-to-end suites that were silently no-op'ing (command/`spec:` wrapper bugs) and wired the freshly built image into the matrix kind tests so the suites genuinely execute |
| 30 | + |
| 31 | +### Upgrade Steps |
| 32 | + |
| 33 | +To upgrade to version 1.2.12, run the following command: |
| 34 | + |
| 35 | +```sh |
| 36 | +helm upgrade --install <RELEASE_NAME> cloudzero/cloudzero-agent -n <NAMESPACE> --create-namespace -f configuration.example.yaml --version 1.2.12 |
| 37 | +``` |
| 38 | + |
| 39 | +The default install no longer emits any monitoring resources or `prometheus.io/*` annotations. If you relied on annotation-based scrape discovery in a prior version, restore it explicitly: |
| 40 | + |
| 41 | +```yaml |
| 42 | +components: |
| 43 | + monitoring: |
| 44 | + enabled: true |
| 45 | + discovery: |
| 46 | + method: annotations |
| 47 | +``` |
0 commit comments