Changelog¶
All notable changes to this project are documented below. This project uses Semantic Versioning and Conventional Commits. This page is generated from the repository CHANGELOG.md.
All notable changes to the Fleet Management Operator will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased¶
Added¶
- TenantPolicy CRD with opt-in Kubernetes RBAC tenancy enforcement, plus its status reconciler (
Ready/Validconditions,boundSubjectCount). - Collector, RemoteAttributePolicy, ExternalAttributeSync, and CollectorDiscovery CRDs, controllers, and admission webhooks (all default-off; opt in per controller).
- External source plugins for ExternalAttributeSync: HTTP (bearer / basic auth) and SQL (postgres via
lib/pq, mysql viago-sql-driver/mysql). Both kinds ship in this release; the factory incmd/main.godispatches onspec.source.kind. - CEL-based structural validation on CRD schemas:
Collector.spec.idimmutability, matcher caps, configType-vs-contents constraints. - API versioning and graduation policy doc, plus a cross-CRD condition type/reason registry.
- Helm chart templates: webhook Service, ValidatingWebhookConfiguration, cert-manager Certificate, PodDisruptionBudget, ServiceMonitor, PrometheusRule with operator alerts, and an embedded Grafana dashboard ConfigMap (DOC-01/02, WH-01/02).
- Operator metrics: Fleet API request counters and rate-limiter wait histogram (OBS-01/02); reconcile-outcome counters (OBS-06); sync-age histogram, owned-key gauge, discovery-list-size gauge (OBS-03/04/05); OpenTelemetry tracing for Fleet API calls, noop by default (OBS-07).
- Per-target rate limiter for ExternalAttributeSync sources (E19): two syncs pointing at the same upstream (HTTP host or SQL secret) share a token bucket via
--controller-sync-target-rateand--controller-sync-target-burst. Default off. - Per-controller
MaxConcurrentReconciles(policy=4, sync=4, discovery=1) with--controller-{policy,sync,discovery}-max-concurrentflags and matching Helm values (PERF-04). Pipeline and Collector remain at 1 by design. - Selective Collector watch handler indexed by matcher key (PERF-03): policy changes now wake only the matching Collectors instead of every Collector.
- Helm chart values exposing
fleetManagement.apiRatePerSecondandfleetManagement.apiBurst(configurable Fleet API rate limit / burst). - Helm chart values exposing
image.digest,webhook.port, leader-election lease tunables, and probe / security tunables (HELM-02/03/04/06/09). - Production-readiness audit scorecard (
docs/superpowers/audits/) and full troubleshooting guide / per-alert runbooks / webhook setup guide (DOC-03/04/05). - Sample manifests: annotated invalid-CR examples for onboarding.
- Renovate configuration for dependency updates.
- Auto-generated chart README via helm-docs (
make chart-docs,make chart-docs-check).
Changed¶
- Memory defaults raised to limits=2Gi / requests=512Mi (HELM-01); 128Mi default was insufficient at 30k-Collector informer-cache footprint and would OOMKill. Sizing matrix in
values.yaml. - Liveness probe
initialDelaySecondsraised so pods are not killed during initial cache warm-up at 30k CRs (HELM-08). - Production logging defaults: structured JSON output, info level (
Development: false). - Fleet API HTTP client now closes its connection pool on shutdown (UPG-03); webhook port is a Helm value with startup cert validation (WH-04).
- Webhook entries set
timeoutSeconds: 5(WH-02). RemoteAttributePolicy.status.matchedCollectorIDscapped at 1000 withmatchedCountfield (PERF-01);ExternalAttributeSync.status.ownedKeyscapped at 1000 with no-op short-circuit;CollectorDiscovery.status.conflictscapped at 100 (PERF-06).- CLAUDE.md: documented REC reconciler invariants, per-target sync rate limiter, per-controller event reasons, and updated SQL plugin to "currently shipped" (was Phase-3-only stub).
Fixed¶
- Validating webhooks for Collector and CollectorDiscovery now validate the incoming
obj, not the empty receiver. Previously, the framework's empty*Collector{}/*CollectorDiscovery{}receiver was being validated, so every admission request trivially passed (WH-05 follow-up). - PERF-03 silent correctness regressions and no-op short-circuit gaps fixed (Batch B).
- TenantPolicy correctness, including D9 webhook markers (Batch C).
- Install-blocking Helm chart defects (Batch A): consolidated duplicate webhook sections, fixed RBAC/template inconsistencies.
- Fleet client interceptor / manager lifecycle / OTEL footguns (Batch D).
- Conflict-policy reconcile path now treats
ctrl.Result.Requeue=truefrom status-conflict as cache lag (no error, no exponential backoff). - 404 from Fleet API on Pipeline / Collector deletion is treated as success.
- Helm chart: leader-election lease flags wired; production log defaults applied; container ports declared on Deployment; metrics endpoint properly bound (HELM-02/04/06).
- Chart README: regenerated from
values.yaml(helm-docs); previous manual table claimedlimits.memory: 128Mi, drift since HELM-01 fix. - Documentation: deployment / Secret / webhook-Service names now match the actual chart-rendered names; memory-limit references updated to reflect the 2Gi default.
- Test: graceful-shutdown test now drives a real
PipelineReconcilerto verify context propagation through the full reconciler → client → interceptor chain (E1, replaces tautological stub). - Lint:
make lintfrom 44 issues to 0 (modernize/prealloc/errcheck/unused cleanups; no behaviour change).
Security¶
- Container image base pinned to digest; added
image.digestHelm value (SEC-01). - Pod and container security context hardened: non-root, read-only root FS, dropped capabilities, restricted seccomp profile (SEC-02/03/04).
- Race detector enabled in
make testtarget (TEST-01).
Upgrade Notes¶
- Helm value renames:
fleet-management-credentialsSecret is now<release>-credentials(defaultfleet-management-operator-credentials). Existing self-managed Secrets continue to work viafleetManagement.existingSecret.name. - Webhook Service is now
<release>-webhook(was<release>-webhook-service). - New CRDs (
Collector,RemoteAttributePolicy,ExternalAttributeSync,CollectorDiscovery,TenantPolicy) install with the chart; controllers remain disabled until you setcontrollers.<name>.enabled: true. controllers.collectorDiscovery.enabled: truerequirescontrollers.collector.enabled: true; the manager refuses to start otherwise.
0.1.0 - YYYY-MM-DD¶
Added¶
- Initial release of Fleet Management Operator
- Pipeline CRD for managing Fleet Management pipelines
- Support for Alloy and OpenTelemetry Collector configurations
- Multi-architecture Docker images (linux/amd64, linux/arm64)
- Helm chart for easy deployment
- Source tracking (Git, Terraform, Kubernetes)
- Finalizer support for proper cleanup
- Status conditions following Kubernetes conventions
- Metrics endpoint on port 8080
- Leader election for high availability